From 34357b62b8ab3b2b15b4e9295cabbab9abe6a2d7 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 13 Mar 2015 14:18:34 +1100 Subject: [PATCH 001/201] (MESS) gamate : improved readability (nw) --- src/mess/audio/gamate.c | 221 ++++++++++++++++------------- src/mess/drivers/gamate.c | 282 +++++++++++++++++++------------------ src/mess/includes/gamate.h | 82 +++++++---- 3 files changed, 316 insertions(+), 269 deletions(-) diff --git a/src/mess/audio/gamate.c b/src/mess/audio/gamate.c index 369dac9df57..c49aeb72680 100644 --- a/src/mess/audio/gamate.c +++ b/src/mess/audio/gamate.c @@ -26,11 +26,10 @@ const int EnvelopeVolumes[]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, //------------------------------------------------- gamate_sound_device::gamate_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, GAMATE_SND, "Gamate Audio Custom", tag, owner, clock, "gamate_sound", __FILE__), - device_sound_interface(mconfig, *this), - m_mixer_channel(NULL) -{ -} + : device_t(mconfig, GAMATE_SND, "Gamate Audio Custom", tag, owner, clock, "gamate_sound", __FILE__) + , device_sound_interface(mconfig, *this) + , m_mixer_channel(NULL) + {} //------------------------------------------------- // device_start - device-specific startup @@ -61,36 +60,39 @@ void gamate_sound_device::sound_stream_update(sound_stream &stream, stream_sampl for (i = 0; i < samples; i++, left++, right++) { noise.pos += noise.step; - while (noise.pos >= 1.0) { - // guess (white noise register taken from supervision) - noise.level = noise.state & 0x40 ? 1 : 0; - bool b1 = (noise.state & 0x40) != 0, b2 = (noise.state & 0x20) != 0; - noise.state=(noise.state<<1)+(b1!=b2?1:0); - noise.pos -= 1; + while (noise.pos >= 1.0) + { + // guess (white noise register taken from supervision) + noise.level = noise.state & 0x40 ? 1 : 0; + bool b1 = (noise.state & 0x40) != 0, b2 = (noise.state & 0x20) != 0; + noise.state=(noise.state<<1)+(b1!=b2?1:0); + noise.pos -= 1; } envelope.pos += envelope.step; while (envelope.pos >= 1.0) { - envelope.pos -= 1; - envelope.index++; - switch (envelope.control) { - case 0: case 1: case 2: case 3: - case 4: case 5: case 6: case 7: - case 8: case 9: case 0xb: - case 0xd: case 0xf: - if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)/2) { - envelope.index=0; - envelope.first=false; - } - break; - default: - if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)) { - envelope.index=0; - envelope.first=false; - } - break; - } - + envelope.pos -= 1; + envelope.index++; + switch (envelope.control) + { + case 0: case 1: case 2: case 3: + case 4: case 5: case 6: case 7: + case 8: case 9: case 0xb: + case 0xd: case 0xf: + if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)/2) + { + envelope.index=0; + envelope.first=false; + } + break; + default: + if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)) + { + envelope.index=0; + envelope.first=false; + } + break; + } } *left = 0; @@ -99,51 +101,67 @@ void gamate_sound_device::sound_stream_update(sound_stream &stream, stream_sampl { if (channel->size != 0) { - channel->level= channel->pos <= channel->size / 2; + channel->level= channel->pos <= channel->size / 2; bool l= channel->full_cycle? true: channel->level; - if (!channel->tone) l= l && noise.level; + if (!channel->tone) + l= l && noise.level; int volume=0; - if (l) { - if (channel->envelope_on) { - switch (envelope.control) { - case 0: case 1: case 2: case 3: - case 0x9: // one time falling, low - if (envelope.first && channel->level) volume=0xf-EnvelopeVolumes[envelope.index]; - break; - case 4: case 5: case 6: case 7: - case 0xf: // one time rising, low - if (envelope.first && channel->level) volume=EnvelopeVolumes[envelope.index]; - break; - case 8: // falling - if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index]; - break; - case 0xa: // rising, falling - if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index]; // cube up - break; - case 0xb: // one time falling, high - if (channel->level) volume=envelope.first? 0xf-EnvelopeVolumes[envelope.index]: 0xf; - break; - case 0xc: // rising, low - if (channel->level) volume=envelope.indexlevel) volume=envelope.first? EnvelopeVolumes[envelope.index]: 0xf; - break; - case 0xe: // falling, rising - if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index]; - break; - } - } else { - volume=channel->volume; - } + if (l) + { + if (channel->envelope_on) + { + switch (envelope.control) + { + case 0: case 1: case 2: case 3: + case 0x9: // one time falling, low + if (envelope.first && channel->level) + volume=0xf-EnvelopeVolumes[envelope.index]; + break; + case 4: case 5: case 6: case 7: + case 0xf: // one time rising, low + if (envelope.first && channel->level) + volume=EnvelopeVolumes[envelope.index]; + break; + case 8: // falling + if (channel->level) + volume=0xf-EnvelopeVolumes[envelope.index]; + break; + case 0xa: // rising, falling + if (channel->level) + volume=0xf-EnvelopeVolumes[envelope.index]; // cube up + break; + case 0xb: // one time falling, high + if (channel->level) + volume=envelope.first ? 0xf-EnvelopeVolumes[envelope.index] : 0xf; + break; + case 0xc: // rising, low + if (channel->level) + volume=envelope.indexlevel) + volume=envelope.first ? EnvelopeVolumes[envelope.index] : 0xf; + break; + case 0xe: // falling, rising + if (channel->level) + volume=0xf-EnvelopeVolumes[envelope.index]; + break; + } + } + else + { + volume=channel->volume; + } } if (j == Right) - *right += Value2Volume(volume); - else if (j==Left) - *left += Value2Volume(volume); - else { - *right += Value2Volume(volume); - *left += Value2Volume(volume); + *right += Value2Volume(volume); + else + if (j==Left) + *left += Value2Volume(volume); + else + { + *right += Value2Volume(volume); + *left += Value2Volume(volume); } channel->pos++; if (channel->pos >= channel->size) @@ -169,7 +187,7 @@ WRITE8_MEMBER( gamate_sound_device::device_w ) case 3: case 4: case 5: - chan=offset/2; + chan=offset/2; size = reg[chan*2] | ((reg[chan*2+1] & 0xf) << 8); if (size) { @@ -182,40 +200,42 @@ WRITE8_MEMBER( gamate_sound_device::device_w ) m_channels[chan].pos = 0; break; case 6: - size=data&0x1f; - if (size==0) size=1; - noise.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size); - break; + size=data&0x1f; + if (size==0) + size=1; + noise.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size); + break; case 7: - m_channels[Right].full_cycle=data&1; - m_channels[Right].tone=data&8; - m_channels[Left].full_cycle=data&2; - m_channels[Left].tone=data&0x10; - m_channels[Both].full_cycle=data&4; - m_channels[Both].tone=data&0x20; - noise.state=1; - noise.pos=0.0; - noise.level=false; - break; + m_channels[Right].full_cycle=data&1; + m_channels[Right].tone=data&8; + m_channels[Left].full_cycle=data&2; + m_channels[Left].tone=data&0x10; + m_channels[Both].full_cycle=data&4; + m_channels[Both].tone=data&0x20; + noise.state=1; + noise.pos=0.0; + noise.level=false; + break; case 8: case 9: case 0xa: - chan=offset-8; + chan=offset-8; m_channels[chan].envelope_on = data & 0x10; // buggy aussetzer cube up m_channels[chan].volume = data & 0xf; break; case 0xb: case 0xc: size = reg[0xb] | ((reg[0xc]) << 8); - if (size==0) size=1; - envelope.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size); - break; + if (size==0) + size=1; + envelope.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size); + break; case 0xd: - envelope.control=data&0xf; - envelope.pos=0; - envelope.index=0; - envelope.first=true; - break; - + envelope.control=data&0xf; + envelope.pos=0; + envelope.index=0; + envelope.first=true; + break; + } envelope.pos=0; // guess envelope.index=0; @@ -224,7 +244,8 @@ WRITE8_MEMBER( gamate_sound_device::device_w ) READ8_MEMBER( gamate_sound_device::device_r ) { - UINT8 data=0; - if ((offset&0xf) m_maincpu; @@ -83,92 +81,113 @@ private: required_shared_ptr m_bios; emu_timer *timer1; emu_timer *timer2; - UINT8 bank_multi; + UINT8 bank_multi; }; WRITE8_MEMBER( gamate_state::gamate_cart_protection_w ) { - logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter); + logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter); - switch (offset) { + switch (offset) + { case 0: card_protection.failed= card_protection.failed || ((card_protection.cartridge_byte&0x80)!=0) != ((data&4)!=0); card_protection.bit_shifter++; - if (card_protection.bit_shifter>=8) { + if (card_protection.bit_shifter>=8) + { card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++]; card_protection.bit_shifter=0; } break; } } + READ8_MEMBER( gamate_state::gamate_cart_protection_r ) { - - UINT8 ret=1; - if (card_protection.bit_shifter==7 && card_protection.unprotected) { - ret=m_cart->get_rom_base()[bank_multi*0x4000]; - } else { - card_protection.bit_shifter++; - if (card_protection.bit_shifter==8) { - card_protection.bit_shifter=0; - card_protection.cartridge_byte='G'; - card_protection.unprotected=true; + UINT8 ret=1; + if (card_protection.bit_shifter==7 && card_protection.unprotected) + { + ret=m_cart->get_rom_base()[bank_multi*0x4000]; } - ret=(card_protection.cartridge_byte&0x80)?2:0; - if (card_protection.bit_shifter==7 && !card_protection.failed) { // now protection chip on cartridge activates cartridge chip select on cpu accesses -// m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working + else + { + card_protection.bit_shifter++; + if (card_protection.bit_shifter==8) + { + card_protection.bit_shifter=0; + card_protection.cartridge_byte='G'; + card_protection.unprotected=true; + } + ret=(card_protection.cartridge_byte&0x80) ? 2 : 0; + if (card_protection.bit_shifter==7 && !card_protection.failed) + { // now protection chip on cartridge activates cartridge chip select on cpu accesses +// m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working + } + card_protection.cartridge_byte<<=1; } - card_protection.cartridge_byte<<=1; - } - logerror("%.6f protection read %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, ret, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter); - return ret; + logerror("%.6f protection read %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, ret, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter); + return ret; } -READ8_MEMBER( gamate_state::protection_r ) { return card_protection.set? 3: 1; } // bits 0 and 1 checked +READ8_MEMBER( gamate_state::protection_r ) +{ + return card_protection.set? 3: 1; +} // bits 0 and 1 checked WRITE8_MEMBER( gamate_state::protection_reset ) { - // writes 0x20 - card_protection.address=0x6005-0x6001; - card_protection.bit_shifter=0; - card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++]; - card_protection.failed=false; - card_protection.unprotected=false; +// writes 0x20 + card_protection.address=0x6005-0x6001; + card_protection.bit_shifter=0; + card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++]; + card_protection.failed=false; + card_protection.unprotected=false; } READ8_MEMBER( gamate_state::newer_protection_set ) { - card_protection.set=true; - return 0; + card_protection.set=true; + return 0; } - WRITE8_MEMBER( gamate_state::gamate_video_w ) { - video.reg[offset]=data; - switch (offset) { - case 1: - if (data&0xf) printf("lcd mode %x\n", data); - video.y_increment=data&0x40; - break; - case 2: video.bitmap.xpos=data;break; - case 3: - if (data>=200) printf("lcd ypos: %x\n", data); - video.bitmap.ypos=data; - break; - case 4: video.bitmap.page2=data&0x80;video.x=data&0x1f;break; - case 5: video.y=data;break; - case 7: - video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; - if (video.y_increment) video.y++; - else video.x++; // overruns - } + video.reg[offset]=data; + switch (offset) + { + case 1: + if (data&0xf) + printf("lcd mode %x\n", data); + video.y_increment=data&0x40; + break; + case 2: + video.bitmap.xpos=data; + break; + case 3: + if (data>=200) + printf("lcd ypos: %x\n", data); + video.bitmap.ypos=data; + break; + case 4: + video.bitmap.page2=data&0x80; + video.x=data&0x1f; + break; + case 5: + video.y=data; + break; + case 7: + video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; + if (video.y_increment) + video.y++; + else + video.x++; // overruns + } } WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w ) { - bank_multi=data; - membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1); + bank_multi=data; + membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1); } WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) @@ -178,61 +197,41 @@ WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) READ8_MEMBER( gamate_state::gamate_video_r ) { - if (offset!=6) return 0; - UINT8 data=0; - data=video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]; + if (offset!=6) + return 0; + UINT8 data = video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]; // if (m_maincpu->pc()<0xf000) // machine().ui().popup_time(2, "lcd read x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data); - if (video.y_increment) video.y++; - else video.x++; // overruns? + if (video.y_increment) + video.y++; + else + video.x++; // overruns? - return data; -} - -WRITE8_MEMBER( gamate_state::gamate_audio_w ) -{ -// logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data); - m_sound->device_w(space, offset, data); -} - -READ8_MEMBER( gamate_state::gamate_audio_r ) -{ - UINT8 data=m_sound->device_r(space, offset); - return data; -} - - -READ8_MEMBER( gamate_state::gamate_pad_r ) -{ - UINT8 data=m_io_joy->read(); - return data; + return data; } READ8_MEMBER( gamate_state::gamate_nmi_r ) { - UINT8 data=0; - machine().ui().popup_time(2, "nmi/4800 read\n"); - return data; + UINT8 data=0; + machine().ui().popup_time(2, "nmi/4800 read\n"); + return data; } static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state ) - AM_RANGE(0x0000, 0x03ff) AM_RAM - AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w) - AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r) - AM_RANGE(0x4800, 0x4800) AM_READ(gamate_nmi_r) - AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w) - AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set) - AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset) - AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r) - - AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti") - AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank") - + AM_RANGE(0x0000, 0x03ff) AM_RAM + AM_RANGE(0x4000, 0x400d) AM_DEVREADWRITE("custom", gamate_sound_device, device_r, device_w) + AM_RANGE(0x4400, 0x4400) AM_READ_PORT("JOY") + AM_RANGE(0x4800, 0x4800) AM_READ(gamate_nmi_r) + AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w) + AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set) + AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset) + AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r) + AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti") + AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank") AM_RANGE(0x6000, 0x6000) AM_READWRITE(gamate_cart_protection_r, gamate_cart_protection_w) AM_RANGE(0x8000, 0x8000) AM_WRITE(cart_bankswitchmulti_w) AM_RANGE(0xc000, 0xc000) AM_WRITE(cart_bankswitch_w) - - AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios") + AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios") ADDRESS_MAP_END @@ -251,10 +250,10 @@ INPUT_PORTS_END /* palette in red, green, blue tribles */ static const unsigned char gamate_colors[4][3] = { - { 255,255,255 }, - { 0xa0, 0xa0, 0xa0 }, - { 0x60, 0x60, 0x60 }, - { 0, 0, 0 } + { 255,255,255 }, + { 0xa0, 0xa0, 0xa0 }, + { 0x60, 0x60, 0x60 }, + { 0, 0, 0 } }; PALETTE_INIT_MEMBER(gamate_state, gamate) @@ -277,27 +276,36 @@ static void BlitPlane(UINT16* line, UINT8 plane1, UINT8 plane2) UINT32 gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int x, y, j; - for (y=0;y<152;y++) { - for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) { - UINT8 d1, d2; - if (video.bitmap.ypos<200) { - d1=video.bitmap.data[0][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; - d2=video.bitmap.data[1][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; - } else if ((video.bitmap.ypos&0xf)<8) { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines; most likely problematic 200 warp around hardware! no real usage - int yi=(y+(video.bitmap.ypos&0xf)-8); - if (yi<0) yi=video.bitmap.ypos+y; // in this case only 2nd plane used!?, source of first plane? - d1=video.bitmap.data[0][yi][(j+video.bitmap.xpos/8)&0x1f]; // value of lines bevor 0 chaos - d2=video.bitmap.data[1][yi][(j+video.bitmap.xpos/8)&0x1f]; - } else { - d1=video.bitmap.data[0][y][(j+video.bitmap.xpos/8)&0x1f]; - d2=video.bitmap.data[1][y][(j+video.bitmap.xpos/8)&0x1f]; - } - BlitPlane(&bitmap.pix16(y, x+4), d1, d2); - BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4); - } - } - return 0; + int x, y, j; + for (y=0;y<152;y++) + { + for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) + { + UINT8 d1, d2; + if (video.bitmap.ypos<200) + { + d1=video.bitmap.data[0][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; + d2=video.bitmap.data[1][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; + } + else + if ((video.bitmap.ypos&0xf)<8) + { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines; most likely problematic 200 warp around hardware! no real usage + int yi=(y+(video.bitmap.ypos&0xf)-8); + if (yi<0) + yi=video.bitmap.ypos+y; // in this case only 2nd plane used!?, source of first plane? + d1=video.bitmap.data[0][yi][(j+video.bitmap.xpos/8)&0x1f]; // value of lines bevor 0 chaos + d2=video.bitmap.data[1][yi][(j+video.bitmap.xpos/8)&0x1f]; + } + else + { + d1=video.bitmap.data[0][y][(j+video.bitmap.xpos/8)&0x1f]; + d2=video.bitmap.data[1][y][(j+video.bitmap.xpos/8)&0x1f]; + } + BlitPlane(&bitmap.pix16(y, x+4), d1, d2); + BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4); + } + } + return 0; } DRIVER_INIT_MEMBER(gamate_state,gamate) @@ -310,7 +318,8 @@ DRIVER_INIT_MEMBER(gamate_state,gamate) void gamate_state::machine_start() { - if (m_cart->exists()) { + if (m_cart->exists()) + { // m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); membank("bankmulti")->set_base(m_cart->get_rom_base()+1); membank("bank")->set_base(m_cart->get_rom_base()+0x4000); // bankswitched games in reality no offset @@ -375,10 +384,8 @@ static MACHINE_CONFIG_START( gamate, gamate_state ) MCFG_SOUND_ADD("custom", GAMATE_SND, 0) MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) - - MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "gamate_cart") - MCFG_GENERIC_MANDATORY + MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "gamate_cart") MCFG_SOFTWARE_LIST_ADD("cart_list","gamate") MACHINE_CONFIG_END @@ -392,7 +399,6 @@ ROM_START(gamate) ROM_END -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ CONS( 19??, gamate, 0, 0, gamate, gamate, gamate_state, gamate, "Bit Corp", "Gamate", 0) - diff --git a/src/mess/includes/gamate.h b/src/mess/includes/gamate.h index 55a0be4c6a1..c230390648c 100644 --- a/src/mess/includes/gamate.h +++ b/src/mess/includes/gamate.h @@ -14,13 +14,15 @@ // ======================> gamate_sound_device -class gamate_sound_device : public device_t, - public device_sound_interface +class gamate_sound_device : public device_t, public device_sound_interface { public: gamate_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ~gamate_sound_device() { } + DECLARE_WRITE8_MEMBER( device_w ); + DECLARE_READ8_MEMBER( device_r ); + protected: // device-level overrides virtual void device_start(); @@ -28,10 +30,6 @@ protected: // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); -public: - DECLARE_WRITE8_MEMBER( device_w ); - DECLARE_READ8_MEMBER( device_r ); - private: static const int DAConverter[]; @@ -40,36 +38,58 @@ private: sound_stream *m_mixer_channel; struct Tone { - Tone() : - envelope_on(false), - level(false), - tone(false), full_cycle(false), - volume(0), - pos(0), - size(0) - { - } + Tone() : + envelope_on(false), + level(false), + tone(false), full_cycle(false), + volume(0), + pos(0), + size(0) + {} - bool envelope_on, level; - bool tone/*else noise*/, full_cycle/* else square signal/pulse */; - int volume; - int pos, size; + bool envelope_on, level; + bool tone/*else noise*/, full_cycle/* else square signal/pulse */; + int volume; + int pos, size; }; - enum { Right, Left, Both }; + + enum + { + Right, + Left, + Both + }; + Tone m_channels[3]; - struct Noise { - Noise(): state(1), level(false), step(0.0), pos(0.0) {} - int state; - bool level; - double step, pos; + + struct Noise + { + Noise(): + state(1), + level(false), + step(0.0), + pos(0.0) + {} + + int state; + bool level; + double step, pos; } noise; - struct Envelope { - Envelope():control(0), index(0), first(false) {} - int control; - int index; - bool first; - double step, pos; + + struct Envelope + { + Envelope(): + control(0), + index(0), + first(false) + {} + + int control; + int index; + bool first; + double step, pos; } envelope; + UINT8 reg[14]; }; From 053e0b4f4b430fdbb91810497f177a9eca57e9ca Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 13 Mar 2015 14:43:56 +1100 Subject: [PATCH 002/201] (MESS) gamate : removed not-needed includes (nw) --- src/mess/drivers/gamate.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/mess/drivers/gamate.c b/src/mess/drivers/gamate.c index 42507fddfb8..d090ad5fec4 100644 --- a/src/mess/drivers/gamate.c +++ b/src/mess/drivers/gamate.c @@ -9,10 +9,6 @@ ******************************************************************************/ #include "emu.h" -#include "cpu/m6502/m6502.h" -#include "bus/generic/slot.h" -#include "bus/generic/carts.h" -//#include "rendlay.h" #include "includes/gamate.h" #include "ui/ui.h" From 6169bcbb8f9604232f1ef2222e3f54a3322674e6 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 13 Mar 2015 14:51:27 +1100 Subject: [PATCH 003/201] (MESS) gamate : reinstated etabeta's no-cart fix. (nw) --- src/mess/drivers/gamate.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mess/drivers/gamate.c b/src/mess/drivers/gamate.c index d090ad5fec4..3953bc5b060 100644 --- a/src/mess/drivers/gamate.c +++ b/src/mess/drivers/gamate.c @@ -78,6 +78,7 @@ private: emu_timer *timer1; emu_timer *timer2; UINT8 bank_multi; + UINT8 *m_cart_ptr; }; WRITE8_MEMBER( gamate_state::gamate_cart_protection_w ) @@ -91,7 +92,7 @@ WRITE8_MEMBER( gamate_state::gamate_cart_protection_w ) card_protection.bit_shifter++; if (card_protection.bit_shifter>=8) { - card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++]; + card_protection.cartridge_byte=m_cart_ptr[card_protection.address++]; card_protection.bit_shifter=0; } break; @@ -103,7 +104,7 @@ READ8_MEMBER( gamate_state::gamate_cart_protection_r ) UINT8 ret=1; if (card_protection.bit_shifter==7 && card_protection.unprotected) { - ret=m_cart->get_rom_base()[bank_multi*0x4000]; + ret=m_cart_ptr[bank_multi*0x4000]; } else { @@ -135,7 +136,7 @@ WRITE8_MEMBER( gamate_state::protection_reset ) // writes 0x20 card_protection.address=0x6005-0x6001; card_protection.bit_shifter=0; - card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++]; + card_protection.cartridge_byte=m_cart_ptr[card_protection.address++]; //m_cart_rom[card_protection.address++]; card_protection.failed=false; card_protection.unprotected=false; } @@ -183,12 +184,12 @@ WRITE8_MEMBER( gamate_state::gamate_video_w ) WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w ) { bank_multi=data; - membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1); + membank("bankmulti")->set_base(m_cart_ptr+0x4000*data+1); } WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) { - membank("bank")->set_base(m_cart->get_rom_base()+0x4000*data); + membank("bank")->set_base(m_cart_ptr+0x4000*data); } READ8_MEMBER( gamate_state::gamate_video_r ) @@ -314,9 +315,11 @@ DRIVER_INIT_MEMBER(gamate_state,gamate) void gamate_state::machine_start() { + m_cart_ptr = memregion("maincpu")->base() + 0x6000; if (m_cart->exists()) { // m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); + m_cart_ptr = m_cart->get_rom_base(); membank("bankmulti")->set_base(m_cart->get_rom_base()+1); membank("bank")->set_base(m_cart->get_rom_base()+0x4000); // bankswitched games in reality no offset } From e553f19a1daa0dd6269ff856178ad3dcc1f6dbf3 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 13 Mar 2015 15:53:27 +1100 Subject: [PATCH 004/201] Add internal artwork for tonypok Make artwork clickable for many goldstar.c games Make buttons that may be used when not lit appear semi-lit in Cherry Master layouts Correct some star100 inputs Make cmpacman/cmtetris key mapping more consistent with defaults for slot games --- src/mame/drivers/goldstar.c | 45 ++-- src/mame/layout/cmaster.lay | 36 +-- src/mame/layout/cmasterb.lay | 30 +-- src/mame/layout/cmasterc.lay | 32 +-- src/mame/layout/cmpacman.lay | 271 +++++++++++++++++++++++ src/mame/layout/cmv4.lay | 72 +++--- src/mame/layout/crazybon.lay | 40 ++-- src/mame/layout/roypok96.lay | 48 ++-- src/mame/layout/tonypok.lay | 418 +++++++++++++++++++++++++++++++++++ src/mame/mame.mak | 4 +- 10 files changed, 853 insertions(+), 143 deletions(-) create mode 100644 src/mame/layout/cmpacman.lay create mode 100644 src/mame/layout/tonypok.lay diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 5d76c6b9c5c..d6c126b4ba7 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -160,6 +160,7 @@ #include "cmaster.lh" #include "cmasterb.lh" #include "cmasterc.lh" +#include "cmpacman.lh" #include "cmv4.lh" #include "crazybon.lh" #include "goldstar.lh" @@ -167,6 +168,7 @@ #include "nfb96.lh" #include "pokonl97.lh" #include "roypok96.lh" +#include "tonypok.lh" WRITE8_MEMBER(goldstar_state::protection_w) @@ -365,7 +367,7 @@ static ADDRESS_MAP_START( star100_readport, AS_IO, 8, sanghopm_state ) AM_RANGE(0x25, 0x25) AM_READ_PORT("DSW2") AM_RANGE(0x26, 0x26) AM_READ_PORT("DSW3") - AM_RANGE(0xf0, 0xf0) AM_WRITENOP // Writing 0's and 1's constantly. Watchdog feeder? + AM_RANGE(0xe0, 0xe0) AM_WRITENOP // Writing 0's and 1's constantly. Watchdog feeder? AM_RANGE(0xe1, 0xe1) AM_WRITE(enable_w) // enable/disable reels register. ADDRESS_MAP_END @@ -2074,11 +2076,11 @@ static INPUT_PORTS_START( tonypok ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Hold 2 / Big / Red") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Hold 3 / W-Up") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Hold 3 / D-Up") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Hold 4 / Take") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Hold 5 / Bet") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Hold 1 / Small / Black") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Deal") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start / Deal / Draw") PORT_INCLUDE( cmv4_coins ) @@ -5638,11 +5640,11 @@ static INPUT_PORTS_START( star100 ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_NAME("Stop All / Big") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_NAME("Stop 1 / D-UP") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_NAME("Stop 3 / Take / Select Card") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Big") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_NAME("Hold / D-UP") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("Play (Bet)") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_NAME("Stop 2 / Small") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Small") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Start") // PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("IN0-1") @@ -5791,12 +5793,11 @@ static INPUT_PORTS_START( star100 ) PORT_DIPNAME( 0x01, 0x01, "Bonus (switch-2)" ) PORT_DIPLOCATION("SW4:5") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Max Bonus" ) PORT_DIPLOCATION("SW4:6") PORT_DIPSETTING( 0x00, "100000" ) PORT_DIPSETTING( 0x02, "200000" ) PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("SW4:7,8") - PORT_DIPSETTING( 0x0c, "0" ) + PORT_DIPSETTING( 0x0c, "1" ) PORT_DIPSETTING( 0x08, "8" ) PORT_DIPSETTING( 0x04, "16" ) PORT_DIPSETTING( 0x00, "32" ) @@ -6007,11 +6008,11 @@ static INPUT_PORTS_START( cmpacman ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_UP) PORT_NAME("Stop 2 / Big / Up") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Stop 1 / D-UP / Left") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Stop All / Take / Down") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_UP) PORT_NAME("Stop 2 / Big / Up") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Stop 1 / D-UP / Left") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Stop All / Take / Down") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_CODE(KEYCODE_C) PORT_NAME("Stop 3 / Small / Info") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_CODE(KEYCODE_V) PORT_NAME("Stop 3 / Small / Info") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Start / Right") PORT_INCLUDE( cmv4_coins ) @@ -6118,11 +6119,11 @@ static INPUT_PORTS_START( cmtetris ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Stop 2 / Big / Right") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_CODE(KEYCODE_Z) PORT_NAME("Stop 1 / D-UP") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_UP) PORT_NAME("Stop All / Take / Up") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Stop 2 / Big / Right") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_CODE(KEYCODE_X) PORT_NAME("Stop 1 / D-UP") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_UP) PORT_NAME("Stop All / Take / Up") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Stop 3 / Small / Info / Left") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Stop 3 / Small / Info / Left") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Start / Down") PORT_START("IN1") @@ -12990,7 +12991,7 @@ GAMEL( 1991, cmastere, cmaster, cm, cmasterb, cmaster_state, cmv4, GAMEL( 1991, cmasterf, cmaster, cm, cmasterb, cmaster_state, cmv4, ROT0, "Dyna", "Cherry Master I (ver.1.01, set 7)", 0, layout_cmasterb ) -GAME( 1991, tonypok, 0, cm, tonypok, cmaster_state, tonypok, ROT0, "Corsica", "Poker Master (Tony-Poker V3.A, hack?)", 0 ) +GAMEL( 1991, tonypok, 0, cm, tonypok, cmaster_state, tonypok, ROT0, "Corsica", "Poker Master (Tony-Poker V3.A, hack?)", 0 , layout_tonypok ) GAME( 199?, jkrmast, 0, pkrmast, pkrmast, driver_device, 0, ROT0, "", "Joker Master", GAME_NOT_WORKING ) // encrypted? GAME( 199?, pkrmast, jkrmast, pkrmast, pkrmast, driver_device, 0, ROT0, "", "Poker Master (ED-1993 set 1)", GAME_NOT_WORKING ) // incomplete dump + encrypted? GAME( 1993, pkrmasta, jkrmast, pkrmast, pkrmast, driver_device, 0, ROT0, "", "Poker Master (ED-1993 set 2)", GAME_NOT_WORKING ) // incomplete dump + encrypted? @@ -13083,10 +13084,10 @@ GAME( 1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, These have hidden games inside that can be switched to avoid inspections, police or whatever purposes)... */ /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ -GAMEL( 198?, cmpacman, 0, cm, cmpacman, cmaster_state, cm, ROT0, "", "Super Pacman (v1.2) + Cherry Master (Corsica, v8.31)", 0, layout_cmv4 ) /* need to press K to switch between games... */ -GAMEL( 198?, cmtetris, 0, cm, cmtetris, cmaster_state, cm, ROT0, "", "Tetris + Cherry Master (Corsica, v8.01, set 1)", 0, layout_cmv4 ) /* need to press K/L to switch between games... */ -GAMEL( 198?, cmtetrsa, 0, cm, cmtetris, cmaster_state, cm, ROT0, "", "Tetris + Cherry Master (Corsica, v8.01, set 2)", GAME_NOT_WORKING, layout_cmv4) // seems banked... -GAMEL( 198?, cmtetrsb, 0, cm, cmtetris, cmaster_state, cm, ROT0, "", "Tetris + Cherry Master (+K, Canada Version, encrypted)", GAME_NOT_WORKING, layout_cmv4) // different Tetris game +GAMEL( 198?, cmpacman, 0, cm, cmpacman, cmaster_state, cm, ROT0, "", "Super Pacman (v1.2) + Cherry Master (Corsica, v8.31)", 0, layout_cmpacman ) // need to press K to switch between games... +GAMEL( 198?, cmtetris, 0, cm, cmtetris, cmaster_state, cm, ROT0, "", "Tetris + Cherry Master (Corsica, v8.01, set 1)", 0, layout_cmpacman ) // need to press K/L to switch between games... +GAMEL( 198?, cmtetrsa, 0, cm, cmtetris, cmaster_state, cm, ROT0, "", "Tetris + Cherry Master (Corsica, v8.01, set 2)", GAME_NOT_WORKING, layout_cmpacman ) // seems banked... +GAMEL( 198?, cmtetrsb, 0, cm, cmtetris, cmaster_state, cm, ROT0, "", "Tetris + Cherry Master (+K, Canada Version, encrypted)", GAME_NOT_WORKING, layout_cmpacman ) // different Tetris game /* other possible stealth sets: - cmv4a ---> see the 1fxx zone. put a bp in 1f9f to see the loop. diff --git a/src/mame/layout/cmaster.lay b/src/mame/layout/cmaster.lay index 5d0d0daf58a..82a1b22f670 100644 --- a/src/mame/layout/cmaster.lay +++ b/src/mame/layout/cmaster.lay @@ -13,7 +13,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -90,7 +90,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -125,7 +125,7 @@ - + @@ -211,50 +211,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/mame/layout/cmasterb.lay b/src/mame/layout/cmasterb.lay index a80537d28ff..df39c2f13e6 100644 --- a/src/mame/layout/cmasterb.lay +++ b/src/mame/layout/cmasterb.lay @@ -13,7 +13,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -108,7 +108,7 @@ - + @@ -203,50 +203,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/mame/layout/cmasterc.lay b/src/mame/layout/cmasterc.lay index 908f1fba95d..d9b0f43209b 100644 --- a/src/mame/layout/cmasterc.lay +++ b/src/mame/layout/cmasterc.lay @@ -13,7 +13,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -112,7 +112,7 @@ - + @@ -207,50 +207,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/mame/layout/cmpacman.lay b/src/mame/layout/cmpacman.lay new file mode 100644 index 00000000000..af48e1a1541 --- /dev/null +++ b/src/mame/layout/cmpacman.lay @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/cmv4.lay b/src/mame/layout/cmv4.lay index e726fc274b6..2fc6dfffb27 100644 --- a/src/mame/layout/cmv4.lay +++ b/src/mame/layout/cmv4.lay @@ -8,29 +8,12 @@ - - - - - - - - - - - - - - - - - - + - + @@ -42,12 +25,12 @@ - + - + @@ -64,7 +47,7 @@ - + @@ -76,6 +59,23 @@ + + + + + + + + + + + + + + + + + @@ -116,7 +116,7 @@ - + @@ -134,7 +134,7 @@ - + @@ -211,50 +211,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/mame/layout/crazybon.lay b/src/mame/layout/crazybon.lay index bfed6b53d98..daad324d85b 100644 --- a/src/mame/layout/crazybon.lay +++ b/src/mame/layout/crazybon.lay @@ -203,51 +203,51 @@ - - - - - - - - - + - + - + - + - + - + - + + + + + + + + + - + - - + + - - + + diff --git a/src/mame/layout/roypok96.lay b/src/mame/layout/roypok96.lay index a9c68624a24..4dd29a2db40 100644 --- a/src/mame/layout/roypok96.lay +++ b/src/mame/layout/roypok96.lay @@ -26,7 +26,7 @@ - + @@ -56,7 +56,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -112,6 +112,15 @@ + + + + + + + + + @@ -130,6 +139,15 @@ + + + + + + + + + @@ -203,50 +221,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/mame/layout/tonypok.lay b/src/mame/layout/tonypok.lay new file mode 100644 index 00000000000..7e124b8e04a --- /dev/null +++ b/src/mame/layout/tonypok.lay @@ -0,0 +1,418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 86663f84e7a..ee68f57dfd7 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -2678,12 +2678,14 @@ $(DRIVERS)/goldstar.o: $(LAYOUT)/goldstar.lh \ $(LAYOUT)/cmaster.lh \ $(LAYOUT)/cmasterb.lh \ $(LAYOUT)/cmasterc.lh \ + $(LAYOUT)/cmpacman.lh \ $(LAYOUT)/cmv4.lh \ $(LAYOUT)/crazybon.lh \ $(LAYOUT)/lucky8.lh \ $(LAYOUT)/nfb96.lh \ $(LAYOUT)/pokonl97.lh \ - $(LAYOUT)/roypok96.lh + $(LAYOUT)/roypok96.lh \ + $(LAYOUT)/tonypok.lh $(DRIVERS)/grchamp.o: $(LAYOUT)/grchamp.lh From 700f665e87b92fec35f817616236c9370a766921 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 13 Mar 2015 16:12:32 +1100 Subject: [PATCH 005/201] Small fix to tonypok layout (nw) --- src/mame/layout/tonypok.lay | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mame/layout/tonypok.lay b/src/mame/layout/tonypok.lay index 7e124b8e04a..be0c1ba3073 100644 --- a/src/mame/layout/tonypok.lay +++ b/src/mame/layout/tonypok.lay @@ -126,8 +126,8 @@ - - + + @@ -138,7 +138,7 @@ - + From e23dec8bf21d356c993ac10a642e25499b3c41b1 Mon Sep 17 00:00:00 2001 From: briantro Date: Fri, 13 Mar 2015 01:07:21 -0500 Subject: [PATCH 006/201] galaxold.c: Document the BPROM type for Videotron's Frogger bootleg - NW --- src/mame/drivers/galaxold.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/galaxold.c b/src/mame/drivers/galaxold.c index bcddcbe87e0..a6d5313c763 100644 --- a/src/mame/drivers/galaxold.c +++ b/src/mame/drivers/galaxold.c @@ -2876,10 +2876,10 @@ ROM_START( froggerv ) ROM_LOAD( "rana_ic12.ic12", 0x0800, 0x0800, CRC(c1690dfc) SHA1(c6fdb1b9ec4fb7da2566b0c71e3e2f931cdece68) ) ROM_REGION( 0x0020, "proms", 0 ) - ROM_LOAD( "ic10", 0x0000, 0x0020, CRC(4e3caeab) SHA1(a25083c3e36d28afdefe4af6e6d4f3155e303625) ) + ROM_LOAD( "ic10", 0x0000, 0x0020, CRC(4e3caeab) SHA1(a25083c3e36d28afdefe4af6e6d4f3155e303625) ) // SN74288 or equivalent BPROM ROM_REGION( 0x0020, "user1", 0 ) /* decode PROMs */ - ROM_LOAD( "ic7", 0x0000, 0x0020, CRC(4ac17114) SHA1(1fa34a556fe445a6bdabfe75b4b679cab6553c8b) ) + ROM_LOAD( "ic7", 0x0000, 0x0020, CRC(4ac17114) SHA1(1fa34a556fe445a6bdabfe75b4b679cab6553c8b) ) // SN74288 or equivalent BPROM ROM_END From e78fe921cfa5c9831a201b2124b02110dac8af60 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 13 Mar 2015 21:54:57 +1100 Subject: [PATCH 007/201] More refined and clickable layouts for the fruities --- src/mame/drivers/goldstar.c | 6 +- src/mame/layout/cmaster.lay | 2 +- src/mame/layout/cmasterb.lay | 2 +- src/mame/layout/cmasterc.lay | 2 +- src/mame/layout/cmpacman.lay | 2 +- src/mame/layout/cmv4.lay | 2 +- src/mame/layout/goldstar.lay | 24 ++-- src/mame/layout/nfb96.lay | 109 +++++++-------- src/mame/layout/nfb96tx.lay | 262 +++++++++++++++++++++++++++++++++++ src/mame/layout/skill98.lay | 253 +++++++++++++++++++++++++++++++++ src/mame/mame.mak | 2 + 11 files changed, 593 insertions(+), 73 deletions(-) create mode 100644 src/mame/layout/nfb96tx.lay create mode 100644 src/mame/layout/skill98.lay diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index d6c126b4ba7..b55af56df68 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -166,8 +166,10 @@ #include "goldstar.lh" #include "lucky8.lh" #include "nfb96.lh" +#include "nfb96tx.lh" #include "pokonl97.lh" #include "roypok96.lh" +#include "skill98.lh" #include "tonypok.lh" @@ -13035,7 +13037,7 @@ GAME( 1991, magoddsd, magodds, magodds, magoddsc, wingco_state, magoddsc, GAMEL( 1997, schery97, 0, amcoe1, schery97, cmaster_state, schery97, ROT0, "Amcoe", "Skill Cherry '97 (Talking ver. sc3.52)", 0, layout_nfb96 ) /* running in CB hardware */ GAMEL( 1997, schery97a, schery97, amcoe1, schery97, cmaster_state, schery97a, ROT0, "Amcoe", "Skill Cherry '97 (Talking ver. sc3.52c4)", 0, layout_nfb96 ) /* running in C4 hardware */ -GAMEL( 1998, skill98, 0, amcoe1, schery97, cmaster_state, skill98, ROT0, "Amcoe", "Skill '98 (Talking ver. s98-1.33)", 0, layout_nfb96 ) +GAMEL( 1998, skill98, 0, amcoe1, schery97, cmaster_state, skill98, ROT0, "Amcoe", "Skill '98 (Talking ver. s98-1.33)", 0, layout_skill98 ) GAMEL( 1997, pokonl97, 0, amcoe1, pokonl97, cmaster_state, po33, ROT0, "Amcoe", "Poker Only '97 (Talking ver. 3.3)", 0, layout_pokonl97 ) GAME( 1998, match98, 0, amcoe1a, match98, cmaster_state, match133, ROT0, "Amcoe", "Match '98 (ver. 1.33)", 0 ) @@ -13052,7 +13054,7 @@ GAMEL( 1996, nc96, 0, amcoe2, nfb96, cmaster_state, nfb96_c1, GAMEL( 1996, nc96a, nc96, amcoe2, nfb96, cmaster_state, nfb96_c1, ROT0, "Amcoe", "New Cherry '96 Special Edition (v3.62, C1 PCB)", 0, layout_nfb96 ) /* C1 Sub-PCB */ GAMEL( 1996, nc96b, nc96, amcoe2, nfb96, cmaster_state, nfb96_d, ROT0, "Amcoe", "New Cherry '96 Special Edition (v3.54, D PCB)", 0, layout_nfb96 ) /* D Sub-PCB */ GAMEL( 1996, nc96c, nc96, amcoe2, nfb96, cmaster_state, nfb96_dk, ROT0, "Amcoe", "New Cherry '96 Special Edition (v3.62, DK PCB)", 0, layout_nfb96 ) /* DK Sub-PCB */ -GAMEL( 2000, nc96txt, nc96, amcoe2, nfb96tx, cmaster_state, nfb96_c2, ROT0, "Amcoe", "New Cherry '96 Special Edition (v1.32 Texas XT, C2 PCB)", 0, layout_nfb96 ) /* ver. tc1.32axt C2 Sub-PCB */ +GAMEL( 2000, nc96txt, nc96, amcoe2, nfb96tx, cmaster_state, nfb96_c2, ROT0, "Amcoe", "New Cherry '96 Special Edition (v1.32 Texas XT, C2 PCB)", 0, layout_nfb96tx ) /* ver. tc1.32axt C2 Sub-PCB */ GAME( 2009, fb2010, 0, amcoe2, nfb96tx, cmaster_state, fb2010, ROT0, "Amcoe", "Fruit Bonus 2010", GAME_NOT_WORKING ) // no gfx dumped diff --git a/src/mame/layout/cmaster.lay b/src/mame/layout/cmaster.lay index 82a1b22f670..f423f79e36a 100644 --- a/src/mame/layout/cmaster.lay +++ b/src/mame/layout/cmaster.lay @@ -32,7 +32,7 @@ - + diff --git a/src/mame/layout/cmasterb.lay b/src/mame/layout/cmasterb.lay index df39c2f13e6..00f61ca3f7b 100644 --- a/src/mame/layout/cmasterb.lay +++ b/src/mame/layout/cmasterb.lay @@ -32,7 +32,7 @@ - + diff --git a/src/mame/layout/cmasterc.lay b/src/mame/layout/cmasterc.lay index d9b0f43209b..b0c787281c9 100644 --- a/src/mame/layout/cmasterc.lay +++ b/src/mame/layout/cmasterc.lay @@ -49,7 +49,7 @@ - + diff --git a/src/mame/layout/cmpacman.lay b/src/mame/layout/cmpacman.lay index af48e1a1541..7f7513bbc7c 100644 --- a/src/mame/layout/cmpacman.lay +++ b/src/mame/layout/cmpacman.lay @@ -32,7 +32,7 @@ - + diff --git a/src/mame/layout/cmv4.lay b/src/mame/layout/cmv4.lay index 2fc6dfffb27..3581c676be7 100644 --- a/src/mame/layout/cmv4.lay +++ b/src/mame/layout/cmv4.lay @@ -32,7 +32,7 @@ - + diff --git a/src/mame/layout/goldstar.lay b/src/mame/layout/goldstar.lay index cf2ede71722..81507522930 100644 --- a/src/mame/layout/goldstar.lay +++ b/src/mame/layout/goldstar.lay @@ -242,50 +242,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/mame/layout/nfb96.lay b/src/mame/layout/nfb96.lay index c45fb01e452..c8dbb22cea4 100644 --- a/src/mame/layout/nfb96.lay +++ b/src/mame/layout/nfb96.lay @@ -17,11 +17,11 @@ - + - + @@ -30,15 +30,15 @@ - + - + - + @@ -47,19 +47,15 @@ - + - + - - - - - + - + @@ -68,19 +64,15 @@ - + - + - - - - - + - + @@ -93,7 +85,7 @@ - + @@ -106,7 +98,7 @@ - + @@ -119,7 +111,7 @@ - + @@ -128,6 +120,15 @@ + + + + + + + + + @@ -184,77 +185,77 @@ - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/src/mame/layout/nfb96tx.lay b/src/mame/layout/nfb96tx.lay new file mode 100644 index 00000000000..4373d2a3546 --- /dev/null +++ b/src/mame/layout/nfb96tx.lay @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/skill98.lay b/src/mame/layout/skill98.lay new file mode 100644 index 00000000000..0ae14c87420 --- /dev/null +++ b/src/mame/layout/skill98.lay @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.mak b/src/mame/mame.mak index ee68f57dfd7..edefdb39d97 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -2683,8 +2683,10 @@ $(DRIVERS)/goldstar.o: $(LAYOUT)/goldstar.lh \ $(LAYOUT)/crazybon.lh \ $(LAYOUT)/lucky8.lh \ $(LAYOUT)/nfb96.lh \ + $(LAYOUT)/nfb96tx.lh \ $(LAYOUT)/pokonl97.lh \ $(LAYOUT)/roypok96.lh \ + $(LAYOUT)/skill98.lh \ $(LAYOUT)/tonypok.lh $(DRIVERS)/grchamp.o: $(LAYOUT)/grchamp.lh From 6b43ed08995654b9de735e81ed2429ad2d348a85 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 13 Mar 2015 22:16:56 +1100 Subject: [PATCH 008/201] Better, clickable pokonl97 layout --- src/mame/layout/pokonl97.lay | 142 +++++++++++++++++++++++------------ 1 file changed, 92 insertions(+), 50 deletions(-) diff --git a/src/mame/layout/pokonl97.lay b/src/mame/layout/pokonl97.lay index a95121453d8..a87ef2b677e 100644 --- a/src/mame/layout/pokonl97.lay +++ b/src/mame/layout/pokonl97.lay @@ -10,31 +10,39 @@ - + - + - + - + + + + + - + - + - + + + + + @@ -43,45 +51,57 @@ - + - + - + + + + + - + - + - + - + + + + + - + - + - + + + + + @@ -94,11 +114,15 @@ - + + + + + - + @@ -116,7 +140,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -167,77 +209,77 @@ - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + From bf16d575e4d30b52c6be894a551b29bc8aca1c13 Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Fri, 13 Mar 2015 09:54:23 -0400 Subject: [PATCH 009/201] Fixed rom/region size for 'torus' set. (nw) --- src/mame/drivers/paradise.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/paradise.c b/src/mame/drivers/paradise.c index c6e7a20ca87..a08aa36bb8c 100644 --- a/src/mame/drivers/paradise.c +++ b/src/mame/drivers/paradise.c @@ -1094,8 +1094,8 @@ All roms had a Yun Sung label with no other ID markings or numbers */ ROM_START( torus ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* Z80 Code */ - ROM_LOAD( "yunsung.u1", 0x00000, 0x40000, CRC(55d3ef3e) SHA1(195463271fdb3f9f5c19068efd1c99105f761fe9) ) + ROM_REGION( 0x10000, "maincpu", 0 ) /* Z80 Code */ + ROM_LOAD( "yunsung.u1", 0x00000, 0x10000, CRC(55d3ef3e) SHA1(195463271fdb3f9f5c19068efd1c99105f761fe9) ) ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT) /* 16x16x8 Sprites */ ROM_LOAD( "yunsung.u67", 0x00000, 0x40000, CRC(5b60ce9f) SHA1(d5c091145e0bae7cd776e642ea17895d086ed2b0) ) From 820ec98714cb229971830ac53df8e40dd12010ab Mon Sep 17 00:00:00 2001 From: mamehaze Date: Fri, 13 Mar 2015 17:28:15 +0000 Subject: [PATCH 010/201] v53: provide access to the interrupt lines (nw) --- src/emu/cpu/nec/v53.c | 29 ++++++++++++++++++++++++++--- src/emu/cpu/nec/v53.h | 7 ++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/emu/cpu/nec/v53.c b/src/emu/cpu/nec/v53.c index feae9eb20f6..c43db72d35e 100644 --- a/src/emu/cpu/nec/v53.c +++ b/src/emu/cpu/nec/v53.c @@ -447,11 +447,34 @@ READ8_MEMBER(v53_base_device::get_pic_ack) return 0; } -WRITE_LINE_MEMBER( v53_base_device::upd71059_irq_w) + + +// the external interface provides no external access to the usual IRQ line of the V33, everything goes through the interrupt controller +void v53_base_device::execute_set_input(int irqline, int state) { - printf("upd71059_irq_w %d\n", state); + switch (irqline) + { + case INPUT_LINE_IRQ0: m_v53icu->ir0_w(state); break; + case INPUT_LINE_IRQ1: m_v53icu->ir1_w(state); break; + case INPUT_LINE_IRQ2: m_v53icu->ir2_w(state); break; + case INPUT_LINE_IRQ3: m_v53icu->ir3_w(state); break; + case INPUT_LINE_IRQ4: m_v53icu->ir4_w(state); break; + case INPUT_LINE_IRQ5: m_v53icu->ir5_w(state); break; + case INPUT_LINE_IRQ6: m_v53icu->ir6_w(state); break; + case INPUT_LINE_IRQ7: m_v53icu->ir7_w(state); break; + + case INPUT_LINE_NMI: nec_common_device::execute_set_input(irqline, state); break; + case NEC_INPUT_LINE_POLL: nec_common_device::execute_set_input(irqline, state); break; + } } +// for hooking the interrupt controller output up to the core +WRITE_LINE_MEMBER(v53_base_device::internal_irq_w) +{ + nec_common_device::execute_set_input(0, state); +} + + static MACHINE_CONFIG_FRAGMENT( v53 ) MCFG_DEVICE_ADD("pit", PIT8254, 0) // functionality identical to uPD71054 @@ -481,7 +504,7 @@ static MACHINE_CONFIG_FRAGMENT( v53 ) MCFG_AM9517A_OUT_DACK_3_CB(WRITELINE(v53_base_device, dma_dack3_trampoline_w)) - MCFG_PIC8259_ADD( "upd71059pic", WRITELINE(v53_base_device, upd71059_irq_w), VCC, READ8(v53_base_device,get_pic_ack)) + MCFG_PIC8259_ADD( "upd71059pic", WRITELINE(v53_base_device, internal_irq_w), VCC, READ8(v53_base_device,get_pic_ack)) MCFG_DEVICE_ADD("v53scu", V53_SCU, 0) MCFG_I8251_TXD_HANDLER(WRITELINE(v53_base_device, scu_txd_trampoline_cb)) diff --git a/src/emu/cpu/nec/v53.h b/src/emu/cpu/nec/v53.h index 3eec840fcd8..dbaa7778773 100644 --- a/src/emu/cpu/nec/v53.h +++ b/src/emu/cpu/nec/v53.h @@ -235,14 +235,16 @@ public: DECLARE_READ8_MEMBER(get_pic_ack); - DECLARE_WRITE_LINE_MEMBER(upd71059_irq_w); + DECLARE_WRITE_LINE_MEMBER(internal_irq_w); + protected: // device-level overrides virtual machine_config_constructor device_mconfig_additions() const; virtual void device_start(); virtual void device_reset(); - + virtual void execute_set_input(int inputnum, int state); + required_device m_v53tcu; required_device m_v53dmau; required_device m_v53icu; @@ -286,7 +288,6 @@ protected: - }; From 7360ae65479fab0a5ef6faab186496a604dbc952 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 13 Mar 2015 17:40:15 +0100 Subject: [PATCH 011/201] updated 3rd party (nw) --- .../bgfx/3rdparty/ocornut-imgui/imgui.cpp | 4 +- 3rdparty/bgfx/examples/common/entry/entry.cpp | 18 ++-- 3rdparty/bgfx/examples/common/imgui/imgui.cpp | 1 + .../examples/common/imgui/ocornut_imgui.cpp | 2 +- 3rdparty/bgfx/examples/common/nanovg/nanovg.h | 1 + .../examples/common/nanovg/nanovg_bgfx.cpp | 7 ++ 3rdparty/bgfx/src/image.cpp | 98 +++++++++--------- 3rdparty/bgfx/src/image.h | 2 + 3rdparty/bgfx/src/renderer_d3d11.cpp | 31 +++++- 3rdparty/bgfx/src/renderer_gl.cpp | 17 ++- 3rdparty/bx/tools/bin/darwin/genie | Bin 385392 -> 385392 bytes 3rdparty/bx/tools/bin/linux/genie | Bin 372064 -> 372064 bytes 3rdparty/bx/tools/bin/windows/genie.exe | Bin 376320 -> 354816 bytes 3rdparty/genie/README.md | 2 +- 3rdparty/genie/build/gmake.darwin/genie.make | 20 ++-- 3rdparty/genie/build/gmake.linux/genie.make | 14 +-- 3rdparty/genie/build/gmake.windows/genie.make | 10 +- 3rdparty/genie/makefile | 2 +- 3rdparty/genie/scripts/genie.lua | 2 +- 3rdparty/genie/src/actions/make/make_cpp.lua | 13 +-- 3rdparty/genie/src/host/scripts.c | 18 ++-- 3rdparty/mongoose/mongoose.c | 58 ++++++----- 3rdparty/mongoose/mongoose.h | 8 +- 23 files changed, 194 insertions(+), 134 deletions(-) diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp index 9db3eced5b8..e77f3db6d30 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp @@ -5618,8 +5618,8 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT // From the moment we focused we are ignoring the content of 'buf' ImFormatString(edit_state.InitialText, IM_ARRAYSIZE(edit_state.InitialText), "%s", buf); const char* buf_end = NULL; - edit_state.CurLenW = ImTextStrFromUtf8(edit_state.Text, IM_ARRAYSIZE(edit_state.Text), buf, NULL, &buf_end); - edit_state.CurLenA = buf_end - buf; // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. + edit_state.CurLenW = (int)ImTextStrFromUtf8(edit_state.Text, IM_ARRAYSIZE(edit_state.Text), buf, NULL, &buf_end); + edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImFormatString() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. edit_state.Width = w; edit_state.InputCursorScreenPos = ImVec2(-1.f,-1.f); edit_state.CursorAnimReset(); diff --git a/3rdparty/bgfx/examples/common/entry/entry.cpp b/3rdparty/bgfx/examples/common/entry/entry.cpp index 1007787a0bd..7ef7853145f 100644 --- a/3rdparty/bgfx/examples/common/entry/entry.cpp +++ b/3rdparty/bgfx/examples/common/entry/entry.cpp @@ -60,15 +60,17 @@ namespace entry switch (_key) { - case Key::Esc: { return 0x1b; } break; - case Key::Return: { return 0x0d; } break; - case Key::Tab: { return 0x09; } break; - case Key::Space: { return 0xa0; } break; - case Key::Backspace: { return 0x08; } break; - case Key::Plus: { return 0x2b; } break; - case Key::Minus: { return 0x2d; } break; - default: { return '\0'; } break; + case Key::Esc: return 0x1b; + case Key::Return: return '\n'; + case Key::Tab: return '\t'; + case Key::Space: return ' '; + case Key::Backspace: return 0x08; + case Key::Plus: return '+'; + case Key::Minus: return '-'; + default: break; } + + return '\0'; } bool setOrToggle(uint32_t& _flags, const char* _name, uint32_t _bit, int _first, int _argc, char const* const* _argv) diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.cpp b/3rdparty/bgfx/examples/common/imgui/imgui.cpp index cdd918c0fbb..a2f572022d8 100644 --- a/3rdparty/bgfx/examples/common/imgui/imgui.cpp +++ b/3rdparty/bgfx/examples/common/imgui/imgui.cpp @@ -813,6 +813,7 @@ struct Imgui void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view) { IMGUI_beginFrame(_mx, _my, _button, _width, _height, _inputChar, _view); + nvgViewId(m_nvg, _view); m_view = _view; m_viewWidth = _width; diff --git a/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp b/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp index 62cb1c87a79..19726040b04 100644 --- a/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp +++ b/3rdparty/bgfx/examples/common/imgui/ocornut_imgui.cpp @@ -165,7 +165,7 @@ struct OcornutImguiContext ImGui::NewFrame(); - ImGui::ShowTestWindow(); + //ImGui::ShowTestWindow(); //Debug only. } void endFrame() diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg.h b/3rdparty/bgfx/examples/common/nanovg/nanovg.h index 4ff96151d73..8709db210d2 100644 --- a/3rdparty/bgfx/examples/common/nanovg/nanovg.h +++ b/3rdparty/bgfx/examples/common/nanovg/nanovg.h @@ -599,6 +599,7 @@ struct NVGparams { typedef struct NVGparams NVGparams; NVGcontext* nvgCreate(int edgeaa, unsigned char viewid); +void nvgViewId(struct NVGcontext* ctx, unsigned char viewid); void nvgDelete(struct NVGcontext* ctx); // Contructor and destructor, called by the render back-end. diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp index 40a1fbe8418..6be7bbf9052 100644 --- a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp +++ b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp @@ -1051,6 +1051,13 @@ error: return NULL; } +void nvgViewId(struct NVGcontext* ctx, unsigned char viewid) +{ + struct NVGparams* params = nvgInternalParams(ctx); + struct GLNVGcontext* gl = (struct GLNVGcontext*)params->userPtr; + gl->viewid = uint8_t(viewid); +} + void nvgDelete(struct NVGcontext* ctx) { nvgDeleteInternal(ctx); diff --git a/3rdparty/bgfx/src/image.cpp b/3rdparty/bgfx/src/image.cpp index 53e3acbcd8d..c18d4e939cf 100644 --- a/3rdparty/bgfx/src/image.cpp +++ b/3rdparty/bgfx/src/image.cpp @@ -19,55 +19,55 @@ namespace bgfx // | | | | +----- min blocks x // | | | | | +-- min blocks y // | | | | | | - { 4, 4, 4, 8, 1, 1 }, // BC1 - { 8, 4, 4, 16, 1, 1 }, // BC2 - { 8, 4, 4, 16, 1, 1 }, // BC3 - { 4, 4, 4, 8, 1, 1 }, // BC4 - { 8, 4, 4, 16, 1, 1 }, // BC5 - { 8, 4, 4, 16, 1, 1 }, // BC6H - { 8, 4, 4, 16, 1, 1 }, // BC7 - { 4, 4, 4, 8, 1, 1 }, // ETC1 - { 4, 4, 4, 8, 1, 1 }, // ETC2 - { 8, 4, 4, 16, 1, 1 }, // ETC2A - { 4, 4, 4, 8, 1, 1 }, // ETC2A1 - { 2, 8, 4, 8, 2, 2 }, // PTC12 - { 4, 4, 4, 8, 2, 2 }, // PTC14 - { 2, 8, 4, 8, 2, 2 }, // PTC12A - { 4, 4, 4, 8, 2, 2 }, // PTC14A - { 2, 8, 4, 8, 2, 2 }, // PTC22 - { 4, 4, 4, 8, 2, 2 }, // PTC24 - { 0, 0, 0, 0, 1, 1 }, // Unknown - { 1, 8, 1, 1, 1, 1 }, // R1 - { 8, 1, 1, 1, 1, 1 }, // R8 - { 16, 1, 1, 2, 1, 1 }, // R16 - { 16, 1, 1, 2, 1, 1 }, // R16F - { 32, 1, 1, 4, 1, 1 }, // R32 - { 32, 1, 1, 4, 1, 1 }, // R32F - { 16, 1, 1, 2, 1, 1 }, // RG8 - { 32, 1, 1, 4, 1, 1 }, // RG16 - { 32, 1, 1, 4, 1, 1 }, // RG16F - { 64, 1, 1, 8, 1, 1 }, // RG32 - { 64, 1, 1, 8, 1, 1 }, // RG32F - { 32, 1, 1, 4, 1, 1 }, // BGRA8 - { 32, 1, 1, 4, 1, 1 }, // RGBA8 - { 64, 1, 1, 8, 1, 1 }, // RGBA16 - { 64, 1, 1, 8, 1, 1 }, // RGBA16F - { 128, 1, 1, 16, 1, 1 }, // RGBA32 - { 128, 1, 1, 16, 1, 1 }, // RGBA32F - { 16, 1, 1, 2, 1, 1 }, // R5G6B5 - { 16, 1, 1, 2, 1, 1 }, // RGBA4 - { 16, 1, 1, 2, 1, 1 }, // RGB5A1 - { 32, 1, 1, 4, 1, 1 }, // RGB10A2 - { 32, 1, 1, 4, 1, 1 }, // R11G11B10F - { 0, 0, 0, 0, 1, 1 }, // UnknownDepth - { 16, 1, 1, 2, 1, 1 }, // D16 - { 24, 1, 1, 3, 1, 1 }, // D24 - { 32, 1, 1, 4, 1, 1 }, // D24S8 - { 32, 1, 1, 4, 1, 1 }, // D32 - { 16, 1, 1, 2, 1, 1 }, // D16F - { 24, 1, 1, 3, 1, 1 }, // D24F - { 32, 1, 1, 4, 1, 1 }, // D32F - { 8, 1, 1, 1, 1, 1 }, // D0S8 + { 4, 4, 4, 8, 1, 1, 0, 0 }, // BC1 + { 8, 4, 4, 16, 1, 1, 0, 0 }, // BC2 + { 8, 4, 4, 16, 1, 1, 0, 0 }, // BC3 + { 4, 4, 4, 8, 1, 1, 0, 0 }, // BC4 + { 8, 4, 4, 16, 1, 1, 0, 0 }, // BC5 + { 8, 4, 4, 16, 1, 1, 0, 0 }, // BC6H + { 8, 4, 4, 16, 1, 1, 0, 0 }, // BC7 + { 4, 4, 4, 8, 1, 1, 0, 0 }, // ETC1 + { 4, 4, 4, 8, 1, 1, 0, 0 }, // ETC2 + { 8, 4, 4, 16, 1, 1, 0, 0 }, // ETC2A + { 4, 4, 4, 8, 1, 1, 0, 0 }, // ETC2A1 + { 2, 8, 4, 8, 2, 2, 0, 0 }, // PTC12 + { 4, 4, 4, 8, 2, 2, 0, 0 }, // PTC14 + { 2, 8, 4, 8, 2, 2, 0, 0 }, // PTC12A + { 4, 4, 4, 8, 2, 2, 0, 0 }, // PTC14A + { 2, 8, 4, 8, 2, 2, 0, 0 }, // PTC22 + { 4, 4, 4, 8, 2, 2, 0, 0 }, // PTC24 + { 0, 0, 0, 0, 1, 1, 0, 0 }, // Unknown + { 1, 8, 1, 1, 1, 1, 0, 0 }, // R1 + { 8, 1, 1, 1, 1, 1, 0, 0 }, // R8 + { 16, 1, 1, 2, 1, 1, 0, 0 }, // R16 + { 16, 1, 1, 2, 1, 1, 0, 0 }, // R16F + { 32, 1, 1, 4, 1, 1, 0, 0 }, // R32 + { 32, 1, 1, 4, 1, 1, 0, 0 }, // R32F + { 16, 1, 1, 2, 1, 1, 0, 0 }, // RG8 + { 32, 1, 1, 4, 1, 1, 0, 0 }, // RG16 + { 32, 1, 1, 4, 1, 1, 0, 0 }, // RG16F + { 64, 1, 1, 8, 1, 1, 0, 0 }, // RG32 + { 64, 1, 1, 8, 1, 1, 0, 0 }, // RG32F + { 32, 1, 1, 4, 1, 1, 0, 0 }, // BGRA8 + { 32, 1, 1, 4, 1, 1, 0, 0 }, // RGBA8 + { 64, 1, 1, 8, 1, 1, 0, 0 }, // RGBA16 + { 64, 1, 1, 8, 1, 1, 0, 0 }, // RGBA16F + { 128, 1, 1, 16, 1, 1, 0, 0 }, // RGBA32 + { 128, 1, 1, 16, 1, 1, 0, 0 }, // RGBA32F + { 16, 1, 1, 2, 1, 1, 0, 0 }, // R5G6B5 + { 16, 1, 1, 2, 1, 1, 0, 0 }, // RGBA4 + { 16, 1, 1, 2, 1, 1, 0, 0 }, // RGB5A1 + { 32, 1, 1, 4, 1, 1, 0, 0 }, // RGB10A2 + { 32, 1, 1, 4, 1, 1, 0, 0 }, // R11G11B10F + { 0, 0, 0, 0, 1, 1, 0, 0 }, // UnknownDepth + { 16, 1, 1, 2, 1, 1, 16, 0 }, // D16 + { 24, 1, 1, 3, 1, 1, 24, 0 }, // D24 + { 32, 1, 1, 4, 1, 1, 24, 8 }, // D24S8 + { 32, 1, 1, 4, 1, 1, 32, 0 }, // D32 + { 16, 1, 1, 2, 1, 1, 16, 0 }, // D16F + { 24, 1, 1, 3, 1, 1, 24, 0 }, // D24F + { 32, 1, 1, 4, 1, 1, 32, 0 }, // D32F + { 8, 1, 1, 1, 1, 1, 0, 8 }, // D0S8 }; BX_STATIC_ASSERT(TextureFormat::Count == BX_COUNTOF(s_imageBlockInfo) ); diff --git a/3rdparty/bgfx/src/image.h b/3rdparty/bgfx/src/image.h index 3ddb1086f7c..ab1430c375d 100644 --- a/3rdparty/bgfx/src/image.h +++ b/3rdparty/bgfx/src/image.h @@ -45,6 +45,8 @@ namespace bgfx uint8_t blockSize; uint8_t minBlockX; uint8_t minBlockY; + uint8_t depthBits; + uint8_t stencilBits; }; /// diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp index d49987e2fdf..b9893331939 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.cpp +++ b/3rdparty/bgfx/src/renderer_d3d11.cpp @@ -201,7 +201,8 @@ namespace bgfx { DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, // PTC22 { DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, // PTC24 { DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, // Unknown - { DXGI_FORMAT_R1_UNORM, DXGI_FORMAT_R1_UNORM, DXGI_FORMAT_UNKNOWN }, // R1 + { DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, // R1 +// { DXGI_FORMAT_R1_UNORM, DXGI_FORMAT_R1_UNORM, DXGI_FORMAT_UNKNOWN }, // R1 { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_UNKNOWN }, // R8 { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN }, // R16 { DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_UNKNOWN }, // R16F @@ -728,7 +729,33 @@ namespace bgfx for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii) { - g_caps.formats[ii] = DXGI_FORMAT_UNKNOWN == s_textureFormat[ii].m_fmt ? 0 : 1; + uint8_t support = BGFX_CAPS_FORMAT_TEXTURE_NONE; + + if (DXGI_FORMAT_UNKNOWN != s_textureFormat[ii].m_fmt) + { + D3D11_FEATURE_DATA_FORMAT_SUPPORT data; // D3D11_FEATURE_DATA_FORMAT_SUPPORT2 + data.InFormat = s_textureFormat[ii].m_fmt; + DX_CHECK(m_device->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT, &data, sizeof(data) ) ); + support |= 0 != (data.OutFormatSupport & (0 + | D3D11_FORMAT_SUPPORT_TEXTURE2D + | D3D11_FORMAT_SUPPORT_TEXTURE3D + | D3D11_FORMAT_SUPPORT_TEXTURECUBE + ) ) + ? BGFX_CAPS_FORMAT_TEXTURE_COLOR + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; + + support |= 0 != (data.OutFormatSupport & (0 + | D3D11_FORMAT_SUPPORT_BUFFER + | D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER + | D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER + ) ) + ? BGFX_CAPS_FORMAT_TEXTURE_VERTEX + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; + } + + g_caps.formats[ii] = support; } // Init reserved part of view name. diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp index c6cffc511fd..03503be7d88 100644 --- a/3rdparty/bgfx/src/renderer_gl.cpp +++ b/3rdparty/bgfx/src/renderer_gl.cpp @@ -4072,9 +4072,22 @@ namespace bgfx } GLenum attachment = GL_COLOR_ATTACHMENT0 + colorIdx; - if (isDepth( (TextureFormat::Enum)texture.m_textureFormat) ) + TextureFormat::Enum format = (TextureFormat::Enum)texture.m_textureFormat; + if (isDepth(format) ) { - attachment = GL_DEPTH_ATTACHMENT; + const ImageBlockInfo& info = getBlockInfo(format); + if (0 < info.stencilBits) + { + attachment = GL_DEPTH_STENCIL_ATTACHMENT; + } + else if (0 == info.depthBits) + { + attachment = GL_STENCIL_ATTACHMENT; + } + else + { + attachment = GL_DEPTH_ATTACHMENT; + } } else { diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie index 5480af740cc10af378f8a1c86f92678c44a1ed6a..461635ee772d1ed34b74350cbe4c1c30677a60e6 100644 GIT binary patch delta 27285 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 RMx?PXCbu$N*dgx-`#-`?#+d*B delta 27206 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 IG@DxeAM+NSlK=n! diff --git a/3rdparty/bx/tools/bin/linux/genie b/3rdparty/bx/tools/bin/linux/genie index 752d1894fbc00bdb209dae6e87fc4fccb4eeba01..de23a2d3a516d9600f0651388ecd46a0a0392063 100644 GIT binary patch delta 24098 zcmaK!30zL;|M$;z>LgobuOvk%OPf&EN~H)zh(bja*|QsWmMGiE8S}Nw7~A{?GvgN- zcQqvIkQuU#ofykamKZ~nxu4H zxgzoFR@U_+^{!cJ!Zpialk%Fno84@$AK^oyzW3r@i!H1nlbp&@aA zB!y)b7Ti$Z_8BZkozLkPde&TadY5C{KS^el>Y{8e%BerH36tF} zsqIEBm7D*e?i&>&2VPRGMz@kDT~a%ZJ|IuIq?V43WSMG@xc#jot^`T>doLkxhP+LY zVpww%rEKuJXew@H`*f!(YNPltc1|4~pCvopQ(wooWCwE^C)8pcPV$smt?n8!FH2JX z&8ob3=RdwHNr;mA!+AeHR{M`R-MIGUAnC~{qtTexZlu4I&r2<6a9M3PHdc1HtY(gl zk(*yuAC3K<-Bi~lu9n+eR-MN+VjI;iTLK71W@gR`)u&5avfHXvdJOxZPDoFX8{JgTrQ6C2FRO-hkJjEdgQU_Hd6&_#RhlOrURmDRTHS|wPrNp17mdbq;+tLw8m$Z>bn6Im_fF?Uo$mLJPf zTdaHCFbiICYJgW^=*lP;TkC_h-Y&{gUDX~;uZ~lFS=NqkR3?wRqi*}6LLO1BZdq?v z@9!tPH7^a{elQwKtqUgI$vM4#mW-ro!;EcL=kIF8%GGVVuFDZ6ISY2L zX6Vpb-(O<}^^fmU<@)#3;XgE$?e68w`oTsU14t4OA5|ulw;3i$9t;R0Y};6 zo*H?;6+=DmKpJ#8l?NuWnnUhk7?lFuy_~5BKQOjiotQg{$KKi8IXzFnhIQER1Obfc zV2b?E%u_K>oDtAN^3TI;nuC0?jx_9Egos`;#}Y|S&a^JLqAtp7!p^H3^E$B;>iIk; z+?VCG!(WGdw+63~*6^V~l5+V}j5$6y|GXNVAI8q-Y|l@T<+}G(o5R~=r~7KoVRzZ% zzWT@ED7oW()vsW*9C%;dRL})^UMv{Hwy2$tOhTSJkDSE)gu+g8_T`6jJo&!*;OJt^$??ZVu{8D6F?V_DAL`p5B&1o(k^j{{UU*u-H`10zL+YoEauz$vLCp!H=ff{F}Tjrgf)%F7~2}d^Ovu z(kZ9DZOYN$K$s2f-eXu-c1peD!fTcH2Xy(od_#TBFi{wu!r*n$P+4v?iiWs!3;_T1B8Kr~GS6p}+XMMm$vGiW(| zhr^$vkvi+_FfN@x+m561Y@r=b9PD+bbbe5#(eT%Cqj5>O<3j6##t(C@{2IV`Mz-fV zb3~l;YuXCVrFKio%|bK(oY@$=s65Wvy>Nb=0^f(~&U0RH%ee}e%Dph1r&@SnHzL6G zVoSC{4Zj$}_Nu!sp2A`{<&rPMFz>qD)$s}+3Ep{pu+Hq}J^F&*ZrO?5;{3WRUD!3% z_lkFud+>uE3)rG~jA*OS)ln{%1!r;=U2$O847U94BG-JRp7_0^T>p{!{`ZIMh%-{2!-l?5$ zbd@6>snc(`b8Nq%mt!8OF*iM(65*Dgj6b51P7_TLfO#68c`rZZk^2432^}WGKGLi3 z$+Zz!T%&L_*@TV0fUn)A{WEmQGaJL((WXNS$_l)d9r%?gN8Yyg!zC#i%?!TKH+XcZOGWDO^HX`$229LZqYQq@ba$Zl^G2e z6QOZMvgg%Kr-V~YJ{%?1}nyNniG7j-e#MoPAXL zJ)9=jexepUY$n%xqTYV!Y}pF4dFIW6KUIrIM=boMU@5OyJ^QFB%g%ZH=uc+R58H-=Gi;1f0K$pCr$6Lsg4Nj4d#o#w8gA0iaTiB+oe(?)J< zHDzXyOC3WC7?urk*y9sbM(JLuR0%F04rPdLPWL7ALw<5lRNNsg}WBZ-c!alv?L4r*`Jd9@Y?ZHjI5kTg=(Z27JCD0u8(0 z7>zijHY;#?M_U!v0&d3@)+ewtN-k|&kjpCsw^o{);jo`cVOqoLX}Y=vKMN-bij^H# zhiGRc3b$Yv>J`BDy{!%FEVG09f%RD-V`s>wA!}Rz+DlV4vBd0af#tK| zk&6`GkS$~7`b!O&8Ee}4j+r#8KGyWQUz|6Su&$rBUY><%o!_dAUNvG3WScu=(U=Ws zzwb62t+=DLaGY(EA6OP71!X?s{m{)B6L<9jmym*4?`U~r)`3^?U}N^eDg{n&gCdw^ zs**RgOuxSgvtshBGW{`I#u)cHX~%LJZGe~d&^f~a>u2VPQuq7~wA!AHVSDM7J#%6w zsD4wHz^>BFrtAoNLY*Ag1i8j5+UCGI$sJ$OH3zl})zliJG)F0MzmcOGYguQaX10zx zYS>}&(8s&63rrq#mVDZ=ZVi-tQ@0;|ZCx+i#b!oozSA38+>V9FU{O2PiltLoJLVyK zzai)LtW2JNM&F~)* z1CEz)eBYZV4svl#^OaKVcs5Q2o!?P>C*~jry(3*G=H=WOzNpD`B(84eUp)}u?X^e8 zBXpq?Ytn3BbunGwnYO@Xpp;raA0s3c#JwY>GutH3d`H_lGuuXUs$IvS{8DQy`jZ~% z&vj<5tZkZRGrYqp{$v$WYljd|^I+2m^ylZql?z;K3w|djUuMU?q^`agxg!+Eae$Wj zvRHPJ{_tf>5o$?(Y)sohSX4_ptnSSM4)NRK@}-5jk5G*DfIH#V14~Nln|66_)c@tj zR}NJXnfGxfqMZS(zXN~S!0oE^k9}q%?%`EV zbpzRU*~eVJFAy_R_ARHzL9DIZ><`-FA}F+X`|IXwts z?b$C>FPKe~N0!sVV0NGVqK^+@8<;%5oGSV-hX(7lYG%uZ%P)*Z9@7=nHk3KDvlJf6 zV(To;Hj@mF*kkjp-_wCmHlKaedxo(h#=fVDzHBu6Kr#K;x3Wd0UJhrEncTCIO8c|@ z@|a5cW&rCWr&N+*09(a5Yanyx+&GYZ!7l6FBbWuV-BO8$n+4k7sUdBirTNUdY4d7H zc?&A_;gRgWGP_KbgITz2`=0tnu~wjdS`-^*-n+?1j9dCOMUtKrBRIlW&hX5y&10;H z=a+dm*!tkYAj9>ysJKb}yQVh$!ZoHd)P1TwoQ;-it)i6SEZF_I<`7_gFeE6`+{Iu~ zo%Ewf`UdaTwCA0gAN6;Kvj%2z`;YoJv1~t9mXEY+6f2c=muUTHwoxAakv!vAiahqC zeoGvSl;zJp>R%-wa99})7|S}aSF~U(JI8iWzeM&e+ogY%$Rf1% z@OUnk&B4>z6M5?2`kph`0Bl)zXiX}!WhL}oD%)5q;trnsTta(5-FGHCrpa+!);FHT znltvfzVmFR*2c6dTFhR{Hh=32marJUgXo*4GsTRZBmHQwpptz;9JywIp0vzjF`mn>vyI>BPR4Yv>Sqr=QD1=qy> zzyB$Qi}cUdFh`z->a1l~Y_^E{#Tf81BPc(MUae&XEQ_+USO^y3cUf#I`+<_yp`0AL zw2t{RJvCHOJ*WHBMP+_r7exlY<8;ASB>#fzLUV$jH=^yEU{$7oU=q;3BNYuzY8 z99Q4`sby6bVXVHbDV$Xw0ksb)0bYt~qvZ>Asj zHQQYi2Al8LT1z>?oVNd$eS=8T_s(WDnH;9jfPE}mo~j(&&+3_@v+Ezk#`{6yDWmG^o#j=Ak;eO*pm#*^rJ7D z>;a_|vKDfU8nm{M`N&Q+=u{zVBe$R> zIt78)=&{ob`Dip2jH$8Q=P1+r9F_l`)M)DT#7XfJ6WvXJW=-G`hXhtoZ54@d+u3PRWy`WIk}FRGHFtBs#BNF@!nqX zV-kGF`i$}EG%jJxxUrsz-ie)k$0a8Cd3pPF^zrob@%Hr6PdaZtn90&tbhOyKx$fIy z94T-$4)-_ldm%UJr^yF|JXzQe3psD7W8^bjDijZgYH_1Bb zu25Xi6jG^>e-QFtLLNCl%fKk)&qRf4;mZlX1`O2fHbO3s*5sx_KGIi{orQeNR3W@< zYb_Km!~E3?tWoWDLS7olWqY|~g1*f~^WCy82(RAx6(-0(EbuE*$ioC<1rr6Q3N8>_ zCa4OUGQpp3gj{o+ze)8UAwP>V$vWvLq1c_MISj{+&95bzgLFvP#|wKSAv=!M{Lcuv zpD5rR-eB-+oUnfoUHkQD&A+bjuWPdFB&i`jNAT|6U#`guMX{5GJy_T`rEB(ZA)gcWNFncEYKkC= zxM^M->3}7LUn^E>iPCOqh2F^2p@T(Fg(yI}CsAimh?It#hL;BQLTUC45& zCI<+)udw$Oa%~~=r#^n|e60Bo6Y@MES4D9jA&(MvGfi$UB??9MBP|0|jOQo)`b3kb z2>H2zcZ(fGm6|)~_@`2S-5IAjT`Se(?RPZ!8!_Y$muvDa(QAQgHF*m@cJr&xDNW{I z;`vqYg(mZ_@cbI!8en3H$iMDJlk6Zp5{g6*&4GUm=a<#`0N$;7r)L;ET`bOi{JJcr z&<(-cg7*chrtlLXzZ8^2HU1RxBf%CTDEMiNUp}IF@uIwO8g){+NMIDS!1FA>_;W44 zYy=w%HpkOBzZ?Y}s`P>_1X~HZ3bqsU66|WCIbMLh&|iFEe$GtS=(U#fT|2GA?1g-< zo+dXJ^6yPG*+s|;TWWGQG3npe*JL+gUnkOg3OPgg-!{{_roFYvKUV4_9AY$u)KvX*Zh-&d`QTXguF?}(}g@o$isy^RFiemY@w(nDzHY#J|e+Fc-C3fLj+Oysv$$ah5pM+x~bm)%itj!ZEo;;UU;ju!~?f!Cr#B1^WsP z5R4T3Q&c2M$ioE_1>*%LnAiV-^Fh^yTjl31()kJY5}Y|Bar)T!)Ocx9;-o3l_20gS+A+sYkC0qpd9p2POEe_pdNUgGa%s;8Sod_&A`#cpB^#SYa#!e*>Kw zOVS(A7wp*^>A)|+H1Jz+Lt{xNZ4Rn1mOybCl$uD=d(a6?53VpqfKS0W;H;1e<5utz zcp5C~Q(-Ize+Y#iD)=0n3SJGXFlK{a_pLA%gSv3!XD3Pb`oj}I2Fvfv_U>bOKFfs-QN5Q|TBz+IMg73jlu5>XKNH&_f7j7Pc_ z7@8yu0oXISLTAjz&Eg4YDR^T(YT6PX%)mJC*aGwj_~mC9A}|{)0pEg_E|O%s5M2*u zf^lG79V!HN1b2bM!D7%M4gRh0l(`56gXh3PFnTc@47l097*XCDUA+VufeA|yY~V}$ z6r&8BupIU_lC&1|1#`e?@Dex`d1pyVn^FIJ#|;KJ2t7+6=g z24jaC<#V(Q?7bFU=!WNGFci!H8%xY-NFfhWN^p!5Y=0yYJ6!98FxcnCCrzkyPFNwQmy zg1`_k0*nFYfN9`bu;rKNYH%}n4J-xAz!bvJb-?^@xdB~?ov8ap6bN1di@~~^5NzO3 z&U^$o#Zu<^H4DR0pzm9l}`yLI~;YR)e1%t`pE->{+WC$8S$p_PDFIoh~{TD3; zcZ0jYt8|_06fC1oI@G~$Q{2nX@?}NHB+)UVyF7Ax3$w7_4 zQgAC+@Ds)gybaoPk)(H^C+Kt#1%N@|RPY2?2tEZ%KwCX3NUe3=Rf!L8mjQ2son%(cKfX;4Jb1$Nq-(0lW(C0)5V52*3@x^T@E5 zB;71V*MkEtAVaVWECzdBLW!bv<*TqmY~PLwO|DJ228^*k)*cw(X~+cJwyS)SouIFa1rPa z9s%RPhu|D=#3NJ;TngrbHjfc2;P;>uf){88R1nmG{@`^m37q%@4FiLpA{{scEDq6O zTHvM(iUXi+A51&Y7aU)TfGkFb!;8 z1CF4(B^<#YL8t!ssR-x`)~s1+j0P`)yFlk!mBtdVhfSr?a{%@LFchp&5BY(wz(R0V z{YsjX+d`{$Ms34X$)Vf#9s>Xen6N zsnTc@DM{X-CpZj@0CnJ0a2vQ5JPu}q55Z!vhBMNGZq7PnFbFFd6t3W2FdDRNfeL|L z!Cm0smZ%uG1uO?kLEFKYzb@zz@HQ9?+O?`Q&H-b=4d6mB7u*V71CN2_-~-S$3PYf4 zjSO%T21bJu!8zb+a0B=b%mwSWLCwKupfm(6bVWMwE|>(myP>6E8h9F9-xduUio+`C z3O)q=!A9-i53cWkd_kSFJH`$-_d%Os$j}301G;*m3&9|81NaMA3=Z(Z7)E2ZfS%wb zFaiwmMvs9Dz(VjWSPuRTdJf0;s*Wfai~-kzhryEJnEwGjsM!eA1WW=Cf?L7Y;AyaZ zCyW(140MgbSrLo_9Xg|8U@&+ZOaM#34WMl-#vb$pYjr`sU~4c990+az-+{%knExTZ zXwgV4Bwf)G&;v{Y2Z3o|0k{in&aPg!ZZWpzyUqbGVn2Y8Z7RKii}1< zpf9+m7yQ89{>TqJ3mSB|d5#+?4lN2m0?-rm1Yd)3;Iu##3~m4o;4#o99_c_=a6@lY z7%T_3f+vIE2X+d^v`vtt@4zJRGMEPb8G`&k%RZR@Ww_ZBiUP-=EBnF$90G0tXM?%m z4`2!S2DBNAp6Q1n0|Ue14~F+gi^1PPDG{@0D0&hc2xfqrq7nUI%~(`u9C{k`1%qSx z{KriN6k9=W{6O|JIB_%z8jqtA=nuY*LqTAJ1OykDHwFbIK@U2C4rAd5_6L)|_(aTi zFbymQQ^#S5lO^fHc+4_zUJ`;ET$F_QpMje-P;3PsgV(@?$p|{o2s%x`Har0}1_yx= zU^18lt_0J-?cfIRA(#y|oQQ(Keqb4x2--}HMA z1hxlHgCSrExDm8T!OAxY6#{pH8^C8^F6c8E4FEp}%fY>%%_KZGOhFHUW5H-J9h?g4 zcH<@kH$Q`0!5ULhbFe9B06jrzvLy8dZNaIaCwKyk03D|xBX9_~7OXQJ6#+Ma2JiqV zO_8M2pe^_u^aP`3py5+6|5I_30Ywp52)+eNK(|zk*;Et=dV*)bB(NENT%7?%fV;rM zUgSp^tuo!#|mVqIkp(j!?v{7dI(OFjn9m&}lY;Xekna_0rKIFl!lF0RFrjLox>$WuWHZ zh)h%f?7RvU2V=ova0O@pb3vQAm{p)J=(-vW1;fBJ@cY%6|GBvFT!R|V!!`+ef`5Y1 zVEfN8c3?P|4UPkg!M&j6e8dXq4|ZCMu?Azn3@{-J{-6q81B*au0rn0R4FeB;fgS)K zeu1t#jhnYnlz?5=qszfTpv`9p8qgEW`w}$<&u&H+gAc(H(DN(!Eky8v(O}1~(Z%2n zFdMYqf-winxAC#YLbV-!U>9&II6;S-4BYGmw}Q2IpoQQspk*4K-FBkuz$7pUJP2+D z$9;>8!LR>=3NFIXfT7?=a1Pk|JNSWu zN5H?pP|!6OT@5CI8Q?Xr7&L%}Wz@Bq(pui!mJ*sN?#z?2nkjAUI<>1XwwG}AvD(VU zT3I^aHWvSd(S>G8b2f-xHB-8u9dki;9`uT9N03`9rA^?z z?iEH}Lv73kRo9B^Dr;bGhkZ!3UG7)q!28Gn1AMq}HPG|>s*7iT0Qwa@sBLSsVoML|+Zx%7r$w#N$jqL!9iqIiC*9!YOFijBYYb>( z3TuPW9#6?_&?DxQ)dnr;MrXJ(ik`Gl`p9Yip}{$znwxJQdfYEqxVdn%z!uYq2gGkIlSsrqGY5>Lvb8Q3|(0JEQ4XI~3QJUbRy^ zTAag6aQkZa=xTQ!AHTx=^l%Dnk48KiP7~Ur{f6PRqCKkTOh?q~Pz(5(@)5wIH^hZh;V#^U0G8CxHl6kYI8n%Iqi z*|Ew7a`P&f#>!0+$=R$a69GU1Scg8Q5J7QF#iTNl^`o_T7)Z$MHJOt;9 z(4(WOFJ6($(Es{BGWUW08T2QUD8WbRY=0g04m{NeE1Lo6KOR}#o8UZ{MEiY|*7i4H zH#IQG$|(+Z-dPJ^Hzd((AG9cjoI7FQe#Sr0jNsXbix+bXZht1zpiT(6?v&XHF?D%iR9fGF;tg^cSalCX;Ei%s$0sx+hVE{!lEVZgO_|Vg>H04U^XJ> zE*RAqn$`s~bNwXR(*;3(eG**+k>&d?h{q>v&?1y@Fr7S-D0F?YSoIeAhJocuPXxJ`x#WkwfH= z-RO>Hyq`z4dMG{FTng)fy3C>E9!eYCviYBGtN&~)e2wkygvUDAO~ z{cG6y@M~+=gn!u=z`h&y?$!2r|FVDOgx9Di;ox5F@b3y7LI#&$|7T|mw{l9dvI!6| zcMJBX^J!2|j7lIa>WLBGy@2w2qHlW>>!l3TomyC7Y+jxF@P8Fw>5Pbn{hzfo>R)z; z7Fc6oH!TaM=8ycBy*uouVds&kHUFQrI2@|j7Lu9t>q5HN3yV@E99vgA@=2pzJn^r{ zNTvXP1QlY-AB#Xc+UAd)WQUGk`(r12uA{aASjivjsBeHWN?w~rdjc?|$J6LW0Ct+@ z`akr1 zgl|EA5Be{;qp1tzFRH4}?Uk?(qiMY{r%D&&0|R#x7oY4tXmL~8-COD6T#C<$G2CRz zrH_@99BCRy9viFR)|yxlj!B~^AP6&LRXU9bQd)Zzq>B|~l$8xa-Bec>oGsr%--+iY zF4JNFeFNGTgsGCYjBW%eoh^1P!DKi9P<4XG=$(PsA(-54Q+EC3t(8iKiAEghb)7(C&|9r}W zQa+VM_xoUAY{@GWKD}sosM1S5vW_-|Vl}$Aj*f*QWCzl#P-H)c+`^FW7L^jhP-rXK z2oXo?3t>1+-(N2d)24nyZBgT$m~gMwlYL*s(eE|v&3G?hDdyp48a3G8LI2OZ#k3it zO&i`*m9W>OX?;<%0NU7B8E8KjUmE#N|s0wh`8OdsIea?@rpW~Lesv~tqU%cf1_7G`?U<_fy`nbM4=hAWnSr{L|u zi$(qU>cQ*p00sY+iN{qDFX2}Ha*C+|sJhf0c3;{Tj(s_W?r}_~di}BLdr^FURHzFr z;_#zw9K+~nf2`AqbiKdQ#(w|S3S(QIuef-AJ3TQ2wvzn-#ogX%TZM5mx1sj(Ml1el zU3v!lj%}1MKxu8)bo;-1ird?J;W3uB4M3M9)0qKS_it{er^wAN9Un+-cy8k2tvdwo z&&X>a+|qZ@pn(X8FLuzpftcUBcF-m+8+XvLfmo`C5sN?zYLasVP8|)u`*&u1;y%L| z*P-|bG|-0T!VAx0+qe`>d648M-_iXDgqkzei^N{Acozjmnzoc=h;}P>RTyjXs-dwQ zrfGz+pHKTDk@)T|x)F)Q-c)lCVtY1)4Zgy@7lk@z<>KEpVsU$v zOY@?XkQUGKM1+{)36UJ5Jv#9iO~KAkkw^EVkbE@R4M8aMq_81M7rXSID~xq{n~;h> zckrHf@x>b>+BgJd?*5tbhhT!XpqfK5+59MADB?$@Ro&l#qTnX)3IUbl{)lf7;tVKdB>p+Jt;X3 z@xFkv;?N(MR&iM94_>FIFv~$K!dFnc?~IA7mQ`7Ud~T&cUv!J^C!)btRC64f z*p0k6;%N9d^yXi;Y27%4A{LWz7@322==C_1h*whMF}1Sq(!BAA9sOO}G#*(5($VpF z&R0vQR+7@Q@6D15BMx8H7q7{)zIdq#y=hkx7Opq%hn*98elLY;YY-1T2k6U7XkC)x zuB^CMVbsy{H8^wKPQw4r4=ZOfHl2-7x8cc5Gg@odWhC2mkNPI#d1?>r?YLcBn50s} zaJ8);=T5Fw0oQc8cUN_1}m zR-&flH4(9ALy;4)m`$gwiP-NC;}-*_6+gtvCKze>m@XY4Nk2WJ4-Rc8SD?!oO(KWR!dRFFH0E4IfNw3Whp?+@@d& z9!%4wU`9`%ZBx*c33QL6A30A|dIj#Q`1JK*A1lu(+Ife!tj=J>5bUOX-!ufU$7yz6 za(mb>SJ3vUyyOZhnyQ4f+FkkSgTp@ue;@cCg8weq-_Y~f80r4gl%{MfB~QbGzv*xM zFaa)A7Y~-$D1N-ZFb&JiE0|5YlCbmKR>Az}Z<41gotxFb?--~mEy&~R7VOKQUqsIb zC`~A3y3#QIDrEmp{2Jok1#jAn(Bln9^~Lqwq5l9q9=xkBu8)HLJ@o%G{!^egqkGe_ zjmuJ{v3GSM?eO^(%pIuS48&A-^5PgwksSSL8pj~Y;uu2vW*~br<#?+=jrIFRBm}jp;5| z8u5TweetTrLSL6I%tY1fV6IKE!Adop&cG(GHm9d^kYuYl)takxZgs`H@{@Hi5pB>e zUgWbFggWeTd{Q-~w7H5c26W?GbY?F)GZ%T!qF0dQ0)<-4!&=mnBIlVpY1%v-Ri;qp zJZ$qnTF`!O97p%&;f?ac8kPUrmw1~GjKuRJ^ol5)!xUK1|51Yi=i@2hpk<}ef*TMN z9DHCJj>40IC9Rl`2JN?`J@b{$x;yau=k>xrs{}7+75s0*Zp$+e7uW9;`Z`rgkmr90 z`U~(6<9e}5IqCjcrEbCg0rn_iUncja(F+tioVn*NP};OuS+mlJlZ!~JtM1%zsKQ5M z{A<#&1n+0au(Uy?_WG%}l?{LX z_ zD{Vmbi*ekiTzE%*m53i6!){vtOr`wu zc8QmA2=+A%X~Gi4o#K|@Ouoe=be8uvr0q+vDxPdeMN80wXB*N}F7IhX^_PM7=s!*cMk83iuGSlZIGWlA6WrH+-xfk;+$b;nI?GQOxe z(#2(XpI_=o^_Sxi(1aqFD+A-RTU2VV+Jt{YFlYig0{TxM2e>{K`XkVH6uul>p9=jA z=z~7d^Eg}uy#=uh3{gk&%0Qs$ThfFK)RoajXyx*jRFr|J!C^ZS?V3!HnP^ucWo2UR znMk`ck@7RTo{7n@kk|?=mwQ{0{R+j={z9wDe;t{5akoX#II=TXb5>7Q&D$V=;1TVZkz*l)Io1q97-lkvSbq;!0t{<+QOS%35 z^mm~Dv=4aUmC(O$P19Fmwj5|vX^cS(;IjlBUa54nKjK=cy-wnp;c~%$Urfg95m&0U z3MbX8u;ZnB^~Hz%GVIq}sqZQT+bvg`unO@WNBdSOy>!dl;mb334&onm<=#~h&g=Kp z6g(fm{^`>+*B^lX4D_F_&!%=lfAIgJe*pas=*@XK;^O|5Q}9nxKK~yD@cK5Kir3QZ zXvJ#O_kBCs17Za`vsxMGnBh@r9LMu8O*m~|I0X0Kp?5HS!^5hwMrj})^Q43|*eEu7 ziJ(LRo{smI&oum-9xvLn2K|){d)4WJ+xf7j!hX$*o~}VZN#ymp(nKkTn~gs5bETz~ zzU*ry*FraTh<5NA$$wFdYw=QzFOO;T_(kKdmo;8^u5tBCjbp_BRiJYaFA|?-LN#_7 zpmF(NjRRvfTI|)hJ>SGyQs5CyaYFC)tzxaPathd^c+{-^zr54jJxZ6Fh0TIZ*%#{b J_9)-U{|BNGL5SSz6jC0Z=W+M-ekA(SkYE!mP7`^{dm#9_V|LzWrL8X315 zldOX=BxdZyFmBculcmP}eV%)s8uR-v=k=Q2=es=n_gT(4*OXpwRC>KpR&lKnYZZxK zBi3CzVjFF#3DK6pCS|m`kKJf6@7?$d;mz{v4GVCcw#VbxnS(EDchB7{Yn_l09| z+s?j~K~g|eSjOccgF`baBSSO$*o9^$`i5qHlo^@0tR%HwVF)}zGoE`F8OHUOq_B*l z!r^K~pTY8P=X3jp{$eg?SLE9DOO)9HbU1|~)($X}jUe~oM<=bl$zMYfiU&Z~|CTgzw8t3d^Ed%{VxUtsiCnGk?pO)m-8`+r2`$|;z zQA_3R_tgEPV&!8cs@3RL^3xKv^XP-}^Ah#(=z*-3+B5Dz>*C8nQh~=M{9h*d`sq&+bE$nYah&0YPGs!$ha&?1+mq6 z@y>sEN0JaF^;!gQI@ApV+*wffFTBxJfZy1$PcTHha@Db1LFuV-) z>X{r0Tywimm?O)1zpIBPzGJ=A{YepW;qR(3DON7NrH+`C16|$8Ve*CFbE7BsW-Kvx z>y$WIF8w|C{j?A!zy4hfnQmlGxgjaLWoDWCIF(t*IkCCV=5AM*qOM76!`iBc(mYw8 z+&|OI%$dLXXlY9}QngwZ%jT*{%M#>`*VXgO?Bw^CRKqgQ)(5T!Nsn9bA?)?k)HQVq zYVkVn<@(wM=KMbYdT!6{ql&`;5w{5hyU0B9j z^W5;oJEQTjb>Y)nxu-YIl2KK^O-}NIK5G1?7jn^?+^EeV3Ah`p4I)^7>LW=9?z+=F;3*-`L2A_uTaFR+^g~F$U!}%ynS$wo=vmU^DsqQgz@# zR}A&sgK5y^RvnzgYW-GImvB<1m`7<+th!2mV7AdC&j-B~bMmRH|ZZGPGzXWvzGfAWyOzpMW7 zQEd6pE8Va-&ZBU6y)?jt90pH$RYK6h8$QPfT@zN=m+8YADj zt9Cm2o&4;sdjIHR%*hGIMlne}b<9I9zo%9l>ugbc537lydLQrFxE5{;%}^b_4)~=? zQeb9-Z;S4!i;fRL30ID{9W)-bP8Bgf#nd@>44yxr5qwQBHKMvpc(*;CB|2nggMzwz znz*6>o_EzjNqSr_G}ETgM;(0PdrU#Ilj|Dox{u;{mzT{z_ZBomJQbp?U!Cm8n|$Y_ zFB)ifD!5zGALu&A#inW&@-Z;v&M*l}&KnK)zct+!#PYV7)}3~F*o#W|YUZTUDW~u~ zuhHORJem7j3~OfR)Y~q+R{3LiPw?^$^)$mIVMv0(yTnlS#%L4`eQ6!7{M|H{{XCAz zw;QX8rzf%*YRTyha@u`0@ysKuVl?HH|Ho43&;G8(_tm(w4P;=}+4Xz{tNlwS4u6gY z>a1Ueap}S@?i^LW6xs8{!QN*c&kM>h8vZ_RG%k75Y@v1Gr}uMzI~TxsMt0|YI3mw? zZSn=2AKNc^V-}k6*UU!PMdk6<9!2x&6z1Jmcc1r$TkaLWRPMzTo@(L6eTV?pl9sHt z8c`C|Wqg*Tt!*Un>=E$%aZ2R3s&Um1n_`RdN{(<`T_Xo^Ry>q2GhS7MX zo1FVV?S8epeC&Zb`|5Jwz%@(u(HUNH?rYWhxg6s;_=Xy7}_<@>o z-GgK2b-jG!ff{?m%jp5!3d&41F;&uOk|_c(Pa`t!7Cd>NetjdU{WI7{dKZ;l9gf8{ z3P+PB{H(&)Zqxo5y5xzCp<=Y@(1Nl8Z{`F#;>@D8?QM)CMdLO!<55J$v)GXVBLYSS zHW}D%YuGjVK-@3<3uQq{Vpo#oPpYEY>s*5TArS2j`oyfmE6$TgHEnB(l(_rY{I)1VeU zXezHWsJ9+CTYg~(l4jm0oS|C$dBmc~h^j}bzx>&RdF4L*^DpL*BAZJFn=G-Cgf2N@ zcbxZU;Q@pC$}mbkW>BNb`pXXu>h7{BHkPKH=8mB+mI)ju>Zs0-8oJqN%8VeFI))Z7 zEIDf|Y+s|ZF<1#*Lv{3{h7L_?EOv(b=o2g*?I+_XQsAVnc{B$nGt0-@uovuk+(uVj zT2U2x9lN1?BJaNH}y70+rOyN3Dr+n=72;G_$k?{^I>C&gWC=cgu??hO^M~mxK8lkQ?-OG5Az%^roY2hbM>~elEaXZ$48g?4k~T<7i#{ zG)U6b56#s1hGrZqj8T`piAMO|e$$@CsCC}DuyED;Z7>^>`^noJ#-^&SmH*UU!82O+ zG;iCJT+b?RvyTo#E;}Tv>)yA?U1MA=%h#Xio64*svoak%W?BWT9>(&YJfTr$Y!b7f zvt}&PmYd{M%V6({VDI~nt@A%3cXQ?dYlt};#+uVMbN0MGpKpjj!@gHWBMzxe3$rUI zTVXBWc3fe70uQ0&$Bhbo(FX3;N^>*(l+SCZtzovBu5Mv>;Uqzk*>QDh2k{1H3I2IyN^vT=%h^%i z57tD##ERjZRQy73XTyAC=A$1_j}ZQA7i_oXyr> zYQW4`lS8-6q*?W_rq^w7!A!!se%gA)I!x<=FP_tjhOEAvb&D(-u_5iexuX?#Tzg(~ z{KTf<7;+EF_>=cTcV|r8)$?6K3M(pTMI+XpSMg9I_RQ)DoGOAMnPsYyU;bQwpfR&z za>aA~F+0W>_d03MavR!}^NR9^&KZtaKQm4|_9(EU)edY7^Pm?F%!vh2y(TPy4WpS& z*bz37Iy`{@0HW{&Df_*(T6l= zLvUc!Z*^viW#+DL?!u-q7EWthu_r85Kfg6IFsJO7Skf9gX)6&wc6e79&P7#k@u=}q zSLVlJ>4YomSWEfU%oGUaw9bt+sLdKkc+ecBl%AtzZmeaU$LCCD>!_oKT_z8Gyc@g7 zn@3+-+eWz9%t$TB{)-m7vk)0P>&{v+h05KTr+nZqa&E`U<;v6g z`t1=2LH@6_0DN!93$#&Iozm(tIt-(C?k}+p^Py=pK=Viu9zEd!eZhsl=&&a{f#-Qz z?8QbQWbS&gT;@+3z1a*lP+zM9o6Fb`{nC!C5o@$Un->_MWq99EV8hq`%nHis#JbB{ zE9hw_W*@r~K6t_~L@h%JSjQ~AiwgIM`ScM|LFK=!1P6_8Ycj*IOWFg@e&P7GH%}bo z;+p0wrP}jsoC*(BP<&_RD4(bxU1#R)d4*;{V2;{zNXOu%+c*zt^Vk+ z-M(l#KlSpbsBm*+wyY==``JkD8 ze;{V2ocEd<1+ljB=l3Wuh;@(;-lthX%-u2*i`%lIyot0gh;@~Je@*v;SUc8-Y=hY( z`POS%7|iamKKl3&wu#A=uc@*RbFAO+jj5Y+WW(iWMk9~udDJ$PIkUbL5z0o?G0!oR z49)nteeD}M7|Q0c1$wVAc9t=BstjkN*<6b4%f678SL)>m_K?YimGrnDJ0Sm2N!$Cg zKJt@FGW2JwIA;xD&YYVEunjCq?-9u?m|e3fRKP6I22TxXb1lth)=isRTgtDh)JF_t z-^(nDss^(NdD9yTk7BJr{q!g{%)B=tnf0=(iX@d4BRC>5XLuES%wsH^=a+FO*!s}I zAj7o^RNSNbB*Z?l|UcIu+j3$Oqv|Sf<2~a4guDOLV_~PT?`gANf(Huukdb7 zd)~>Y(%*?;_08mOs`Rf$umf0Gs%Y;h_EDV7n(V=Jal!qUFfosQ0w5M$GwY==V93#oWjcF z@_+QbX0ZO)vTo6uRA$HGXiqBJT)X%dp8H%vdqN#PlO5CKI4IvOW~# z(xdCig*FA>!xE%z)vn*sI$u_wc4e@Y^2zt)xe{@4^1Xi0Nh|`esq}Gr7&9T{|6pnxEkx9 ztYOV~8mg1UezR$YB-}gJfR`CT1-A4eixo0k%2~%kun50i$C6n)N?ea}I?|=}%%63k z1}dtTeV4kZtZUdHk-_gcUGNpjzc5BLiqFj0wE)|+st|?4)>BVau{t!)Cg|zK9u+|Ol;pok^ul~}q zwJY2R(}WGo&1@TP)D6tpY#(m)8(4F*A8>PR1MAC@^{qBySN2L{!PVnYo^3P+FT1a^ zDcEdMR`6VJKpC*wyxo#FPS`tgnEvsnI1*tOciGHb&E;~L`hU(E$(6Ex{O4?6Ef{R} zuq;ct*o=05&$c7d^u2RfEhe8ar~dm{j$Cej=m4`dM`zbNgpIF>e)=IChVbf$X6acF zv!oyOY$O8BK99M&4!|JtO>Io(dt=72JXecgX<11@7a-I+=vY}gX8O@*jr06yVjgR1 z_7;uH$YY&xYB`d}nph8o-{U%Y_tA%sl{{A}%flhnPv113eI&b#gfZaf;C5KkjGz~1 z*w4Xs2|Q7+Fua;C=tZGFvX-?2xMxPNSKdc7^G8;RsXP5JLsg*83#RRd*^HKhcp}-m zC@dq`=CLKR;ajv6wq${gG}D2Lm?)ipV#8zv*XkoIm?hGsBdoWbAJTm=S^0Kgm&cpo zQN(((u{61ewUAd>P*xG^BxhUDsUp@!{>Fly7qM1OiRMV0S?8pQUC+*}Q+N#7VW%1L zkI`88hsBCcN149UQThE8eSc50lXWS%mzjm$Z=_i+TjA+vruXzSUzyd>%g4!e%(N*} zCZ;-#^XWX+*Sk~41aEI&pH5wU61t9!_v$#tr<0F&e231RygI~p7&p$hOGo{a3+96v zYf1qZ&7135<4KucjUxO_Y$xQ#eKonWkf#cJFCpg-)$Bn+?lfGJ`wDqyq$ZCO^5!s2 z9xCJ+{YiW7>9nnIc^RK{nMP@Hw2)(j z953X0LQWL&#gUr-G$Ah$@+=|m8ll-22>E3KH*t-S<5y_%d(rNx!hTZNw=C1_=Y)J-*e?qC zz*18LQSlA);(=Rn#^u+_Of8XgQ!Dg(h9)n-_XU1^xl)to3HepJCVwRSy@hP0e{s`% zw1qB3G)WOnFYT%2!}H>otU=;WU;LUb{89zyVmKhpke`YIKNqso2~+Rs{$CZkAj&(1 zm%#kmc~Z--x`O+KoQpF%zxozw_E6!k3j1DBo};Kwb$dS5@^2@7Cmbf6&@!kFs-Hyz zs~Z%MZ>sR22j+2RP3DWa6n$Asv_!~#FPWU&GliUcO|z>)cD|{}+l1WXcay)q*kGQ+ z+71`-%#Vir8ZDS6^eY52%IK>{=B?fNyE}f7&~F#~Lhw7mlVw4CtLNay#jPP~`lnWq^wD{G@Yb zn*3bIPYt|V?CJ7jb4MNjY{{?N<29$~$C|wJwk9_hBmQ88CcBDW3(OLBd`IS2pHrI5 zzl!tA_L(O0FXH^_?;2oYoXEfKW|QnFjTee>o|*&yFwHNkjRCw{_1RA_c)FW7hw&>4 z#~^+U7aS>=AXq(vCklC*V4A4*3?Yvf+=(M2zxc_BUkCA(fnRq;d4FouNwY-)o#1jo z{*1}5EWu9&x8q5kU)uz?R_g_K3VtEDSMY1W{elH1n&Wi$R6pps`FS(l#ur-7ckHze z+alzyI%d0VYO zChRZTYqEuqe-LsVAtwvDo{*2X)BGC=dATV+91!@+cYZmF0vv?HERkTj=tg%THy8E? zVy1cH1q#3FxoZWq6m}-^^APeK(ZJiHK|gWX0|`3{htGtAuaM^mxlAM&=BCZmv$2 z7J<#^a){qw^EZY3R%t4el2>W|sXOgx!Kg-bk>k7F*$c=@(C0(<-2)S&vCbtuE9h2N%lB&%i&vQF7YZ&FTq&3(xKVJ6MxC@vC``4$pD=tk;aBy>_?561 z;gOqPEw5V3ZYd{DjNR{I?g>GB1S2+o`_E@fXM+>~i4`u>XYshQ5urPAot zP?E0psx*drOHysWN~2|%Bqe}*<0R=P(9RBp`&Swz_%#fuG)98~U^18lW`Pp|D~+eY zBVak$uXm-UI$NuRwF8n2GDvWTHZ{O27>U`56iVM{Y#{;9sDPrzDO091Q|5g2`a}Z3see7?=lUfW_cu z(BP@V1NnAjh))J)JJ3~Nhn=V?xCykxiue-r0!Qt_tN_0Sv%sv~=t|J`3uFY|0=+t* z2fsvq;AdbWIC~Ge9(3M|AqG2q4Zn_(^fMT(!_DGvP%u~q?gd|ciwwcU@6g4aFpa=a zu=IPh7<9{lA6Nz&K+FB8XlG0>&+H{emPe3m)8;k@`fXQHx9zy^ofu-Ok(9#z}0{VkL=Ai;$ z&wTV4I1Ds^aRr$Fp6*PkWU`!dNA@~?f2Twji zI`B8J82{!#`Uf}VP;`2Xn)bo81AW1VU>vA>h62HX&k=OsQqTZy0Hsh#$^q@bJD@-4 zTaKXwUw~;~%nLLSd<2$);V+SY7#2D(Qiq#6xS0(m{Dt5EAHG5X;6@`H!zJlssmd4! z_5{*4V+OnunFh4rg+#yH$KHmEYDgKO;260mubDx+&8q8juEy})SjINub?e%->e%5pX0J4Q>W!gEzrV;CnC+bZU+CU?BJg z91Ge-VF+}%@x{#>+0ECwgLRvD!sXd&nej&`duCW7CAS)kOm z%6J-V=#GXB#bFh61;>H@;6^YJZ0Lb}LER4Al;S4A6A6YPLobXCxED+YPk@`iKHjJR zcpkKj#%$?;E(ZsLk>DvX9jpS2z`h;PQg9*Y6@%{uU?O+}%mRCMLb)-R|3`7-KO8Lr z6G5NOh;A?iJPm#WmV;M7*I1kteGshRR&Wz|5F6i137<2NazH&Ps01loZ)pcj}Dhy>sZuo$%K zjRasIXcLcgpetw>gbIVR!E7)%7=GXnpi_b*wF!Y8i~`fZ8GVo+m=5a7anm*o1&%>i zhQk5;4cr922J^snebKdGDrhqnJp=lK$0Fblp6iDegG2kHA>%N6hN36I3t&3v5QFFk zGe)37i z;8xHd{1r?D?~cQK2c_|7DfkMsoG3|i6EVxccVIHeCSv}l@?C@&<-pIy}+R9XaTqlOa^}gv%pm; zs0ipV1L?s|pfnA?mjms^~m~XJ9&kuHa%Y6#NrR1C<5nNw6uH2fBg9UQP^2mBK(20gM+k$H#}&>#E(OayO$>EOL}@CWO!$7}$@L1{krjtyuS z=(7<$0FK*;t~`yKSx}UM1>hU71hiRzp!pOP0=p7w4EEiME(XVerC<(dvk<}eIVue1 zg2`aZZKwda7Ayy6@8n~Rg$j%Y^S3T3B`>Oj05NI z!?XgGuh27~4_FG00^fk^K$|7-`x-3*uY7|c0$+i9LCvRNX3VrBV3>L*AY0eh<&`&M-&6d{XJ>16Utgb`=}%nwO1TzaZANRp3#*Kfb18#+Y;STNwr+iHn(on)&=bk zr=u=PV~TT8EamClD2eOVQihAtMIPCm&IT$D$`cDb-_c#D*kiJ9g}!Xpg92M2%kOD= zD`>CNK4=5IdsZ5GEwynQR8upqtNIB0JM2Sh>~h~~2i{MP803VWRIfGq=^%x*Ry;d2 z>{V&BWgQ85c=A^=&RNUs%E|DEYId4u{LOEEkA0}M)8ro{b+a_ zm9p+}$HjtZF!CXpQ) zcOE~k(zupq*T<@q$t!C5ho{?GA7?aL=dE~R9XRT(3}BgL+W~c0JE79(#uJIl)c2@J zHU)Hm^8uRP0quEC>pEa%dXs9dE*kiu`k z+0^0>3Oo$wK@%&D=%|{DSL8DE5zv1)(KbTrg~4JZa(Ob29s&A55{xeWIEu37+Ou&e9*@4h;>1y?wkDIwwUUK#djBZ zcfkS`JcWjLL11pA9bGW0H|Rwd%*=*UsjV-9JZ35l0+Hn$U&JF#tu%J1t`*4pZG_8pCK`T4YptIdjt1rm5JDi@9cXtGUdn$!@hqj2;byqwsy3WLCnDI&EOb@#& zZtNY|_CQ_}W>dEwsPsFE=VI46w6cfNtC{)SN@FUoe4v$$Jl)DN2)9o#ed3^BA@OC! zk>s98x1HR2qI=`!(eR#V#+-SyvZvCEy`?ifQI|JV)>CPtvzY(k*81<}!q?ayPI$C~ z-PBd4wP{+-Wa9P_us4OB55Kl{CH==fA9gp`d(_zH{>Q%639nLv;owo@@ZSm?Mh1gn z|95wcuyRVYvI!6|cN6xc`Bc&iqjHRxA4c450d@03-yWw$e#!t{h_2Guye9XU{}f;4 zjEIN*-?cRAKX%6!SYu!}EeodRkNl6l2kfD+^GMX1|Lyl;*>+ zb&VsRG}^@zpF>8A>8L+~3bEynMc`|44!};*GL2FKu#-(mqpt$6l21sZvjNH|*=7;7 z4aAW4UPQwKvD0j)eSsL#t8|9LNM(Ua7p2zXO5
aW;Q&)!N$xz%Dy>8*GSoB_SH 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 JSIQpwe*l!ArG@|i diff --git a/3rdparty/bx/tools/bin/windows/genie.exe b/3rdparty/bx/tools/bin/windows/genie.exe index 0cc72817afc20fecf6797fd4f147b1a016324428..e2392ff839f1110df1fcfc23543de30d4f4189c8 100644 GIT binary patch literal 354816 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 D{EY|R literal 376320 zcmeFad3;nwy7=9ljSgEkN+hmCjG72yGH!{2=8#S}4IPZ4g5y5XsDle5-GU1wOeYS9 zV~@;S=QqyGy|e1vnQ``U5OCB^0tt(zxajUjLHidvlzu%|M=}tg@_r32Q_x|M8w|N5U+J`W$gVz}qo!dFgT z<_*7c`qg*dHK%0u{rBB*|E>3wG~Igdz4t{*zHxiW{n2|%?z*=mc*XRRd+xjK_VL4p z4K8&-H`aMPw>?_u`RVLKS7&v@DMbFi{5L*w`@D#J`X&#LZyA5vt&v;#yhMf@$PmCCJ4Nze zji)g&{(h(8o!3LZ629NS-@Ie%-BL4two^}!k+FJ&F}Lt{z<)KKikk8BoO;im&WAtq zeGGrwzM|eY=FE|%3E|haqrXeJ{MYKaB{BXk2cAP~cqa9KeRO^LO^mO->S}3or~Few zJsHA^W9!u<#z*ef{pxz~K-c@nvGs0A2$=u>zkUjIHS7Pz`$xCwLNm6btTNHOaN@hW z(&>h;_vDY>nD0RpJw5p&vQN3$r$YBBa)*__d_%s+&L2Wadm>^k7e=Y*r(TcQ(~;&s z^^10|$1eJuTBemh^gaFOi|zce^N-t~@38{vrNv%PY~oCBj>j8mu1uJ*m1SMarE_&I za8gVCqdjKRuy!yr<3*F?k9Y0DOT>gkTm8>XDQ;ePaELc@x%|oTw||pPV=H7>!~Kum z$cz2`K3*yl?VJ5SNF=9H(!9is4_i*J>M8zldyG94p}{z5uvj?_)<}bsC|Lr1s_guF z1`)J}UBRDlJb&YQ1`#jXr2h=t%pWWNDgBcFAM(cvmX@eF`@9tE_t?s+t_;16YmBR} znQ`rObK#CB=?kE1X;PV3K8!aresyU{UHcl-dSjpYjKBR)(DZiG&O5V0(Asa>GkvB# zapI@>p42G+=vE3nW_6dp?QH5TS15e?4b$4a+w}kC)Zf1gBJGLjJ9hq$c&vOY*5~!N z9Y;kwe-Q=k34hxyy!GUN{EEYHJAXFix|-OH_P6|Pr}GzX&AUd!iVUr*Ost^DQ@JL+ zQ5_eD)$w6dzvK0!i+-_B#+`o|V^N_;^@s0&fed_>hSt6%QjouJCk(Xm_hKagx=UKv zf@9>W$~CECcRX#IBNN)!M8;_`Fk=a?e`%ogP|1Ri3~RL!+wE;VG{*1;SEt_ZuRnA^ zwcT`J(LvD8zn^i{0sVyi!O|PN%LaqDzkMhFTKNYswn6*MVyO|oyVTpzv@_K4L2lSe zsvUd0w0hsPRzc}qFXwyw-@P7*tb8j&Z+qxFY6F$b_-wCf?NQImvlaXogBkgbX?29G z-Da%ItNup0QT@-B^`Y2K-;|!Efc|_|!j&Rb*WYyWjm8be zja|)4{LckTZ%G!4?E6Oth5L)&$@e@jN+zss{{${AAI+OOPD8nyulmDbJ|N`(98w@$ zUd12Px7&+Y^yCMrBVyohe}_tF(RcDEQk2{zO{`7nqLcUVR?C~{ThVd{#E<#YlkcOV z*6?QlmRv-gy2_o&e;!Gvtq%X_8jt!3O(zBX7)Ntg<>WppoS{ng2vuirQN<_v5 zLDO2NCLWN#9qKvAXIi~hr@Fq%>sh8h$5xhH-?e0k*5%lanFE^@NHbAo+L~66Qa^xh ziOAi6P@h~Vj6b&!3Z-AOD`H1-BBNtRhD9qO)GdQ^JRz%(YBfu9)Cm_updSk+@uFL^ zUsU=cienU~Ukjo>@uHdf+d*2rC`?grQz3Ob_*8C|4u4lIvRZT-wWNxseHm3u`|8pf zsn8BaE8v5SP`!7Fu06r2tpv%4dVzebA6RoaHAU1{&J<~b63%~EHaIen8hxJ$ z5xb#9x@gKSu{_b!1={-;=&s%>ltH7ny{Z(nmdO}W$GI%%RUb>4OYpMmZ|V}$c?_3+ zNC$KXrL}PqNNt%Sy6rTrgXtpAC;dHt)9HC(f6u>TWXJYAdqB@6jL{k5viu^fcKq8< z|2+rgGyHW4|BE9qT7zdLPB+sX-i@hUUzVfKKE;B-jSlq!bhbdXcdzL`XSMqD{Ql8t zaa!_a`YoezhJIfgFp8&W3uE8%W$7mrJ$4j&WCQ4@;a4HtDD_5~ri*UciQR}7z08Z| z(Y5m44vyWCF+IW3aqxp$0bT3r(s5Gfb)>lf`5BkWafB==^mBWuf=d}`ShD0x{93O* z+Q)3wNNv%LM|Lm@s|y~P@y4O)qShVsZf(V~npSR4txtd|&j9e6684yB8JlM*?MoZk9y)p&*{ z#EtyRZM;Vv&L9I}#U1LGy9`CM^jtGg$JXu@70^YZKi~`d)U%XoPIg9SnC<%`SA}A0 z#9Uhk!q%F-f5gi$4{Vwi&nwigd^oTv>|JA2uYTklvuRC3QzBHpdP;m~ff}81Oeb*t zPjsql{|hX?EWdqw9N~8?K>R9eOmH z@ramPk?KPuFs((4=m*&Qc|l?sa=K`~6j`0ihe9C++rD|mDhWw49_O7>93<|Vz%=)_J!Z{%z?-7CX#$V3f_YCS1`FH(+N$?^7+K-gZ^FR0d zQW0Z2Qu;_Noo_u-T4F^?ORc+0%lz%%p?3RzoTFPo)Zey>*Vqv+?>Fi9zw38=+ouI; zJX~6%hG0Qj|4}*|h~DV&&9O&HYYM4ft?Rc_tvU9O(xIAO@%+mvoi}Isbrh$I+8srg zGSoYsKZOU=U$@b;t}d-eT@_0gM2+_S(Ni+esdAZAi5Jy5H9J#fAa_&+0Y-%@bcJAN zY7mXW@`4Xsk)4Cia!l2w`a`e!?Rk1u*&yn-cRVs+_38;o-R>CX61Uz$r`~$0w{~E? ziB7$Ix88M5y;r2(F9+5ua_W5;5QKVFCG}+5tB{vcUb55Pj*LX(KnbJ!r!;L3Vr%hI z5@I>V?(%pR8Vlj>ZD9XT#p3~Dkd4{g276B%S$ z7Z!HPf&@wkib4tF2FHG~^ci-%=Jy6ao^vJZly&MipL=9Yv{HBxFM2-np;tZbeE3{? zi5ETH|KR~XQ1W9+1ks%d%fy$XRr@D_*bUY2LKHKL)Ri0uO&n# zj^Pe7XG3y?Wf`yNl+@lyNfzVJO7(cuzscWt(NCOKn34(VBI*V0aOs4~&4x1@FvlI+ zz4`%?4MTt}8q^ydsa`!>#A#e2RqB*WpKq2)Hy!HE_uZK#H3;J53UOj9O-JI58;zTc zoAvCza7PU)Xe`SUMT|dEIzi?c>va)-CiGG7vogcS>?6w1E=wB_znG;s-AP|hjFrAn z!(R1Q7{vVa+AvmipS>r=%+j6eClre=9Xl9jm|2&01>8hSLoVH(gGBfdm(bg{0VwdV z68KJ6lX+YL61w~;yr=%bzXd_CFVUIOd!*E7HFwq zS(c^83>_uy zHmn(oeOB|r?VcL{bNJA`>J3oKI0TKd1{?SvRBzgBdN&0Z<$29?!st*wGuD?E-Q}`! zBSdjMC6EHy4QBk`OJ$j*+QG!Nyt5r|-Tx`e+s%e{*wrsZKCC?}!czCMeR{pbrxkg+ zt@|-5FK_mL6gNTL>3+ObUY_UU3UNVPuo9L^6*8`L(W@We11xPT{ViXE{-uwVYEuGw zzjF%OG@kJ5Ifq|XTj?UcNR!|2m)BPJ^*`k`i0{FtUpvpU<@ssn`A&Hj)uhfX^8733 zd8R!7(s^!_=U+I_rab@Ld9IP?pE=J}^88chxk8@*!+9=~XK{ppU!q35D?))we^C7i z`EXdbaHVj<6^a22bl1~mdM&FJjn!NUmbKge_!fbvRcZO@+Qzi4pafxZ3LpPS__=Du zr4-7v_pNPO(phEr+XR`A@bP0P9V%C9!&!tL9TQ{#45I#ZsG~+hz|ob?UUeqlvZ8-I zD%h_`-xni=75Oo7Ni=a}RwZ_f&X|?ztb_3;WoCOiG88LrT3`6vuZ8Uxom2U@GLZ^6 zh^fcHDtS9)7$SUK*45W8E35H%rmNcsrkdp|wU1z0>z8{dg{b(g1XLuf5jhL5b#VYs zWEh@FG`HJx9`c{s=`5zyg+SJ$BG$2RrNDGtX<4nSGr%q_Zc5oP3#GvyN-wTQ6NC-C zV6tv@p2T|n>&y&C^~8Df@@d@%nmt)+-unp~PFn4B<)h}<8h?4Dw8Axa>(v{e)Sj^t zd%|%hnwGOv0oDeOx6IS*FI(+zKMYr0;Cs|fbe3eT>`{;MFx3_9TK)Lj1zA(^qTlV|BU_q7jykfSI4j17&}xrH$SE-QibWFtrA&P7YD1i z%|C6g;XjATTpI87U$>j^N@A~n=57rk+5rwzH4eRD?=H3fU!dXbGOIt2p4z^XL9dU{ zD3Jeum>K;uR!jWxFK1wnu^)TXzwxxhUj`L3G_L8N%QEX!aoH|7wO_(nCf4R-{ca(& z)tts)uYL!;-Cf?NeJiE`CkEkiXq}n`5b49}HkRdQII6CDPvR`~#8`VnO&fz)l5uJ) z><<#WBM9Nj)8wznPlLR0nq ze*No#PsgI>5`LYUIuMV`crkQ%C`-KyAsH{IaV*1J&7-a_`MyvtOr*R@^_?V&QM7fC zHkO99QvEwkiIu0{BI;iKq5pB2ye;0b5vsE;yBaj`*;}l!xPH#Q>n{m91E^H^RtBm3(r0N~XKj z-}sU>(V>&Dv(v=R+NaioczO%)CVU0F`2vrRW`%l)N4-ACdWc^sU%%LvH9o!S-4h4! z{zF_rOj-^Djt-M?ZfBe;grPeAj9?8=jIh;>8a-1WWL~E}M}u@tY4*L7G%b&DgiCbbJ`!v*Ewe>AWrbOw~9#AC?tG8O|#nGVTAH-D1@gsPoG6ztv zN;+OBeK8v*#Zz|UU*Y($<21YSd-AhdvQCw51A%za9WuZtF=t?HU+`^5*B^OTj~2Jf z+N&-Vfjg3K^+cw`jub}fVn=eLVX=SW&B<6#qJo%atDAo%Qh}|`KM$*htzNArU@~Qe zM8$d@ouKO}mR@*Qp`589W)pFhUR5SvwH=fhFJt@4tk+%gtW*DXf@ag14kY2wP0aKxYqcE#$}*7FNv4q` zZIfjj>(mU4VdZ8Vk4&AC>-A2MRLQ9BI`t@OPYw0#K#QE?Af@htdhy01p!5_%>Ml$N zpd@jqGPOW=Gys{3>yvZ9#SvbY66;hGKpnGgb!Ws^ZThE#0{c=wF(ZA!Gboj)Z~|NfY{0TGFRWpQhB2qvUyf&`cMWzs9g#W0A2c z*UD-f%hbQ7d}ic8rEvnVY_Vx=QulU4mTFlKqd_{B(dVVOG{YV3zcdxWT|WD!q9YhlMD8O%vF8x$C&hlt8q3;3z8htH0CUEp+D- zk&T~G+Ak|&9q!hg;whbQ*e-$+zu*D&Gkh*^8>QJaRDMX_>?HBxTcqbRSiXHZ;a+O;L7Jw0IP zecj++VKDjBj4>h0%F^)5Q6XD}VHXZ^tPTR4av4wsgM?GQ+=Qx9X#kpI&JX?v27#}m@4 zBZD--Q$y?=1ZH0n6Zvxm0PZr`b5^2(59!}r)|Bp zZ?AtuK`K`h_)W$mYbwV9t0BnxkdH68Mq8p2!*-6|fulX!5JjW3Cht+BHi)e64L2oZ zO?~E-@|L@}#ur;n6e(fV`Z8iF3)Q1ZRq@honzgJxw=`I*;4b^9b)2LVMPEa?fRzu&p;}jJebb-D-hdQM@>r=w|6w8((!9-! zo^01TY|fLN`{PY}xH=!UcCZtEmZ4MiG_y4;dcmnZ@!;_Ok_TZjq|pBU|E2#Tr~l!) zf8G1PB~s09@2B?new^F;-*qScpC(dF@12r~h#oykI-hdQcf(!s}gVOyCOD zI~u!+40X1!>Wpo>Jl1!@+}Y5z^)T#d%KNtI?M!b+wR0;sFB7IT8~*Vg|4%yo!OrC4 zyc@QsIyV($%8)Dv$3sm1N~Fp@K17aEb!Vg*mn)h_r1Kl5eHAHgH32hzMX{2NY4QC6 zsrOC0z^u-7&`V7)?HPfLeuaens1_+sI;W~rU3?I}Q^T>p{`Bf-ff(LMe#V~Y**81Y zwQpvZmAzI*r*XJ<|D?esQPL^BuD5m&RWL;r%K29tg|5gOX7z!HA!!q@?60SKk0^#) ze@~|V!O6Nl?n&f7?HXTotuOjB*%#WXeu-#;(f0_-LJ=pHd+e@asHYn@0f)Uw>@16`5S0B+U;s6^|t8=hC% zQW%mR9tr&VAu$k1HTYWSEQTT()}HoU z1fV^k!#vT>RD6nk!AVAX?UeWgPbk)fcwzTr-Ng;w)phNgNp9KqRLeg@9UtXk(*;EN z=jumTqGRTwy7CVin%-}i^**84RiW6*K-hbGz=(a}^*?@#*qPWdTZ0)-#DMYrwngTK zJc2HL`O$BMY>3gIO*8ItQeBGCmY70n3YIt!-GK-fhwX3IKv`!O>33o^}AtU znN*|pYr*zwtFKFTfw#pAlC+)i`1UDIb;gRM!vBnxZ! zP#dV+8Kh9siH|eH-Frc6LqTlbZclWd8B>AS!IRL3K=dq&lnpV^_?aDQl(@T?PnE7E z68f=Zkl|YRgCDznSAP+iZ^r7Y@=^~-FKj27<(o`vt#z;?N!xex%<{FS4Q{cIOU#Z# z2(Y=)Hv3|Syq5Xq0)$*Kb|UAs0rfM?{jsCUT~J}#jm~gJS(AM!-@=bPi53sDC)y{? zzS=f9x#_YY)95dMr1X}czdTqvn|~iGZPi2DAXJB^6K{m5qP=!=1$!To&y9Z4X-%|O8fI)(RbK1V zF|E$3+MWz=4~m?aR<2q{_)I8PXOWk&*XY<;5Ziuvoqy?0GCe|8k65bMp|hsOPnqEV z&T{SI3~SggQ}M{}aR4H{-RSsaRH);_yaw-wsUf@!mzR+DlMqv=m21FSTdKNP{RaO@`2E}3HETDmdV{=uU5)b=qbj}bePj_ydF zsUgE>snO81e~KO4U81cO9)NW`_AvP{^BNrpasvH8w+E_3{0wrxAUiD{ywH>K(`%Y? zDY+t^cY#T`qyh}>UT?fp&fO%IB`m50$!cdP!HG^pK zX<<1_4^0uAAWf93g(#Dth|iwtvrOOqTJfS4eq`9rH5@N`D{uQJi5I<*Cqdf2gsq7# zUj7G=cIJS`ge)hKf`I%9gXq;|1fn=f-Exh%8SGN$!oXmmLP+Wup1*D75O(BP;Iy46 zf0HQs1T{~dB`t@rdRW!~2i4pexDQY2y2v*C{}@ZQJumFt?uvoQViD7W^Jdi+M~*v6 zCXxoSb&Oaf&!xlc3Sje>q%Hgy5=n%VR*{MU8t4f=0L@Xv_cq-7B@v~i*isBZ}eewdp zN#72fehgF}2~x=o2y4*VceE+#NR0|LbsObxn;q}vNg`JKTCX@m4e^nAVQWS}?b@rS zrwY;=LS7bExgl#1>s|vl#k40Eo3VMto&}>r@yUTu^*dm1`X_NpU~)j6gn@M2m&thg z%@xToidxscGctnG3TjS?UtP6ZEu5=oFwFZWY3#dWyK}BZzuGMxEWtV^tfbDF{QowS zeW_;#g$>J0K{ClnH>Z(%l=`|Ok^k*k^1lgN&RYhnRb;SsP?O1gnd0iJ>|*Op90|sS zmsBJ!xAt)*efjE~-D>ay9#2PV_`;MB-E4ZxjOYD_#C}b0eO2;lV7Q(JtY%Bi*>s4U ziA$YVxjA)e>{3tkKr+69Nuw;*ue6~v;%rQcRViCe`B~OlkoRd z!%gnewww8NCldI9I2c5&M28~7T{j}+eLHN;4b(}_gI3R>=Q}$qEI)Wofl;IZqnjf+?~{vmUR^*eJ`qT53uA}S?(#Ry z+&Z+bz9O7EHy{II{ZDlM0Ut=$P>ypvwqlB!=iv_(9b* zhmkvEnNUffv3?9L(!C6eh%E&1w|xhI87q){h!<8P(`8AL+w33zIxAyV$APJV2MTyy zoyz0i4*$O;+E`HB;h-{nN<8oHd7eJb6xUY`u$?^CR`k?XX*+r;b%{IYhU2qJA}4Bu zdeyHKU9(E(*hSGbALn^er^OyF&XwF%HZ82RD&~HdREw|kT@*DW>+y%nawDhc=yg)v z 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 Tdv#4J=>K1e%1dD#o&x_L_=8br diff --git a/3rdparty/genie/README.md b/3rdparty/genie/README.md index 0fc9c18128d..4abe8049d68 100644 --- a/3rdparty/genie/README.md +++ b/3rdparty/genie/README.md @@ -14,7 +14,7 @@ Supported project generators: Download (stable) ----------------- - version 206 (commit e65d8143b1186496b9da03c6461a25402a2ee873) + version 215 (commit 76a21acb8d4c45fbcfd0e2e68feb912934094201) Linux: https://github.com/bkaradzic/bx/raw/master/tools/bin/linux/genie diff --git a/3rdparty/genie/build/gmake.darwin/genie.make b/3rdparty/genie/build/gmake.darwin/genie.make index e532179d4b1..fb575d44efd 100644 --- a/3rdparty/genie/build/gmake.darwin/genie.make +++ b/3rdparty/genie/build/gmake.darwin/genie.make @@ -40,12 +40,13 @@ endif ifeq ($(config),release) OBJDIR = obj/Release TARGETDIR = ../../bin/darwin - TARGET = $(TARGETDIR)/genie + override TARGET = $(TARGETDIR)/genie DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -Wl,-x -mmacosx-version-min=10.4 LDDEPS += @@ -115,12 +116,13 @@ endif ifeq ($(config),debug) OBJDIR = obj/Debug TARGETDIR = ../../bin/darwin - TARGET = $(TARGETDIR)/genie + override TARGET = $(TARGETDIR)/genie DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -mmacosx-version-min=10.4 LDDEPS += @@ -190,12 +192,13 @@ endif ifeq ($(config),releaseuniv32) OBJDIR = obj/Universal32/Release TARGETDIR = ../../bin/darwin - TARGET = $(TARGETDIR)/genie + override TARGET = $(TARGETDIR)/genie DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -Wl,-x -arch i386 -arch ppc -mmacosx-version-min=10.4 LDDEPS += @@ -265,12 +268,13 @@ endif ifeq ($(config),debuguniv32) OBJDIR = obj/Universal32/Debug TARGETDIR = ../../bin/darwin - TARGET = $(TARGETDIR)/genie + override TARGET = $(TARGETDIR)/genie DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_MACOSX INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -arch i386 -arch ppc -mmacosx-version-min=10.4 LDDEPS += diff --git a/3rdparty/genie/build/gmake.linux/genie.make b/3rdparty/genie/build/gmake.linux/genie.make index bc4c40cda53..7dbdb0534c3 100644 --- a/3rdparty/genie/build/gmake.linux/genie.make +++ b/3rdparty/genie/build/gmake.linux/genie.make @@ -40,12 +40,13 @@ endif ifeq ($(config),release) OBJDIR = obj/Release TARGETDIR = ../../bin/linux - TARGET = $(TARGETDIR)/genie + override TARGET = $(TARGETDIR)/genie DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -s -rdynamic LDDEPS += @@ -115,12 +116,13 @@ endif ifeq ($(config),debug) OBJDIR = obj/Debug TARGETDIR = ../../bin/linux - TARGET = $(TARGETDIR)/genie + override TARGET = $(TARGETDIR)/genie DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE -DLUA_USE_POSIX -DLUA_USE_DLOPEN INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -rdynamic LDDEPS += @@ -189,8 +191,8 @@ endif OBJDIRS := \ $(OBJDIR) \ - $(OBJDIR)/src/host \ $(OBJDIR)/src/host/lua-5.2.3/src \ + $(OBJDIR)/src/host \ RESOURCES := \ @@ -211,8 +213,8 @@ $(TARGETDIR): $(OBJDIRS): @echo Creating $(OBJDIR) -$(call MKDIR,$(OBJDIR)) - -$(call MKDIR,$(OBJDIR)/src/host) -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) + -$(call MKDIR,$(OBJDIR)/src/host) clean: @echo Cleaning genie diff --git a/3rdparty/genie/build/gmake.windows/genie.make b/3rdparty/genie/build/gmake.windows/genie.make index 237eebc1c18..3b63871b978 100644 --- a/3rdparty/genie/build/gmake.windows/genie.make +++ b/3rdparty/genie/build/gmake.windows/genie.make @@ -40,12 +40,13 @@ endif ifeq ($(config),release) OBJDIR = obj/Release TARGETDIR = ../../bin/windows - TARGET = $(TARGETDIR)/genie.exe + override TARGET = $(TARGETDIR)/genie.exe DEFINES += -DNDEBUG -DLUA_COMPAT_MODULE INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -s LDDEPS += @@ -115,12 +116,13 @@ endif ifeq ($(config),debug) OBJDIR = obj/Debug TARGETDIR = ../../bin/windows - TARGET = $(TARGETDIR)/genie.exe + override TARGET = $(TARGETDIR)/genie.exe DEFINES += -D_DEBUG -DLUA_COMPAT_MODULE INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g - ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. LDDEPS += diff --git a/3rdparty/genie/makefile b/3rdparty/genie/makefile index c3caf34e9af..8908d3fa3fc 100644 --- a/3rdparty/genie/makefile +++ b/3rdparty/genie/makefile @@ -41,7 +41,7 @@ release-linux: $(GENIE) $(SILENT) $(GENIE) release $(SILENT) make -C build/gmake.darwin clean all CC=x86_64-apple-darwin13-clang++ $(SILENT) make -C build/gmake.linux clean all - $(SILENT) make -C build/gmake.windows clean all CC=x86_64-w64-mingw32-gcc + $(SILENT) make -C build/gmake.windows clean all CC=i686-w64-mingw32-gcc $(SILENT) git checkout src/host/version.h release: release-$(OS) diff --git a/3rdparty/genie/scripts/genie.lua b/3rdparty/genie/scripts/genie.lua index 24fe8313c58..468aa5359ce 100644 --- a/3rdparty/genie/scripts/genie.lua +++ b/3rdparty/genie/scripts/genie.lua @@ -7,7 +7,7 @@ -- default when folks build using the makefile. That way they don't have to -- worry about the /scripts argument and all that. -- - premake.make.undefine = { "TARGET" } + premake.make.override = { "TARGET" } solution "genie" configurations { diff --git a/3rdparty/genie/src/actions/make/make_cpp.lua b/3rdparty/genie/src/actions/make/make_cpp.lua index d4f5c3b351a..4492ac2bbd2 100644 --- a/3rdparty/genie/src/actions/make/make_cpp.lua +++ b/3rdparty/genie/src/actions/make/make_cpp.lua @@ -5,7 +5,7 @@ -- premake.make.cpp = { } - premake.make.undefine = { } + premake.make.override = { } local cpp = premake.make.cpp local make = premake.make @@ -174,10 +174,7 @@ _p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true))) _p('endif') _p('') - for _, variable in ipairs(premake.make.undefine) do - _p('override undefine '.. variable) - end - _p('') + _p('ifndef verbose') _p(' SILENT = @') _p('endif') @@ -228,9 +225,9 @@ -- if this platform requires a special compiler or linker, list it here cpp.platformtools(cfg, cc) - _p(' OBJDIR = %s', _MAKE.esc(cfg.objectsdir)) - _p(' TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory)) - _p(' TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name)) + _p(' ' .. (table.contains(premake.make.override,"OBJDIR") and "override " or "") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir)) + _p(' ' .. (table.contains(premake.make.override,"TARGETDIR") and "override " or "") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory)) + _p(' ' .. (table.contains(premake.make.override,"TARGET") and "override " or "") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name)) _p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines))) _p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs))) diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c index ab706827655..bc7542d5c03 100644 --- a/3rdparty/genie/src/host/scripts.c +++ b/3rdparty/genie/src/host/scripts.c @@ -179,17 +179,17 @@ const char* builtin_scripts[] = { "ative(sln.location, prj.location)), _MAKE.esc(_MAKE.getmakefilename(prj, true)))\n_p('')\nend\n_p('clean:')\nfor _ ,prj in ipairs(sln.projects) do\n_p('\\t@${MAKE} --no-print-directory -C %s -f %s clean', _MAKE.esc(path.getrelative(sln.location, prj.location)), _MAKE.esc(_MAKE.getmakefilename(prj, true)))\nend\n_p('')\n_p('help:')\n_p(1,'@echo \"Usage: make [config=name] [target]\"')\n_p(1,'@echo \"\"')\n_p(1,'@echo \"CONFIGURATIONS:\"')\nlocal cfgpairs = { }\nfor _, platform in ipairs(platforms) do\nfor _, cfgname in ipairs(sln.configurations) do\n_p(1,'@echo \" %s\"', premake.getconfigname(cfgname, platform, true))\nend\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"TARGETS:\"')\n_p(1,'@echo \" all (default)\"')\n_p(1,'@echo \" clean\"')\nfor _, prj in ipairs(sln.projects) do\n_p(1,'@echo \" %s\"', prj.name)\nend\n_p(1,'@echo \"\"')\n_p(1,'@echo \"For more information, see http://industriousone.com/premake/quick-start\"')\nend\n", /* actions/make/make_cpp.lua */ - "premake.make.cpp = { }\npremake.make.undefine = { }\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\npremake.gmake_cpp_header(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nlocal objdirs = {}\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in pairs(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('al" + "premake.make.cpp = { }\npremake.make.override = { }\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\npremake.gmake_cpp_header(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nlocal objdirs = {}\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in pairs(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('al" "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then \nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\nend\nelse\nif prj.msglinking the" "n\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(OBJDIR)')\nend\n_p('\\t-$(call MKDIR,$(OBJDIR))')\nfor dir, _ in pairs(objdirs) do\n_p('\\t-$(call MKDIR,$(OBJDIR)/%s)', dir)\nend\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /," - "\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\nfor _, variable in ipairs(premake.make.undefine) do\n_p('override undefine '.. variable)\nend\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHEL" - "LTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(" - "cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", " - "\"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.b" - "uildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX" - "\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppf" - "ile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$" - "@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", + "\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -" + "p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. " + " 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' de" + "fine POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions" + ", cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif cc.llvm then" + "\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o " + "\"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfu" + "nction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", /* actions/make/make_csharp.lua */ "local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\n local name = cfg.buildtarget.basename .. \".\"\n local dir = path.getdirectory(fname)\n if dir ~= \".\" then \nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Co" diff --git a/3rdparty/mongoose/mongoose.c b/3rdparty/mongoose/mongoose.c index f7f47cadadd..53908b63053 100644 --- a/3rdparty/mongoose/mongoose.c +++ b/3rdparty/mongoose/mongoose.c @@ -262,7 +262,7 @@ struct ns_connection *ns_bind(struct ns_mgr *, const char *, struct ns_connection *ns_connect(struct ns_mgr *, const char *, ns_callback_t, void *); -int ns_send(struct ns_connection *, const void *buf, int len); +int ns_send(struct ns_connection *, const void *buf, size_t len); int ns_printf(struct ns_connection *, const char *fmt, ...); int ns_vprintf(struct ns_connection *, const char *fmt, va_list ap); @@ -1017,14 +1017,14 @@ static void ns_write_to_socket(struct ns_connection *conn) { } } -int ns_send(struct ns_connection *conn, const void *buf, int len) { +int ns_send(struct ns_connection *conn, const void *buf, size_t len) { return (int) ns_out(conn, buf, len); } static void ns_handle_udp(struct ns_connection *ls) { struct ns_connection nc; char buf[NS_UDP_RECEIVE_BUFFER_SIZE]; - int n; + ssize_t n; socklen_t s_len = sizeof(nc.sa); memset(&nc, 0, sizeof(nc)); @@ -1381,7 +1381,7 @@ typedef pid_t process_id_t; struct vec { const char *ptr; - int len; + uintptr_t len; }; // For directory listing and WevDAV support @@ -1501,7 +1501,7 @@ struct connection { char *request; int64_t num_bytes_recv; // Total number of bytes received int64_t cl; // Reply content length, for Range support - int request_len; // Request length, including last \r\n after last header + ssize_t request_len; // Request length, including last \r\n after last header }; #define MG_CONN_2_CONN(c) ((struct connection *) ((char *) (c) - \ @@ -1743,7 +1743,7 @@ static int mg_snprintf(char *buf, size_t buflen, const char *fmt, ...) { // -1 if request is malformed // 0 if request is not yet fully buffered // >0 actual request length, including last \r\n\r\n -static int get_request_len(const char *s, int buf_len) { +static int get_request_len(const char *s, size_t buf_len) { const unsigned char *buf = (unsigned char *) s; int i; @@ -1785,7 +1785,7 @@ static char *skip(char **buf, const char *delimiters) { // Parse HTTP headers from the given buffer, advance buffer to the point // where parsing stopped. static void parse_http_headers(char **buf, struct mg_connection *ri) { - size_t i; + int i; for (i = 0; i < ARRAY_SIZE(ri->http_headers); i++) { ri->http_headers[i].name = skip(buf, ": "); @@ -2336,13 +2336,13 @@ static void on_cgi_data(struct ns_connection *nc) { // If reply has not been parsed yet, parse it if (conn->ns_conn->flags & NSF_BUFFER_BUT_DONT_SEND) { struct iobuf *io = &conn->ns_conn->send_iobuf; - int s_len = sizeof(cgi_status) - 1; - int len = get_request_len(io->buf + s_len, io->len - s_len); + size_t s_len = sizeof(cgi_status) - 1; + ssize_t len = get_request_len(io->buf + s_len, io->len - s_len); char buf[MAX_REQUEST_SIZE], *s = buf; if (len == 0) return; - if (len < 0 || len > (int) sizeof(buf)) { + if (len < 0 || len > sizeof(buf)) { len = io->len; iobuf_remove(io, io->len); send_http_error(conn, 500, "CGI program sent malformed headers: [%.*s]", @@ -2436,8 +2436,8 @@ static void remove_double_dots_and_double_slashes(char *s) { *p = '\0'; } -int mg_url_decode(const char *src, int src_len, char *dst, - int dst_len, int is_form_url_encoded) { +int mg_url_decode(const char *src, size_t src_len, char *dst, + size_t dst_len, int is_form_url_encoded) { int i, j, a, b; #define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') @@ -2471,7 +2471,7 @@ static int is_valid_http_method(const char *s) { // This function modifies the buffer by NUL-terminating // HTTP request components, header names and header values. // Note that len must point to the last \n of HTTP headers. -static int parse_http_message(char *buf, int len, struct mg_connection *ri) { +static size_t parse_http_message(char *buf, size_t len, struct mg_connection *ri) { int is_request, n; // Reset the connection. Make sure that we don't touch fields that are @@ -2553,7 +2553,7 @@ const char *mg_get_header(const struct mg_connection *ri, const char *s) { } // Perform case-insensitive match of string against pattern -int mg_match_prefix(const char *pattern, int pattern_len, const char *str) { +int mg_match_prefix(const char *pattern, ssize_t pattern_len, const char *str) { const char *or_str; int len, res, i = 0, j = 0; @@ -2644,12 +2644,12 @@ static int convert_uri_to_file_name(struct connection *conn, char *buf, #endif const char *uri = conn->mg_conn.uri; const char *domain = mg_get_header(&conn->mg_conn, "Host"); - int match_len, root_len = root == NULL ? 0 : strlen(root); + size_t match_len, root_len = root == NULL ? 0 : strlen(root); // Perform virtual hosting rewrites if (rewrites != NULL && domain != NULL) { const char *colon = strchr(domain, ':'); - int domain_len = colon == NULL ? (int) strlen(domain) : colon - domain; + ssize_t domain_len = colon == NULL ? strlen(domain) : colon - domain; while ((rewrites = next_option(rewrites, &a, &b)) != NULL) { if (a.len > 1 && a.ptr[0] == '@' && a.len == domain_len + 1 && @@ -2709,7 +2709,7 @@ static int should_keep_alive(const struct mg_connection *conn) { (header == NULL && http_version && !strcmp(http_version, "1.1"))); } -size_t mg_write(struct mg_connection *c, const void *buf, int len) { +size_t mg_write(struct mg_connection *c, const void *buf, size_t len) { struct connection *conn = MG_CONN_2_CONN(c); ns_send(conn->ns_conn, buf, len); return conn->ns_conn->send_iobuf.len; @@ -2873,8 +2873,8 @@ static void SHA1Init(SHA1_CTX *context) { } static void SHA1Update(SHA1_CTX *context, const unsigned char *data, - uint32_t len) { - uint32_t i, j; + size_t len) { + size_t i, j; j = context->count[0]; if ((context->count[0] += len << 3) < j) @@ -2962,7 +2962,7 @@ static void send_websocket_handshake(struct mg_connection *conn, mg_write(conn, buf, strlen(buf)); } -static int deliver_websocket_frame(struct connection *conn) { +static size_t deliver_websocket_frame(struct connection *conn) { // Having buf unsigned char * is important, as it is used below in arithmetic unsigned char *buf = (unsigned char *) conn->ns_conn->recv_iobuf.buf; size_t i, len, buf_len = conn->ns_conn->recv_iobuf.len, frame_len = 0, @@ -3241,7 +3241,8 @@ static int find_index_file(struct connection *conn, char *path, const char *list = conn->server->config_options[INDEX_FILES]; file_stat_t st; struct vec filename_vec; - size_t n = strlen(path), found = 0; + size_t n = strlen(path); + int found = 0; // The 'path' given to us points to the directory. Remove all trailing // directory separator characters from the end of the path, and @@ -3499,7 +3500,7 @@ static int scan_directory(struct connection *conn, const char *dir, return arr_ind; } -int mg_url_encode(const char *src, size_t s_len, char *dst, size_t dst_len) { +size_t mg_url_encode(const char *src, size_t s_len, char *dst, size_t dst_len) { static const char *dont_escape = "._-$,;~()"; static const char *hex = "0123456789abcdef"; size_t i = 0, j = 0; @@ -3796,7 +3797,7 @@ static void handle_put(struct connection *conn, const char *path) { static void forward_put_data(struct connection *conn) { struct iobuf *io = &conn->ns_conn->recv_iobuf; size_t k = conn->cl < (int64_t) io->len ? conn->cl : (int64_t) io->len; // To write - int n = write(conn->endpoint.fd, io->buf, k); // Write them! + size_t n = write(conn->endpoint.fd, io->buf, k); // Write them! if (n > 0) { iobuf_remove(io, n); conn->cl -= n; @@ -4183,9 +4184,10 @@ static int is_dav_request(const struct connection *conn) { } #endif // MONGOOSE_NO_AUTH -static int parse_header(const char *str, int str_len, const char *var_name, +static int parse_header(const char *str, size_t str_len, const char *var_name, char *buf, size_t buf_size) { - int ch = ' ', ch1 = ',', len = 0, n = strlen(var_name); + int ch = ' ', ch1 = ',', len = 0; + size_t n = strlen(var_name); const char *p, *end = str + str_len, *s = NULL; if (buf != NULL && buf_size > 0) buf[0] = '\0'; @@ -4226,7 +4228,7 @@ static void send_ssi_file(struct mg_connection *, const char *, FILE *, int); static void send_file_data(struct mg_connection *conn, FILE *fp) { char buf[IOBUF_SIZE]; - int n; + size_t n; while ((n = fread(buf, 1, sizeof(buf), fp)) > 0) { mg_write(conn, buf, n); } @@ -4898,7 +4900,7 @@ static void close_local_endpoint(struct connection *conn) { static void transfer_file_data(struct connection *conn) { char buf[IOBUF_SIZE]; - int n; + size_t n; // If output buffer is too big, don't send anything. Wait until // mongoose drains already buffered data to the client. @@ -4919,7 +4921,7 @@ static void transfer_file_data(struct connection *conn) { } } -int mg_poll_server(struct mg_server *server, int milliseconds) { +time_t mg_poll_server(struct mg_server *server, int milliseconds) { return ns_mgr_poll(&server->ns_mgr, milliseconds); } diff --git a/3rdparty/mongoose/mongoose.h b/3rdparty/mongoose/mongoose.h index cfe411e3e4e..064adea3757 100644 --- a/3rdparty/mongoose/mongoose.h +++ b/3rdparty/mongoose/mongoose.h @@ -88,7 +88,7 @@ enum { struct mg_server *mg_create_server(void *server_param, mg_handler_t handler); void mg_destroy_server(struct mg_server **); const char *mg_set_option(struct mg_server *, const char *opt, const char *val); -int mg_poll_server(struct mg_server *, int milliseconds); +time_t mg_poll_server(struct mg_server *, int milliseconds); const char **mg_get_valid_option_names(void); const char *mg_get_option(const struct mg_server *server, const char *name); void mg_copy_listeners(struct mg_server *from, struct mg_server *to); @@ -102,7 +102,7 @@ void mg_send_status(struct mg_connection *, int status_code); void mg_send_header(struct mg_connection *, const char *name, const char *val); size_t mg_send_data(struct mg_connection *, const void *data, int data_len); size_t mg_printf_data(struct mg_connection *, const char *format, ...); -size_t mg_write(struct mg_connection *, const void *buf, int len); +size_t mg_write(struct mg_connection *, const void *buf, size_t len); size_t mg_printf(struct mg_connection *conn, const char *fmt, ...); size_t mg_websocket_write(struct mg_connection *, int opcode, @@ -128,8 +128,8 @@ int mg_parse_multipart(const char *buf, int buf_len, void *mg_start_thread(void *(*func)(void *), void *param); char *mg_md5(char buf[33], ...); int mg_authorize_digest(struct mg_connection *c, FILE *fp); -int mg_url_encode(const char *src, size_t s_len, char *dst, size_t dst_len); -int mg_url_decode(const char *src, int src_len, char *dst, int dst_len, int); +size_t mg_url_encode(const char *src, size_t s_len, char *dst, size_t dst_len); +int mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len, int); int mg_terminate_ssl(struct mg_connection *c, const char *cert); int mg_forward(struct mg_connection *c, const char *addr); void *mg_mmap(FILE *fp, size_t size); From 61203a2adb2d09360db3deaaa860bf7e63771e35 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 13 Mar 2015 20:16:50 +0100 Subject: [PATCH 012/201] Compile fix --- 3rdparty/mongoose/mongoose.h | 1 + 1 file changed, 1 insertion(+) diff --git a/3rdparty/mongoose/mongoose.h b/3rdparty/mongoose/mongoose.h index 064adea3757..a434758dea1 100644 --- a/3rdparty/mongoose/mongoose.h +++ b/3rdparty/mongoose/mongoose.h @@ -22,6 +22,7 @@ #include // required for FILE #include // required for size_t +#include // required for time_t #ifdef __cplusplus extern "C" { From a65c9ef758939a9e8052da99804c0801a4f056b7 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Fri, 13 Mar 2015 21:51:27 +0000 Subject: [PATCH 013/201] hooked v53 irq ack callback so that it can get the correct vector from the controller, make a note of which ones get unmasked (nw) --- src/emu/cpu/nec/v53.c | 5 +++++ src/mame/audio/hng64.c | 10 +++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/emu/cpu/nec/v53.c b/src/emu/cpu/nec/v53.c index c43db72d35e..0019f5bd959 100644 --- a/src/emu/cpu/nec/v53.c +++ b/src/emu/cpu/nec/v53.c @@ -215,6 +215,8 @@ void v53_base_device::device_start() m_out_dack_1_cb.resolve_safe(); m_out_dack_2_cb.resolve_safe(); m_out_dack_3_cb.resolve_safe(); + + static_set_irq_acknowledge_callback(*this, device_irq_acknowledge_delegate(FUNC(pic8259_device::inta_cb), (pic8259_device*)m_v53icu)); } void v53_base_device::install_peripheral_io() @@ -484,6 +486,7 @@ static MACHINE_CONFIG_FRAGMENT( v53 ) MCFG_PIT8253_OUT0_HANDLER(WRITELINE( v53_base_device, tcu_out0_trampoline_cb )) MCFG_PIT8253_OUT1_HANDLER(WRITELINE( v53_base_device, tcu_out1_trampoline_cb )) MCFG_PIT8253_OUT2_HANDLER(WRITELINE( v53_base_device, tcu_out2_trampoline_cb )) + MCFG_DEVICE_ADD("upd71071dma", V53_DMAU, 4000000) MCFG_AM9517A_OUT_HREQ_CB(WRITELINE(v53_base_device, hreq_trampoline_cb)) @@ -506,6 +509,8 @@ static MACHINE_CONFIG_FRAGMENT( v53 ) MCFG_PIC8259_ADD( "upd71059pic", WRITELINE(v53_base_device, internal_irq_w), VCC, READ8(v53_base_device,get_pic_ack)) + + MCFG_DEVICE_ADD("v53scu", V53_SCU, 0) MCFG_I8251_TXD_HANDLER(WRITELINE(v53_base_device, scu_txd_trampoline_cb)) MCFG_I8251_DTR_HANDLER(WRITELINE(v53_base_device, scu_dtr_trampoline_cb)) diff --git a/src/mame/audio/hng64.c b/src/mame/audio/hng64.c index a185b9fc44f..1f5eb542f48 100644 --- a/src/mame/audio/hng64.c +++ b/src/mame/audio/hng64.c @@ -14,12 +14,15 @@ buriki (#)SNK R&D Center (R) HYPER NEOGEO64 Sound Driver Ver 1.15. (#)Copyrig The earlier revisions appear to have 2 banks of code (there are vectors at the end of the 0x1e0000 block and the 0x1f0000 block) -Those first two revisions also spam the entire range of I/O ports with values several times on startup causing some unexpected -writes to the V53 internal registers. The important ones are reinitialized after this however, I'm guessing this is harmless -on real hardware, as the code flow seems to be correct. +If the banking setup is wrong then those first two revisions also spam the entire range of I/O ports with values several times +on startup causing some unexpected writes to the V53 internal registers. data structures look very similar between all of them +IRQ mask register on the internal interrupt controller is set to 0xd8 + +so levels 0,1,2,5 are unmasked + */ @@ -298,6 +301,7 @@ WRITE_LINE_MEMBER(hng64_state::tcu_tm1_cb) { // these are very active, maybe they feed back into the v53 via one of the IRQ pins? TM2 toggles more rapidly than TM1 // printf("tcu_tm1_cb %02x\n", state); + m_audiocpu->set_input_line(0, state? ASSERT_LINE:CLEAR_LINE); } WRITE_LINE_MEMBER(hng64_state::tcu_tm2_cb) From bf61c9a5e2a24c5d1a4765c5ad717bee907ef321 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Fri, 13 Mar 2015 22:52:57 +0000 Subject: [PATCH 014/201] note used addresses (nw) --- src/mame/audio/hng64.c | 114 ++++++++++++++++++++++++++++++-------- src/mame/includes/hng64.h | 20 ++++++- 2 files changed, 109 insertions(+), 25 deletions(-) diff --git a/src/mame/audio/hng64.c b/src/mame/audio/hng64.c index 1f5eb542f48..8003b14b492 100644 --- a/src/mame/audio/hng64.c +++ b/src/mame/audio/hng64.c @@ -103,25 +103,25 @@ WRITE32_MEMBER( hng64_state::hng64_soundcpu_enable_w ) // I guess it's only one of the bits, the commands are inverse of each other if (cmd==0x55AA) { - printf("soundcpu ON\n"); + logerror("soundcpu ON\n"); m_audiocpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } else if (cmd==0xAA55) { - printf("soundcpu OFF\n"); + logerror("soundcpu OFF\n"); m_audiocpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); } else { - printf("unknown hng64_soundcpu_enable_w cmd %04x\n", cmd); + logerror("unknown hng64_soundcpu_enable_w cmd %04x\n", cmd); } } if (mem_mask&0x0000ffff) { - printf("unknown hng64_soundcpu_enable_w %08x %08x\n", data, mem_mask); + logerror("unknown hng64_soundcpu_enable_w %08x %08x\n", data, mem_mask); } } @@ -180,7 +180,7 @@ ADDRESS_MAP_END WRITE16_MEMBER(hng64_state::hng64_sound_port_0008_w) { -// printf("hng64_sound_port_0008_w %04x %04x\n", data, mem_mask); +// logerror("hng64_sound_port_0008_w %04x %04x\n", data, mem_mask); // seems to one or more of the DMARQ on the V53, writes here when it expects DMA channel 3 to transfer ~0x20 bytes just after startup @@ -189,36 +189,57 @@ WRITE16_MEMBER(hng64_state::hng64_sound_port_0008_w) } +READ16_MEMBER(hng64_state::hng64_sound_port_0004_r) +{ + // read in irq5 + logerror("%08x: hng64_sound_port_0004_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + return rand(); +} + +READ16_MEMBER(hng64_state::hng64_sound_port_0006_r) +{ + // read in irq5 + logerror("%08x: hng64_sound_port_0006_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + return rand(); +} + +READ16_MEMBER(hng64_state::hng64_sound_port_0008_r) +{ + // read in irq5 + logerror("%08x: hng64_sound_port_0008_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + return rand(); +} + WRITE16_MEMBER(hng64_state::hng64_sound_select_w) { // seems to write values in the format xxyy where yy is 0x00-0x1f and xx is oten 00/01/0a // there are said to be 32 audio channels, so maybe the lower byte is the channel? -// printf("hng64_sound_select_w") +// logerror("hng64_sound_select_w") COMBINE_DATA(&m_audiochannel); } WRITE16_MEMBER(hng64_state::hng64_sound_data_02_w) { m_audiodat[m_audiochannel].dat[2] = data; -// printf("write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); +// logerror("write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); } WRITE16_MEMBER(hng64_state::hng64_sound_data_04_w) { m_audiodat[m_audiochannel].dat[1] = data; -// printf("write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); +// logerror("write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); } WRITE16_MEMBER(hng64_state::hng64_sound_data_06_w) { m_audiodat[m_audiochannel].dat[0] = data; -// printf("write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); +// logerror("write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); } // but why not just use the V33/V53 XA mode?? WRITE16_MEMBER(hng64_state::hng64_sound_bank_w) { - printf("%08x hng64_sound_bank_w? %02x %04x\n", space.device().safe_pc(), offset, data); + logerror("%08x hng64_sound_bank_w? %02x %04x\n", space.device().safe_pc(), offset, data); // buriki writes 0x3f to 0x200 before jumping to the low addresses.. // where it expects to find data from 0x1f0000 @@ -247,27 +268,75 @@ WRITE16_MEMBER(hng64_state::hng64_sound_bank_w) } + +WRITE16_MEMBER(hng64_state::hng64_sound_port_000a_w) +{ + logerror("%08x: hng64_port hng64_sound_port_000a_w %04x mask (%04x)\n", space.device().safe_pc(), data, mem_mask); +} + +WRITE16_MEMBER(hng64_state::hng64_sound_port_000c_w) +{ + logerror("%08x: hng64_port hng64_sound_port_000c_w %04x mask (%04x)\n", space.device().safe_pc(), data, mem_mask); +} + + WRITE16_MEMBER(hng64_state::hng64_sound_port_0102_w) { - printf("hng64_port 0x0102 %04x\n", data); + logerror("hng64_port 0x0102 %04x\n", data); } WRITE16_MEMBER(hng64_state::hng64_sound_port_0080_w) { - printf("hng64_port 0x0080 %04x\n", data); + logerror("hng64_port 0x0080 %04x\n", data); +} + +READ16_MEMBER(hng64_state::hng64_sound_port_0106_r) +{ + // read in irq5 + logerror("%08x: hng64_sound_port_0106_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + return rand(); +} + +WRITE16_MEMBER(hng64_state::hng64_sound_port_010a_w) +{ + logerror("%08x: hng64_port hng64_sound_port_010a_w %04x mask (%04x)\n", space.device().safe_pc(), data, mem_mask); +} + +WRITE16_MEMBER(hng64_state::hng64_sound_port_0108_w) +{ + logerror("%08x: hng64_port hng64_sound_port_0108_w %04x mask (%04x)\n", space.device().safe_pc(), data, mem_mask); +} + + +WRITE16_MEMBER(hng64_state::hng64_sound_port_0100_w) +{ + logerror("%08x: hng64_port hng64_sound_port_0100_w %04x mask (%04x)\n", space.device().safe_pc(), data, mem_mask); +} + +READ16_MEMBER(hng64_state::hng64_sound_port_0104_r) +{ + // read in irq5 + logerror("%08x: hng64_sound_port_0104_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + return rand(); } static ADDRESS_MAP_START( hng_sound_io, AS_IO, 16, hng64_state ) AM_RANGE(0x0000, 0x0001) AM_WRITE( hng64_sound_select_w ) AM_RANGE(0x0002, 0x0003) AM_WRITE( hng64_sound_data_02_w ) - AM_RANGE(0x0004, 0x0005) AM_WRITE( hng64_sound_data_04_w ) - AM_RANGE(0x0006, 0x0007) AM_WRITE( hng64_sound_data_06_w ) - AM_RANGE(0x0008, 0x0009) AM_WRITE( hng64_sound_port_0008_w ) - // a 8 c used too? + AM_RANGE(0x0004, 0x0005) AM_READWRITE( hng64_sound_port_0004_r, hng64_sound_data_04_w ) + AM_RANGE(0x0006, 0x0007) AM_READWRITE( hng64_sound_port_0006_r, hng64_sound_data_06_w ) + AM_RANGE(0x0008, 0x0009) AM_READWRITE( hng64_sound_port_0008_r, hng64_sound_port_0008_w ) + AM_RANGE(0x000a, 0x000b) AM_WRITE( hng64_sound_port_000a_w ) + AM_RANGE(0x000c, 0x000d) AM_WRITE( hng64_sound_port_000c_w ) AM_RANGE(0x0080, 0x0081) AM_WRITE( hng64_sound_port_0080_w ) - AM_RANGE(0x0102, 0x0103) AM_WRITE( hng64_sound_port_0102_w ) + AM_RANGE(0x0100, 0x0101) AM_WRITE( hng64_sound_port_0100_w ) + AM_RANGE(0x0102, 0x0103) AM_WRITE( hng64_sound_port_0102_w ) // gets values of 0x0080 / 0x0081 / 0x0000 / 0x0001 depending on return from 0x0106 in irq5? + AM_RANGE(0x0104, 0x0105) AM_READ( hng64_sound_port_0104_r ) + AM_RANGE(0x0106, 0x0107) AM_READ( hng64_sound_port_0106_r ) + AM_RANGE(0x0108, 0x0109) AM_WRITE( hng64_sound_port_0108_w ) + AM_RANGE(0x010a, 0x010b) AM_WRITE( hng64_sound_port_010a_w ) AM_RANGE(0x0200, 0x021f) AM_WRITE( hng64_sound_bank_w ) // ?? @@ -288,26 +357,27 @@ WRITE8_MEMBER(hng64_state::dma_iow3_cb) // currently it reads a block of 0x20 '0x00' values from a very specific block of RAM where there is a 0x20 space in the data and transfers them repeatedly, I assume // this is some kind of buffer for the audio or DSP and eventually will be populated with other values... // if this comes to life maybe something interesting is happening! - if (data!=0x00) printf("dma_iow3_cb %02x\n", data); + if (data!=0x00) logerror("dma_iow3_cb %02x\n", data); } WRITE_LINE_MEMBER(hng64_state::tcu_tm0_cb) { // this goes high once near startup - printf("tcu_tm0_cb %02x\n", state); + logerror("tcu_tm0_cb %02x\n", state); } WRITE_LINE_MEMBER(hng64_state::tcu_tm1_cb) { // these are very active, maybe they feed back into the v53 via one of the IRQ pins? TM2 toggles more rapidly than TM1 -// printf("tcu_tm1_cb %02x\n", state); - m_audiocpu->set_input_line(0, state? ASSERT_LINE:CLEAR_LINE); +// logerror("tcu_tm1_cb %02x\n", state); + m_audiocpu->set_input_line(5, state? ASSERT_LINE:CLEAR_LINE); // not accurate, just so we have a trigger } WRITE_LINE_MEMBER(hng64_state::tcu_tm2_cb) { // these are very active, maybe they feed back into the v53 via one of the IRQ pins? TM2 toggles more rapidly than TM1 -// printf("tcu_tm2_cb %02x\n", state); +// logerror("tcu_tm2_cb %02x\n", state); + m_audiocpu->set_input_line(2, state? ASSERT_LINE:CLEAR_LINE); // not accurate, just so we have a trigger } diff --git a/src/mame/includes/hng64.h b/src/mame/includes/hng64.h index eee5de71afa..c8c43c858c9 100644 --- a/src/mame/includes/hng64.h +++ b/src/mame/includes/hng64.h @@ -354,7 +354,6 @@ public: int m_vertsrom_size; void reset_sound(); void reset_net(); - DECLARE_WRITE16_MEMBER(hng64_sound_port_0008_w); DECLARE_WRITE_LINE_MEMBER(dma_hreq_cb); DECLARE_READ8_MEMBER(dma_memr_cb); @@ -375,10 +374,25 @@ public: DECLARE_WRITE16_MEMBER(hng64_sound_data_02_w); DECLARE_WRITE16_MEMBER(hng64_sound_data_04_w); DECLARE_WRITE16_MEMBER(hng64_sound_data_06_w); - DECLARE_WRITE16_MEMBER(hng64_sound_bank_w); - DECLARE_WRITE16_MEMBER(hng64_sound_port_0102_w); + + DECLARE_READ16_MEMBER(hng64_sound_port_0004_r); + DECLARE_READ16_MEMBER(hng64_sound_port_0006_r); + + DECLARE_READ16_MEMBER(hng64_sound_port_0008_r); + DECLARE_WRITE16_MEMBER(hng64_sound_port_0008_w); + + DECLARE_WRITE16_MEMBER(hng64_sound_port_000a_w); + DECLARE_WRITE16_MEMBER(hng64_sound_port_000c_w); + DECLARE_WRITE16_MEMBER(hng64_sound_port_0080_w); + DECLARE_WRITE16_MEMBER(hng64_sound_port_0100_w); + DECLARE_WRITE16_MEMBER(hng64_sound_port_0102_w); + DECLARE_READ16_MEMBER(hng64_sound_port_0104_r); + DECLARE_READ16_MEMBER(hng64_sound_port_0106_r); + DECLARE_WRITE16_MEMBER(hng64_sound_port_0108_w); + DECLARE_WRITE16_MEMBER(hng64_sound_port_010a_w); + DECLARE_WRITE16_MEMBER(hng64_sound_bank_w); }; From e7ffb8a6b04ff317180ddc41dc9108a32465bf66 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 14 Mar 2015 05:34:43 +0100 Subject: [PATCH 015/201] added astrocmd and kingman (Astro Command probably works fine, i just haven't tested it yet) --- src/mess/drivers/hh_hmcs40.c | 49 ++++++++++++++- src/mess/drivers/hh_ucom4.c | 113 ++++++++++++++++++++++++++++++++++- src/mess/mess.lst | 2 + 3 files changed, 158 insertions(+), 6 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 7f903114df6..58c1370a611 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -15,7 +15,7 @@ *62 HD38750A 1982, Actronics(Hanzawa) Pack'n Maze *04 HD38800A 1980, Gakken Heiankyo Alien - *23 HD38800A 198?, Tomy Kingman + @23 HD38800B 1982, Tomy Kingman (THF-01II) *24 HD38800B 1982, Actronics(Hanzawa) Wanted G-Man @25 HD38800A 1981, Coleco Alien Attack @27 HD38800A 1981, Bandai Packri Monster (DM-21Z) @@ -336,7 +336,7 @@ WRITE8_MEMBER(hh_hmcs40_state::alnattck_plate_w) m_plate = (m_plate & ~(0xf << shift)) | (data << shift); // update display - UINT32 plate = BITSWAP16((UINT16)m_plate,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15) | (m_plate & 0xf0000); + UINT32 plate = BITSWAP16(m_plate,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15) | (m_plate & 0xf0000); display_matrix(20, 10, plate, m_grid); } @@ -622,6 +622,41 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Tomy Kingman (manufactured in Japan) + * boards are labeled THF-01II 2E138E01/2E128E02 + * Hitachi HD38800B23 MCU + * cyan/red/blue VFD display Futaba DM-65ZK 3A + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +static INPUT_PORTS_START( kingman ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( kingman, hh_hmcs40_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", HD38800, 400000) // approximation - RC osc. + +// MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Tomy(tronic) Tron (manufactured in Japan) @@ -739,6 +774,13 @@ ROM_START( pbqbert ) ROM_END +ROM_START( kingman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + ROM_START( tmtron ) ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) ) @@ -763,4 +805,5 @@ CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, driver_device, 0, "Parker Brothers", "Q*Bert (Parker Brothers)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) -CONS( 1982, tmtron, 0, 0, tmtron, tmtron, driver_device, 0, "Tomy", "Tron (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1982, kingman, 0, 0, kingman, kingman, driver_device, 0, "Tomy", "Kingman", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1984, tmtron, 0, 0, tmtron, tmtron, driver_device, 0, "Tomy", "Tron (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 4f72e9e36f9..d420140d3bc 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -19,7 +19,7 @@ *128 uPD650C 1982, Roland TR-606 133 uPD650C 1982, Roland TB-303 @160 uPD553C 1982, Tomy Pac Man (TN-08) - *202 uPD553C 1982, Epoch Astro Command + @202 uPD553C 1982, Epoch Astro Command @206 uPD553C 1982, Epoch Dracula @258 uPD553C 1984, Tomy Alien Chase (TN-16) @@ -88,6 +88,10 @@ public: DECLARE_WRITE8_MEMBER(splasfgt_grid_w); DECLARE_WRITE8_MEMBER(splasfgt_plate_w); + void astrocmd_display(); + DECLARE_WRITE8_MEMBER(astrocmd_grid_w); + DECLARE_WRITE8_MEMBER(astrocmd_plate_w); + DECLARE_WRITE8_MEMBER(edracula_grid_w); DECLARE_WRITE8_MEMBER(edracula_plate_w); @@ -474,6 +478,102 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Epoch Astro Command (manufactured in Japan) + * PCB label 96111 + * NEC uCOM-43 MCU, labeled D553C 202 + * cyan/red VFD display NEC FIP9AM20T NO.42, with color overlay + + known releases: + - Japan: Astro Command + - USA: Astro Command, published by Tandy + - UK: Scramble, published by Grandstand + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +void hh_ucom4_state::astrocmd_display() +{ + UINT32 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3); + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10); + + display_matrix(17, 9, plate, grid); +} + +WRITE8_MEMBER(hh_ucom4_state::astrocmd_grid_w) +{ + // C,D(,E3): vfd matrix grid + int shift = (offset - NEC_UCOM4_PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + astrocmd_display(); +} + +WRITE8_MEMBER(hh_ucom4_state::astrocmd_plate_w) +{ + // E01,F,G,H,I: vfd matrix plate + int shift = (offset - NEC_UCOM4_PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + if (offset == NEC_UCOM4_PORTE) + { + // E2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // E3: vfd matrix grid 8 + astrocmd_grid_w(space, offset, data >> 3 & 1); + } + else + astrocmd_display(); +} + + +static INPUT_PORTS_START( astrocmd ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( astrocmd, hh_ucom4_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", NEC_D553, XTAL_400kHz) + MCFG_UCOM4_READ_A_CB(IOPORT("IN.0")) + MCFG_UCOM4_READ_B_CB(IOPORT("IN.1")) + MCFG_UCOM4_WRITE_C_CB(WRITE8(hh_ucom4_state, astrocmd_grid_w)) + MCFG_UCOM4_WRITE_D_CB(WRITE8(hh_ucom4_state, astrocmd_grid_w)) + MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, astrocmd_plate_w)) + MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, astrocmd_plate_w)) + MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, astrocmd_plate_w)) + MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, astrocmd_plate_w)) + MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, astrocmd_plate_w)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_ucom4_test) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Epoch Dracula (manufactured in Japan) @@ -719,7 +819,7 @@ MACHINE_CONFIG_END void hh_ucom4_state::tmpacman_display() { - UINT8 grid = BITSWAP8((UINT8)m_grid,0,1,2,3,4,5,6,7); + UINT32 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7); UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15); display_matrix(19, 8, plate | 0x100, grid); // plate 8 (maze) is always on @@ -929,9 +1029,15 @@ ROM_START( splasfgt ) ROM_END +ROM_START( astrocmd ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) ) +ROM_END + + ROM_START( edracula ) ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-206", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) ) + ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) ) ROM_END @@ -958,6 +1064,7 @@ ROM_END CONS( 1979, ssfball, 0, 0, ssfball, ssfball, driver_device, 0, "Bambino", "Superstar Football", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, driver_device, 0, "Bambino", "Space Laser Fight", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) +CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, driver_device, 0, "Epoch", "Astro Command", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1982, edracula, 0, 0, edracula, edracula, driver_device, 0, "Epoch", "Dracula (Epoch)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, driver_device, 0, "Tomy", "Tennis (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 4c788c05d81..47c23faba1f 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2184,6 +2184,7 @@ cpacmanr1 // egalaxn2 // Entex epacman2 // Entex pbqbert // Parker Brothers +kingman // Tomy tmtron // Tomy maniac // Ideal @@ -2208,6 +2209,7 @@ tandy12 // Tandy Radio Shack ssfball // Bambino splasfgt // Bambino +astrocmd // Epoch edracula // Epoch tmpacman // Tomy tmtennis // Tomy From 60abf238017ddb5571d8fcdc5e60e678cc1af169 Mon Sep 17 00:00:00 2001 From: briantro Date: Sat, 14 Mar 2015 00:37:19 -0500 Subject: [PATCH 016/201] new PE poker clones New Clones Added -------------------------------------------------- Player's Edge Plus (BE0014) Blackjack (International English/Spanish) [BrianT] Player's Edge Plus (X000006P+XP000038) Standard Draw Poker [BrianT] Player's Edge Plus (X000042P+XP000038) 10's or Better [BrianT] Player's Edge Plus (X000764P+XP000038) 4 of a Kind Bonus Poker [BrianT] Player's Edge Plus (X002010P+XP000038) Nevada Bonus Poker [BrianT] Player's Edge Plus (X002016P+XP000038) Full House Bonus Poker [BrianT] Player's Edge Plus (X002017P+XP000038) Full House Bonus Poker [BrianT] Player's Edge Plus (X002037P+XP000038) Nevada Bonus Poker [BrianT] Player's Edge Plus (X002039P+XP000038) Nevada Bonus Poker [BrianT] Player's Edge Plus (X002247P+XP000038) Standard Draw Poker [BrianT] Player's Edge Plus (X002386P+XP000038) 4 of a Kind Bonus Poker [BrianT] --- src/mame/drivers/peplus.c | 280 +++++++++++++++++++++++++++++++++++++- src/mame/mame.lst | 11 ++ 2 files changed, 289 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/peplus.c b/src/mame/drivers/peplus.c index 033e73be66b..77ed8dee732 100644 --- a/src/mame/drivers/peplus.c +++ b/src/mame/drivers/peplus.c @@ -3995,7 +3995,7 @@ PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) Programs Available: PP0516, X000516P & PP0540 - Non Double-up Only */ ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "pp0516_989-974.u68", 0x00000, 0x10000, CRC(d9da6e13) SHA1(421678d9cb42daaf5b21074cc3900db914dd26cf) ) /* Game Version: 989, Library Version: 974 , Video Lib ver: A0Y*/ + ROM_LOAD( "pp0516_989-974.u68", 0x00000, 0x10000, CRC(d9da6e13) SHA1(421678d9cb42daaf5b21074cc3900db914dd26cf) ) /* Game Version: 989, Library Version: 974 , Video Lib ver: A0Y */ ROM_REGION( 0x020000, "gfx1", 0 ) ROM_LOAD( "mro-cg2003.u72", 0x00000, 0x8000, CRC(0d425f48) SHA1(b60aaf3f4bd76f75f72f6e8dda724bdf795cb521) ) /* 08/30/94 @ IGT L95-0145 */ @@ -4968,6 +4968,24 @@ Known to exist: ROM_LOAD( "cap707.u50", 0x0000, 0x0100, CRC(9851ba36) SHA1(5a0a43c1e212ae8c173102ede9c57a3d95752f99) ) ROM_END +ROM_START( pebe0014a ) /* Normal board : Blackjack (BE0014) English / Spanish - Key on Credit */ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "be0014_533-a85.u68", 0x00000, 0x10000, CRC(0ce8d349) SHA1(72cdc39e4da0e016dea5aef707a9db5f9a7d500b) ) /* Game Version: 533, Library Version: A85 */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg1339.u72", 0x00000, 0x8000, NO_DUMP ) /* Needed for correct graphics for currency */ + ROM_LOAD( "mgo-cg1339.u73", 0x08000, 0x8000, NO_DUMP ) + ROM_LOAD( "mbo-cg1339.u74", 0x10000, 0x8000, NO_DUMP ) + ROM_LOAD( "mxo-cg1339.u75", 0x18000, 0x8000, NO_DUMP ) + ROM_LOAD( "mro-cg2036.u72", 0x00000, 0x8000, CRC(0a168d06) SHA1(7ed4fb5c7bcacab077bcec030f0465c6eaf3ce1c) ) + ROM_LOAD( "mgo-cg2036.u73", 0x08000, 0x8000, CRC(826b4090) SHA1(34390484c0faffe9340fd93d273b9292d09f97fd) ) + ROM_LOAD( "mbo-cg2036.u74", 0x10000, 0x8000, CRC(46aac851) SHA1(28d84b49c6cebcf2894b5a15d935618f84093caa) ) + ROM_LOAD( "mxo-cg2036.u75", 0x18000, 0x8000, CRC(60204a56) SHA1(2e3420da9e79ba304ca866d124788f84861380a7) ) + + ROM_REGION( 0x100, "proms", 0 ) + ROM_LOAD( "cap707.u50", 0x0000, 0x0100, CRC(9851ba36) SHA1(5a0a43c1e212ae8c173102ede9c57a3d95752f99) ) +ROM_END + ROM_START( peke0017 ) /* Normal board : Keno 1-10 Spot (KE0017) */ ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "ke0017_560-a07.u68", 0x00000, 0x08000, CRC(a0f70116) SHA1(15808cd3245e2e5934f3365f95590da0be552e8b) ) /* Game Version: 560, Library Version: A07 */ @@ -5382,6 +5400,30 @@ PayTable Js+ 2PR 3K STR FL FH 4K SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex0006p ) /* Superboard : Standard Draw Poker (X000006P+XP000038) */ +/* +PayTable Js+ 2PR 3K STR FL FH 4K SF RF (Bonus) +---------------------------------------------------------- + CB 1 2 3 4 6 9 25 50 250 1000 + % Range: 96.1-98.1% Optimum: 100.1% Hit Frequency: 45.2% + Programs Available: PP0006, X000006P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x000006p.u66", 0x00000, 0x10000, CRC(0ee609a1) SHA1(57043ac2c6ff4377479dd7b66d7e379053f3f602) ) /* Standard Draw Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ + ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) + ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) + ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex0040p ) /* Superboard : Standard Draw Poker (X000040P+XP000038) */ /* PayTable Js+ 2PR 3K STR FL FH 4K SF RF (Bonus) @@ -5406,6 +5448,30 @@ PayTable Js+ 2PR 3K STR FL FH 4K SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex0042p ) /* Superboard : Standard Draw Poker (10's or Better) (X000042P+XP000038) */ +/* +PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus) +---------------------------------------------------------- + P7A 1 1 3 4 6 9 25 50 300 800 + % Range: 86.8-88.8% Optimum: 90.8% Hit Frequency: 49.1% + Programs Available: PP0042, X000042P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x000042p.u66", 0x00000, 0x10000, CRC(7f803cb5) SHA1(f8f2974c78c63a608a536f2c72cf7ccb7d1ba0eb) ) /* Standard Draw Poker (10's or Better) */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ + ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) + ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) + ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex0045p ) /* Superboard : Standard Draw Poker (10's or Better) (X000045P+XP000038) */ /* PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus) @@ -6952,6 +7018,106 @@ PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex0764p ) /* Superboard : 4 of a Kind Bonus Poker (X000764P+XP000038) */ +/* + 5-K 2-4 +PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) +------------------------------------------------------------------ + P596A 1 1 3 6 8 10 25 40 80 50 250 800 + % Range: 91.8-93.8% Optimum: 95.8% Hit Frequency: 42.3% + Programs Available: PP0764, X000764P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x000764p.u66", 0x00000, 0x10000, CRC(0a1213d7) SHA1(208262fa3e9642789dcedcd3551ad876e5390707) ) /* 4 of a Kind Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2275.u77", 0x00000, 0x8000, CRC(15d5d6b8) SHA1(61b6821d4cc059732bc3831bf19bf01aa3910b31) ) + ROM_LOAD( "mgo-cg2275.u78", 0x08000, 0x8000, CRC(bcb49579) SHA1(d5d9f523304582fa6f0a0c69aade77629bdec006) ) + ROM_LOAD( "mbo-cg2275.u79", 0x10000, 0x8000, CRC(9f893787) SHA1(0b79d5cbac920394d5f5c04d0d9d3727e0060366) ) + ROM_LOAD( "mxo-cg2275.u80", 0x18000, 0x8000, CRC(6187c68b) SHA1(7777b141fd1379d37d93a228b2e2159476c2b89e) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + +ROM_START( pex2010p ) /* Superboard : Nevada Bonus Poker (X002010P+XP000038) */ +/* + 2-K +PayTable Js+ 2PR 3K 3A STR FL FH 4K 4A SF RF (Bonus) +----------------------------------------------------------------- + P503A 1 1 3 6 5 8 10 25 200 100 250 800 + % Range: 94.8-96.8% Optimum: 98.8% Hit Frequency: 42.7% + Programs Available: X002010P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002010p.u66", 0x00000, 0x10000, CRC(1a76f22e) SHA1(a269391682d44fdaf4fd68fa3e3ca7366509ce92) ) /* Nevada Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ + ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) + ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) + ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + +ROM_START( pex2016p ) /* Superboard : Fullhouse Bonus Poker (X002016P+XP000038) */ +/* + 5-K 2-4 +PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) +----------------------------------------------------------------- + P530A 1 1 3 5 8 12 25 40 200 100 250 800 + % Range: 95.4-97.4% Optimum: 99.4% Hit Frequency: 42.5% + Programs Available: X002016P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002016p.u66", 0x00000, 0x10000, CRC(77fcac28) SHA1(2d9ea5aea24295d74a3257a217717ddfe3b99736) ) /* Full House Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2275.u77", 0x00000, 0x8000, CRC(15d5d6b8) SHA1(61b6821d4cc059732bc3831bf19bf01aa3910b31) ) + ROM_LOAD( "mgo-cg2275.u78", 0x08000, 0x8000, CRC(bcb49579) SHA1(d5d9f523304582fa6f0a0c69aade77629bdec006) ) + ROM_LOAD( "mbo-cg2275.u79", 0x10000, 0x8000, CRC(9f893787) SHA1(0b79d5cbac920394d5f5c04d0d9d3727e0060366) ) + ROM_LOAD( "mxo-cg2275.u80", 0x18000, 0x8000, CRC(6187c68b) SHA1(7777b141fd1379d37d93a228b2e2159476c2b89e) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + +ROM_START( pex2017p ) /* Superboard : Fullhouse Bonus Poker (X002017P+XP000038) */ +/* + 5-K 2-4 +PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) +----------------------------------------------------------------- + P531A 1 1 3 5 7 12 25 40 200 100 250 800 + % Range: 93.7-95.7% Optimum: 97.7% Hit Frequency: 43.1% + Programs Available: X002017P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002017p.u66", 0x00000, 0x10000, CRC(16ac0b5b) SHA1(9d92b66cec4cea72bf2c04677691cc7343676d6f) ) /* Full House Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2275.u77", 0x00000, 0x8000, CRC(15d5d6b8) SHA1(61b6821d4cc059732bc3831bf19bf01aa3910b31) ) + ROM_LOAD( "mgo-cg2275.u78", 0x08000, 0x8000, CRC(bcb49579) SHA1(d5d9f523304582fa6f0a0c69aade77629bdec006) ) + ROM_LOAD( "mbo-cg2275.u79", 0x10000, 0x8000, CRC(9f893787) SHA1(0b79d5cbac920394d5f5c04d0d9d3727e0060366) ) + ROM_LOAD( "mxo-cg2275.u80", 0x18000, 0x8000, CRC(6187c68b) SHA1(7777b141fd1379d37d93a228b2e2159476c2b89e) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex2018p ) /* Superboard : Fullhouse Bonus Poker (X002018P+XP000038) */ /* 5-K 2-4 @@ -7155,6 +7321,31 @@ PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex2037p ) /* Superboard : Nevada Bonus Poker (X002037P+XP000038) */ +/* + 2-K +PayTable Js+ 2PR 3K 3A STR FL FH 4K 4A SF RF (Bonus) +----------------------------------------------------------------- + P575A 1 1 3 6 5 8 11 25 200 100 250 800 + % Range: 95.8-97.8% Optimum: 99.8% Hit Frequency: 42.7% + Programs Available: X002037P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002037p.u66", 0x00000, 0x10000, CRC(12aea90e) SHA1(26ff0e7b81271252573739f26db9d20f35af274b) ) /* Nevada Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ + ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) + ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) + ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex2038p ) /* Superboard : Nevada Bonus Poker (X002038P+XP000038) */ /* 2-K @@ -7180,6 +7371,31 @@ PayTable Js+ 2PR 3K 3A STR FL FH 4K 4A SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex2039p ) /* Superboard : Nevada Bonus Poker (X002039P+XP000038) */ +/* + 2-K +PayTable Js+ 2PR 3K 3A STR FL FH 4K 4A SF RF (Bonus) +----------------------------------------------------------------- + P577A 1 1 3 6 5 7 9 25 200 100 250 800 + % Range: 92.2-96.2% Optimum: 96.2% Hit Frequency: 43.4% + Programs Available: X002039P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002039p.u66", 0x00000, 0x10000, CRC(98cb0d98) SHA1(ff5d7b085c8b11987c32e6639f013304b55cb2bc) ) /* Nevada Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ + ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) + ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) + ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex2040p ) /* Superboard : Nevada Bonus Poker (X002040P+XP000038) */ /* 2-K @@ -7716,6 +7932,30 @@ PayTable Js+ 2PR 3K STR FL FH 4K SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex2247p ) /* Superboard : Standard Draw Poker (X002247P+XP000038) */ +/* +PayTable Js+ 2PR 3K STR FL FH 4K SF RF (Bonus) +---------------------------------------------------------- + CD 1 2 3 4 6 9 25 50 250 940 + % Range: 95.9-97.9% Optimum: 99.9% Hit Frequency: 45.3% + Programs Available: X002247P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002247p.u66", 0x00000, 0x10000, CRC(41aecb1a) SHA1(d4c5388b66b003e7f4449963d86f6b20f1954193) ) /* Standard Draw Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2185.u77", 0x00000, 0x8000, CRC(7e64bd1a) SHA1(e988a380ee58078bf5bdc7747e83aed1393cfad8) ) /* 07/10/95 @ IGT L95-1506 */ + ROM_LOAD( "mgo-cg2185.u78", 0x08000, 0x8000, CRC(d4127893) SHA1(75039c45ba6fd171a66876c91abc3191c7feddfc) ) + ROM_LOAD( "mbo-cg2185.u79", 0x10000, 0x8000, CRC(17dba955) SHA1(5f77379c88839b3a04e235e4fb0120c77e17b60e) ) + ROM_LOAD( "mxo-cg2185.u80", 0x18000, 0x8000, CRC(583eb3b1) SHA1(4a2952424969917fb1594698a779fe5a1e99bff5) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex2250p ) /* Superboard : Shockwave Poker (X002250P+XP000050) */ /* PayTable Js+ 2PR 3K STR FL FH 4K* SF RF (Bonus) @@ -8083,7 +8323,7 @@ ROM_START( pex2314p ) /* Superboard : Triple Bonus Poker Plus (X002314P+XP000112 5-K 2-4 PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) ----------------------------------------------------------------- - P903A 1 1 3 4 5 6 50 120 240 100 250 800 + P919BA 1 1 3 4 5 6 50 120 240 100 250 800 % Range: 92.6-94.6% Optimum: 96.6% Hit Frequency: 44.7% Programs Available: X002314P */ @@ -8153,6 +8393,31 @@ PayTable Js+ 2PR 3K STR FL FH 4K 4K 4K 4A SF RF (Bonus) ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) ROM_END +ROM_START( pex2386p ) /* Superboard : 4 of a Kind Bonus Poker (X002386P+XP000038) */ +/* + 5-K 2-4 +PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF (Bonus) +------------------------------------------------------------------ + ???? 1 2 3 4 5 7 25 40 80 50 500 500 + % Range: 93.3-95.3% Optimum: 97.3% Hit Frequency: 42.7% + Programs Available: X002386P +*/ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ + + ROM_REGION( 0x10000, "user1", 0 ) + ROM_LOAD( "x002386p.u66", 0x00000, 0x10000, CRC(3b2731e4) SHA1(aefe0fc2c2baf653cf3dc0e1394afbb55fb18f61) ) /* 4 of a Kind Bonus Poker */ + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD( "mro-cg2275.u77", 0x00000, 0x8000, CRC(15d5d6b8) SHA1(61b6821d4cc059732bc3831bf19bf01aa3910b31) ) + ROM_LOAD( "mgo-cg2275.u78", 0x08000, 0x8000, CRC(bcb49579) SHA1(d5d9f523304582fa6f0a0c69aade77629bdec006) ) + ROM_LOAD( "mbo-cg2275.u79", 0x10000, 0x8000, CRC(9f893787) SHA1(0b79d5cbac920394d5f5c04d0d9d3727e0060366) ) + ROM_LOAD( "mxo-cg2275.u80", 0x18000, 0x8000, CRC(6187c68b) SHA1(7777b141fd1379d37d93a228b2e2159476c2b89e) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "capx1321.u43", 0x0000, 0x0200, CRC(4b57569f) SHA1(fa29c0f627e7ce79951ec6dadec114864144f37d) ) +ROM_END + ROM_START( pex2419p ) /* Superboard : Deuces Wild Bonus Poker - French (X002419P+XP000064) */ /* Same payouts as X002027P English Deuces Wild Bonus Poker: @@ -9410,6 +9675,7 @@ GAMEL(1994, pemg0252, 0, peplus, peplus_poker, peplus_state, peplus, /* Normal board : Blackjack */ GAMEL(1994, pebe0014, 0, peplus, peplus_bjack, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (BE0014) Blackjack", 0, layout_pe_bjack ) +GAMEL(1994, pebe0014a, pebe0014, peplus, peplus_bjack, peplus_state, peplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (BE0014) Blackjack (International English/Spanish)", GAME_IMPERFECT_GRAPHICS, layout_pe_bjack ) /* Needs CG1339 graphics roms */ /* Normal board : Keno */ GAMEL(1994, peke0017, 0, peplus, peplus_keno, peplus_state, nonplus, ROT0, "IGT - International Game Technology", "Player's Edge Plus (KE0017) Keno", GAME_NOT_WORKING, layout_pe_keno ) @@ -9444,7 +9710,9 @@ GAMEL(1996, peps0716, 0, peplus, peplus_slots, peplus_state, peplus, /* Superboard : Poker */ GAMEL(1995, pex0002p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000002P+XP000038) Standard Draw Poker", 0, layout_pe_poker ) GAMEL(1995, pex0002pa, pex0002p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000002P+XP000109) Standard Draw Poker", 0, layout_pe_poker ) +GAMEL(1995, pex0006p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000006P+XP000038) Standard Draw Poker", 0, layout_pe_poker ) GAMEL(1995, pex0040p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000040P+XP000038) Standard Draw Poker", 0, layout_pe_poker ) +GAMEL(1995, pex0042p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000042P+XP000038) 10's or Better", 0, layout_pe_poker ) GAMEL(1995, pex0045p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000045P+XP000038) 10's or Better", 0, layout_pe_poker ) GAMEL(1995, pex0046p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000046P+XP000038) 10's or Better", 0, layout_pe_poker ) GAMEL(1995, pex0053p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000053P+XP000038) Joker Poker (Aces or Better)", 0, layout_pe_poker ) @@ -9507,6 +9775,10 @@ GAMEL(1995, pex0725p, 0, peplus, peplus_poker, peplus_state, peplussb, GAMEL(1995, pex0726p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000726P+XP000038) Double Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex0727p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000727P+XP000038) Double Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex0763p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000763P+XP000038) 4 of a Kind Bonus Poker", 0,layout_pe_poker ) +GAMEL(1995, pex0764p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X000764P+XP000038) 4 of a Kind Bonus Poker", 0,layout_pe_poker ) +GAMEL(1995, pex2010p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002010P+XP000038) Nevada Bonus Poker", 0, layout_pe_poker ) +GAMEL(1995, pex2016p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002016P+XP000038) Full House Bonus Poker", 0, layout_pe_poker ) +GAMEL(1995, pex2017p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002017P+XP000038) Full House Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2018p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002018P+XP000038) Full House Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2025p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002025P+XP000019) Deuces Wild Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2026p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002026P+XP000019) Deuces Wild Bonus Poker", 0, layout_pe_poker ) @@ -9515,7 +9787,9 @@ GAMEL(1995, pex2029p, 0, peplus, peplus_poker, peplus_state, peplussb, GAMEL(1995, pex2031p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002031P+XP000112) Lucky Deal Poker", 0, layout_pe_poker ) GAMEL(1995, pex2035p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002035P+XP000112) White Hot Aces Poker", 0, layout_pe_poker ) GAMEL(1995, pex2036p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002036P+XP000112) White Hot Aces Poker", 0, layout_pe_poker ) +GAMEL(1995, pex2037p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002037P+XP000038) Nevada Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2038p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002038P+XP000038) Nevada Bonus Poker", 0, layout_pe_poker ) +GAMEL(1995, pex2039p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002039P+XP000038) Nevada Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2040p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002040P+XP000038) Nevada Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2042p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002042P+XP000038) Triple Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2043p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002043P+XP000038) Triple Bonus Poker", 0, layout_pe_poker ) @@ -9537,6 +9811,7 @@ GAMEL(1995, pex2241p, 0, peplus, peplus_poker, peplus_state, peplussb, GAMEL(1995, pex2244p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002244P+XP000079) Double Bonus Poker", 0, layout_pe_poker ) GAMEL(1995, pex2245p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002245P+XP000055) Standard Draw Poker", 0,layout_pe_poker ) GAMEL(1995, pex2245pa, pex2245p, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002245P+XP000079) Standard Draw Poker", 0,layout_pe_poker ) +GAMEL(1995, pex2247p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002247P+XP000038) Standard Draw Poker", 0, layout_pe_poker ) GAMEL(1995, pex2250p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002250P+XP000050) Shockwave Poker", 0, layout_pe_poker ) GAMEL(1995, pex2251p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002251P+XP000050) Shockwave Poker", 0, layout_pe_poker ) GAMEL(1995, pex2272p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002272P+XP000055) Black Jack Bonus Poker", 0, layout_pe_poker ) @@ -9553,6 +9828,7 @@ GAMEL(1995, pex2310p, 0, peplus, peplus_poker, peplus_state, peplussb, GAMEL(1995, pex2314p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002314P+XP000112) Triple Bonus Poker Plus", 0, layout_pe_poker ) GAMEL(1995, pex2374p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002374P+XP000112) Super Aces Poker", 0, layout_pe_poker ) GAMEL(1995, pex2377p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002377P+XP000112) Super Double Bonus Poker", 0, layout_pe_poker ) +GAMEL(1995, pex2386p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002386P+XP000038) 4 of a Kind Bonus Poker", 0,layout_pe_poker ) GAMEL(1995, pex2419p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002419P+XP000064) Deuces Wild Bonus Poker - French", 0, layout_pe_poker ) GAMEL(1995, pex2420p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002420P+XP000064) Deuces Wild Bonus Poker - French", 0, layout_pe_poker ) GAMEL(1995, pex2421p, 0, peplus, peplus_poker, peplus_state, peplussb, ROT0, "IGT - International Game Technology", "Player's Edge Plus (X002421P+XP000064) Deuces Wild Bonus Poker - French", 0, layout_pe_poker ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 0ca6ffebfcf..31924ae4f11 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -11236,6 +11236,7 @@ peip0120 // (c) 1987 IGT - International Game Technology pemg0183 // (c) 1994 IGT - International Game Technology pemg0252 // (c) 1994 IGT - International Game Technology pebe0014 // (c) 1994 IGT - International Game Technology +pebe0014a // (c) 1994 IGT - International Game Technology peke0017 // (c) 1994 IGT - International Game Technology peke1012 // (c) 1994 IGT - International Game Technology peke1013 // (c) 1994 IGT - International Game Technology @@ -11264,7 +11265,9 @@ peps0631 // (c) 1996 IGT - International Game Technology peps0716 // (c) 1996 IGT - International Game Technology pex0002p // (c) 1995 IGT - International Game Technology pex0002pa // (c) 1995 IGT - International Game Technology +pex0006p // (c) 1995 IGT - International Game Technology pex0040p // (c) 1995 IGT - International Game Technology +pex0042p // (c) 1995 IGT - International Game Technology pex0045p // (c) 1995 IGT - International Game Technology pex0046p // (c) 1995 IGT - International Game Technology pex0054p // (c) 1995 IGT - International Game Technology @@ -11327,6 +11330,10 @@ pex0725p // (c) 1995 IGT - International Game Technology pex0726p // (c) 1995 IGT - International Game Technology pex0727p // (c) 1995 IGT - International Game Technology pex0763p // (c) 1995 IGT - International Game Technology +pex0764p // (c) 1995 IGT - International Game Technology +pex2010p // (c) 1995 IGT - International Game Technology +pex2016p // (c) 1995 IGT - International Game Technology +pex2017p // (c) 1995 IGT - International Game Technology pex2018p // (c) 1995 IGT - International Game Technology pex2025p // (c) 1995 IGT - International Game Technology pex2026p // (c) 1995 IGT - International Game Technology @@ -11335,7 +11342,9 @@ pex2029p // (c) 1995 IGT - International Game Technology pex2031p // (c) 1995 IGT - International Game Technology pex2035p // (c) 1995 IGT - International Game Technology pex2036p // (c) 1995 IGT - International Game Technology +pex2037p // (c) 1995 IGT - International Game Technology pex2038p // (c) 1995 IGT - International Game Technology +pex2039p // (c) 1995 IGT - International Game Technology pex2040p // (c) 1995 IGT - International Game Technology pex2042p // (c) 1995 IGT - International Game Technology pex2043p // (c) 1995 IGT - International Game Technology @@ -11357,6 +11366,7 @@ pex2241p // (c) 1995 IGT - International Game Technology pex2244p // (c) 1995 IGT - International Game Technology pex2245p // (c) 1995 IGT - International Game Technology pex2245pa // (c) 1995 IGT - International Game Technology +pex2247p // (c) 1995 IGT - International Game Technology pex2250p // (c) 1995 IGT - International Game Technology pex2251p // (c) 1995 IGT - International Game Technology pex2272p // (c) 1995 IGT - International Game Technology @@ -11373,6 +11383,7 @@ pex2310p // (c) 1995 IGT - International Game Technology pex2314p // (c) 1995 IGT - International Game Technology pex2374p // (c) 1995 IGT - International Game Technology pex2377p // (c) 1995 IGT - International Game Technology +pex2386p // (c) 1995 IGT - International Game Technology pex2419p // (c) 1995 IGT - International Game Technology pex2420p // (c) 1995 IGT - International Game Technology pex2421p // (c) 1995 IGT - International Game Technology From 39aadc1b4324dcefc796b6949e456ae075fa23d4 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sat, 14 Mar 2015 07:57:07 +0100 Subject: [PATCH 017/201] jankenmn: enabled save state support (nw) --- src/mame/drivers/jankenmn.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/mame/drivers/jankenmn.c b/src/mame/drivers/jankenmn.c index 4c4210295a6..c28b74a276c 100644 --- a/src/mame/drivers/jankenmn.c +++ b/src/mame/drivers/jankenmn.c @@ -152,11 +152,13 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu") { } - DECLARE_CUSTOM_INPUT_MEMBER(jankenmn_hopper_status_r); - DECLARE_WRITE8_MEMBER(jankenmn_lamps1_w); - DECLARE_WRITE8_MEMBER(jankenmn_lamps2_w); - DECLARE_WRITE8_MEMBER(jankenmn_lamps3_w); required_device m_maincpu; + + DECLARE_WRITE8_MEMBER(lamps1_w); + DECLARE_WRITE8_MEMBER(lamps2_w); + DECLARE_WRITE8_MEMBER(lamps3_w); + + DECLARE_CUSTOM_INPUT_MEMBER(hopper_status_r); }; @@ -167,7 +169,7 @@ public: static const UINT8 led_map[16] = // 7748 IC? { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 }; -WRITE8_MEMBER(jankenmn_state::jankenmn_lamps1_w) +WRITE8_MEMBER(jankenmn_state::lamps1_w) { // hand state: d0: rock, d1: scissors, d2: paper output_set_lamp_value(8, (data & 7) != 0); @@ -183,7 +185,7 @@ WRITE8_MEMBER(jankenmn_state::jankenmn_lamps1_w) // d3: ? (only set if game is over) } -WRITE8_MEMBER(jankenmn_state::jankenmn_lamps2_w) +WRITE8_MEMBER(jankenmn_state::lamps2_w) { // button LEDs: d1: paper, d2: scissors, d3: rock output_set_lamp_value(2, data >> 3 & 1); @@ -202,7 +204,7 @@ WRITE8_MEMBER(jankenmn_state::jankenmn_lamps2_w) output_set_digit_value(0, led_map[data & 1]); } -WRITE8_MEMBER(jankenmn_state::jankenmn_lamps3_w) +WRITE8_MEMBER(jankenmn_state::lamps3_w) { // d1: blue rotating lamp on top of cab output_set_lamp_value(15, data >> 1 & 1); @@ -220,7 +222,7 @@ WRITE8_MEMBER(jankenmn_state::jankenmn_lamps3_w) // d0, d6, d7: N/C? } -CUSTOM_INPUT_MEMBER(jankenmn_state::jankenmn_hopper_status_r) +CUSTOM_INPUT_MEMBER(jankenmn_state::hopper_status_r) { // temp workaround, needs hopper return machine().rand(); @@ -257,7 +259,7 @@ static INPUT_PORTS_START( jankenmn ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Paa (Paper)") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN3 ) // 100 yen coin - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jankenmn_state,jankenmn_hopper_status_r, NULL) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jankenmn_state, hopper_status_r, NULL) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN2 ) // 10 yen coin PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) // 10 yen coin @@ -315,13 +317,13 @@ static MACHINE_CONFIG_START( jankenmn, jankenmn_state ) /* (10-13) Mode 0 - Ports A & B set as input, high C & low C as output. */ MCFG_I8255_IN_PORTA_CB(IOPORT("DSW")) MCFG_I8255_IN_PORTB_CB(IOPORT("IN0")) - MCFG_I8255_OUT_PORTC_CB(WRITE8(jankenmn_state, jankenmn_lamps3_w)) + MCFG_I8255_OUT_PORTC_CB(WRITE8(jankenmn_state, lamps3_w)) MCFG_DEVICE_ADD("ppi8255_1", I8255, 0) /* (20-23) Mode 0 - Ports A, B, high C & low C set as output. */ MCFG_I8255_OUT_PORTA_CB(DEVWRITE8("dac", dac_device, write_unsigned8)) - MCFG_I8255_OUT_PORTB_CB(WRITE8(jankenmn_state, jankenmn_lamps1_w)) - MCFG_I8255_OUT_PORTC_CB(WRITE8(jankenmn_state, jankenmn_lamps2_w)) + MCFG_I8255_OUT_PORTB_CB(WRITE8(jankenmn_state, lamps1_w)) + MCFG_I8255_OUT_PORTC_CB(WRITE8(jankenmn_state, lamps2_w)) MCFG_DEVICE_ADD("ctc", Z80CTC, MASTER_CLOCK) MCFG_Z80CTC_INTR_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) @@ -359,4 +361,4 @@ ROM_END *********************************************/ /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS... LAYOUT */ -GAMEL( 1991, jankenmn, 0, jankenmn, jankenmn, driver_device, 0, ROT0, "Sunwise", "Janken Man Kattara Ageru", 0, layout_jankenmn ) +GAMEL( 1991, jankenmn, 0, jankenmn, jankenmn, driver_device, 0, ROT0, "Sunwise", "Janken Man Kattara Ageru", GAME_SUPPORTS_SAVE, layout_jankenmn ) From ae1856faa45aa2a5d3e3d1fa10dc9995da03565b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 14 Mar 2015 09:05:55 +0100 Subject: [PATCH 018/201] compile fix from Firewave propagated upstream (nw) --- 3rdparty/mongoose/mongoose.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3rdparty/mongoose/mongoose.c b/3rdparty/mongoose/mongoose.c index 53908b63053..244b3d8efba 100644 --- a/3rdparty/mongoose/mongoose.c +++ b/3rdparty/mongoose/mongoose.c @@ -80,6 +80,8 @@ #ifdef _WIN32 #ifdef _MSC_VER #pragma comment(lib, "ws2_32.lib") // Linking with winsock library +#include +typedef SSIZE_T ssize_t; #endif #include #include From eb43ff52df9e76f3dadbede7567b79b7b0869453 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 14 Mar 2015 11:52:58 +0000 Subject: [PATCH 019/201] new clones Puzznic (bootleg) [cmonkey] --- src/mame/audio/hng64.c | 61 ++++++++++++++++++++++++++++++++------ src/mame/drivers/taito_l.c | 15 ++++++++-- src/mame/mame.lst | 3 +- 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/mame/audio/hng64.c b/src/mame/audio/hng64.c index 8003b14b492..dbce6f5c885 100644 --- a/src/mame/audio/hng64.c +++ b/src/mame/audio/hng64.c @@ -23,6 +23,10 @@ IRQ mask register on the internal interrupt controller is set to 0xd8 so levels 0,1,2,5 are unmasked +returning random values / triggering random interrupts eventually results in a situation +where the CPU stops writing to the sound related addresses and starts reading / masking the +serial comms register. + */ @@ -191,15 +195,17 @@ WRITE16_MEMBER(hng64_state::hng64_sound_port_0008_w) READ16_MEMBER(hng64_state::hng64_sound_port_0004_r) { + // it writes the channel select before reading this.. so either it works on channels, or the command.. // read in irq5 - logerror("%08x: hng64_sound_port_0004_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + printf("%08x: hng64_sound_port_0004_r mask (%04x) chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel); return rand(); } READ16_MEMBER(hng64_state::hng64_sound_port_0006_r) { + // it writes the channel select before reading this.. so either it works on channels, or the command.. // read in irq5 - logerror("%08x: hng64_sound_port_0006_r mask (%04x)\n", space.device().safe_pc(), mem_mask); + printf("%08x: hng64_sound_port_0006_r mask (%04x) chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel); return rand(); } @@ -212,28 +218,60 @@ READ16_MEMBER(hng64_state::hng64_sound_port_0008_r) WRITE16_MEMBER(hng64_state::hng64_sound_select_w) { - // seems to write values in the format xxyy where yy is 0x00-0x1f and xx is oten 00/01/0a - // there are said to be 32 audio channels, so maybe the lower byte is the channel? + // I'm guessing these addresses are the sound chip / DSP? + + // ---- ---- 000c cccc + // c = channel + + if (data & 0x00e0) printf("hng64_sound_select_w unknown channel %02x\n", data & 0x00ff); + + UINT8 command = data >> 8; + + switch (command) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: // 00003fffffff (startup only?) + case 0x04: // doesn't use 6 + case 0x05: // 00003fffffff (mostly, often) + case 0x06: // 00007ff0ffff mostly + case 0x07: // 0000000f0708 etc. (low values) + case 0x08: // doesn't write to 2/4/6 with this set?? + case 0x09: // doesn't write to 2/4/6 with this set?? + case 0x0a: // random looking values + + break; + + default: + printf("hng64_sound_select_w unrecognized command %02x\n", command); + break; + } -// logerror("hng64_sound_select_w") COMBINE_DATA(&m_audiochannel); } WRITE16_MEMBER(hng64_state::hng64_sound_data_02_w) { m_audiodat[m_audiochannel].dat[2] = data; -// logerror("write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); + +// if ((m_audiochannel & 0xff00) == 0x0a00) +// printf("write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); } WRITE16_MEMBER(hng64_state::hng64_sound_data_04_w) { m_audiodat[m_audiochannel].dat[1] = data; -// logerror("write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); + +// if ((m_audiochannel & 0xff00) == 0x0a00) +// printf("write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); } WRITE16_MEMBER(hng64_state::hng64_sound_data_06_w) { m_audiodat[m_audiochannel].dat[0] = data; -// logerror("write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); + +// if ((m_audiochannel & 0xff00) == 0x0a00) +// printf("write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]); } // but why not just use the V33/V53 XA mode?? @@ -377,7 +415,12 @@ WRITE_LINE_MEMBER(hng64_state::tcu_tm2_cb) { // these are very active, maybe they feed back into the v53 via one of the IRQ pins? TM2 toggles more rapidly than TM1 // logerror("tcu_tm2_cb %02x\n", state); - m_audiocpu->set_input_line(2, state? ASSERT_LINE:CLEAR_LINE); // not accurate, just so we have a trigger + + // NOT ACCURATE, just so that all the interrupts get triggered for now. + static int i = 0; + m_audiocpu->set_input_line(i, state? ASSERT_LINE:CLEAR_LINE); + i++; + if (i == 3) i = 0; } diff --git a/src/mame/drivers/taito_l.c b/src/mame/drivers/taito_l.c index 9315fdfa58c..49d9edb202e 100644 --- a/src/mame/drivers/taito_l.c +++ b/src/mame/drivers/taito_l.c @@ -2352,7 +2352,7 @@ ROM_START( puzznicj ) ROM_LOAD( "c20-05.ic3", 0x0000, 0x0144, CRC(f90e5594) SHA1(6181bb25b77028bb150c84bdc073f0457efd7eaa) ) // Confirmed/Matches Japan Set ROM_END -ROM_START( puzznici ) /* bootleg */ +ROM_START( puzznici ) /* bootleg (original main board, bootleg sub-board without MCU) */ ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "1.ic11", 0x00000, 0x20000, CRC(4612f5e0) SHA1(dc07a365414666568537d31ef01b58f2362cadaf) ) @@ -2361,6 +2361,15 @@ ROM_START( puzznici ) /* bootleg */ ROM_LOAD16_BYTE( "3.ic9", 0x00001, 0x20000, CRC(2bf5232a) SHA1(a8fc06bb8bae2ca6bd21e3a96c9ed38bb356d5d7) ) ROM_END +ROM_START( puzznicb ) /* bootleg (original main board, bootleg sub-board without MCU) */ + ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_LOAD( "ic11.bin", 0x00000, 0x20000, CRC(2510df4d) SHA1(534327e3d7f847b6c0effc5fd0fb9f5da9b0d3b1) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) // this has the bad line in tile 1 fixed (unused I believe) are we sure the roms used in the original sets are a good dump? + ROM_LOAD16_BYTE( "ic10.bin", 0x00000, 0x10000, CRC(be12749a) SHA1(c67d1a434486843a6776d89e905362b7db595d8d) ) + ROM_LOAD16_BYTE( "ic9.bin", 0x00001, 0x10000, CRC(0f183340) SHA1(9eef7de801eb9763313f55a38e567b92fca3bfa6) ) +ROM_END + /* Taito's Horse Shoe @@ -2588,13 +2597,13 @@ GAME( 1989, flipull, plotting, plotting, plotting, driver_device, 0, GAME( 1989, puzznic, 0, puzznic, puzznic, driver_device, 0, ROT0, "Taito Corporation Japan", "Puzznic (World)", 0 ) GAME( 1989, puzznicj, puzznic, puzznic, puzznic, driver_device, 0, ROT0, "Taito Corporation", "Puzznic (Japan)", 0 ) GAME( 1989, puzznici, puzznic, puzznici, puzznic, driver_device, 0, ROT0, "bootleg", "Puzznic (Italian bootleg)", 0 ) +GAME( 1989, puzznicb, puzznic, puzznici, puzznic, driver_device, 0, ROT0, "bootleg", "Puzznic (bootleg)", 0 ) GAME( 1990, horshoes, 0, horshoes, horshoes, driver_device, 0, ROT270, "Taito America Corporation", "American Horseshoes (US)", 0 ) GAME( 1990, palamed, 0, palamed, palamed, driver_device, 0, ROT0, "Taito Corporation", "Palamedes (Japan)", 0 ) GAME( 1993, cachat, 0, cachat, cachat, driver_device, 0, ROT0, "Taito Corporation", "Cachat (Japan)", 0 ) - GAME( 1993, tubeit, cachat, cachat, tubeit, driver_device, 0, ROT0, "bootleg", "Tube-It", 0 ) // No (c) message GAME( 199?, cubybop, 0, cachat, cubybop, driver_device, 0, ROT0, "Hot-B", "Cuby Bop (location test)", 0 ) // No (c) message, but Hot-B company logo in tile gfx @@ -2603,6 +2612,6 @@ GAME( 1992, plgirls, 0, cachat, plgirls, driver_device, 0, GAME( 1992, lagirl, plgirls, cachat, plgirls, driver_device, 0, ROT270, "bootleg", "LA Girl", 0 ) // bootleg hardware with changed title & backgrounds GAME( 1993, plgirls2, 0, cachat, plgirls2, driver_device, 0, ROT270, "Hot-B", "Play Girls 2", 0 ) -GAME( 1993, plgirls2b, plgirls2, cachat, plgirls2, driver_device, 0, ROT270, "bootleg", "Play Girls 2 (bootleg)", 0 ) // bootleg hardware (regular Z80 etc. instead of TC0090LVC, but acts the same) +GAME( 1993, plgirls2b, plgirls2, cachat, plgirls2, driver_device, 0, ROT270, "bootleg", "Play Girls 2 (bootleg)", GAME_IMPERFECT_GRAPHICS ) // bootleg hardware (regular Z80 etc. instead of TC0090LVC, but acts almost the same - scroll offset problems) GAME( 1990, evilston, 0, evilston, evilston, driver_device, 0, ROT270, "Spacy Industrial, Ltd.", "Evil Stone", GAME_IMPERFECT_SOUND ) // not Taito PCB, just uses TC0090LVC diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 31924ae4f11..e5216e1b67f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -2283,7 +2283,8 @@ champwru // C01 (c) 1989 Taito America Corporation (US) champwrj // C01 (c) 1989 Taito Corporation (Japan) puzznic // C20 (c) 1989 Taito Corporation (Japan) puzznicj // C20 (c) 1989 Taito Corporation (Japan) -puzznici // C20 (c) 1989 Taito Corporation (Japan) +puzznici // bootleg +puzznicb // bootleg horshoes // C47 (c) 1990 Taito America Corporation (US) palamed // C63 (c) 1990 Taito Corporation (Japan) cachat // ??? (c) 1993 Taito Corporation (Japan) From 0fdc96d72cbb94da30cf8f28903c2bcfc2030d90 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sat, 14 Mar 2015 14:40:36 +0100 Subject: [PATCH 020/201] i386.c: remove bug in x87 fsave and frstor (nw) --- src/emu/cpu/i386/x87ops.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emu/cpu/i386/x87ops.inc b/src/emu/cpu/i386/x87ops.inc index 545e9e8e684..0459e39358d 100644 --- a/src/emu/cpu/i386/x87ops.inc +++ b/src/emu/cpu/i386/x87ops.inc @@ -4519,7 +4519,7 @@ void i386_device::x87_fsave(UINT8 modrm) } for (int i = 0; i < 8; ++i) - x87_write_stack(i, READ80(ea + i*10), FALSE); + WRITE80(ea + i*10, ST(i)); CYCLES((m_cr[0] & 1) ? 56 : 67); } @@ -4575,7 +4575,7 @@ void i386_device::x87_frstor(UINT8 modrm) } for (int i = 0; i < 8; ++i) - WRITE80(ea + i*10, ST(i)); + x87_write_stack(i, READ80(ea + i*10), FALSE); CYCLES((m_cr[0] & 1) ? 34 : 44); } From f2430a3fdfc8f98abd2bde14b37504bd86ff5344 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sat, 14 Mar 2015 14:44:38 +0100 Subject: [PATCH 021/201] i386.c: x87 fpatan implemented using atan2() and not atan() (nw) --- src/emu/cpu/i386/x87ops.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emu/cpu/i386/x87ops.inc b/src/emu/cpu/i386/x87ops.inc index 0459e39358d..1afd7da0a40 100644 --- a/src/emu/cpu/i386/x87ops.inc +++ b/src/emu/cpu/i386/x87ops.inc @@ -2411,7 +2411,7 @@ void i386_device::x87_fpatan(UINT8 modrm) else { // TODO: Inaccurate - double val = atan(fx80_to_double(ST(1)) / fx80_to_double(ST(0))); + double val = atan2(fx80_to_double(ST(1)) , fx80_to_double(ST(0))); result = double_to_fx80(val); } From 612af8ba64b4aa37a51f5b2f6d895158382ece30 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sat, 14 Mar 2015 14:51:57 +0100 Subject: [PATCH 022/201] i386.c: new implementation of x87 opcode fprem based on intel manual since curent one gives wrong results (nw) --- src/emu/cpu/i386/x87ops.inc | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/emu/cpu/i386/x87ops.inc b/src/emu/cpu/i386/x87ops.inc index 1afd7da0a40..c057138cb44 100644 --- a/src/emu/cpu/i386/x87ops.inc +++ b/src/emu/cpu/i386/x87ops.inc @@ -2185,13 +2185,41 @@ void i386_device::x87_fprem(UINT8 modrm) } else { - floatx80 a = ST(0); - floatx80 b = ST(1); + floatx80 a0 = ST(0); + floatx80 b1 = ST(1); m_x87_sw &= ~X87_SW_C2; - // TODO: Implement Cx bits - result = floatx80_rem(a, b); + //int d=extractFloatx80Exp(a0)-extractFloatx80Exp(b1); + int d = (a0.high & 0x7FFF) - (b1.high & 0x7FFF); + if (d < 64) { + floatx80 t=floatx80_div(a0, b1); + int64 q = floatx80_to_int64_round_to_zero(t); + floatx80 qf = int64_to_floatx80(q); + floatx80 tt = floatx80_mul(b1, qf); + result = floatx80_sub(a0, tt); + // C2 already 0 + m_x87_sw &= ~(X87_SW_C0|X87_SW_C3|X87_SW_C1); + if (q & 1) + m_x87_sw |= X87_SW_C1; + if (q & 2) + m_x87_sw |= X87_SW_C3; + if (q & 4) + m_x87_sw |= X87_SW_C0; + } + else { + m_x87_sw |= X87_SW_C2; + int n = 63; + int e = 1 << (d - n); + floatx80 ef = int32_to_floatx80(e); + floatx80 t=floatx80_div(a0, b1); + floatx80 td = floatx80_div(t, ef); + int64 qq = floatx80_to_int64_round_to_zero(td); + floatx80 qqf = int64_to_floatx80(qq); + floatx80 tt = floatx80_mul(b1, qqf); + floatx80 ttt = floatx80_mul(tt, ef); + result = floatx80_sub(a0, ttt); + } } if (x87_check_exceptions()) From 4cf5728397ec036d2650a903ed405089816e0bd5 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 14 Mar 2015 17:33:19 +0100 Subject: [PATCH 023/201] added interrupt/timer --- src/emu/cpu/hmcs40/hmcs40.c | 209 ++++++++++++++++++++++++++++---- src/emu/cpu/hmcs40/hmcs40.h | 23 +++- src/emu/cpu/hmcs40/hmcs40d.c | 50 +++++--- src/emu/cpu/hmcs40/hmcs40op.inc | 67 +++++----- 4 files changed, 272 insertions(+), 77 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index defd8a6e180..bbf4b4327bd 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -184,6 +184,9 @@ void hmcs40_cpu_device::device_start() m_prgmask = (1 << m_prgwidth) - 1; m_datamask = (1 << m_datawidth) - 1; m_pcmask = (1 << m_pcwidth) - 1; + + m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hmcs40_cpu_device::simple_timer_cb), this)); + reset_prescaler(); m_read_r0.resolve_safe(0); m_read_r1.resolve_safe(0); @@ -210,6 +213,8 @@ void hmcs40_cpu_device::device_start() memset(m_stack, 0, sizeof(m_stack)); m_op = 0; m_prev_op = 0; + m_i = 0; + m_eint_line = 0; m_pc = 0; m_prev_pc = 0; m_page = 0; @@ -221,6 +226,13 @@ void hmcs40_cpu_device::device_start() m_spy = 0; m_s = 1; m_c = 0; + m_tc = 0; + m_cf = 0; + m_ie = 0; + m_iri = m_irt = 0; + memset(m_if, 0, sizeof(m_if)); + m_tf = 0; + memset(m_int, 0, sizeof(m_int)); memset(m_r, 0, sizeof(m_r)); m_d = 0; @@ -228,6 +240,8 @@ void hmcs40_cpu_device::device_start() save_item(NAME(m_stack)); save_item(NAME(m_op)); save_item(NAME(m_prev_op)); + save_item(NAME(m_i)); + save_item(NAME(m_eint_line)); save_item(NAME(m_pc)); save_item(NAME(m_prev_pc)); save_item(NAME(m_page)); @@ -239,6 +253,15 @@ void hmcs40_cpu_device::device_start() save_item(NAME(m_spy)); save_item(NAME(m_s)); save_item(NAME(m_c)); + save_item(NAME(m_tc)); + save_item(NAME(m_cf)); + save_item(NAME(m_ie)); + save_item(NAME(m_iri)); + save_item(NAME(m_irt)); + save_item(NAME(m_if)); + save_item(NAME(m_tf)); + save_item(NAME(m_int)); + save_item(NAME(m_r)); save_item(NAME(m_d)); @@ -275,6 +298,12 @@ void hmcs40_cpu_device::device_reset() for (int i = 0; i < 8; i++) hmcs40_cpu_device::write_r(i, 0); + + // clear interrupts + m_cf = 0; + m_ie = 0; + m_iri = m_irt = 0; + m_if[0] = m_if[1] = m_tf = 1; } @@ -347,7 +376,7 @@ UINT8 hmcs43_cpu_device::read_r(int index) index &= 7; if (index >= 2) - logerror("%s read from %s port R%d at $%04X\n", tag(), (index >= 4) ? "unknown" : "output", index, m_prev_pc << 1); + logerror("%s read from %s port R%d at $%04X\n", tag(), (index >= 4) ? "unknown" : "output", index, m_prev_pc); return hmcs40_cpu_device::read_r(index); } @@ -359,7 +388,7 @@ void hmcs43_cpu_device::write_r(int index, UINT8 data) if (index != 0 && index < 4) hmcs40_cpu_device::write_r(index, data); else - logerror("%s ineffective write to port R%d = $%X at $%04X\n", tag(), index, data & 0xf, m_prev_pc << 1); + logerror("%s ineffective write to port R%d = $%X at $%04X\n", tag(), index, data & 0xf, m_prev_pc); } int hmcs43_cpu_device::read_d(int index) @@ -367,7 +396,7 @@ int hmcs43_cpu_device::read_d(int index) index &= 15; if (index >= 4) - logerror("%s read from output pin D%d at $%04X\n", tag(), index, m_prev_pc << 1); + logerror("%s read from output pin D%d at $%04X\n", tag(), index, m_prev_pc); return hmcs40_cpu_device::read_d(index); } @@ -381,7 +410,7 @@ UINT8 hmcs44_cpu_device::read_r(int index) index &= 7; if (index >= 6) - logerror("%s read from unknown port R%d at $%04X\n", tag(), index, m_prev_pc << 1); + logerror("%s read from unknown port R%d at $%04X\n", tag(), index, m_prev_pc); return hmcs40_cpu_device::read_r(index); } @@ -393,7 +422,7 @@ void hmcs44_cpu_device::write_r(int index, UINT8 data) if (index < 6) hmcs40_cpu_device::write_r(index, data); else - logerror("%s ineffective write to port R%d = $%X at $%04X\n", tag(), index, data & 0xf, m_prev_pc << 1); + logerror("%s ineffective write to port R%d = $%X at $%04X\n", tag(), index, data & 0xf, m_prev_pc); } // HMCS45: @@ -405,7 +434,7 @@ UINT8 hmcs45_cpu_device::read_r(int index) index &= 7; if (index >= 6) - logerror("%s read from %s port R%d at $%04X\n", tag(), (index == 7) ? "unknown" : "output", index, m_prev_pc << 1); + logerror("%s read from %s port R%d at $%04X\n", tag(), (index == 7) ? "unknown" : "output", index, m_prev_pc); return hmcs40_cpu_device::read_r(index); } @@ -417,7 +446,83 @@ void hmcs45_cpu_device::write_r(int index, UINT8 data) if (index != 7) hmcs40_cpu_device::write_r(index, data); else - logerror("%s ineffective write to port R%d = $%X at $%04X\n", tag(), index, data & 0xf, m_prev_pc << 1); + logerror("%s ineffective write to port R%d = $%X at $%04X\n", tag(), index, data & 0xf, m_prev_pc); +} + + + +//------------------------------------------------- +// interrupt/timer handling +//------------------------------------------------- + +void hmcs40_cpu_device::do_interrupt() +{ + m_icount--; + push_stack(); + + // line 0/1 for external interrupt, let's use 2 for t/c interrupt + int line = (m_iri) ? m_eint_line : 2; + + // vector $3f, on page 0(timer/counter), or page 1(external) + // external interrupt has priority over t/c interrupt + m_pc = 0x3f | (m_iri ? 0x40 : 0); + m_iri = m_irt = 0; + m_ie = 0; + + standard_irq_callback(line); +} + +void hmcs40_cpu_device::execute_set_input(int line, int state) +{ + if (line != 0 && line != 1) + return; + state = (state) ? 1 : 0; + + // external interrupt request on rising edge + if (state && !m_int[line]) + { + if (!m_if[line]) + { + m_eint_line = line; + m_iri = 1; + m_if[line] = 1; + } + + // clock tc if it is in counter mode + if (m_cf && line == 1) + increment_tc(); + } + + m_int[line] = state; +} + +void hmcs40_cpu_device::reset_prescaler() +{ + // reset 6-bit timer prescaler + attotime base = attotime::from_hz(unscaled_clock() / 4 / 64); + m_timer->adjust(base); +} + +TIMER_CALLBACK_MEMBER( hmcs40_cpu_device::simple_timer_cb ) +{ + // timer prescaler overflow + if (!m_cf) + increment_tc(); + + reset_prescaler(); +} + +void hmcs40_cpu_device::increment_tc() +{ + // increment timer/counter + m_tc = (m_tc + 1) & 0xf; + + // timer interrupt request on overflow + if (m_tc == 0 && !m_tf) + { + m_irt = 1; + m_tf = 1; + } } @@ -451,6 +556,10 @@ void hmcs40_cpu_device::execute_run() if ((m_prev_op & 0x3e0) == 0x340) m_pc = ((m_page << 6) | (m_pc & 0x3f)) & m_pcmask; + // check/handle interrupt + else if (m_ie && (m_iri || m_irt)) + do_interrupt(); + // remember previous state m_prev_op = m_op; m_prev_pc = m_pc; @@ -458,15 +567,67 @@ void hmcs40_cpu_device::execute_run() // fetch next opcode debugger_instruction_hook(this, m_pc); m_op = m_program->read_word(m_pc << 1) & 0x3ff; + m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param increment_pc(); +/* + +op_ayy(); - +op_syy(); - +op_am(); - 34 234 4c +op_sm()???:- 234 +op_daa(); - 46 +op_das(); - 45 +op_nega(); - +op_anem(); - 324 124 +op_bnem(); - 267 024 +op_alem(); - 324 124 +op_blem(); - 267 024 +op_lay(); - 118 + +*/ + // handle opcode switch (m_op) { + case 0x118: + op_lay(); // probably lay + break; + case 0x267: + op_blem(); break; // bnem or blem + case 0x124: + op_alem(); // alem or anem + break; + case 0x324: + op_anem(); break; // " + case 0x024: + //op_nega(); + //op_am(); + op_illegal(); + break; + case 0x234: + // sm? +#if 0 + m_a = ram_r() - m_a; + m_s = ~m_a >> 4 & 1; + m_a &= 0xf; +#else + op_am(); +#endif + break; + case 0x04c: + op_illegal(); + //m_c ^= 1; + //op_lat(); + break; + + + + /* 0x000 */ case 0x000: case 0x001: case 0x002: case 0x003: - op_xsp(); break; +/* ok */ op_xsp(); break; case 0x004: case 0x005: case 0x006: case 0x007: op_sem(); break; case 0x008: case 0x009: case 0x00a: case 0x00b: @@ -490,7 +651,7 @@ void hmcs40_cpu_device::execute_run() case 0x050: op_lya(); break; case 0x054: - op_iy(); break; +/* ok */ op_iy(); break; case 0x060: op_lba(); break; case 0x064: @@ -513,7 +674,7 @@ void hmcs40_cpu_device::execute_run() case 0x0a2: op_seif0(); break; case 0x0a4: - op_seie(); break; +/* ok */ op_seie(); break; case 0x0a5: op_setf(); break; @@ -526,14 +687,14 @@ void hmcs40_cpu_device::execute_run() op_lbr(); break; case 0x0f0: case 0x0f1: case 0x0f2: case 0x0f3: case 0x0f4: case 0x0f5: case 0x0f6: case 0x0f7: case 0x0f8: case 0x0f9: case 0x0fa: case 0x0fb: case 0x0fc: case 0x0fd: case 0x0fe: case 0x0ff: - op_xamr(); break; +/* ok */ op_xamr(); break; /* 0x100 */ - case 0x110: case 0x111: +/* ok */ case 0x110: case 0x111: op_lmaiy(); break; - case 0x114: case 0x115: +/* ok */ case 0x114: case 0x115: op_lmady(); break; case 0x120: op_or(); break; @@ -549,7 +710,7 @@ void hmcs40_cpu_device::execute_run() /* ok */ op_lbi(); break; case 0x170: case 0x171: case 0x172: case 0x173: case 0x174: case 0x175: case 0x176: case 0x177: case 0x178: case 0x179: case 0x17a: case 0x17b: case 0x17c: case 0x17d: case 0x17e: case 0x17f: - op_lti(); break; +/* ok */ op_lti(); break; case 0x1a0: op_tif1(); break; @@ -580,40 +741,40 @@ void hmcs40_cpu_device::execute_run() case 0x204: case 0x205: case 0x206: case 0x207: op_rem(); break; case 0x208: case 0x209: case 0x20a: case 0x20b: - op_xma(); break; +/* ok */ op_xma(); break; case 0x210: case 0x211: case 0x212: case 0x213: case 0x214: case 0x215: case 0x216: case 0x217: case 0x218: case 0x219: case 0x21a: case 0x21b: case 0x21c: case 0x21d: case 0x21e: case 0x21f: op_mnei(); break; case 0x220: case 0x221: case 0x222: case 0x223: /* ok */ op_xmb(); break; case 0x224: - op_rotr(); break; +/* ok */ op_rotr(); break; case 0x225: - op_rotl(); break; +/* ok */ op_rotl(); break; case 0x230: op_smc(); break; case 0x23c: op_lat(); break; case 0x240: - op_laspx(); break; +/* ok */ op_laspx(); break; case 0x24f: op_tc(); break; case 0x250: - op_laspy(); break; +/* ok */ op_laspy(); break; case 0x254: op_dy(); break; case 0x260: - op_lab(); break; +/* ok */ op_lab(); break; case 0x264: op_db(); break; case 0x270: case 0x271: case 0x272: case 0x273: case 0x274: case 0x275: case 0x276: case 0x277: case 0x278: case 0x279: case 0x27a: case 0x27b: case 0x27c: case 0x27d: case 0x27e: case 0x27f: - op_alei(); break; +/* ok */ op_alei(); break; case 0x280: case 0x281: case 0x282: case 0x283: case 0x284: case 0x285: case 0x286: case 0x287: case 0x288: case 0x289: case 0x28a: case 0x28b: case 0x28c: case 0x28d: case 0x28e: case 0x28f: - op_ynei(); break; +/* ok */ op_ynei(); break; case 0x290: /* ok */ op_red(); break; case 0x2a0: @@ -625,7 +786,7 @@ void hmcs40_cpu_device::execute_run() case 0x2a4: op_reie(); break; case 0x2a5: - op_retf(); break; +/* ok */ op_retf(); break; case 0x2c0: case 0x2c1: case 0x2c2: case 0x2c3: case 0x2c4: case 0x2c5: case 0x2c6: case 0x2c7: /* ok */ op_lra(); break; @@ -651,7 +812,7 @@ void hmcs40_cpu_device::execute_run() /* ok */ op_p(); break; case 0x3a4: - op_rtni(); break; +/* ok */ op_rtni(); break; case 0x3a7: /* ok */ op_rtn(); break; diff --git a/src/emu/cpu/hmcs40/hmcs40.h b/src/emu/cpu/hmcs40/hmcs40.h index 6e423a52879..2ee8f2f7a96 100644 --- a/src/emu/cpu/hmcs40/hmcs40.h +++ b/src/emu/cpu/hmcs40/hmcs40.h @@ -78,7 +78,8 @@ protected: // device_execute_interface overrides virtual UINT32 execute_min_cycles() const { return 1; } virtual UINT32 execute_max_cycles() const { return 2; } - virtual UINT32 execute_input_lines() const { return 1; } + virtual UINT32 execute_input_lines() const { return 2+1; } // 3rd one is internal + virtual void execute_set_input(int line, int state); virtual void execute_run(); // device_memory_interface overrides @@ -86,7 +87,7 @@ protected: // device_disasm_interface overrides virtual UINT32 disasm_min_opcode_bytes() const { return 2; } - virtual UINT32 disasm_max_opcode_bytes() const { return 2+1; } + virtual UINT32 disasm_max_opcode_bytes() const { return 2; } virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options); void state_string_export(const device_state_entry &entry, astring &string); @@ -107,6 +108,9 @@ protected: UINT16 m_stack[4]; // max 4 UINT16 m_op; // current opcode UINT16 m_prev_op; + UINT8 m_i; // 4-bit immediate opcode param + int m_eint_line; // which input_line caused an interrupt + emu_timer *m_timer; int m_icount; UINT16 m_pc; // Program Counter @@ -118,8 +122,16 @@ protected: UINT8 m_spx; // 1/3/4-bit SPX register UINT8 m_y; // 4-bit Y register UINT8 m_spy; // 4-bit SPY register - UINT8 m_s; // Status F/F + UINT8 m_s; // Status F/F (F/F = flip-flop) UINT8 m_c; // Carry F/F + UINT8 m_tc; // Timer/Counter + UINT8 m_cf; // CF F/F (timer mode or counter mode) + UINT8 m_ie; // I/E(Interrupt Enable) F/F + UINT8 m_iri; // external interrupt pending I/RI F/F + UINT8 m_irt; // timer interrupt pending I/RT F/F + UINT8 m_if[2]; // external interrupt mask IF0,1 F/F + UINT8 m_tf; // timer interrupt mask TF F/F + UINT8 m_int[2]; // INT0/1 pins state UINT8 m_r[8]; // R outputs state UINT16 m_d; // D pins state @@ -142,6 +154,11 @@ protected: virtual int read_d(int index); virtual void write_d(int index, int state); + void reset_prescaler(); + TIMER_CALLBACK_MEMBER( simple_timer_cb ); + void increment_tc(); + void do_interrupt(); + // opcode handlers void op_illegal(); diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 53b4ebd292d..08aecd78110 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -3,6 +3,8 @@ /* Hitachi HMCS40 MCU family disassembler + + NOTE: start offset(basepc) is $3F, not 0 */ @@ -41,19 +43,19 @@ static const char *const s_mnemonics[] = "NOP", "?" }; -// number of bits per opcode parameter, -3 means (XY) parameter +// number of bits per opcode parameter, 99 means (XY) parameter, negative means reversed bit-order static const INT8 s_bits[] = { 0, 0, 0, 0, 0, 4, - 0, 0, 4, 4, 0, 0, 0, 0, -3, - -3, -3, -3, -3, -3, -3, - 4, 4, 4, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 0, 0, 4, 0, 0, + 0, 0, -4, -4, 0, 0, 0, 0, 99, + 99, 99, 99, 99, 99, 99, + -4, -4, -4, + -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, 0, -4, 0, 0, 2, 2, 2, 6, 6, 5, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 4, 4, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, -4, -4, 3, 3, 3, 3, 3, 0, 0 }; @@ -186,7 +188,7 @@ CPU_DISASSEMBLE(hmcs40) INT8 bits = s_bits[instr]; // special case for (XY) opcode - if (bits == -3) + if (bits == 99) { dst += sprintf(dst, "%s", s_mnemonics[instr]); @@ -196,17 +198,29 @@ CPU_DISASSEMBLE(hmcs40) dst += sprintf(dst, "Y"); } else + { dst += sprintf(dst, "%-6s ", s_mnemonics[instr]); - // opcode parameter - if (bits > 0) - { - UINT8 param = op & ((1 << bits) - 1); - - if (bits > 5) - dst += sprintf(dst, "$%02X", param); - else - dst += sprintf(dst, "%d", param); + // opcode parameter + if (bits != 0) + { + UINT8 param = op; + + // reverse bits + if (bits < 0) + { + param = BITSWAP8(param,0,1,2,3,4,5,6,7); + param >>= (8 + bits); + bits = -bits; + } + + param &= ((1 << bits) - 1); + + if (bits > 5) + dst += sprintf(dst, "$%02X", param); + else + dst += sprintf(dst, "%d", param); + } } int pos = s_next_pc[pc & 0x3f] & DASMFLAG_LENGTHMASK; diff --git a/src/emu/cpu/hmcs40/hmcs40op.inc b/src/emu/cpu/hmcs40/hmcs40op.inc index 916af48f1b9..15c6d309755 100644 --- a/src/emu/cpu/hmcs40/hmcs40op.inc +++ b/src/emu/cpu/hmcs40/hmcs40op.inc @@ -34,7 +34,7 @@ void hmcs40_cpu_device::push_stack() void hmcs40_cpu_device::op_illegal() { - logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc << 1); + logerror("%s unknown opcode $%03X at $%04X\n", tag(), m_op, m_prev_pc); } @@ -110,13 +110,13 @@ void hmcs40_cpu_device::op_lya() void hmcs40_cpu_device::op_lxi() { // LXI i: Load X from Immediate - m_x = m_op & 0xf; + m_x = m_i; } void hmcs40_cpu_device::op_lyi() { // LYI i: Load Y from Immediate - m_y = m_op & 0xf; + m_y = m_i; } void hmcs40_cpu_device::op_iy() @@ -223,20 +223,20 @@ void hmcs40_cpu_device::op_lmady() void hmcs40_cpu_device::op_lmiiy() { // LMIIY i: Load Memory from Immediate, Increment Y - ram_w(m_op & 0xf); + ram_w(m_i); op_iy(); } void hmcs40_cpu_device::op_lai() { // LAI i: Load A from Immediate - m_a = m_op & 0xf; + m_a = m_i; } void hmcs40_cpu_device::op_lbi() { // LBI i: Load B from Immediate - m_b = m_op & 0xf; + m_b = m_i; } @@ -245,7 +245,7 @@ void hmcs40_cpu_device::op_lbi() void hmcs40_cpu_device::op_ai() { // AI i: Add Immediate to A - m_a += (m_op & 0xf); + m_a += (m_i); m_s = m_a >> 4 & 1; m_a &= 0xf; } @@ -368,13 +368,13 @@ void hmcs40_cpu_device::op_or() void hmcs40_cpu_device::op_mnei() { // MNEI i: Memory Not Equal to Immediate - m_s = (ram_r() != (m_op & 0xf)); + m_s = (ram_r() != (m_i)); } void hmcs40_cpu_device::op_ynei() { // YNEI i: Y Not Equal to Immediate - m_s = (m_y != (m_op & 0xf)); + m_s = (m_y != (m_i)); } void hmcs40_cpu_device::op_anem() @@ -392,7 +392,7 @@ void hmcs40_cpu_device::op_bnem() void hmcs40_cpu_device::op_alei() { // ALEI i: A Less or Equal to Immediate - m_s = (m_a <= (m_op & 0xf)); + m_s = (m_a <= (m_i)); } void hmcs40_cpu_device::op_alem() @@ -458,7 +458,7 @@ void hmcs40_cpu_device::op_lpu() if (m_s) m_page = m_op & 0x1f; else - m_op = 0; + m_op = 0; // fake nop } void hmcs40_cpu_device::op_tbr() @@ -480,115 +480,118 @@ void hmcs40_cpu_device::op_rtn() void hmcs40_cpu_device::op_seie() { // SEIE: Set I/E - op_illegal(); + m_ie = 1; } void hmcs40_cpu_device::op_seif0() { // SEIF0: Set IF0 - op_illegal(); + m_if[0] = 1; } void hmcs40_cpu_device::op_seif1() { // SEIF1: Set IF1 - op_illegal(); + m_if[1] = 1; } void hmcs40_cpu_device::op_setf() { // SETF: Set TF - op_illegal(); + m_tf = 1; } void hmcs40_cpu_device::op_secf() { // SECF: Set CF - op_illegal(); + m_cf = 1; } void hmcs40_cpu_device::op_reie() { // REIE: Reset I/E - op_illegal(); + m_ie = 0; } void hmcs40_cpu_device::op_reif0() { // REIF0: Reset IF0 - op_illegal(); + m_if[0] = 0; } void hmcs40_cpu_device::op_reif1() { // REIF1: Reset IF1 - op_illegal(); + m_if[1] = 0; } void hmcs40_cpu_device::op_retf() { // RETF: Reset TF - op_illegal(); + m_tf = 0; } void hmcs40_cpu_device::op_recf() { // RECF: Reset CF - op_illegal(); + m_cf = 0; } void hmcs40_cpu_device::op_ti0() { // TI0: Test INT0 - op_illegal(); + m_s = m_int[0]; } void hmcs40_cpu_device::op_ti1() { // TI1: Test INT1 - op_illegal(); + m_s = m_int[1]; } void hmcs40_cpu_device::op_tif0() { // TIF0: Test IF0 - op_illegal(); + m_s = m_if[0]; } void hmcs40_cpu_device::op_tif1() { // TIF1: Test IF1 - op_illegal(); + m_s = m_if[1]; } void hmcs40_cpu_device::op_ttf() { // TTF: Test TF - op_illegal(); + m_s = m_tf; } void hmcs40_cpu_device::op_lti() { // LTI i: Load Timer/Counter from Immediate - op_illegal(); + m_tc = m_i; + reset_prescaler(); } void hmcs40_cpu_device::op_lta() { // LTA: Load Timer/Counter from A - op_illegal(); + m_tc = m_a; + reset_prescaler(); } void hmcs40_cpu_device::op_lat() { // LAT: Load A from Timer/Counter - op_illegal(); + m_a = m_tc; } void hmcs40_cpu_device::op_rtni() { // RTNI: Return from Interrupt - op_illegal(); + op_seie(); + op_rtn(); } @@ -615,13 +618,13 @@ void hmcs40_cpu_device::op_td() void hmcs40_cpu_device::op_sedd() { // SEDD n: Set Discrete I/O Latch Direct - write_d(m_op & 0xf, 1); + write_d(m_i, 1); } void hmcs40_cpu_device::op_redd() { // REDD n: Reset Discrete I/O Latch Direct - write_d(m_op & 0xf, 0); + write_d(m_i, 0); } void hmcs40_cpu_device::op_lar() From 46964c195f63a1512616c2ef5e0812c9db991d3c Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 00:09:04 +0100 Subject: [PATCH 024/201] skeleton added for TI Little Professor --- src/mess/drivers/ticalc1x.c | 29 +++++++++++++++++++++++++++++ src/mess/mess.lst | 1 + 2 files changed, 30 insertions(+) diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 3558f8854e4..c518365c6b5 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -437,6 +437,9 @@ static INPUT_PORTS_START( wizatron ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) INPUT_PORTS_END +static INPUT_PORTS_START( lilprof ) +INPUT_PORTS_END + static INPUT_PORTS_START( ti30 ) PORT_START("IN.0") // O0 @@ -717,6 +720,17 @@ static MACHINE_CONFIG_DERIVED( wizatron, t9base ) MCFG_DEFAULT_LAYOUT(layout_wizatron) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( lilprof, t9base ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed +// MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) +// MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) +// MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) + + MCFG_DEFAULT_LAYOUT(layout_wizatron) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( ti30, t9base ) @@ -776,6 +790,20 @@ ROM_START( wizatron ) ROM_LOAD( "tms0970_wizatron_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) ROM_END +ROM_START( lilprof ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_lilprof_ipla.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_lilprof_mpla.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0970_lilprof_opla.pla", 0, 352, CRC(03f509c4) SHA1(691554a55db0c5950df848077095f23a991b1909) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0970_lilprof_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) +ROM_END + ROM_START( ti30 ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) @@ -824,6 +852,7 @@ COMP( 1974, tisr16, 0, 0, tisr16, tisr16, driver_device, 0, "Texas Instrum COMP( 1976, ti1270, 0, 0, ti1270, ti1270, driver_device, 0, "Texas Instruments", "TI-1270", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, wizatron, 0, 0, wizatron, wizatron, driver_device, 0, "Texas Instruments", "Wiz-A-Tron", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1978, lilprof , 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // 1978 version, original is from 1976 COMP( 1976, ti30, 0, 0, ti30, ti30, driver_device, 0, "Texas Instruments", "TI-30", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, tiprog, 0, 0, ti30, tiprog, driver_device, 0, "Texas Instruments", "TI Programmer", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 47c23faba1f..19e30640f61 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -1085,6 +1085,7 @@ ti30 // 1976 TI-30 tiprog tibusan1 wizatron +lilprof ti73 // 1990 TI-73 ti74 // 1985 TI-74 ti95 // 1986 TI-95 From 8605dd56e4ad913ed49b36df0722e7f7bc16d870 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 00:39:00 +0100 Subject: [PATCH 025/201] added tms1990 device --- src/emu/cpu/tms0980/tms0980.c | 5 +++++ src/emu/cpu/tms0980/tms0980.h | 7 +++++++ src/mess/drivers/ticalc1x.c | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/emu/cpu/tms0980/tms0980.c b/src/emu/cpu/tms0980/tms0980.c index a81bbf6a886..61f9e4a102e 100644 --- a/src/emu/cpu/tms0980/tms0980.c +++ b/src/emu/cpu/tms0980/tms0980.c @@ -163,6 +163,7 @@ const device_type TMS0980 = &device_creator; // 28-pin DIP, // - 32-term microinstructions PLA between the RAM and ROM, supporting 15 microinstructions // - 16-term output PLA and segment PLA above the RAM (rotate opla 90 degrees) const device_type TMS0970 = &device_creator; // 28-pin DIP, 11 R pins +const device_type TMS1990 = &device_creator; // 28-pin DIP, ? R pins.. // TMS0950 is same? // TMS0270 on the other hand, is a TMS0980 with earrings and a new hat. The new changes look like a quick afterthought, almost hacky @@ -264,6 +265,10 @@ tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, device_typ : tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source) { } +tms1990_cpu_device::tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : tms0970_cpu_device(mconfig, TMS1990, "TMS1990", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1990", __FILE__) +{ } + tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : tms0970_cpu_device(mconfig, TMS0980, "TMS0980", tag, owner, clock, 8, 9, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_64x9_as4), "tms0980", __FILE__) diff --git a/src/emu/cpu/tms0980/tms0980.h b/src/emu/cpu/tms0980/tms0980.h index 2a44449ba1d..3b7348f0db9 100644 --- a/src/emu/cpu/tms0980/tms0980.h +++ b/src/emu/cpu/tms0980/tms0980.h @@ -312,6 +312,12 @@ protected: virtual void op_tdo(); }; +class tms1990_cpu_device : public tms0970_cpu_device +{ +public: + tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + class tms0980_cpu_device : public tms0970_cpu_device { @@ -394,6 +400,7 @@ extern const device_type TMS1370; extern const device_type TMS1400; extern const device_type TMS1470; extern const device_type TMS0970; +extern const device_type TMS1990; extern const device_type TMS0980; extern const device_type TMS0270; diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index c518365c6b5..7d3182f3068 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -723,7 +723,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( lilprof, t9base ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed + MCFG_CPU_ADD("maincpu", TMS1990, 250000) // guessed // MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) // MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) // MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) @@ -852,7 +852,7 @@ COMP( 1974, tisr16, 0, 0, tisr16, tisr16, driver_device, 0, "Texas Instrum COMP( 1976, ti1270, 0, 0, ti1270, ti1270, driver_device, 0, "Texas Instruments", "TI-1270", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, wizatron, 0, 0, wizatron, wizatron, driver_device, 0, "Texas Instruments", "Wiz-A-Tron", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1978, lilprof , 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // 1978 version, original is from 1976 +COMP( 1978, lilprof , 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW | GAME_NOT_WORKING ) // 1978 version, original is from 1976 COMP( 1976, ti30, 0, 0, ti30, ti30, driver_device, 0, "Texas Instruments", "TI-30", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, tiprog, 0, 0, ti30, tiprog, driver_device, 0, "Texas Instruments", "TI Programmer", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) From 1e1963abda7201f75520ce2535fe9b2890b93863 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 03:02:44 +0100 Subject: [PATCH 026/201] (MESS)New working game added ----------------- Epoch Astro Command (aka Grandstand Scramble) [hap, Kevin Horton] --- src/mess/drivers/hh_ucom4.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index d420140d3bc..910f216a920 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -534,8 +534,8 @@ static INPUT_PORTS_START( astrocmd ) PORT_START("IN.0") // port A PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Missile") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") PORT_START("IN.1") // port B PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) @@ -1064,7 +1064,7 @@ ROM_END CONS( 1979, ssfball, 0, 0, ssfball, ssfball, driver_device, 0, "Bambino", "Superstar Football", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, driver_device, 0, "Bambino", "Space Laser Fight", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) -CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, driver_device, 0, "Epoch", "Astro Command", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, driver_device, 0, "Epoch", "Astro Command", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1982, edracula, 0, 0, edracula, edracula, driver_device, 0, "Epoch", "Dracula (Epoch)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, driver_device, 0, "Tomy", "Tennis (Tomy)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) From a2537f21d525af4bd10c503134ee42df16a1d586 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 03:25:36 +0100 Subject: [PATCH 027/201] clarify vars --- src/mess/drivers/hh_hmcs40.c | 20 ++++++++++---------- src/mess/drivers/hh_pic16.c | 18 +++++++++--------- src/mess/drivers/hh_tms1k.c | 22 +++++++++++----------- src/mess/drivers/hh_ucom4.c | 22 +++++++++++----------- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 58c1370a611..945e7d3ed46 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -67,24 +67,24 @@ public: optional_device m_speaker; // misc common - UINT16 m_inp_mux; + UINT16 m_inp_mux; // multiplexed inputs mask UINT16 read_inputs(int columns); virtual void machine_start(); // display common - int m_display_wait; - int m_display_maxy; - int m_display_maxx; + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns - UINT32 m_grid; - UINT32 m_plate; + UINT32 m_grid; // VFD current row data + UINT32 m_plate; // VFD current column data - UINT32 m_display_state[0x20]; - UINT32 m_display_cache[0x20]; - UINT8 m_display_decay[0x20][0x20]; - UINT16 m_7seg_mask[0x20]; + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); diff --git a/src/mess/drivers/hh_pic16.c b/src/mess/drivers/hh_pic16.c index 260c7fed605..df80386215a 100644 --- a/src/mess/drivers/hh_pic16.c +++ b/src/mess/drivers/hh_pic16.c @@ -48,20 +48,20 @@ public: optional_device m_speaker; // misc common - UINT8 m_b; - UINT8 m_c; + UINT8 m_b; // MCU port B data + UINT8 m_c; // MCU port C data virtual void machine_start(); // display common - int m_display_wait; - int m_display_maxy; - int m_display_maxx; + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns - UINT32 m_display_state[0x20]; - UINT32 m_display_cache[0x20]; - UINT8 m_display_decay[0x20][0x20]; - UINT16 m_7seg_mask[0x20]; + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 28477f781ff..0617949b52c 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -108,10 +108,10 @@ public: optional_device m_speaker; // misc common - UINT16 m_r; - UINT16 m_o; - UINT16 m_inp_mux; - bool m_power_on; + UINT16 m_r; // MCU R-pins data + UINT16 m_o; // MCU O-pins data + UINT16 m_inp_mux; // multiplexed inputs mask + bool m_power_on; // TMS0980 power-on state UINT8 read_inputs(int columns); DECLARE_INPUT_CHANGED_MEMBER(tms0980_power_button); @@ -121,14 +121,14 @@ public: virtual void machine_reset(); // display common - int m_display_wait; - int m_display_maxy; - int m_display_maxx; + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns - UINT32 m_display_state[0x20]; - UINT32 m_display_cache[0x20]; - UINT8 m_display_decay[0x20][0x20]; - UINT16 m_7seg_mask[0x20]; + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 910f216a920..e65d59b37b2 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -53,25 +53,25 @@ public: optional_device m_speaker; // misc common - UINT8 m_port[9]; - UINT16 m_inp_mux; + UINT8 m_port[9]; // MCU port A-I write data + UINT16 m_inp_mux; // multiplexed inputs mask UINT8 read_inputs(int columns); virtual void machine_start(); // display common - int m_display_wait; - int m_display_maxy; - int m_display_maxx; + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns - UINT32 m_grid; - UINT32 m_plate; + UINT32 m_grid; // VFD current row data + UINT32 m_plate; // VFD current column data - UINT32 m_display_state[0x20]; - UINT32 m_display_cache[0x20]; - UINT8 m_display_decay[0x20][0x20]; - UINT16 m_7seg_mask[0x20]; + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); From 96077ccedd933c4e334f14328983493b65480a9d Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 03:53:05 +0100 Subject: [PATCH 028/201] ticalc1x.c cleanup part 1 --- src/mess/drivers/ticalc1x.c | 266 +++++++++++++++++++++++------------- 1 file changed, 169 insertions(+), 97 deletions(-) diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 7d3182f3068..f0e48fa4e14 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -14,7 +14,9 @@ #include "emu.h" #include "cpu/tms0980/tms0980.h" +#include "sound/speaker.h" +// internal artwork #include "ti1270.lh" #include "ti30.lh" #include "tisr16.lh" @@ -27,20 +29,46 @@ public: ticalc1x_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_button_matrix(*this, "IN") + m_inp_matrix(*this, "IN"), + m_speaker(*this, "speaker"), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) { } + // devices required_device m_maincpu; - optional_ioport_array<11> m_button_matrix; // up to 11 rows + optional_ioport_array<11> m_inp_matrix; // max 11 + optional_device m_speaker; - UINT16 m_r; - UINT16 m_o; - bool m_power_on; + // misc common + UINT16 m_r; // MCU R-pins data + UINT16 m_o; // MCU O-pins data + UINT16 m_inp_mux; // multiplexed inputs mask + bool m_power_on; // TMS0980 power-on state - UINT16 m_display_state[0x10]; - UINT16 m_display_cache[0x10]; - UINT8 m_display_decay[0x100]; + UINT8 read_inputs(int columns); + DECLARE_INPUT_CHANGED_MEMBER(tms0980_power_button); + DECLARE_WRITE_LINE_MEMBER(tms0980_auto_power_off); + virtual void machine_reset(); + virtual void machine_start(); + + // display common + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns + + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) + + TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); + + // calculator-specific handlers DECLARE_READ8_MEMBER(tisr16_read_k); DECLARE_WRITE16_MEMBER(tisr16_write_o); DECLARE_WRITE16_MEMBER(tisr16_write_r); @@ -57,61 +85,86 @@ public: DECLARE_READ8_MEMBER(ti30_read_k); DECLARE_WRITE16_MEMBER(ti30_write_o); DECLARE_WRITE16_MEMBER(ti30_write_r); - - DECLARE_INPUT_CHANGED_MEMBER(power_button); - DECLARE_WRITE_LINE_MEMBER(auto_power_off); - - TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); - void display_update(); - - virtual void machine_reset(); - virtual void machine_start(); }; +// machine_start/reset + +void ticalc1x_state::machine_start() +{ + // zerofill + memset(m_display_state, 0, sizeof(m_display_state)); + memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); + + m_o = 0; + m_r = 0; + m_inp_mux = 0; + m_power_on = false; + + // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + + save_item(NAME(m_display_state)); + save_item(NAME(m_display_cache)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_7seg_mask)); + + save_item(NAME(m_o)); + save_item(NAME(m_r)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_power_on)); +} + +void ticalc1x_state::machine_reset() +{ + m_power_on = true; +} + + /*************************************************************************** - LED Display + Helper Functions ***************************************************************************/ -// Devices with TMS09x0 strobe the outputs very fast, it is unnoticeable to the user. +// The device may strobe the outputs very fast, it is unnoticeable to the user. // To prevent flickering here, we need to simulate a decay. -// decay time, in steps of 1ms -#define DISPLAY_DECAY_TIME 50 - void ticalc1x_state::display_update() { - UINT16 active_state[0x10]; + UINT32 active_state[0x20]; - for (int i = 0; i < 0x10; i++) + for (int y = 0; y < m_display_maxy; y++) { - active_state[i] = 0; + active_state[y] = 0; - for (int j = 0; j < 0x10; j++) + for (int x = 0; x < m_display_maxx; x++) { - int di = j << 4 | i; - // turn on powered segments - if (m_power_on && m_display_state[i] >> j & 1) - m_display_decay[di] = DISPLAY_DECAY_TIME; + if (m_power_on && m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; // determine active state - int ds = (m_display_decay[di] != 0) ? 1 : 0; - active_state[i] |= (ds << j); + int ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state[y] |= (ds << x); } } // on difference, send to output - for (int i = 0; i < 0x10; i++) - if (m_display_cache[i] != active_state[i]) + for (int y = 0; y < m_display_maxy; y++) + if (m_display_cache[y] != active_state[y]) { - output_set_digit_value(i, active_state[i]); + if (m_7seg_mask[y] != 0) + output_set_digit_value(y, active_state[y] & m_7seg_mask[y]); - for (int j = 0; j < 8; j++) - output_set_lamp_value(i*10 + j, active_state[i] >> j & 1); + const int mul = (m_display_maxx <= 10) ? 10 : 100; + for (int x = 0; x < m_display_maxx; x++) + output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); @@ -120,13 +173,58 @@ void ticalc1x_state::display_update() TIMER_DEVICE_CALLBACK_MEMBER(ticalc1x_state::display_decay_tick) { // slowly turn off unpowered segments - for (int i = 0; i < 0x100; i++) - if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i]) - m_display_decay[i]--; - + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x < m_display_maxx; x++) + if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + display_update(); } +void ticalc1x_state::display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; + + // update current state + UINT32 mask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + m_display_state[y] = (sety >> y & 1) ? (setx & mask) : 0; + + display_update(); +} + + +UINT8 ticalc1x_state::read_inputs(int columns) +{ + UINT8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inp_matrix[i]->read(); + + return ret; +} + + +// devices with a TMS0980 can auto power-off + +WRITE_LINE_MEMBER(ticalc1x_state::tms0980_auto_power_off) +{ + if (state) + { + m_power_on = false; + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + } +} + +INPUT_CHANGED_MEMBER(ticalc1x_state::tms0980_power_button) +{ + m_power_on = (bool)(FPTR)param; + m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); +} + /*************************************************************************** @@ -159,7 +257,7 @@ READ8_MEMBER(ticalc1x_state::tisr16_read_k) // read selected button rows for (int i = 0; i < 11; i++) if (m_r >> i & 1) - k |= m_button_matrix[i]->read(); + k |= m_inp_matrix[i]->read(); return k; } @@ -191,16 +289,22 @@ READ8_MEMBER(ticalc1x_state::ti1270_read_k) // read selected button rows for (int i = 0; i < 7; i++) if (m_o >> (i+1) & 1) - k |= m_button_matrix[i]->read(); + k |= m_inp_matrix[i]->read(); return k; } WRITE16_MEMBER(ticalc1x_state::ti1270_write_r) { + m_display_maxx = 8; + m_display_maxy = 8; + // R0-R7: select digit (right-to-left) for (int i = 0; i < 8; i++) + { + m_7seg_mask[i] = 0xff; m_display_state[i] = (data >> i & 1) ? m_o : 0; + } display_update(); } @@ -222,17 +326,23 @@ READ8_MEMBER(ticalc1x_state::wizatron_read_k) // read selected button rows for (int i = 0; i < 4; i++) if (m_o >> (i+1) & 1) - k |= m_button_matrix[i]->read(); + k |= m_inp_matrix[i]->read(); return k; } WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) { + m_display_maxx = 8; + m_display_maxy = 9; + // R0-R8: select digit (right-to-left) // note: 3rd digit is custom(not 7seg), for math symbols for (int i = 0; i < 9; i++) + { + m_7seg_mask[i] = 0x7f; m_display_state[i] = (data >> i & 1) ? m_o : 0; + } // 6th digit only has A and G for = m_display_state[3] &= 0x41; @@ -256,22 +366,28 @@ WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) READ8_MEMBER(ticalc1x_state::ti30_read_k) { // the Vss row is always on - UINT8 k = m_button_matrix[8]->read(); + UINT8 k = m_inp_matrix[8]->read(); // read selected button rows for (int i = 0; i < 8; i++) if (m_o >> i & 1) - k |= m_button_matrix[i]->read(); + k |= m_inp_matrix[i]->read(); return k; } WRITE16_MEMBER(ticalc1x_state::ti30_write_r) { + m_display_maxx = 8; + m_display_maxy = 9; + // R0-R8: select digit UINT8 o = BITSWAP8(m_o,7,5,2,1,4,0,6,3); for (int i = 0; i < 9; i++) + { + m_7seg_mask[i] = 0xff; m_display_state[i] = (data >> i & 1) ? o : 0; + } // 1st digit only has segments B,F,G,DP m_display_state[0] &= 0xe2; @@ -294,12 +410,6 @@ WRITE16_MEMBER(ticalc1x_state::ti30_write_o) ***************************************************************************/ -INPUT_CHANGED_MEMBER(ticalc1x_state::power_button) -{ - m_power_on = (bool)(FPTR)param; - m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); -} - static INPUT_PORTS_START( tisr16 ) PORT_START("IN.0") // R0 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -496,11 +606,11 @@ static INPUT_PORTS_START( ti30 ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)false) INPUT_PORTS_END @@ -559,11 +669,11 @@ static INPUT_PORTS_START( tiprog ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)false) INPUT_PORTS_END @@ -623,11 +733,11 @@ static INPUT_PORTS_START( tibusan1 ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)false) INPUT_PORTS_END @@ -638,44 +748,6 @@ INPUT_PORTS_END ***************************************************************************/ -WRITE_LINE_MEMBER(ticalc1x_state::auto_power_off) -{ - // TMS0980 auto power-off opcode - if (state) - { - m_power_on = false; - m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - } -} - - -void ticalc1x_state::machine_reset() -{ - m_power_on = true; -} - -void ticalc1x_state::machine_start() -{ - // zerofill - memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); - memset(m_display_decay, 0, sizeof(m_display_decay)); - - m_r = 0; - m_o = 0; - m_power_on = false; - - // register for savestates - save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); - save_item(NAME(m_display_decay)); - - save_item(NAME(m_r)); - save_item(NAME(m_o)); - save_item(NAME(m_power_on)); -} - - static MACHINE_CONFIG_START( tisr16, ticalc1x_state ) /* basic machine hardware */ @@ -739,7 +811,7 @@ static MACHINE_CONFIG_DERIVED( ti30, t9base ) MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, ti30_read_k)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, ti30_write_o)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, ti30_write_r)) - MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(ticalc1x_state, auto_power_off)) + MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(ticalc1x_state, tms0980_auto_power_off)) MCFG_DEFAULT_LAYOUT(layout_ti30) MACHINE_CONFIG_END From 2b40bfdf2068a2d2c24ec1198c12177788695756 Mon Sep 17 00:00:00 2001 From: briantro Date: Sat, 14 Mar 2015 22:13:05 -0500 Subject: [PATCH 029/201] peplus.c: Minor info update - NW --- src/mame/drivers/peplus.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/peplus.c b/src/mame/drivers/peplus.c index 77ed8dee732..0f2eb061219 100644 --- a/src/mame/drivers/peplus.c +++ b/src/mame/drivers/peplus.c @@ -5477,7 +5477,7 @@ ROM_START( pex0045p ) /* Superboard : Standard Draw Poker (10's or Better) (X000 PayTable 10s+ 2PR 3K STR FL FH 4K SF RF (Bonus) ---------------------------------------------------------- P8A 1 1 3 4 5 8 25 50 300 800 - % Range: 84.6-86.6% Optimum: 98.6% Hit Frequency: 49.2% + % Range: 84.6-86.6% Optimum: 88.6% Hit Frequency: 49.2% Programs Available: PP0045, X000045P */ ROM_REGION( 0x10000, "maincpu", 0 ) @@ -7664,7 +7664,7 @@ PayTable Js+ 2PR 3K STR FL FH 4K 4K 4A SF RF RF (Bonus) % Range: 92.6-94.6% Optimum: 98.6% Hit Frequency: 45.0% Programs Available: X002111P -NOTE: Royal Flush bonus is 800 times max bet, Sequential Royal Flush is 10000 times max bet +NOTE: Royal Flush bonus is 800 x MAX bet, Sequential Royal Flush is 10000 x MAX bet */ ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "xp000038.u67", 0x00000, 0x10000, CRC(8707ab9e) SHA1(3e00a2ad8017e1495c6d6fe900d0efa68a1772b8) ) /* 09/05/95 @ IGT L95-2452 */ @@ -9253,8 +9253,9 @@ Jacks or Better P11A 96.10% Joker Poker P17A 95.50% */ ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "xmp00025.u67", 0x00000, 0x10000, CRC(5d39ff71) SHA1(0a5f67e61ae0e8a08cc551ab4271ffc97c343ae3) ) - + ROM_LOAD( "xmp00025.u67", 0x00000, 0x10000, CRC(5d39ff71) SHA1(0a5f67e61ae0e8a08cc551ab4271ffc97c343ae3) ) /* International multi currency version - Auto Hold always on */ + /* Also compatible with XMP00002, XMP00003, XMP00004, XMP00006 and XMP00024 programs */ + ROM_REGION( 0x10000, "user1", 0 ) ROM_LOAD( "xm00013p.u66", 0x00000, 0x10000, CRC(4fde73f9) SHA1(f8eb6fb0585e8df9a7eb2ddc65bb20b120753d7a) ) From 327d6dece9cc26133748f1ca65e396a683953993 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 04:38:38 +0100 Subject: [PATCH 030/201] ticalc1x.c cleanup part 2 --- src/mess/drivers/ticalc1x.c | 165 +++++++++++------------------------- 1 file changed, 51 insertions(+), 114 deletions(-) diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index f0e48fa4e14..f2980c56f1c 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -66,7 +66,7 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); - void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); + void display_matrix_7seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 _7segmask); // calculator-specific handlers DECLARE_READ8_MEMBER(tisr16_read_k); @@ -96,7 +96,7 @@ void ticalc1x_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); + memset(m_7seg_mask, ~0, sizeof(m_7seg_mask)); // ! m_o = 0; m_r = 0; @@ -181,15 +181,18 @@ TIMER_DEVICE_CALLBACK_MEMBER(ticalc1x_state::display_decay_tick) display_update(); } -void ticalc1x_state::display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety) +void ticalc1x_state::display_matrix_7seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 _7segmask) { m_display_maxx = maxx; m_display_maxy = maxy; // update current state - UINT32 mask = (1 << maxx) - 1; + UINT32 colmask = (1 << maxx) - 1; for (int y = 0; y < maxy; y++) - m_display_state[y] = (sety >> y & 1) ? (setx & mask) : 0; + { + m_7seg_mask[y] &= _7segmask; + m_display_state[y] = (sety >> y & 1) ? (setx & colmask) : 0; + } display_update(); } @@ -238,36 +241,27 @@ INPUT_CHANGED_MEMBER(ticalc1x_state::tms0980_power_button) void ticalc1x_state::tisr16_display_update() { // update leds state - for (int i = 0; i < 11; i++) - if (m_r >> i & 1) - m_display_state[i] = m_o; + for (int y = 0; y < 11; y++) + m_display_state[y] = (m_r >> y & 1) ? m_o : 0; // exponent sign (not 100% sure this is correct) - m_display_state[11] = (m_display_state[0] | m_display_state[1]) ? 0x40 : 0; + m_display_state[11] = (m_display_state[0] || m_display_state[1]) ? 0x40 : 0; - // send to output - for (int i = 0; i < 12; i++) - output_set_digit_value(i, m_display_state[i]); + m_display_maxx = 8; + m_display_maxy = 12; + display_update(); } READ8_MEMBER(ticalc1x_state::tisr16_read_k) { - UINT8 k = 0; - - // read selected button rows - for (int i = 0; i < 11; i++) - if (m_r >> i & 1) - k |= m_inp_matrix[i]->read(); - - return k; + return read_inputs(11); } WRITE16_MEMBER(ticalc1x_state::tisr16_write_r) { // R0-R10: input mux // R0-R10: select digit (right-to-left) - m_r = data; - + m_r = m_inp_mux = data; tisr16_display_update(); } @@ -275,7 +269,6 @@ WRITE16_MEMBER(ticalc1x_state::tisr16_write_o) { // O0-O7: digit segments m_o = data; - tisr16_display_update(); } @@ -284,35 +277,20 @@ WRITE16_MEMBER(ticalc1x_state::tisr16_write_o) READ8_MEMBER(ticalc1x_state::ti1270_read_k) { - UINT8 k = 0; - - // read selected button rows - for (int i = 0; i < 7; i++) - if (m_o >> (i+1) & 1) - k |= m_inp_matrix[i]->read(); - - return k; + return read_inputs(6); } WRITE16_MEMBER(ticalc1x_state::ti1270_write_r) { - m_display_maxx = 8; - m_display_maxy = 8; - // R0-R7: select digit (right-to-left) - for (int i = 0; i < 8; i++) - { - m_7seg_mask[i] = 0xff; - m_display_state[i] = (data >> i & 1) ? m_o : 0; - } - - display_update(); + display_matrix_7seg(8, 8, m_o, data, 0xff); } WRITE16_MEMBER(ticalc1x_state::ti1270_write_o) { // O1-O5,O7: input mux // O0-O7: digit segments + m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); m_o = data; } @@ -321,33 +299,17 @@ WRITE16_MEMBER(ticalc1x_state::ti1270_write_o) READ8_MEMBER(ticalc1x_state::wizatron_read_k) { - UINT8 k = 0; - - // read selected button rows - for (int i = 0; i < 4; i++) - if (m_o >> (i+1) & 1) - k |= m_inp_matrix[i]->read(); - - return k; + return read_inputs(4); } WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) { - m_display_maxx = 8; - m_display_maxy = 9; - + // note: 3rd digit is custom(not 7seg), for math symbols, and 6th digit + // only has A and G for =, though some newer revisions use a custom digit too. + m_7seg_mask[3] = 0x41; + // R0-R8: select digit (right-to-left) - // note: 3rd digit is custom(not 7seg), for math symbols - for (int i = 0; i < 9; i++) - { - m_7seg_mask[i] = 0x7f; - m_display_state[i] = (data >> i & 1) ? m_o : 0; - } - - // 6th digit only has A and G for = - m_display_state[3] &= 0x41; - - display_update(); + display_matrix_7seg(8, 9, m_o, data, 0x7f); } WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) @@ -355,6 +317,7 @@ WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) // O1-O4: input mux // O0-O6: digit segments A-G // O7: N/C + m_inp_mux = data >> 1 & 0xf; m_o = data & 0x7f; } @@ -365,40 +328,24 @@ WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) READ8_MEMBER(ticalc1x_state::ti30_read_k) { - // the Vss row is always on - UINT8 k = m_inp_matrix[8]->read(); - - // read selected button rows - for (int i = 0; i < 8; i++) - if (m_o >> i & 1) - k |= m_inp_matrix[i]->read(); - - return k; + // note: the Vss row is always on + return m_inp_matrix[7]->read() | read_inputs(7); } WRITE16_MEMBER(ticalc1x_state::ti30_write_r) { - m_display_maxx = 8; - m_display_maxy = 9; + // note: 1st digit only has segments B,F,G,DP + m_7seg_mask[0] = 0xe2; // R0-R8: select digit - UINT8 o = BITSWAP8(m_o,7,5,2,1,4,0,6,3); - for (int i = 0; i < 9; i++) - { - m_7seg_mask[i] = 0xff; - m_display_state[i] = (data >> i & 1) ? o : 0; - } - - // 1st digit only has segments B,F,G,DP - m_display_state[0] &= 0xe2; - - display_update(); + display_matrix_7seg(8, 9, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data, 0xff); } WRITE16_MEMBER(ticalc1x_state::ti30_write_o) { - // O1-O5,O7: input mux + // O0-O2,O4-O7: input mux // O0-O7: digit segments + m_inp_mux = (data & 7) | (data >> 1 & 0x78); m_o = data; } @@ -510,10 +457,7 @@ static INPUT_PORTS_START( ti1270 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CODE(KEYCODE_I) PORT_NAME(UTF8_SMALL_PI) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_START("IN.5") // O6 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // O7 + PORT_START("IN.5") // O7 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") @@ -573,31 +517,28 @@ static INPUT_PORTS_START( ti30 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_START("IN.3") // O3 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // O4 + PORT_START("IN.3") // O4 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - PORT_START("IN.5") // O5 + PORT_START("IN.4") // O5 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_START("IN.6") // O6 + PORT_START("IN.5") // O6 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("DRG") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("INV") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("cos") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("sin") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("tan") - PORT_START("IN.7") // O7 + PORT_START("IN.6") // O7 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") @@ -605,7 +546,7 @@ static INPUT_PORTS_START( ti30 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.8") // Vss! + PORT_START("IN.7") // Vss! PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") @@ -636,31 +577,28 @@ static INPUT_PORTS_START( tiprog ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_START("IN.3") // O3 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // O4 + PORT_START("IN.3") // O4 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - PORT_START("IN.5") // O5 + PORT_START("IN.4") // O5 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_START("IN.6") // O6 + PORT_START("IN.5") // O6 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - PORT_START("IN.7") // O7 + PORT_START("IN.6") // O7 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") @@ -668,7 +606,7 @@ static INPUT_PORTS_START( tiprog ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.8") // Vss! + PORT_START("IN.7") // Vss! PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") @@ -700,31 +638,28 @@ static INPUT_PORTS_START( tibusan1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_START("IN.3") // O3 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // O4 + PORT_START("IN.3") // O4 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA"+ " UTF8_CAPITAL_SIGMA"-") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("( AN-CI\"") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("x<>y L.R.") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(") 1/x") - PORT_START("IN.5") // O5 + PORT_START("IN.4") // O5 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("SUM x" UTF8_PRIME) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_START("IN.6") // O6 + PORT_START("IN.5") // O6 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("FV") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("PMT") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("%i") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("PV") - PORT_START("IN.7") // O7 + PORT_START("IN.6") // O7 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC x" UTF8_PRIME) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") @@ -732,7 +667,7 @@ static INPUT_PORTS_START( tibusan1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.8") // Vss! + PORT_START("IN.7") // Vss! PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") @@ -756,6 +691,8 @@ static MACHINE_CONFIG_START( tisr16, ticalc1x_state ) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, tisr16_write_o)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, tisr16_write_r)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_tisr16) MACHINE_CONFIG_END From 6a97ecf993c0f31eda05a489a2c3f244422a68be Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 04:57:05 +0100 Subject: [PATCH 031/201] ticalc1x.c cleanup part 3 --- src/mess/drivers/ticalc1x.c | 368 ++++++++++++++++++++---------------- 1 file changed, 207 insertions(+), 161 deletions(-) diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index f2980c56f1c..75718aada30 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -232,11 +232,16 @@ INPUT_CHANGED_MEMBER(ticalc1x_state::tms0980_power_button) /*************************************************************************** - I/O + Minidrivers (I/O, Inputs, Machine Config) ***************************************************************************/ -// SR-16: TMS1000 MCU labeled TMS1001NL. die labeled 1001A +/*************************************************************************** + + TI SR-16 + * TMS1000 MCU labeled TMS1001NL. die labeled 1001A + +***************************************************************************/ void ticalc1x_state::tisr16_display_update() { @@ -273,90 +278,6 @@ WRITE16_MEMBER(ticalc1x_state::tisr16_write_o) } -// TI-1270: TMS0970 MCU labeled TMC0974NL ZA0355, DP0974A. die labeled 0970D-74A - -READ8_MEMBER(ticalc1x_state::ti1270_read_k) -{ - return read_inputs(6); -} - -WRITE16_MEMBER(ticalc1x_state::ti1270_write_r) -{ - // R0-R7: select digit (right-to-left) - display_matrix_7seg(8, 8, m_o, data, 0xff); -} - -WRITE16_MEMBER(ticalc1x_state::ti1270_write_o) -{ - // O1-O5,O7: input mux - // O0-O7: digit segments - m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); - m_o = data; -} - - -// WIZ-A-TRON (educational toy): TMS0970 MCU labeled TMC0907NL ZA0379, DP0907BS. die labeled 0970F-07B - -READ8_MEMBER(ticalc1x_state::wizatron_read_k) -{ - return read_inputs(4); -} - -WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) -{ - // note: 3rd digit is custom(not 7seg), for math symbols, and 6th digit - // only has A and G for =, though some newer revisions use a custom digit too. - m_7seg_mask[3] = 0x41; - - // R0-R8: select digit (right-to-left) - display_matrix_7seg(8, 9, m_o, data, 0x7f); -} - -WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) -{ - // O1-O4: input mux - // O0-O6: digit segments A-G - // O7: N/C - m_inp_mux = data >> 1 & 0xf; - m_o = data & 0x7f; -} - - -// TI-30: TMS0980 MCU labeled TMC0981NL. die labeled 0980B-81F -// TI Programmer: TMS0980 MCU labeled ZA0675NL, JP0983AT. die labeled 0980B-83 -// TI Business Analyst-I: TMS0980 MCU labeled TMC0982NL. die labeled 0980B-82F - -READ8_MEMBER(ticalc1x_state::ti30_read_k) -{ - // note: the Vss row is always on - return m_inp_matrix[7]->read() | read_inputs(7); -} - -WRITE16_MEMBER(ticalc1x_state::ti30_write_r) -{ - // note: 1st digit only has segments B,F,G,DP - m_7seg_mask[0] = 0xe2; - - // R0-R8: select digit - display_matrix_7seg(8, 9, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data, 0xff); -} - -WRITE16_MEMBER(ticalc1x_state::ti30_write_o) -{ - // O0-O2,O4-O7: input mux - // O0-O7: digit segments - m_inp_mux = (data & 7) | (data >> 1 & 0x78); - m_o = data; -} - - - -/*************************************************************************** - - Inputs - -***************************************************************************/ - static INPUT_PORTS_START( tisr16 ) PORT_START("IN.0") // R0 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -426,6 +347,53 @@ static INPUT_PORTS_START( tisr16 ) INPUT_PORTS_END +static MACHINE_CONFIG_START( tisr16, ticalc1x_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1000, 250000) // guessed + MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, tisr16_read_k)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, tisr16_write_o)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, tisr16_write_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_tisr16) + + /* no video! */ + + /* no sound! */ +MACHINE_CONFIG_END + + + + + +/*************************************************************************** + + TI-1270 + * TMS0970 MCU labeled TMC0974NL ZA0355, DP0974A. die labeled 0970D-74A + +***************************************************************************/ + +READ8_MEMBER(ticalc1x_state::ti1270_read_k) +{ + return read_inputs(6); +} + +WRITE16_MEMBER(ticalc1x_state::ti1270_write_r) +{ + // R0-R7: select digit (right-to-left) + display_matrix_7seg(8, 8, m_o, data, 0xff); +} + +WRITE16_MEMBER(ticalc1x_state::ti1270_write_o) +{ + // O1-O5,O7: input mux + // O0-O7: digit segments + m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); + m_o = data; +} + + static INPUT_PORTS_START( ti1270 ) PORT_START("IN.0") // O1 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") @@ -465,6 +433,58 @@ static INPUT_PORTS_START( ti1270 ) INPUT_PORTS_END +static MACHINE_CONFIG_START( ti1270, ticalc1x_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed + MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, ti1270_read_k)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, ti1270_write_o)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, ti1270_write_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_ti1270) + + /* no video! */ + + /* no sound! */ +MACHINE_CONFIG_END + + + + + +/*************************************************************************** + + TI WIZ-A-TRON (educational toy) + * TMS0970 MCU labeled TMC0907NL ZA0379, DP0907BS. die labeled 0970F-07B + +***************************************************************************/ + +READ8_MEMBER(ticalc1x_state::wizatron_read_k) +{ + return read_inputs(4); +} + +WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) +{ + // note: 3rd digit is custom(not 7seg), for math symbols, and 6th digit + // only has A and G for =, though some newer revisions use a custom digit too. + m_7seg_mask[3] = 0x41; + + // R0-R8: select digit (right-to-left) + display_matrix_7seg(8, 9, m_o, data, 0x7f); +} + +WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) +{ + // O1-O4: input mux + // O0-O6: digit segments A-G + // O7: N/C + m_inp_mux = data >> 1 & 0xf; + m_o = data & 0x7f; +} + + static INPUT_PORTS_START( wizatron ) PORT_START("IN.0") // O1 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("CLEAR") @@ -491,8 +511,58 @@ static INPUT_PORTS_START( wizatron ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) INPUT_PORTS_END -static INPUT_PORTS_START( lilprof ) -INPUT_PORTS_END + +static MACHINE_CONFIG_START( wizatron, ticalc1x_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed + MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, wizatron_read_k)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, wizatron_write_o)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, wizatron_write_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_wizatron) + + /* no video! */ + + /* no sound! */ +MACHINE_CONFIG_END + + + + + +/*************************************************************************** + + Majestic-line calculators: + * TI-30: TMS0980 MCU labeled TMC0981NL. die labeled 0980B-81F + * TI Programmer: TMS0980 MCU labeled ZA0675NL, JP0983AT. die labeled 0980B-83 + * TI Business Analyst-I: TMS0980 MCU labeled TMC0982NL. die labeled 0980B-82F + +***************************************************************************/ + +READ8_MEMBER(ticalc1x_state::ti30_read_k) +{ + // note: the Vss row is always on + return m_inp_matrix[7]->read() | read_inputs(7); +} + +WRITE16_MEMBER(ticalc1x_state::ti30_write_r) +{ + // note: 1st digit only has segments B,F,G,DP + m_7seg_mask[0] = 0xe2; + + // R0-R8: select digit + display_matrix_7seg(8, 9, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data, 0xff); +} + +WRITE16_MEMBER(ticalc1x_state::ti30_write_o) +{ + // O0-O2,O4-O7: input mux + // O0-O7: digit segments + m_inp_mux = (data & 7) | (data >> 1 & 0x78); + m_o = data; +} static INPUT_PORTS_START( ti30 ) @@ -676,72 +746,7 @@ static INPUT_PORTS_START( tibusan1 ) INPUT_PORTS_END - -/*************************************************************************** - - Machine Config(s) - -***************************************************************************/ - -static MACHINE_CONFIG_START( tisr16, ticalc1x_state ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1000, 250000) // guessed - MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, tisr16_read_k)) - MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, tisr16_write_o)) - MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, tisr16_write_r)) - - MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) - - MCFG_DEFAULT_LAYOUT(layout_tisr16) -MACHINE_CONFIG_END - - -static MACHINE_CONFIG_START( t9base, ticalc1x_state ) - - /* basic machine hardware */ - MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) - - /* no video! */ - - /* no sound! */ -MACHINE_CONFIG_END - -static MACHINE_CONFIG_DERIVED( ti1270, t9base ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed - MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, ti1270_read_k)) - MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, ti1270_write_o)) - MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, ti1270_write_r)) - - MCFG_DEFAULT_LAYOUT(layout_ti1270) -MACHINE_CONFIG_END - -static MACHINE_CONFIG_DERIVED( wizatron, t9base ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed - MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, wizatron_read_k)) - MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, wizatron_write_o)) - MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, wizatron_write_r)) - - MCFG_DEFAULT_LAYOUT(layout_wizatron) -MACHINE_CONFIG_END - -static MACHINE_CONFIG_DERIVED( lilprof, t9base ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1990, 250000) // guessed -// MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) -// MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) -// MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) - - MCFG_DEFAULT_LAYOUT(layout_wizatron) -MACHINE_CONFIG_END - - -static MACHINE_CONFIG_DERIVED( ti30, t9base ) +static MACHINE_CONFIG_START( ti30, ticalc1x_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", TMS0980, 400000) // guessed @@ -750,11 +755,45 @@ static MACHINE_CONFIG_DERIVED( ti30, t9base ) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, ti30_write_r)) MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(ticalc1x_state, tms0980_auto_power_off)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_ti30) + + /* no video! */ + + /* no sound! */ MACHINE_CONFIG_END + + + + +static INPUT_PORTS_START( lilprof ) +INPUT_PORTS_END + + + + + + +static MACHINE_CONFIG_START( lilprof, ticalc1x_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1990, 250000) // guessed +// MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) +// MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) +// MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_wizatron) + + /* no video! */ + + /* no sound! */ +MACHINE_CONFIG_END + + /*************************************************************************** Game driver(s) @@ -771,6 +810,7 @@ ROM_START( tisr16 ) ROM_LOAD( "tms1000_sr16_opla.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) ) ROM_END + ROM_START( ti1270 ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "tms0974nl", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) @@ -785,6 +825,7 @@ ROM_START( ti1270 ) ROM_LOAD( "tms0970_ti1270_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) ROM_END + ROM_START( wizatron ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "dp0907bs", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) @@ -799,6 +840,7 @@ ROM_START( wizatron ) ROM_LOAD( "tms0970_wizatron_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) ROM_END + ROM_START( lilprof ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) @@ -813,6 +855,7 @@ ROM_START( lilprof ) ROM_LOAD( "tms0970_lilprof_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) ROM_END + ROM_START( ti30 ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) @@ -827,6 +870,7 @@ ROM_START( ti30 ) ROM_LOAD( "tms0980_ti30_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) ROM_END + ROM_START( tibusan1 ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) ) @@ -841,6 +885,7 @@ ROM_START( tibusan1 ) ROM_LOAD( "tms0980_tibusan1_spla.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) ROM_END + ROM_START( tiprog ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) @@ -857,12 +902,13 @@ ROM_END -COMP( 1974, tisr16, 0, 0, tisr16, tisr16, driver_device, 0, "Texas Instruments", "SR-16 (Texas Instruments)", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ +COMP( 1974, tisr16, 0, 0, tisr16, tisr16, driver_device, 0, "Texas Instruments", "SR-16 (Texas Instruments)", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1976, ti1270, 0, 0, ti1270, ti1270, driver_device, 0, "Texas Instruments", "TI-1270", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1977, wizatron, 0, 0, wizatron, wizatron, driver_device, 0, "Texas Instruments", "Wiz-A-Tron", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1978, lilprof , 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW | GAME_NOT_WORKING ) // 1978 version, original is from 1976 +COMP( 1976, ti1270, 0, 0, ti1270, ti1270, driver_device, 0, "Texas Instruments", "TI-1270", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1977, wizatron, 0, 0, wizatron, wizatron, driver_device, 0, "Texas Instruments", "Wiz-A-Tron", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1978, lilprof, 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW | GAME_NOT_WORKING ) // 1978 version, original is from 1976 -COMP( 1976, ti30, 0, 0, ti30, ti30, driver_device, 0, "Texas Instruments", "TI-30", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1977, tiprog, 0, 0, ti30, tiprog, driver_device, 0, "Texas Instruments", "TI Programmer", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1979, tibusan1, 0, 0, ti30, tibusan1, driver_device, 0, "Texas Instruments", "TI Business Analyst-I", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1976, ti30, 0, 0, ti30, ti30, driver_device, 0, "Texas Instruments", "TI-30", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1977, tiprog, 0, 0, ti30, tiprog, driver_device, 0, "Texas Instruments", "TI Programmer", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1979, tibusan1, 0, 0, ti30, tibusan1, driver_device, 0, "Texas Instruments", "TI Business Analyst-I", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) From 9d6f2381864ff44a74684a92d14aff4f5c2edc0d Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 05:32:05 +0100 Subject: [PATCH 032/201] added coleco mspacman skeleton --- src/mess/drivers/hh_hmcs40.c | 60 +++++++++++-- src/mess/layout/hh_hmcs40_test.lay | 134 ++++++++++++++++++++++++++++- src/mess/mess.lst | 1 + 3 files changed, 184 insertions(+), 11 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 945e7d3ed46..c44727af7e0 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -34,6 +34,7 @@ *43 HD38820A 1982, Entex Turtles (have dump, +COP411 for audio) @45 HD38820A 1982, Coleco Donkey Kong @49 HD38820A 1983, Bandai Zackman + @61 HD38820A 1983, Coleco Ms. Pac-Man @70 HD38820A 1983, Parker Brothers Q*Bert @88 HD38820A 1984, Tomy Tron (THN-02) @@ -79,16 +80,16 @@ public: int m_display_maxx; // display matrix number of columns UINT32 m_grid; // VFD current row data - UINT32 m_plate; // VFD current column data + UINT64 m_plate; // VFD current column data - UINT32 m_display_state[0x20]; // display matrix rows data + UINT64 m_display_state[0x20]; // display matrix rows data UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments - UINT32 m_display_cache[0x20]; // (internal use) - UINT8 m_display_decay[0x20][0x20]; // (internal use) + UINT64 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x40]; // (internal use) TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); - void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); + void display_matrix(int maxx, int maxy, UINT64 setx, UINT32 sety); // game-specific handlers DECLARE_WRITE8_MEMBER(alnattck_plate_w); @@ -137,7 +138,7 @@ void hh_hmcs40_state::machine_start() void hh_hmcs40_state::display_update() { - UINT32 active_state[0x20]; + UINT64 active_state[0x20]; for (int y = 0; y < m_display_maxy; y++) { @@ -181,13 +182,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(hh_hmcs40_state::display_decay_tick) display_update(); } -void hh_hmcs40_state::display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety) +void hh_hmcs40_state::display_matrix(int maxx, int maxy, UINT64 setx, UINT32 sety) { m_display_maxx = maxx; m_display_maxy = maxy; // update current state - UINT32 mask = (1 << maxx) - 1; + UINT64 mask = (1 << maxx) - 1; for (int y = 0; y < maxy; y++) m_display_state[y] = (sety >> y & 1) ? (setx & mask) : 0; @@ -520,6 +521,41 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Coleco Ms. Pac-Man (manufactured in Taiwan) + * board label Coleco 911171 + * Hitachi HD38820A61 MCU + * cyan/red VFD display Futaba DM-60Z 3I, with color overlay + + NOTE!: MESS external artwork is recommended + +***************************************************************************/ + +static INPUT_PORTS_START( cmspacmn ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( cmspacmn, hh_hmcs40_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation - RC osc. + +// MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Entex Galaxian 2 (manufactured in Japan) @@ -753,6 +789,13 @@ ROM_START( cpacmanr1 ) ROM_END +ROM_START( cmspacmn ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + ROM_START( egalaxn2 ) ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) ) @@ -800,6 +843,7 @@ CONS( 1982, cdkong, 0, 0, cdkong, cdkong, driver_device, 0, "Colec CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, driver_device, 0, "Coleco", "Galaxian (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, cpacman, 0, 0, cpacman, cpacman, driver_device, 0, "Coleco", "Pac-Man (Coleco, Rev. 29)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, driver_device, 0, "Coleco", "Pac-Man (Coleco, Rev. 28)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, driver_device, 0, "Coleco", "Ms. Pac-Man (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex", "Galaxian 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) diff --git a/src/mess/layout/hh_hmcs40_test.lay b/src/mess/layout/hh_hmcs40_test.lay index 55266384f2e..95fdc39d59d 100644 --- a/src/mess/layout/hh_hmcs40_test.lay +++ b/src/mess/layout/hh_hmcs40_test.lay @@ -16,12 +16,12 @@ - + - + - + @@ -55,6 +55,14 @@ + + + + + + + + @@ -88,6 +96,14 @@ + + + + + + + + @@ -121,6 +137,14 @@ + + + + + + + + @@ -154,6 +178,14 @@ + + + + + + + + @@ -187,6 +219,14 @@ + + + + + + + + @@ -220,6 +260,14 @@ + + + + + + + + @@ -253,6 +301,14 @@ + + + + + + + + @@ -286,6 +342,14 @@ + + + + + + + + @@ -319,6 +383,14 @@ + + + + + + + + @@ -352,6 +424,14 @@ + + + + + + + + @@ -385,6 +465,14 @@ + + + + + + + + @@ -418,6 +506,14 @@ + + + + + + + + @@ -451,6 +547,14 @@ + + + + + + + + @@ -484,6 +588,14 @@ + + + + + + + + @@ -517,6 +629,14 @@ + + + + + + + + @@ -550,6 +670,14 @@ + + + + + + + + diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 19e30640f61..e581fa59686 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2182,6 +2182,7 @@ cdkong // Coleco cgalaxn // Coleco cpacman // Coleco cpacmanr1 // +cmspacmn // Coleco egalaxn2 // Entex epacman2 // Entex pbqbert // Parker Brothers From af7b120d8239d1d165d3bba64ed939965088ba5f Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 15 Mar 2015 22:57:16 +1100 Subject: [PATCH 033/201] OS/2 patches for SDLMAME 0.159 [KO Muyng-Hun] --- 3rdparty/mongoose/mongoose.c | 4 ++++ makefile | 4 +--- src/osd/sdl/sdl.mak | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/3rdparty/mongoose/mongoose.c b/3rdparty/mongoose/mongoose.c index 244b3d8efba..550c3bd2415 100644 --- a/3rdparty/mongoose/mongoose.c +++ b/3rdparty/mongoose/mongoose.c @@ -63,6 +63,10 @@ #pragma warning (disable : 4204) // missing c99 support #endif +#ifdef __OS2__ +#define _MMAP_DECLARED // Prevent dummy mmap() declaration in stdio.h +#endif + #include #include #include diff --git a/makefile b/makefile index 0182e22b8b8..741ad490856 100644 --- a/makefile +++ b/makefile @@ -483,12 +483,10 @@ ifdef PROFILER DEFS += -DMAME_PROFILER endif -# dine USE_NETWORK if networking is enabled (not OS/2 and hasn't been disabled) -ifneq ($(TARGETOS),os2) +# define USE_NETWORK if networking is enabled (hasn't been disabled) ifndef DONT_USE_NETWORK DEFS += -DUSE_NETWORK endif -endif # need to ensure FLAC functions are statically linked ifeq ($(BUILD_FLAC),1) diff --git a/src/osd/sdl/sdl.mak b/src/osd/sdl/sdl.mak index 005955d3be1..2f188762da5 100644 --- a/src/osd/sdl/sdl.mak +++ b/src/osd/sdl/sdl.mak @@ -753,7 +753,7 @@ SDLLIBS := $(shell sdl-config --libs) INCPATH += $(SDLCFLAGS) LIBS += $(SDLLIBS) -lpthread -BASELIBS += += $(SDLLIBS) -lpthread +BASELIBS += $(SDLLIBS) -lpthread endif # OS2 From abae5d34e6104efd31f987afb1712f836a17f44d Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 15:40:51 +0100 Subject: [PATCH 034/201] (MESS)New working game added ----------------- TI Little Professor (1978 version) [hap, Sean Riddle] --- src/mess/drivers/hh_hmcs40.c | 2 +- src/mess/drivers/hh_pic16.c | 2 +- src/mess/drivers/hh_tms1k.c | 24 ++--- src/mess/drivers/hh_ucom4.c | 2 +- src/mess/drivers/ticalc1x.c | 166 +++++++++++++++++++++++++---------- src/mess/drivers/tispeak.c | 12 +-- 6 files changed, 141 insertions(+), 67 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index c44727af7e0..d7b648c9408 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -176,7 +176,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(hh_hmcs40_state::display_decay_tick) // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) for (int x = 0; x < m_display_maxx; x++) - if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0) + if (m_display_decay[y][x] != 0) m_display_decay[y][x]--; display_update(); diff --git a/src/mess/drivers/hh_pic16.c b/src/mess/drivers/hh_pic16.c index df80386215a..bd4066d569e 100644 --- a/src/mess/drivers/hh_pic16.c +++ b/src/mess/drivers/hh_pic16.c @@ -148,7 +148,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(hh_pic16_state::display_decay_tick) // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) for (int x = 0; x < m_display_maxx; x++) - if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0) + if (m_display_decay[y][x] != 0) m_display_decay[y][x]--; display_update(); diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 0617949b52c..da397dac487 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -111,11 +111,11 @@ public: UINT16 m_r; // MCU R-pins data UINT16 m_o; // MCU O-pins data UINT16 m_inp_mux; // multiplexed inputs mask - bool m_power_on; // TMS0980 power-on state + bool m_power_on; UINT8 read_inputs(int columns); - DECLARE_INPUT_CHANGED_MEMBER(tms0980_power_button); - DECLARE_WRITE_LINE_MEMBER(tms0980_auto_power_off); + DECLARE_INPUT_CHANGED_MEMBER(power_button); + DECLARE_WRITE_LINE_MEMBER(auto_power_off); virtual void machine_start(); virtual void machine_reset(); @@ -307,7 +307,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(hh_tms1k_state::display_decay_tick) // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) for (int x = 0; x < m_display_maxx; x++) - if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0) + if (m_display_decay[y][x] != 0) m_display_decay[y][x]--; display_update(); @@ -342,7 +342,7 @@ UINT8 hh_tms1k_state::read_inputs(int columns) // devices with a TMS0980 can auto power-off -WRITE_LINE_MEMBER(hh_tms1k_state::tms0980_auto_power_off) +WRITE_LINE_MEMBER(hh_tms1k_state::auto_power_off) { if (state) { @@ -351,7 +351,7 @@ WRITE_LINE_MEMBER(hh_tms1k_state::tms0980_auto_power_off) } } -INPUT_CHANGED_MEMBER(hh_tms1k_state::tms0980_power_button) +INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button) { m_power_on = (bool)(FPTR)param; m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); @@ -1182,11 +1182,11 @@ static INPUT_PORTS_START( elecdet ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.4") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false) INPUT_PORTS_END @@ -1197,7 +1197,7 @@ static MACHINE_CONFIG_START( elecdet, hh_tms1k_state ) MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, elecdet_read_k)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, elecdet_write_r)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, elecdet_write_o)) - MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, tms0980_auto_power_off)) + MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, auto_power_off)) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_elecdet) @@ -1778,11 +1778,11 @@ static INPUT_PORTS_START( stopthief ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.2") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, tms0980_power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false) INPUT_PORTS_END static MACHINE_CONFIG_START( stopthief, hh_tms1k_state ) @@ -1792,7 +1792,7 @@ static MACHINE_CONFIG_START( stopthief, hh_tms1k_state ) MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, stopthief_read_k)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, stopthief_write_r)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, stopthief_write_o)) - MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, tms0980_auto_power_off)) + MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(hh_tms1k_state, auto_power_off)) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_stopthie) diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index e65d59b37b2..355a4b6d995 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -192,7 +192,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(hh_ucom4_state::display_decay_tick) // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) for (int x = 0; x < m_display_maxx; x++) - if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0) + if (m_display_decay[y][x] != 0) m_display_decay[y][x]--; display_update(); diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 75718aada30..59016fc09d4 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -9,6 +9,7 @@ TODO: - MCU clocks are unknown + - lilprof equals-sign is always on ***************************************************************************/ @@ -45,11 +46,11 @@ public: UINT16 m_r; // MCU R-pins data UINT16 m_o; // MCU O-pins data UINT16 m_inp_mux; // multiplexed inputs mask - bool m_power_on; // TMS0980 power-on state + bool m_power_on; UINT8 read_inputs(int columns); - DECLARE_INPUT_CHANGED_MEMBER(tms0980_power_button); - DECLARE_WRITE_LINE_MEMBER(tms0980_auto_power_off); + DECLARE_INPUT_CHANGED_MEMBER(power_button); + DECLARE_WRITE_LINE_MEMBER(auto_power_off); virtual void machine_reset(); virtual void machine_start(); @@ -82,6 +83,10 @@ public: DECLARE_WRITE16_MEMBER(wizatron_write_o); DECLARE_WRITE16_MEMBER(wizatron_write_r); + DECLARE_READ8_MEMBER(lilprof_read_k); + DECLARE_WRITE16_MEMBER(lilprof_write_o); + DECLARE_WRITE16_MEMBER(lilprof_write_r); + DECLARE_READ8_MEMBER(ti30_read_k); DECLARE_WRITE16_MEMBER(ti30_write_o); DECLARE_WRITE16_MEMBER(ti30_write_r); @@ -175,7 +180,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(ticalc1x_state::display_decay_tick) // slowly turn off unpowered segments for (int y = 0; y < m_display_maxy; y++) for (int x = 0; x < m_display_maxx; x++) - if (!(m_display_state[y] >> x & 1) && m_display_decay[y][x] != 0) + if (m_display_decay[y][x] != 0) m_display_decay[y][x]--; display_update(); @@ -213,7 +218,7 @@ UINT8 ticalc1x_state::read_inputs(int columns) // devices with a TMS0980 can auto power-off -WRITE_LINE_MEMBER(ticalc1x_state::tms0980_auto_power_off) +WRITE_LINE_MEMBER(ticalc1x_state::auto_power_off) { if (state) { @@ -222,7 +227,7 @@ WRITE_LINE_MEMBER(ticalc1x_state::tms0980_auto_power_off) } } -INPUT_CHANGED_MEMBER(ticalc1x_state::tms0980_power_button) +INPUT_CHANGED_MEMBER(ticalc1x_state::power_button) { m_power_on = (bool)(FPTR)param; m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); @@ -455,7 +460,7 @@ MACHINE_CONFIG_END /*************************************************************************** - TI WIZ-A-TRON (educational toy) + TI WIZ-A-TRON * TMS0970 MCU labeled TMC0907NL ZA0379, DP0907BS. die labeled 0970F-07B ***************************************************************************/ @@ -467,7 +472,7 @@ READ8_MEMBER(ticalc1x_state::wizatron_read_k) WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) { - // note: 3rd digit is custom(not 7seg), for math symbols, and 6th digit + // note: 6th digit is custom(not 7seg), for math symbols, and 3rd digit // only has A and G for =, though some newer revisions use a custom digit too. m_7seg_mask[3] = 0x41; @@ -532,10 +537,106 @@ MACHINE_CONFIG_END +/*************************************************************************** + + TI Little Professor '78 + * TMS1990 MCU labeled TMC1993NL. die labeled 1990C-c3C + +***************************************************************************/ + +READ8_MEMBER(ticalc1x_state::lilprof_read_k) +{ + return read_inputs(5); +} + +WRITE16_MEMBER(ticalc1x_state::lilprof_write_r) +{ + // update leds state + UINT8 o = BITSWAP8(m_o,7,4,3,2,1,0,6,5) & 0x7f; + UINT16 r = (data & 7) | (data << 1 & 0x1f0); + + for (int y = 0; y < 9; y++) + m_display_state[y] = (r >> y & 1) ? o : 0; + + // 3rd digit A/G(equals sign) is from O7 + m_display_state[3] = (m_o & 0x80) ? 0x41 : 0; + + // 6th digit is a custom 7seg for math symbols + m_display_state[6] = BITSWAP8(m_display_state[6],7,6,1,4,2,3,5,0); + + m_display_maxx = 8; + m_display_maxy = 9; + display_update(); +} + +WRITE16_MEMBER(ticalc1x_state::lilprof_write_o) +{ + // O0-O3,O5: input mux + // O0-O6: digit segments A-G + // O7: 6th digit + m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); + m_o = data; +} + + +static INPUT_PORTS_START( lilprof ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.3") // O3 or O4? + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( lilprof, ticalc1x_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1990, 250000) // guessed + MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_wizatron) + + /* no video! */ + + /* no sound! */ +MACHINE_CONFIG_END + + + + + /*************************************************************************** Majestic-line calculators: - * TI-30: TMS0980 MCU labeled TMC0981NL. die labeled 0980B-81F + * TI-30(aka SR-40): TMS0980 MCU labeled TMC0981NL. die labeled 0980B-81F * TI Programmer: TMS0980 MCU labeled ZA0675NL, JP0983AT. die labeled 0980B-83 * TI Business Analyst-I: TMS0980 MCU labeled TMC0982NL. die labeled 0980B-82F @@ -617,11 +718,11 @@ static INPUT_PORTS_START( ti30 ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) INPUT_PORTS_END @@ -677,11 +778,11 @@ static INPUT_PORTS_START( tiprog ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_PGUP) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) INPUT_PORTS_END @@ -738,11 +839,11 @@ static INPUT_PORTS_START( tibusan1 ) // note: even though power buttons are on the matrix, they are not CPU-controlled PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)true) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_DEL) PORT_NAME("ON/C") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)true) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, tms0980_power_button, (void *)false) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("OFF") PORT_CHANGED_MEMBER(DEVICE_SELF, ticalc1x_state, power_button, (void *)false) INPUT_PORTS_END @@ -753,7 +854,7 @@ static MACHINE_CONFIG_START( ti30, ticalc1x_state ) MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, ti30_read_k)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, ti30_write_o)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, ti30_write_r)) - MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(ticalc1x_state, tms0980_auto_power_off)) + MCFG_TMS1XXX_POWER_OFF_CB(WRITELINE(ticalc1x_state, auto_power_off)) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_ti30) @@ -767,33 +868,6 @@ MACHINE_CONFIG_END - - -static INPUT_PORTS_START( lilprof ) -INPUT_PORTS_END - - - - - - -static MACHINE_CONFIG_START( lilprof, ticalc1x_state ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1990, 250000) // guessed -// MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) -// MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) -// MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) - - MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) - MCFG_DEFAULT_LAYOUT(layout_wizatron) - - /* no video! */ - - /* no sound! */ -MACHINE_CONFIG_END - - /*************************************************************************** Game driver(s) @@ -846,13 +920,13 @@ ROM_START( lilprof ) ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_lilprof_ipla.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_LOAD( "tms0970_lilprof_ipla.pla", 0, 782, BAD_DUMP CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) // not verified ROM_REGION( 860, "maincpu:mpla", 0 ) ROM_LOAD( "tms0970_lilprof_mpla.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) ROM_REGION( 352, "maincpu:opla", 0 ) ROM_LOAD( "tms0970_lilprof_opla.pla", 0, 352, CRC(03f509c4) SHA1(691554a55db0c5950df848077095f23a991b1909) ) ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0970_lilprof_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) + ROM_LOAD( "tms0970_lilprof_spla.pla", 0, 157, CRC(234ca3a8) SHA1(76844dd87cb380a07c8fcbef143038087e98f138) ) ROM_END @@ -907,7 +981,7 @@ COMP( 1974, tisr16, 0, 0, tisr16, tisr16, driver_device, 0, "Tex COMP( 1976, ti1270, 0, 0, ti1270, ti1270, driver_device, 0, "Texas Instruments", "TI-1270", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, wizatron, 0, 0, wizatron, wizatron, driver_device, 0, "Texas Instruments", "Wiz-A-Tron", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1978, lilprof, 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW | GAME_NOT_WORKING ) // 1978 version, original is from 1976 +COMP( 1978, lilprof, 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor (1978 version)", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // original is from 1976 COMP( 1976, ti30, 0, 0, ti30, ti30, driver_device, 0, "Texas Instruments", "TI-30", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, tiprog, 0, 0, ti30, tiprog, driver_device, 0, "Texas Instruments", "TI Programmer", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index 1e05f4cc2a5..2340e3e43a6 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -951,14 +951,14 @@ ROM_END -COMP( 1978, snspell, 0, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US prototype)", GAME_IMPERFECT_SOUND ) // also US set 1 -COMP( 1980, snspella, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) -COMP( 1978, snspelluk, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) -COMP( 1981, snspelluka, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +COMP( 1978, snspell, 0, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, prototype)", GAME_IMPERFECT_SOUND ) // also US set 1 +COMP( 1980, snspella, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +COMP( 1978, snspelluk, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +COMP( 1981, snspelluka, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) COMP( 1979, snspelljp, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (Japan)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) COMP( 1980, ladictee, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "La Dictee Magique (France)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // doesn't work due to missing CD2702 MCU dump, German/Italian version has CD2702 too -COMP( 1980, snmath, 0, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US prototype)", GAME_IMPERFECT_SOUND ) // also US set 1 -COMP( 1986, snmatha, snmath, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US set 2)", GAME_IMPERFECT_SOUND ) +COMP( 1980, snmath, 0, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, prototype)", GAME_IMPERFECT_SOUND ) // also US set 1 +COMP( 1986, snmatha, snmath, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1986 version)", GAME_IMPERFECT_SOUND ) COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, lantutor, "Texas Instruments", "Language Tutor (prototype)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) From 3790a735eb0921de3136aa68ee7c4abf2cb5560a Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 16:39:41 +0100 Subject: [PATCH 035/201] rename: snmath -> snmathp snmatha -> snmath --- src/mess/drivers/tispeak.c | 50 +++++++++++++++++++------------------- src/mess/mess.lst | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index 2340e3e43a6..0c5b6882a93 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -898,24 +898,6 @@ ROM_END ROM_START( snmath ) - ROM_REGION( 0x1000, "maincpu", 0 ) - // typed in from patent 4946391, verified with source code - // BTANB note: Mix It does not work at all, this is an original bug in the prototype. There are probably other minor bugs too. - ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_cd2708_mpla.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // taken from cd2708, need to verify if it's same as cd2704 - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2708_opla.pla", 0, 1246, BAD_DUMP CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) // " - - ROM_REGION( 0x8000, "tms6100", 0 ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) -ROM_END - -ROM_START( snmatha ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD( "cd2708n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) ) @@ -934,6 +916,24 @@ ROM_START( snmatha ) ROM_RELOAD( 0x7000, 0x1000 ) ROM_END +ROM_START( snmathp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + // typed in from patent 4946391, verified with source code + // BTANB note: Mix It does not work at all, this is an original bug in the prototype. There are probably other minor bugs too. + ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_default_ipla.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_cd2708_mpla.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // taken from cd2708, need to verify if it's same as cd2704 + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2708_opla.pla", 0, 1246, BAD_DUMP CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) // " + + ROM_REGION( 0x8000, "tms6100", 0 ) + ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) + ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) +ROM_END + ROM_START( lantutor ) ROM_REGION( 0x1000, "maincpu", 0 ) @@ -951,14 +951,14 @@ ROM_END -COMP( 1978, snspell, 0, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, prototype)", GAME_IMPERFECT_SOUND ) // also US set 1 -COMP( 1980, snspella, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) -COMP( 1978, snspelluk, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) -COMP( 1981, snspelluka, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) -COMP( 1979, snspelljp, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (Japan)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +COMP( 1978, snspell, 0, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1978 version/prototype)", GAME_IMPERFECT_SOUND ) +COMP( 1980, snspella, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM +COMP( 1978, snspelluk, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM +COMP( 1981, snspelluka, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM +COMP( 1979, snspelljp, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (Japan)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM COMP( 1980, ladictee, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "La Dictee Magique (France)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // doesn't work due to missing CD2702 MCU dump, German/Italian version has CD2702 too -COMP( 1980, snmath, 0, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, prototype)", GAME_IMPERFECT_SOUND ) // also US set 1 -COMP( 1986, snmatha, snmath, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1986 version)", GAME_IMPERFECT_SOUND ) +COMP( 1986, snmath, 0, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1986 version)", GAME_IMPERFECT_SOUND ) +COMP( 1980, snmathp, snmath, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1980 version/prototype)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, lantutor, "Texas Instruments", "Language Tutor (prototype)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index e581fa59686..2ea9ed1c715 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -1075,7 +1075,7 @@ snspelluka snspelljp ladictee snmath -snmatha +snmathp lantutor // Texas Instruments Calculators From 02590ff26399678eabdfdcdc25d44b47d2578c9b Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 17:46:47 +0100 Subject: [PATCH 036/201] update tispeak.c display_update --- src/mess/drivers/hh_hmcs40.c | 10 +-- src/mess/drivers/hh_pic16.c | 12 ++-- src/mess/drivers/hh_tms1k.c | 30 ++++----- src/mess/drivers/hh_ucom4.c | 10 +-- src/mess/drivers/ticalc1x.c | 26 ++++---- src/mess/drivers/tispeak.c | 117 ++++++++++++++++++++++------------- 6 files changed, 117 insertions(+), 88 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index d7b648c9408..a1d3f0c0681 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -83,7 +83,7 @@ public: UINT64 m_plate; // VFD current column data UINT64 m_display_state[0x20]; // display matrix rows data - UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments UINT64 m_display_cache[0x20]; // (internal use) UINT8 m_display_decay[0x20][0x40]; // (internal use) @@ -104,7 +104,7 @@ void hh_hmcs40_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); m_inp_mux = 0; m_grid = 0; @@ -118,7 +118,7 @@ void hh_hmcs40_state::machine_start() save_item(NAME(m_display_state)); save_item(NAME(m_display_cache)); save_item(NAME(m_display_decay)); - save_item(NAME(m_7seg_mask)); + save_item(NAME(m_display_segmask)); save_item(NAME(m_inp_mux)); save_item(NAME(m_grid)); @@ -160,8 +160,8 @@ void hh_hmcs40_state::display_update() for (int y = 0; y < m_display_maxy; y++) if (m_display_cache[y] != active_state[y]) { - if (m_7seg_mask[y] != 0) - output_set_digit_value(y, active_state[y] & m_7seg_mask[y]); + if (m_display_segmask[y] != 0) + output_set_digit_value(y, active_state[y] & m_display_segmask[y]); const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) diff --git a/src/mess/drivers/hh_pic16.c b/src/mess/drivers/hh_pic16.c index bd4066d569e..44043ea0ff3 100644 --- a/src/mess/drivers/hh_pic16.c +++ b/src/mess/drivers/hh_pic16.c @@ -59,7 +59,7 @@ public: int m_display_maxx; // display matrix number of columns UINT32 m_display_state[0x20]; // display matrix rows data - UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments UINT32 m_display_cache[0x20]; // (internal use) UINT8 m_display_decay[0x20][0x20]; // (internal use) @@ -78,7 +78,7 @@ void hh_pic16_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); m_b = 0; m_c = 0; @@ -91,7 +91,7 @@ void hh_pic16_state::machine_start() save_item(NAME(m_display_state)); save_item(NAME(m_display_cache)); save_item(NAME(m_display_decay)); - save_item(NAME(m_7seg_mask)); + save_item(NAME(m_display_segmask)); save_item(NAME(m_b)); save_item(NAME(m_c)); @@ -132,8 +132,8 @@ void hh_pic16_state::display_update() for (int y = 0; y < m_display_maxy; y++) if (m_display_cache[y] != active_state[y]) { - if (m_7seg_mask[y] != 0) - output_set_digit_value(y, active_state[y] & m_7seg_mask[y]); + if (m_display_segmask[y] != 0) + output_set_digit_value(y, active_state[y] & m_display_segmask[y]); const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) @@ -199,7 +199,7 @@ WRITE8_MEMBER(hh_pic16_state::maniac_output_w) m_display_maxx = 7; m_display_maxy = 2; - m_7seg_mask[offset] = 0x7f; + m_display_segmask[offset] = 0x7f; m_display_state[offset] = ~data & 0x7f; display_update(); } diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index da397dac487..ec4b244782f 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -126,7 +126,7 @@ public: int m_display_maxx; // display matrix number of columns UINT32 m_display_state[0x20]; // display matrix rows data - UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments UINT32 m_display_cache[0x20]; // (internal use) UINT8 m_display_decay[0x20][0x20]; // (internal use) @@ -215,7 +215,7 @@ void hh_tms1k_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); m_o = 0; m_r = 0; @@ -230,7 +230,7 @@ void hh_tms1k_state::machine_start() save_item(NAME(m_display_state)); save_item(NAME(m_display_cache)); save_item(NAME(m_display_decay)); - save_item(NAME(m_7seg_mask)); + save_item(NAME(m_display_segmask)); save_item(NAME(m_o)); save_item(NAME(m_r)); @@ -291,8 +291,8 @@ void hh_tms1k_state::display_update() for (int y = 0; y < m_display_maxy; y++) if (m_display_cache[y] != active_state[y]) { - if (m_7seg_mask[y] != 0) - output_set_digit_value(y, active_state[y] & m_7seg_mask[y]); + if (m_display_segmask[y] != 0) + output_set_digit_value(y, active_state[y] & m_display_segmask[y]); const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) @@ -395,7 +395,7 @@ void hh_tms1k_state::mathmagi_display() // R0-R7: 7seg leds for (int y = 0; y < 8; y++) { - m_7seg_mask[y] = 0x7f; + m_display_segmask[y] = 0x7f; m_display_state[y] = (m_r >> y & 1) ? (m_o >> 1) : 0; } @@ -558,7 +558,7 @@ void hh_tms1k_state::amaztron_display() // R8,R9: select digit for (int y = 0; y < 2; y++) { - m_7seg_mask[y] = 0x7f; + m_display_segmask[y] = 0x7f; m_display_state[y] = (m_r >> (y + 8) & 1) ? m_o : 0; } @@ -705,7 +705,7 @@ void hh_tms1k_state::tc4_display() // R5,7,8,9 are 7segs for (int y = 0; y < 10; y++) if (y >= 5 && y <= 9 && y != 6) - m_7seg_mask[y] = 0x7f; + m_display_segmask[y] = 0x7f; // update current state (note: R6 as extra column!) display_matrix(9, 10, (m_o | (m_r << 2 & 0x100)), m_r); @@ -848,7 +848,7 @@ MACHINE_CONFIG_END void hh_tms1k_state::ebball_display() { // R8 is a 7seg - m_7seg_mask[8] = 0x7f; + m_display_segmask[8] = 0x7f; display_matrix(7, 9, ~m_o, m_r); } @@ -979,12 +979,12 @@ void hh_tms1k_state::ebball3_display() m_display_state[y] = (m_r >> y & 1) ? m_o : 0; // R0,R1 are normal 7segs - m_7seg_mask[0] = m_7seg_mask[1] = 0x7f; + m_display_segmask[0] = m_display_segmask[1] = 0x7f; // R4,R7 contain segments(only F and B) for the two other digits m_display_state[10] = (m_display_state[4] & 0x20) | (m_display_state[7] & 0x02); m_display_state[11] = ((m_display_state[4] & 0x10) | (m_display_state[7] & 0x01)) << 1; - m_7seg_mask[10] = m_7seg_mask[11] = 0x22; + m_display_segmask[10] = m_display_segmask[11] = 0x22; display_update(); } @@ -1126,7 +1126,7 @@ WRITE16_MEMBER(hh_tms1k_state::elecdet_write_r) // R0-R6: select digit for (int y = 0; y < 7; y++) - m_7seg_mask[y] = 0x7f; + m_display_segmask[y] = 0x7f; display_matrix(7, 7, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data); } @@ -1228,7 +1228,7 @@ MACHINE_CONFIG_END void hh_tms1k_state::starwbc_display() { // R6,R8 are 7segs - m_7seg_mask[6] = m_7seg_mask[8] = 0x7f; + m_display_segmask[6] = m_display_segmask[8] = 0x7f; display_matrix(8, 10, m_o, m_r); } @@ -1527,7 +1527,7 @@ WRITE16_MEMBER(hh_tms1k_state::cnsector_write_r) // R0-R5: select digit (right-to-left) for (int y = 0; y < 6; y++) { - m_7seg_mask[y] = 0xff; + m_display_segmask[y] = 0xff; m_display_state[y] = (data >> y & 1) ? m_o : 0; } @@ -1731,7 +1731,7 @@ WRITE16_MEMBER(hh_tms1k_state::stopthief_write_r) UINT8 o = BITSWAP8(m_o,3,5,2,1,4,0,6,7) & 0x7f; for (int y = 0; y < m_display_maxy; y++) { - m_7seg_mask[y] = 0x7f; + m_display_segmask[y] = 0x7f; m_display_state[y] = (data >> y & 1) ? o : 0; } diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 355a4b6d995..632afeb0850 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -69,7 +69,7 @@ public: UINT32 m_plate; // VFD current column data UINT32 m_display_state[0x20]; // display matrix rows data - UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments UINT32 m_display_cache[0x20]; // (internal use) UINT8 m_display_decay[0x20][0x20]; // (internal use) @@ -118,7 +118,7 @@ void hh_ucom4_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); + memset(m_display_segmask, 0, sizeof(m_display_segmask)); memset(m_port, 0, sizeof(m_port)); m_inp_mux = 0; @@ -133,7 +133,7 @@ void hh_ucom4_state::machine_start() save_item(NAME(m_display_state)); save_item(NAME(m_display_cache)); save_item(NAME(m_display_decay)); - save_item(NAME(m_7seg_mask)); + save_item(NAME(m_display_segmask)); save_item(NAME(m_port)); save_item(NAME(m_inp_mux)); @@ -176,8 +176,8 @@ void hh_ucom4_state::display_update() for (int y = 0; y < m_display_maxy; y++) if (m_display_cache[y] != active_state[y]) { - if (m_7seg_mask[y] != 0) - output_set_digit_value(y, active_state[y] & m_7seg_mask[y]); + if (m_display_segmask[y] != 0) + output_set_digit_value(y, active_state[y] & m_display_segmask[y]); const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 59016fc09d4..3957087e0ea 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -61,13 +61,13 @@ public: int m_display_maxx; // display matrix number of columns UINT32 m_display_state[0x20]; // display matrix rows data - UINT16 m_7seg_mask[0x20]; // if not 0, display matrix row is a 7seg, mask indicates connected segments + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments UINT32 m_display_cache[0x20]; // (internal use) UINT8 m_display_decay[0x20][0x20]; // (internal use) TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); void display_update(); - void display_matrix_7seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 _7segmask); + void display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask); // calculator-specific handlers DECLARE_READ8_MEMBER(tisr16_read_k); @@ -101,7 +101,7 @@ void ticalc1x_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); - memset(m_7seg_mask, ~0, sizeof(m_7seg_mask)); // ! + memset(m_display_segmask, ~0, sizeof(m_display_segmask)); // ! m_o = 0; m_r = 0; @@ -116,7 +116,7 @@ void ticalc1x_state::machine_start() save_item(NAME(m_display_state)); save_item(NAME(m_display_cache)); save_item(NAME(m_display_decay)); - save_item(NAME(m_7seg_mask)); + save_item(NAME(m_display_segmask)); save_item(NAME(m_o)); save_item(NAME(m_r)); @@ -164,8 +164,8 @@ void ticalc1x_state::display_update() for (int y = 0; y < m_display_maxy; y++) if (m_display_cache[y] != active_state[y]) { - if (m_7seg_mask[y] != 0) - output_set_digit_value(y, active_state[y] & m_7seg_mask[y]); + if (m_display_segmask[y] != 0) + output_set_digit_value(y, active_state[y] & m_display_segmask[y]); const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) @@ -186,7 +186,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(ticalc1x_state::display_decay_tick) display_update(); } -void ticalc1x_state::display_matrix_7seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 _7segmask) +void ticalc1x_state::display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask) { m_display_maxx = maxx; m_display_maxy = maxy; @@ -195,7 +195,7 @@ void ticalc1x_state::display_matrix_7seg(int maxx, int maxy, UINT32 setx, UINT32 UINT32 colmask = (1 << maxx) - 1; for (int y = 0; y < maxy; y++) { - m_7seg_mask[y] &= _7segmask; + m_display_segmask[y] &= segmask; m_display_state[y] = (sety >> y & 1) ? (setx & colmask) : 0; } @@ -387,7 +387,7 @@ READ8_MEMBER(ticalc1x_state::ti1270_read_k) WRITE16_MEMBER(ticalc1x_state::ti1270_write_r) { // R0-R7: select digit (right-to-left) - display_matrix_7seg(8, 8, m_o, data, 0xff); + display_matrix_seg(8, 8, m_o, data, 0xff); } WRITE16_MEMBER(ticalc1x_state::ti1270_write_o) @@ -474,10 +474,10 @@ WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) { // note: 6th digit is custom(not 7seg), for math symbols, and 3rd digit // only has A and G for =, though some newer revisions use a custom digit too. - m_7seg_mask[3] = 0x41; + m_display_segmask[3] = 0x41; // R0-R8: select digit (right-to-left) - display_matrix_7seg(8, 9, m_o, data, 0x7f); + display_matrix_seg(8, 9, m_o, data, 0x7f); } WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) @@ -651,10 +651,10 @@ READ8_MEMBER(ticalc1x_state::ti30_read_k) WRITE16_MEMBER(ticalc1x_state::ti30_write_r) { // note: 1st digit only has segments B,F,G,DP - m_7seg_mask[0] = 0xe2; + m_display_segmask[0] = 0xe2; // R0-R8: select digit - display_matrix_7seg(8, 9, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data, 0xff); + display_matrix_seg(8, 9, BITSWAP8(m_o,7,5,2,1,4,0,6,3), data, 0xff); } WRITE16_MEMBER(ticalc1x_state::ti30_write_o) diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index 0c5b6882a93..a6a14886556 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -303,25 +303,40 @@ public: m_tms5100(*this, "tms5100"), m_tms6100(*this, "tms6100"), m_cart(*this, "cartslot"), - m_button_matrix(*this, "IN") + m_button_matrix(*this, "IN"), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) { } + // devices required_device m_maincpu; required_device m_tms5100; required_device m_tms6100; optional_device m_cart; required_ioport_array<9> m_button_matrix; - UINT16 m_r; - UINT16 m_o; + // misc common + UINT16 m_r; // MCU R-pins data + UINT16 m_o; // MCU O-pins data int m_power_on; + int m_filament_on; + + // display common + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns + + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) - UINT16 m_display_state[0x10]; - UINT16 m_display_cache[0x10]; - UINT8 m_display_decay[0x100]; - void display_update(); TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask); + // cartridge UINT32 m_cart_max_size; UINT8* m_cart_base; DECLARE_DEVICE_IMAGE_LOAD_MEMBER(tispeak_cartridge); @@ -386,47 +401,39 @@ DRIVER_INIT_MEMBER(tispeak_state, lantutor) ***************************************************************************/ -// The device strobes the filament-enable very fast, it is unnoticeable to the user. +// The device may strobe the outputs very fast, it is unnoticeable to the user. // To prevent flickering here, we need to simulate a decay. -// decay time, in steps of 1ms -#define DISPLAY_DECAY_TIME 40 - void tispeak_state::display_update() { - int filament_on = (m_r & 0x8000) ? 1 : 0; - UINT16 active_state[0x10]; + UINT32 active_state[0x20]; - for (int i = 0; i < 0x10; i++) + for (int y = 0; y < m_display_maxy; y++) { - // update current state - m_display_state[i] = (m_r >> i & 1) ? m_o : 0; + active_state[y] = 0; - active_state[i] = 0; - - for (int j = 0; j < 0x10; j++) + for (int x = 0; x < m_display_maxx; x++) { - int di = j << 4 | i; - // turn on powered segments - if (m_power_on && filament_on && m_display_state[i] >> j & 1) - m_display_decay[di] = DISPLAY_DECAY_TIME; + if (m_power_on && m_filament_on && m_display_state[y] >> x & 1) + m_display_decay[y][x] = m_display_wait; // determine active state - int ds = (m_display_decay[di] != 0) ? 1 : 0; - active_state[i] |= (ds << j); + int ds = (m_display_decay[y][x] != 0) ? 1 : 0; + active_state[y] |= (ds << x); } } // on difference, send to output - for (int i = 0; i < 0x10; i++) - if (m_display_cache[i] != active_state[i]) + for (int y = 0; y < m_display_maxy; y++) + if (m_display_cache[y] != active_state[y]) { - output_set_digit_value(i, active_state[i] & 0x3fff); + if (m_display_segmask[y] != 0) + output_set_digit_value(y, active_state[y] & m_display_segmask[y]); - // lampxyy where x=digit, y=segment - for (int j = 0; j < 0x10; j++) - output_set_lamp_value(i*100 + j, active_state[i] >> j & 1); + const int mul = (m_display_maxx <= 10) ? 10 : 100; + for (int x = 0; x < m_display_maxx; x++) + output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); @@ -435,10 +442,27 @@ void tispeak_state::display_update() TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::display_decay_tick) { // slowly turn off unpowered segments - for (int i = 0; i < 0x100; i++) - if (!(m_display_state[i & 0xf] >> (i>>4) & 1) && m_display_decay[i]) - m_display_decay[i]--; + for (int y = 0; y < m_display_maxy; y++) + for (int x = 0; x < m_display_maxx; x++) + if (m_display_decay[y][x] != 0) + m_display_decay[y][x]--; + + display_update(); +} +void tispeak_state::display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask) +{ + m_display_maxx = maxx; + m_display_maxy = maxy; + + // update current state + UINT32 colmask = (1 << maxx) - 1; + for (int y = 0; y < maxy; y++) + { + m_display_segmask[y] &= segmask; + m_display_state[y] = (sety >> y & 1) ? (setx & colmask) : 0; + } + display_update(); } @@ -467,15 +491,17 @@ READ8_MEMBER(tispeak_state::snspell_read_k) WRITE16_MEMBER(tispeak_state::snspell_write_r) { - // R0-R7: input mux and select digit (+R8 if the device has 9 digits) - // R15: filament on (handled in leds_update) + // R15: filament on + m_filament_on = data & 0x8000; + // R13: power-off request, on falling edge if ((m_r >> 13 & 1) && !(data >> 13 & 1)) power_off(); + // R0-R7: input mux and select digit (+R8 if the device has 9 digits) // other bits: MCU internal use - m_r = data; - display_update(); + m_r = data & 0x21ff; + display_matrix_seg(16, 16, m_o, m_r, 0x3fff); } WRITE16_MEMBER(tispeak_state::snspell_write_o) @@ -483,8 +509,7 @@ WRITE16_MEMBER(tispeak_state::snspell_write_o) // reorder opla to led14seg, plus DP as d14 and AP as d15: // E,D,C,G,B,A,I,M,L,K,N,J,[AP],H,F,[DP] (sidenote: TI KLMN = MAME MLNK) m_o = BITSWAP16(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); - - display_update(); + display_matrix_seg(16, 16, m_o, m_r, 0x3fff); } @@ -505,8 +530,7 @@ WRITE16_MEMBER(tispeak_state::snmath_write_o) // reorder opla to led14seg, plus DP as d14 and AP as d15: // [DP],D,C,H,F,B,I,M,L,K,N,J,[AP],E,G,A (sidenote: TI KLMN = MAME MLNK) m_o = BITSWAP16(data,12,0,10,7,8,9,11,6,3,14,4,13,1,2,5,15); - - display_update(); + display_matrix_seg(16, 16, m_o, m_r, 0x3fff); } @@ -515,8 +539,9 @@ WRITE16_MEMBER(tispeak_state::snmath_write_o) WRITE16_MEMBER(tispeak_state::lantutor_write_r) { // same as default, except R13 is used for an extra digit - m_r = data; - display_update(); + m_filament_on = data & 0x8000; + m_r = data & 0x21ff; + display_matrix_seg(16, 16, m_o, m_r, 0x3fff); } @@ -708,19 +733,23 @@ void tispeak_state::machine_start() memset(m_display_state, 0, sizeof(m_display_state)); memset(m_display_cache, 0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); + memset(m_display_segmask, ~0, sizeof(m_display_segmask)); // ! m_r = 0; m_o = 0; m_power_on = 0; + m_filament_on = 0; // register for savestates save_item(NAME(m_display_state)); save_item(NAME(m_display_cache)); save_item(NAME(m_display_decay)); + save_item(NAME(m_display_segmask)); save_item(NAME(m_r)); save_item(NAME(m_o)); save_item(NAME(m_power_on)); + save_item(NAME(m_filament_on)); // init cartridge if (m_cart != NULL && m_cart->exists()) From ce5d0ca8d4dfba497797419e48acc99bc84b3933 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 15 Mar 2015 17:56:56 +0100 Subject: [PATCH 037/201] fix display not refreshing on loadstate --- src/mess/drivers/hh_hmcs40.c | 2 +- src/mess/drivers/hh_pic16.c | 2 +- src/mess/drivers/hh_tms1k.c | 2 +- src/mess/drivers/hh_ucom4.c | 2 +- src/mess/drivers/ticalc1x.c | 2 +- src/mess/drivers/tispeak.c | 24 ++++++++++++++---------- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index a1d3f0c0681..68b84e28596 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -116,7 +116,7 @@ void hh_hmcs40_state::machine_start() save_item(NAME(m_display_wait)); save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); + /* save_item(NAME(m_display_cache)); */ // don't save! save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); diff --git a/src/mess/drivers/hh_pic16.c b/src/mess/drivers/hh_pic16.c index 44043ea0ff3..bdabf44dd43 100644 --- a/src/mess/drivers/hh_pic16.c +++ b/src/mess/drivers/hh_pic16.c @@ -89,7 +89,7 @@ void hh_pic16_state::machine_start() save_item(NAME(m_display_wait)); save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); + /* save_item(NAME(m_display_cache)); */ // don't save! save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index ec4b244782f..55d3873b6ea 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -228,7 +228,7 @@ void hh_tms1k_state::machine_start() save_item(NAME(m_display_wait)); save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); + /* save_item(NAME(m_display_cache)); */ // don't save! save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 632afeb0850..61af487386e 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -131,7 +131,7 @@ void hh_ucom4_state::machine_start() save_item(NAME(m_display_wait)); save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); + /* save_item(NAME(m_display_cache)); */ // don't save! save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 3957087e0ea..152b3a76088 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -114,7 +114,7 @@ void ticalc1x_state::machine_start() save_item(NAME(m_display_wait)); save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); + /* save_item(NAME(m_display_cache)); */ // don't save! save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index a6a14886556..df40fbf214f 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -741,8 +741,12 @@ void tispeak_state::machine_start() m_filament_on = 0; // register for savestates + save_item(NAME(m_display_maxy)); + save_item(NAME(m_display_maxx)); + save_item(NAME(m_display_wait)); + save_item(NAME(m_display_state)); - save_item(NAME(m_display_cache)); + /* save_item(NAME(m_display_cache)); */ // don't save! save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); @@ -980,14 +984,14 @@ ROM_END -COMP( 1978, snspell, 0, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1978 version/prototype)", GAME_IMPERFECT_SOUND ) -COMP( 1980, snspella, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM -COMP( 1978, snspelluk, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM -COMP( 1981, snspelluka, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM -COMP( 1979, snspelljp, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (Japan)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // incomplete dump, uses prototype MCU ROM -COMP( 1980, ladictee, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "La Dictee Magique (France)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) // doesn't work due to missing CD2702 MCU dump, German/Italian version has CD2702 too +COMP( 1978, snspell, 0, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1978 version/prototype)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND ) +COMP( 1980, snspella, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) // incomplete dump, uses prototype MCU ROM +COMP( 1978, snspelluk, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) // incomplete dump, uses prototype MCU ROM +COMP( 1981, snspelluka, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) // incomplete dump, uses prototype MCU ROM +COMP( 1979, snspelljp, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "Speak & Spell (Japan)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) // incomplete dump, uses prototype MCU ROM +COMP( 1980, ladictee, snspell, 0, snspell, snspell, tispeak_state, snspell, "Texas Instruments", "La Dictee Magique (France)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) // doesn't work due to missing CD2702 MCU dump, German/Italian version has CD2702 too -COMP( 1986, snmath, 0, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1986 version)", GAME_IMPERFECT_SOUND ) -COMP( 1980, snmathp, snmath, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1980 version/prototype)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +COMP( 1986, snmath, 0, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1986 version)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND ) +COMP( 1980, snmathp, snmath, 0, snmath, snmath, driver_device, 0, "Texas Instruments", "Speak & Math (US, 1980 version/prototype)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) -COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, lantutor, "Texas Instruments", "Language Tutor (prototype)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, lantutor, "Texas Instruments", "Language Tutor (prototype)", GAME_SUPPORTS_SAVE | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) From 106cdbcbc2b84880f16901d6024928bab608e299 Mon Sep 17 00:00:00 2001 From: Luca Elia Date: Sun, 15 Mar 2015 23:16:06 +0100 Subject: [PATCH 038/201] New clones added ---------------- Mahjong Electromagnetic Base [Dyq, XingXing, Luca Elia] New games marked as GAME_NOT_WORKING --------------------------------------------------- Mahjong Ougon No Pai [Dyq, XingXing] --- src/mame/drivers/dynax.c | 398 ++++++++++++++++++++++++++++---------- src/mame/includes/dynax.h | 4 + src/mame/mame.lst | 4 +- src/mame/video/dynax.c | 34 ++++ 4 files changed, 335 insertions(+), 105 deletions(-) diff --git a/src/mame/drivers/dynax.c b/src/mame/drivers/dynax.c index d575a70bcf2..4676ba1983a 100644 --- a/src/mame/drivers/dynax.c +++ b/src/mame/drivers/dynax.c @@ -24,6 +24,7 @@ Year + Game Main Board Sub Board CPU Sound 90 Mj Campus Hunting D3312108L1-1 D23SUB1 Z80 AY8912 YM2413 M5205 RAM 90 Hana Jingi no number D3312108L1-2 Z80 AY8912 YM2413 M5205 RAM 90 7jigen no Youseitachi D3707198L1 D23SUB1 Z80 AY8912 YM2413 M5205 RAM +89 Mj Electromagnetic Base D3803248L1 Z80 AY8912 YM2413 M5205 RAM 90 Mj Electron Base Z80 AY8912 YM2413 RAM 90 Mj X-Tal/Diamond 7 D4005208L1-1 D23SUB Z80 AY8912 YM2413 M5205 RAM 90 Mj Neruton Haikujiradan D4005208L1-1 D4508308L-2 Z80 AY8912 YM2413 M5205 RAM @@ -33,6 +34,7 @@ Year + Game Main Board Sub Board CPU Sound 91 Mj Angels D5512068L1-1 D6107068L-1 Z80 AY8912 YM2413 M5205 RAM 91 Mj Comic Gekijou V.1 D5512068L1-1 D6107068L-1 Z80 AY8912 YM2413 M5205 M6242 RAM NL-001, Battery 91 Mj Tenkaigen TLCS AY8910 YM2413 M6242 RAM Protection, Battery +91 Mj Ougon No Pai D6209038L1-0 TLCS AY8910 YM2413 RAM Undumped TMP91P640 Code, Battery 92 Quiz TV Gassyuukoku D5512068L1-2 D6410288L-1 Z80 AY8912 YM2413 M5205 RAM 92 Hanafuda Hana Tengoku D6502208L1 D6107068L-1 Z80 AY8910 YM2413 M6242 RAM 94 Mj Reach (bootleg) bootleg TLCS AY8910 YM2413 M6242 PROM Battery @@ -555,7 +557,7 @@ static ADDRESS_MAP_START( hnoridur_io_map, AS_IO, 8, dynax_state ) AM_RANGE( 0x30, 0x30 ) AM_WRITE(adpcm_reset_w) // MSM5205 reset AM_RANGE( 0x32, 0x32 ) AM_WRITE(adpcm_data_w) // MSM5205 data AM_RANGE( 0x34, 0x35 ) AM_DEVWRITE("ym2413", ym2413_device, write) // - AM_RANGE( 0x36, 0x36 ) AM_DEVREAD("aysnd", ay8910_device, data_r) // AY8910, DSW1 + AM_RANGE( 0x36, 0x36 ) AM_DEVREAD("aysnd", ay8910_device, data_r) // AY8910, DSW0 AM_RANGE( 0x38, 0x38 ) AM_DEVWRITE("aysnd", ay8910_device, data_w) // AY8910 AM_RANGE( 0x3a, 0x3a ) AM_DEVWRITE("aysnd", ay8910_device, address_w) // AM_RANGE( 0x40, 0x40 ) AM_WRITE(dynax_blit_pen_w) // Destination Pen @@ -640,7 +642,7 @@ static ADDRESS_MAP_START( hjingi_io_map, AS_IO, 8, dynax_state ) AM_RANGE( 0x32, 0x32 ) AM_WRITE(adpcm_data_w) // MSM5205 data AM_RANGE( 0x34, 0x35 ) AM_DEVWRITE("ym2413", ym2413_device, write) // - AM_RANGE( 0x36, 0x36 ) AM_DEVREAD("aysnd", ay8910_device, data_r) // AY8910, DSW1 + AM_RANGE( 0x36, 0x36 ) AM_DEVREAD("aysnd", ay8910_device, data_r) // AY8910, DSW0 AM_RANGE( 0x38, 0x38 ) AM_DEVWRITE("aysnd", ay8910_device, data_w) // AY8910 AM_RANGE( 0x3a, 0x3a ) AM_DEVWRITE("aysnd", ay8910_device, address_w) // @@ -1044,7 +1046,7 @@ READ8_MEMBER(dynax_state::mjelctrn_keyboard_1_r) READ8_MEMBER(dynax_state::mjelctrn_dsw_r) { int dsw = (m_keyb & 0xc0) >> 6; - static const char *const dswnames[] = { "DSW0", "DSW1", "DSW3", "DSW4" }; + static const char *const dswnames[] = { "DSW0", "DSW1", "DSW2", "DSW3" }; return ioport(dswnames[dsw])->read(); } @@ -1092,6 +1094,39 @@ static ADDRESS_MAP_START( mjelctrn_io_map, AS_IO, 8, dynax_state ) AM_RANGE( 0xe7, 0xe7 ) AM_WRITE(hnoridur_palbank_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( mjembase_io_map, AS_IO, 8, dynax_state ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE( 0x04, 0x05 ) AM_DEVWRITE("ym2413", ym2413_device, write) // + AM_RANGE( 0x06, 0x06 ) AM_DEVREAD("aysnd", ay8910_device, data_r) // AY8910, dsw0 + AM_RANGE( 0x08, 0x08 ) AM_DEVWRITE("aysnd", ay8910_device, data_w) // + AM_RANGE( 0x0a, 0x0a ) AM_DEVWRITE("aysnd", ay8910_device, address_w) // + AM_RANGE( 0x11, 0x12 ) AM_WRITE(mjelctrn_blitter_ack_w) //? + AM_RANGE( 0x1c, 0x1c ) AM_READ_PORT("DSW1") + AM_RANGE( 0x1e, 0x1e ) AM_READ_PORT("DSW2") + AM_RANGE( 0x20, 0x20 ) AM_WRITE(hanamai_keyboard_w) // keyboard row select + AM_RANGE( 0x21, 0x21 ) AM_READ_PORT("COINS") // Coins + AM_RANGE( 0x22, 0x22 ) AM_READ(mjelctrn_keyboard_1_r) // P2 + AM_RANGE( 0x23, 0x23 ) AM_READ(hanamai_keyboard_0_r) // P1 + AM_RANGE( 0x24, 0x24 ) AM_READ_PORT("DSW3") +// AM_RANGE( 0x40, 0x40 ) AM_WRITENOP // CRT Controller +// AM_RANGE( 0x41, 0x41 ) AM_WRITENOP // CRT Controller + AM_RANGE( 0x61, 0x67 ) AM_WRITE(dynax_blitter_rev2_w) // Blitter + AM_RANGE( 0x80, 0x80 ) AM_WRITE(dynax_flipscreen_w) // Flip Screen + AM_RANGE( 0x81, 0x81 ) AM_WRITE(hanamai_layer_half_w) // half of the interleaved layer to write to + AM_RANGE( 0x82, 0x82 ) AM_WRITE(hnoridur_layer_half2_w) // + AM_RANGE( 0x83, 0x83 ) AM_WRITE(dynax_coincounter_0_w) // Coin Counters + AM_RANGE( 0x84, 0x84 ) AM_WRITE(dynax_coincounter_1_w) // + AM_RANGE( 0xa0, 0xa0 ) AM_WRITE(hnoridur_rombank_w) // BANK ROM Select + AM_RANGE( 0xc0, 0xc0 ) AM_WRITE(dynax_blit_pen_w) // Destination Pen + AM_RANGE( 0xc1, 0xc1 ) AM_WRITE(mjembase_blit_dest_w) // Destination Layer + AM_RANGE( 0xc2, 0xc2 ) AM_WRITE(dynax_blit_palette01_w) // Layers Palettes + AM_RANGE( 0xc3, 0xc3 ) AM_WRITE(mjembase_blit_palette23_w) // + AM_RANGE( 0xc4, 0xc4 ) AM_WRITE(mjembase_priority_w) // layer priority and enable + AM_RANGE( 0xc5, 0xc5 ) AM_WRITE(dynax_blit_backpen_w) // Background Color + AM_RANGE( 0xc6, 0xc6 ) AM_WRITE(yarunara_blit_romregion_w) // Blitter ROM bank + AM_RANGE( 0xc7, 0xc7 ) AM_WRITE(hnoridur_palbank_w) +ADDRESS_MAP_END + /*************************************************************************** Mahjong Tenkaigen @@ -3026,9 +3061,9 @@ static INPUT_PORTS_START( jantouki ) PORT_DIPSETTING( 0x02, "11:00" ) PORT_DIPSETTING( 0x01, "11:30" ) PORT_DIPSETTING( 0x00, "12:00" ) - PORT_DIPNAME( 0x08, 0x08, "Moles On Gal's Face" ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "Nudity" ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x08, DEF_STR( No ) ) // Moles On Gal's Face PORT_DIPNAME( 0x10, 0x10, "Buy Screen Bonus Points" ) /* Sets your points to 100 every time you arrive at the screen for buying special items. */ PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -3097,6 +3132,131 @@ static INPUT_PORTS_START( jantouki ) INPUT_PORTS_END +static INPUT_PORTS_START( mjembase ) + PORT_START("DSW2") /* DIP1, 7c20 (port $1e) */ + PORT_DIPNAME( 0x0f, 0x07, "Pay Out Rate" ) + PORT_DIPSETTING( 0x00, "50" ) + PORT_DIPSETTING( 0x01, "53" ) + PORT_DIPSETTING( 0x02, "56" ) + PORT_DIPSETTING( 0x03, "59" ) + PORT_DIPSETTING( 0x04, "62" ) + PORT_DIPSETTING( 0x05, "65" ) + PORT_DIPSETTING( 0x06, "68" ) + PORT_DIPSETTING( 0x07, "71" ) + PORT_DIPSETTING( 0x08, "75" ) + PORT_DIPSETTING( 0x09, "78" ) + PORT_DIPSETTING( 0x0a, "81" ) + PORT_DIPSETTING( 0x0b, "84" ) + PORT_DIPSETTING( 0x0c, "87" ) + PORT_DIPSETTING( 0x0d, "90" ) + PORT_DIPSETTING( 0x0e, "93" ) + PORT_DIPSETTING( 0x0f, "96" ) + PORT_DIPNAME( 0x30, 0x30, "Max Bet" ) + PORT_DIPSETTING( 0x30, "1" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPSETTING( 0x10, "10" ) + PORT_DIPSETTING( 0x00, "20" ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW1") /* DIP2, 7c21 (port $1c) */ + PORT_DIPNAME( 0x03, 0x03, "Difficulty?" ) + PORT_DIPSETTING( 0x03, "0" ) // 20 + PORT_DIPSETTING( 0x00, "1" ) // 32 + PORT_DIPSETTING( 0x01, "2" ) // 64 + PORT_DIPSETTING( 0x02, "3" ) // c8 + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" ) + PORT_DIPNAME( 0x30, 0x30, "Min Pay?" ) + PORT_DIPSETTING( 0x30, "1" ) + PORT_DIPSETTING( 0x20, "2" ) + PORT_DIPSETTING( 0x10, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x40, 0x40, "Allow Coin Out" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Win A Prize?" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW0") /* DIP3, 7c22 (port $06, AY) */ /* note that these are in reverse order wrt the others */ + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "DonDen Key" ) + PORT_DIPSETTING( 0x02, "A" ) + PORT_DIPSETTING( 0x00, "Flip Flop" ) + PORT_DIPNAME( 0x04, 0x04, "Draw New Tile" ) + PORT_DIPSETTING( 0x00, "Automatic" ) + PORT_DIPSETTING( 0x04, "Manual" ) + PORT_DIPNAME( 0x08, 0x08, "Win Rate?" ) + PORT_DIPSETTING( 0x08, DEF_STR( High ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Low ) ) + PORT_DIPNAME( 0x10, 0x10, "YAKU times" ) + PORT_DIPSETTING( 0x10, "1" ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPNAME( 0xe0, 0xe0, "YAKUMAN Bonus" ) + PORT_DIPSETTING( 0xe0, "Cut" ) + PORT_DIPSETTING( 0x60, "1 T" ) + PORT_DIPSETTING( 0xa0, "300" ) + PORT_DIPSETTING( 0x20, "500" ) + PORT_DIPSETTING( 0xc0, "700" ) + PORT_DIPSETTING( 0x40, "1000" ) +// PORT_DIPSETTING( 0x80, "1000" ) +// PORT_DIPSETTING( 0x00, "1000" ) + + PORT_START("DSW3") /* DIP4, 7c23 (port $24) */ + PORT_DIPNAME( 0x01, 0x01, "Last Chance" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Pay Rate?" ) + PORT_DIPSETTING( 0x02, DEF_STR( High ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Low ) ) + PORT_DIPNAME( 0x04, 0x04, "Choose Bonus" ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "In-Game Bet?" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "In-Game Music" ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "Select Girl" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "Nudity" ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x80, DEF_STR( No ) ) // Moles On Gal's Face + + PORT_START("FAKE") /* IN10 - Fake DSW */ + PORT_DIPNAME( 0xff, 0xff, "Allow Bets" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0xff, DEF_STR( On ) ) + + PORT_START("COINS") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_CODE(KEYCODE_4) // Pay + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // 18B + PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) // Test + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 ) // Analyzer + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE3 ) // Memory Reset + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) // Note + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) // Coin + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) // Service + + PORT_INCLUDE( MAHJONG_KEYS_BET ) +INPUT_PORTS_END + + static INPUT_PORTS_START( mjelct3 ) PORT_START("DSW0") /* 7c21 (select = 00) */ PORT_DIPNAME( 0x03, 0x03, "Difficulty?" ) @@ -3163,7 +3323,7 @@ static INPUT_PORTS_START( mjelct3 ) PORT_INCLUDE( MAHJONG_KEYS_BET ) - PORT_START("DSW3") /* 7c22 (select = 80) */ + PORT_START("DSW2") /* 7c22 (select = 80) */ PORT_DIPNAME( 0x07, 0x07, "YAKUMAN Bonus" ) PORT_DIPSETTING( 0x07, "Cut" ) PORT_DIPSETTING( 0x06, "1 T" ) @@ -3189,7 +3349,7 @@ static INPUT_PORTS_START( mjelct3 ) PORT_DIPSETTING( 0x80, "None (Part 2)" ) PORT_DIPSETTING( 0x00, "Super Express (Part 3)" ) - PORT_START("DSW4") /* 7c23 (select = c0) */ + PORT_START("DSW3") /* 7c23 (select = c0) */ PORT_DIPNAME( 0x01, 0x01, "Last Chance" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) @@ -3211,9 +3371,9 @@ static INPUT_PORTS_START( mjelct3 ) PORT_DIPNAME( 0x40, 0x40, "Select Girl" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Moles On Gal's Face" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "Nudity" ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x80, DEF_STR( No ) ) // Moles On Gal's Face PORT_START("FAKE") /* IN10 - Fake DSW */ PORT_DIPNAME( 0xff, 0xff, "Allow Bets" ) @@ -3288,7 +3448,7 @@ static INPUT_PORTS_START( mjelctrn ) PORT_INCLUDE( MAHJONG_KEYS_BET ) - PORT_START("DSW3") /* 7c22 (select = 80) */ + PORT_START("DSW2") /* 7c22 (select = 80) */ PORT_DIPNAME( 0x07, 0x07, "YAKUMAN Bonus" ) PORT_DIPSETTING( 0x07, "Cut" ) PORT_DIPSETTING( 0x06, "1 T" ) @@ -3314,7 +3474,7 @@ static INPUT_PORTS_START( mjelctrn ) PORT_DIPSETTING( 0x80, "None (Part 2)" ) PORT_DIPSETTING( 0x00, "???? (Part 4)" ) - PORT_START("DSW4") // 7c23 (select = c0) + PORT_START("DSW3") // 7c23 (select = c0) PORT_DIPNAME( 0x01, 0x01, "Last Chance" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) @@ -3413,7 +3573,7 @@ static INPUT_PORTS_START( majxtal7 ) PORT_INCLUDE( MAHJONG_KEYS_BET ) - PORT_START("DSW3") /* select = 80 */ + PORT_START("DSW2") /* select = 80 */ PORT_DIPNAME( 0x07, 0x07, "YAKUMAN Bonus" ) PORT_DIPSETTING( 0x07, "Cut" ) PORT_DIPSETTING( 0x06, "1 T" ) @@ -3439,7 +3599,7 @@ static INPUT_PORTS_START( majxtal7 ) PORT_DIPSETTING( 0x80, "X-Tal" ) PORT_DIPSETTING( 0x00, "Diamond" ) - PORT_START("DSW4") /* select = c0 */ + PORT_START("DSW3") /* select = c0 */ PORT_DIPNAME( 0x01, 0x01, "Last Chance" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) @@ -3533,9 +3693,9 @@ static INPUT_PORTS_START( neruton ) PORT_INCLUDE( MAHJONG_KEYS ) - /* 2008-06 FP: the following are needed to make happy the read handlers shared with mjelctrn*/ + /* 2008-06 FP: the following are needed to make happy the read handlers shared with mjelctrn */ + PORT_START("DSW2") PORT_START("DSW3") - PORT_START("DSW4") PORT_START("FAKE") INPUT_PORTS_END @@ -4482,6 +4642,14 @@ static MACHINE_CONFIG_DERIVED( mjelctrn, hnoridur ) MCFG_VIDEO_START_OVERRIDE(dynax_state,mjelctrn) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( mjembase, hnoridur ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(nanajign_mem_map) + MCFG_CPU_IO_MAP(mjembase_io_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, mjelctrn_vblank_interrupt) /* IM 2 needs a vector on the data bus */ + + MCFG_VIDEO_START_OVERRIDE(dynax_state,mjembase) +MACHINE_CONFIG_END /*************************************************************************** Neruton @@ -5821,6 +5989,37 @@ ROM_START( mjelctrb ) ROM_LOAD( "eb-02.rom", 0x00000, 0x80000, CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) ) ROM_END +/*************************************************************************** + +Mahjong Electromagnetic Base +DYNAX D3803248L1 + +AY-3-8912?, MSM5205? +HD46505SP?, Dynax blitter? (rest of the chips are scratched) +4 x DSW8, 28-way connector + +***************************************************************************/ + +ROM_START( mjembase ) + ROM_REGION( 0x30000, "maincpu", 0 ) + ROM_LOAD( "dynax_3815.20a", 0x00000, 0x20000, CRC(35b35b48) SHA1(9966804337a7c6de160a09087e1fea3b0a515fe4) ) + ROM_RELOAD( 0x10000, 0x20000 ) + + ROM_REGION( 0x100000, "gfx1", 0 ) // blitter data + ROM_LOAD( "dynax_3803.7c", 0x000000, 0x20000, CRC(5480c4f8) SHA1(8f533683eb08281f50247c17e7ccfcfd2d8f1937) ) + ROM_LOAD( "dynax_3802.6c", 0x020000, 0x20000, CRC(ba27976a) SHA1(cb9ce82054b7568507807a891ada3d39adf094d2) ) + ROM_LOAD( "dynax_3801.5c", 0x040000, 0x20000, CRC(84a013ac) SHA1(3d5c196f7474bb13d9b724befec3de7f247953e3) ) + ROM_LOAD( "dynax_3804.1a", 0x060000, 0x20000, CRC(8c055525) SHA1(8e31bef48a8b89e79ecb8b71855bc20036667561) ) + ROM_LOAD( "dynax_3805.3a", 0x080000, 0x20000, CRC(a27b2063) SHA1(9da26086832f047c65ad88147e65d1f65e9b7677) ) + ROM_LOAD( "dynax_3806.5a", 0x0a0000, 0x20000, CRC(42486764) SHA1(217ea04fad8853b03522474a70a322642a5301a5) ) + ROM_LOAD( "dynax_3807.6a", 0x0c0000, 0x20000, CRC(c29abf8f) SHA1(79e05fc0decd450622189ce1c8681c4442c566b0) ) + ROM_LOAD( "dynax_3808.7a", 0x0e0000, 0x20000, CRC(72efcd62) SHA1(9b84043fc9b2dcaf97a58aba0ba4ce27ee64381c) ) + + ROM_REGION( 0x040000, "gfx2", 0 ) // blitter data + ROM_LOAD( "dynax_3809.9a", 0x000000, 0x20000, CRC(7c239069) SHA1(71c8b437a555ab48ce600ff283d50e0a21e9f8eb) ) + ROM_LOAD( "dynax_381a.10a", 0x020000, 0x20000, CRC(72c092c7) SHA1(3a4f1cd56c9544dcd4689e385c98407c45ac894c) ) +ROM_END + /* @@ -6340,7 +6539,7 @@ ROM_START( tenkai ) // It appears that the first half of lzc-01.u6 in tenkaibb (as well as the same data in other bootleg versions) // does not exist _anywhere_ in this rom dump, and in this way some girls won't show correctly (such as the 3rd one) ROM_REGION( 0x100000, "gfx1", 0 ) // blitter data - ROM_LOAD( "tydg002.u8", 0x000000, 0x80000, BAD_DUMP CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // not dumped, rom taken from tenkaid + ROM_LOAD( "tydg002.u8", 0x000000, 0x80000, BAD_DUMP CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // not dumped, rom taken from ougonpaib ROM_LOAD( "taicom01.15b", 0x080000, 0x80000, BAD_DUMP CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // either this was dumped half size, or the above rom was missing from the pcb ROM_REGION( 0x100000, "gfx2", 0 ) // blitter data @@ -6533,7 +6732,7 @@ ROM_START( tenkaicb ) // it doesn't need the internal rom from tenkai ROM_REGION( 0x100000, "gfx1", 0 ) // blitter data - ROM_LOAD( "tydg002.u8", 0x00000, 0x80000, BAD_DUMP CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // not dumped, rom taken from tenkaid + ROM_LOAD( "tydg002.u8", 0x00000, 0x80000, BAD_DUMP CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // not dumped, rom taken from ougonpaib ROM_LOAD( "rom.u12", 0x80000, 0x80000, BAD_DUMP CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // either this was dumped half size, or the above rom was missing from the pcb ROM_REGION( 0x100000, "gfx2", 0 ) // blitter data @@ -6543,90 +6742,6 @@ ROM_END /*************************************************************************** -Mahjong Tenkaigen (? PCB is not working) - -PCB Layout ----------- - -|-------------------------------------------| -| 4558 3.579545MHz BATTERY | -|uPC1241H VOL K-663A DSW DSW 6264 | -| DSW DSW TYDG001 | -| DSW NL-002 YM2149 PAL | -|1 | -|8 6116 TMP91C640| -|W | -|A TYDG004 TYDG002 | -|Y PAL | -| | -| | -| TYDG005 TYDG003 | -| PAL | -| PAL | -|1 PAL | -|0 | -|W 81461 81461 TK-101 | -|A 81461 81461 | -|Y 81461 81461 21.245MHz | -|-------------------------------------------| - -romcmp tenkaid tenkaibb: - -tydg002.u8 lzc-01.u6 [1/2] IDENTICAL -tydg005.u19 lzc-01.u6 [2/2] IDENTICAL - -tydg001.u11 [1/4] tdh-12m.u11 [odd 2/2] 6.478882% -tydg001.u11 [2/4] lzc-03.u15 [odd] 31.292725% -tydg001.u11 [3/4] tdh-12m.u11 [even 2/2] 55.366516% -tydg001.u11 [4/4] lzc-03.u15 [even] 59.931946% - -tydg003.u6 [1/2] lzc-02.u19 [3/4] 2.625275% -tydg003.u6 [2/2] lzc-02.u19 [2/4] 1.834488% - -tydg004.u21 [1/2] lzc-02.u19 [1/4] 3.769302% -tydg004.u21 [2/2] lzc-02.u19 [4/4] 14.524460% - -romcmp tenkaid tenkai: - -tydg005.u19 taicom01.15b IDENTICAL - -tydg001.u11 [1/4] taicom00.2c [1/4] 26.155090% -tydg001.u11 [2/4] taicom00.2c [3/4] 22.038269% -tydg001.u11 [3/4] taicom00.2c [2/4] 4.237366% -tydg001.u11 [4/4] taicom00.2c [4/4] 59.855652% - -tydg002.u8 [4/4] taicom03.13b [2/4] 4.472351% - -tydg003.u6 [1/4] taicom02.11b [3/4] 2.860260% -tydg003.u6 [2/4] taicom03.13b [3/4] 6.129456% -tydg003.u6 [3/4] taicom02.11b [2/4] 2.205658% - -tydg004.u21 [1/4] taicom02.11b [1/4] 5.610657% -tydg004.u21 [2/4] taicom03.13b [1/4] 1.743317% -tydg004.u21 [3/4] taicom02.11b [4/4] 2.343750% -tydg004.u21 [4/4] taicom03.13b [4/4] 24.230194% - -***************************************************************************/ - -ROM_START( tenkaid ) - ROM_REGION( 0x90000, "maincpu", 0 ) - ROM_LOAD( "tydg001.u11", 0x00000, 0x40000, CRC(4ffa543c) SHA1(ab6ec7bd735358643f5186c6c983fa8b599fe84b) ) - ROM_RELOAD( 0x10000, 0x40000 ) - ROM_RELOAD( 0x50000, 0x40000 ) - // tenkai internal rom is incompatible with the code of this set - ROM_LOAD( "tenkaid_tmp91p640n-10.5b", 0x00000, 0x04000, NO_DUMP ) - - ROM_REGION( 0x100000, "gfx1", 0 ) // blitter data - ROM_LOAD( "tydg002.u8", 0x00000, 0x80000, CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) - ROM_LOAD( "tydg003.u6", 0x80000, 0x80000, CRC(60717d91) SHA1(85dbb510d33b36d2255b740ccc4917216dd21497) ) - - ROM_REGION( 0x100000, "gfx2", 0 ) // blitter data - ROM_LOAD( "tydg004.u21", 0x00000, 0x80000, CRC(b7d49d04) SHA1(756c35bbe207b5bfc6e05d6da99a7ad5a3453506) ) - ROM_LOAD( "tydg005.u19", 0x80000, 0x80000, CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) -ROM_END - -/*************************************************************************** - tenkaigen set 2 romcmp tenkaie tenkai: @@ -6653,6 +6768,79 @@ ROM_START( tenkaie ) ROM_LOAD( "lzc-02.rom", 0x000000, 0x100000, CRC(90a19443) SHA1(8f593c00e39dd5acc76b058591019d117967a17b) ) ROM_END +/*************************************************************************** + +Mahjong Ougon No Pai +DYNAX D6209038L1-0 + +AY-3-8910A, rest of the chips are scratched +2 x DSW10, 2 x DSW8, 1 x DSW4, Battery + +***************************************************************************/ + +ROM_START( ougonpai ) + ROM_REGION( 0x90000, "maincpu", 0 ) + ROM_LOAD( "dynax_6201b.2c", 0x00000, 0x40000, CRC(18ef8eda) SHA1(48a3e4566b0a86db907602fd235c01d96eddec23) ) + ROM_RELOAD( 0x10000, 0x40000 ) + ROM_RELOAD( 0x50000, 0x40000 ) + ROM_LOAD( "ougonpai_tmp91p640n-10.5b", 0x00000, 0x04000, NO_DUMP ) + + ROM_REGION( 0x100000, "gfx1", 0 ) // blitter data + ROM_LOAD( "dynax_6202.11b", 0x00000, 0x80000, CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // = tydg002.u8 (ougonpaib) + ROM_LOAD( "dynax_6203.13b", 0x80000, 0x80000, CRC(60717d91) SHA1(85dbb510d33b36d2255b740ccc4917216dd21497) ) // = tydg003.u6 (ougonpaib) + + ROM_REGION( 0x100000, "gfx2", 0 ) // blitter data + ROM_LOAD( "dynax_6204.14b", 0x00000, 0x80000, CRC(4142f94b) SHA1(9982f12333973b307c210e39310eafc88b8620e1) ) // ~= tydg004.u21 (ougonpaib) + ROM_LOAD( "dynax_6205.15b", 0x80000, 0x80000, CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // = tydg005.u19 (ougonpaib) +ROM_END + +/*************************************************************************** + +Mahjong Ougon No Pai (bootleg, PCB is not working) + +PCB Layout +---------- + +|-------------------------------------------| +| 4558 3.579545MHz BATTERY | +|uPC1241H VOL K-663A DSW DSW 6264 | +| DSW DSW TYDG001 | +| DSW NL-002 YM2149 PAL | +|1 | +|8 6116 TMP91C640| +|W | +|A TYDG004 TYDG002 | +|Y PAL | +| | +| | +| TYDG005 TYDG003 | +| PAL | +| PAL | +|1 PAL | +|0 | +|W 81461 81461 TK-101 | +|A 81461 81461 | +|Y 81461 81461 21.245MHz | +|-------------------------------------------| + +***************************************************************************/ + +ROM_START( ougonpaib ) + ROM_REGION( 0x90000, "maincpu", 0 ) + ROM_LOAD( "tydg001.u11", 0x00000, 0x40000, CRC(4ffa543c) SHA1(ab6ec7bd735358643f5186c6c983fa8b599fe84b) ) + ROM_RELOAD( 0x10000, 0x40000 ) + ROM_RELOAD( 0x50000, 0x40000 ) + // tenkai internal rom is incompatible with the code of this set + ROM_LOAD( "ougonpaib_tmp91p640n-10.5b", 0x00000, 0x04000, NO_DUMP ) + + ROM_REGION( 0x100000, "gfx1", 0 ) // blitter data + ROM_LOAD( "tydg002.u8", 0x00000, 0x80000, CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // = lzc-01.u6 [1/2] + ROM_LOAD( "tydg003.u6", 0x80000, 0x80000, CRC(60717d91) SHA1(85dbb510d33b36d2255b740ccc4917216dd21497) ) + + ROM_REGION( 0x100000, "gfx2", 0 ) // blitter data + ROM_LOAD( "tydg004.u21", 0x00000, 0x80000, CRC(b7d49d04) SHA1(756c35bbe207b5bfc6e05d6da99a7ad5a3453506) ) + ROM_LOAD( "tydg005.u19", 0x80000, 0x80000, CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // = taicom01.15b = lzc-01.u6 [2/2] +ROM_END /*************************************************************************** @@ -6913,6 +7101,7 @@ GAME( 1991, yarunara, 0, yarunara, yarunara, driver_device, 0, ROT GAME( 1991, mjangels, 0, yarunara, yarunara, driver_device, 0, ROT180, "Dynax", "Mahjong Angels - Comic Theater Vol.2 (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1992, quiztvqq, 0, quiztvqq, quiztvqq, driver_device, 0, ROT180, "Dynax", "Quiz TV Gassyuukoku Q&Q (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1993, mjelctrn, 0, mjelctrn, mjelctrn, dynax_state, mjelct3, ROT180, "Dynax", "Mahjong Electron Base (parts 2 & 4, Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1989, mjembase, mjelctrn, mjembase, mjembase, dynax_state, mjelct3, ROT180, "Dynax", "Mahjong Electromagnetic Base", GAME_SUPPORTS_SAVE ) GAME( 1990, mjelct3, mjelctrn, mjelctrn, mjelct3, dynax_state, mjelct3, ROT180, "Dynax", "Mahjong Electron Base (parts 2 & 3, Japan)", GAME_SUPPORTS_SAVE ) GAME( 1990, mjelct3a, mjelctrn, mjelctrn, mjelct3, dynax_state, mjelct3a, ROT180, "Dynax", "Mahjong Electron Base (parts 2 & 3, alt., Japan)", GAME_SUPPORTS_SAVE ) GAME( 1993, mjelctrb, mjelctrn, mjelctrn, mjelct3, dynax_state, mjelct3, ROT180, "bootleg", "Mahjong Electron Base (parts 2 & 4, Japan, bootleg)", GAME_SUPPORTS_SAVE ) @@ -6925,8 +7114,9 @@ GAME( 1991, tenkai, 0, tenkai, tenkai, driver_device, 0, ROT GAME( 1991, tenkai2b, tenkai, tenkai, tenkai, driver_device, 0, ROT0, "bootleg", "Mahjong Tenkaigen Part 2 (bootleg)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1991, tenkaibb, tenkai, tenkai, tenkai, driver_device, 0, ROT0, "bootleg", "Mahjong Tenkaigen (bootleg b)", GAME_SUPPORTS_SAVE ) GAME( 1991, tenkaicb, tenkai, tenkai, tenkai, driver_device, 0, ROT0, "bootleg", "Mahjong Tenkaigen (bootleg c)", GAME_SUPPORTS_SAVE ) -GAME( 1991, tenkaid, tenkai, tenkai, tenkai, driver_device, 0, ROT0, "Dynax", "Mahjong Tenkaigen (set 1)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1991, tenkaie, tenkai, tenkai, tenkai, driver_device, 0, ROT0, "Dynax", "Mahjong Tenkaigen (set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1991, ougonpai, 0, tenkai, tenkai, driver_device, 0, ROT0, "Dynax", "Mahjong Ougon No Pai", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) +GAME( 1991, ougonpaib,ougonpai, tenkai, tenkai, driver_device, 0, ROT0, "bootleg", "Mahjong Ougon No Pai (bootleg)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1994, mjreach, 0, tenkai, mjreach, dynax_state, mjreach, ROT0, "bootleg / Dynax", "Mahjong Reach (bootleg)", GAME_SUPPORTS_SAVE ) GAME( 1995, shpeng, 0, sprtmtch, drgpunch, driver_device, 0, ROT0, "WSAC Systems?", "Sea Hunter Penguin", GAME_NO_COCKTAIL | GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) // not a dynax board. proms? GAME( 1996, majrjhdx, 0, majrjhdx, tenkai, driver_device, 0, ROT0, "Dynax", "Mahjong Raijinhai DX", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/dynax.h b/src/mame/includes/dynax.h index 960eb2e559b..45b87468847 100644 --- a/src/mame/includes/dynax.h +++ b/src/mame/includes/dynax.h @@ -186,12 +186,14 @@ public: DECLARE_WRITE8_MEMBER(dynax_blit_dest_w); DECLARE_WRITE8_MEMBER(dynax_blit2_dest_w); DECLARE_WRITE8_MEMBER(tenkai_blit_dest_w); + DECLARE_WRITE8_MEMBER(mjembase_blit_dest_w); DECLARE_WRITE8_MEMBER(dynax_blit_backpen_w); DECLARE_WRITE8_MEMBER(dynax_blit_palette01_w); DECLARE_WRITE8_MEMBER(tenkai_blit_palette01_w); DECLARE_WRITE8_MEMBER(dynax_blit_palette45_w); DECLARE_WRITE8_MEMBER(dynax_blit_palette23_w); DECLARE_WRITE8_MEMBER(tenkai_blit_palette23_w); + DECLARE_WRITE8_MEMBER(mjembase_blit_palette23_w); DECLARE_WRITE8_MEMBER(dynax_blit_palette67_w); DECLARE_WRITE8_MEMBER(dynax_blit_palbank_w); DECLARE_WRITE8_MEMBER(dynax_blit2_palbank_w); @@ -213,6 +215,7 @@ public: DECLARE_WRITE8_MEMBER(jantouki_blitter2_rev2_w); DECLARE_WRITE8_MEMBER(hanamai_priority_w); DECLARE_WRITE8_MEMBER(tenkai_priority_w); + DECLARE_WRITE8_MEMBER(mjembase_priority_w); DECLARE_DRIVER_INIT(mjelct3); DECLARE_DRIVER_INIT(blktouch); @@ -264,6 +267,7 @@ public: DECLARE_MACHINE_START(jantouki); DECLARE_VIDEO_START(jantouki); DECLARE_VIDEO_START(mjelctrn); + DECLARE_VIDEO_START(mjembase); DECLARE_VIDEO_START(mjdialq2); DECLARE_VIDEO_START(mcnpshnt); DECLARE_PALETTE_INIT(janyuki); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index e5216e1b67f..ffff6c5ac71 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -9603,6 +9603,7 @@ inca // (c) 199? ???? blktouch // (c) Yang Gi Co Ltd. mcnpshnt // "33" Mahjong Campus Hunting 1990 Dynax 7jigen // "37" 7jigen no Youseitachi 1990 Dynax +mjembase // "38" Mahjong Electromagnetic Base 1989 Dynax neruton // "45" Mahjong Neruton Haikujiradan 1990 Dynax nerutona // "45" Mahjong Neruton Haikujiradan 1990 Dynax mjcomv1 // 1991 Dynax @@ -9611,8 +9612,9 @@ tenkai // 1991 Dynax tenkai2b // 1991 Dynax tenkaibb // 1991 Dynax tenkaicb // 1991 Dynax -tenkaid // 1991 Dynax tenkaie // 1991 Dynax +ougonpai // 1991 Dynax +ougonpaib // bootleg htengoku // 1992 Dynax mjreach // 1994 Dynax mjdialq2 // "52" (c) 1991 Dynax diff --git a/src/mame/video/dynax.c b/src/mame/video/dynax.c index 38551f43def..7f3f8d3d0b4 100644 --- a/src/mame/video/dynax.c +++ b/src/mame/video/dynax.c @@ -121,6 +121,15 @@ WRITE8_MEMBER(dynax_state::tenkai_blit_dest_w) dynax_blit_dest_w(space, 0, BITSWAP8(data, 7, 6, 5, 4, 0, 1, 2, 3)); } +/* +mjelctrn: 7 d e -> 1 - 4 8 +mjembase: b d e -> - 2 4 8 +*/ +WRITE8_MEMBER(dynax_state::mjembase_blit_dest_w) +{ + dynax_blit_dest_w(space, 0, BITSWAP8(data, 7, 6, 5, 4, 2, 3, 1, 0)); +} + /* Background Color */ WRITE8_MEMBER(dynax_state::dynax_blit_backpen_w) @@ -174,6 +183,11 @@ WRITE8_MEMBER(dynax_state::tenkai_blit_palette23_w) LOG(("P23=%02X ", data)); } +WRITE8_MEMBER(dynax_state::mjembase_blit_palette23_w) +{ + dynax_blit_palette23_w(space, offset, BITSWAP8(data, 3, 2, 1, 0, 7, 6, 5, 4), mem_mask); +} + /* Layer 6&7 Palettes (Low Bits) */ WRITE8_MEMBER(dynax_state::dynax_blit_palette67_w) @@ -729,6 +743,7 @@ WRITE8_MEMBER(dynax_state::jantouki_blitter2_rev2_w) static const int priority_hnoridur[8] = { 0x0231, 0x2103, 0x3102, 0x2031, 0x3021, 0x1302, 0x2310, 0x1023 }; static const int priority_mcnpshnt[8] = { 0x3210, 0x2103, 0x3102, 0x2031, 0x3021, 0x1302, 0x2310, 0x1023 }; static const int priority_mjelctrn[8] = { 0x0231, 0x0321, 0x2031, 0x2301, 0x3021, 0x3201 ,0x0000, 0x0000 }; // this game doesn't use (hasn't?) layer 1 +static const int priority_mjembase[8] = { 0x0231, 0x2031, 0x0321, 0x3021, 0x2301, 0x3201 ,0x0000, 0x0000 }; // this game doesn't use (hasn't?) layer 1 void dynax_state::dynax_common_reset() @@ -940,6 +955,14 @@ VIDEO_START_MEMBER(dynax_state,mjelctrn) m_update_irq_func = &dynax_state::mjelctrn_update_irq; } +VIDEO_START_MEMBER(dynax_state,mjembase) +{ + VIDEO_START_CALL_MEMBER(hnoridur); + + m_priority_table = priority_mjembase; + m_update_irq_func = &dynax_state::mjelctrn_update_irq; +} + VIDEO_START_MEMBER(dynax_state,neruton) { VIDEO_START_CALL_MEMBER(hnoridur); @@ -1152,6 +1175,17 @@ WRITE8_MEMBER(dynax_state::tenkai_priority_w) m_hanamai_priority = BITSWAP8(data, 3, 2, 1, 0, 4, 7, 5, 6); } +/* +mjembase: priority: 00 08 10 18 20 28; enable: 1,2,4 +Convert to: +mjelctrn: priority: 00 20 10 40 30 50; enable: 1,2,8 +*/ +WRITE8_MEMBER(dynax_state::mjembase_priority_w) +{ + m_hanamai_priority = BITSWAP8(data, 6, 5, 4, 3, 2, 7, 1, 0); +} + + int dynax_state::debug_mask() { #ifdef MAME_DEBUG From f4b3468a990e237951d3d6fd2833c83cf50f4b93 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Mar 2015 00:10:06 +0100 Subject: [PATCH 039/201] added egalaxn2 i/o --- src/emu/cpu/hmcs40/hmcs40.h | 68 +++++++++++++++++++++++++++++++ src/emu/cpu/ucom4/ucom4.h | 30 ++++++++++++++ src/mess/drivers/hh_hmcs40.c | 79 +++++++++++++++++++++++++++++++++++- src/mess/drivers/hh_ucom4.c | 14 +++---- 4 files changed, 183 insertions(+), 8 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.h b/src/emu/cpu/hmcs40/hmcs40.h index 2ee8f2f7a96..38750c0dd6a 100644 --- a/src/emu/cpu/hmcs40/hmcs40.h +++ b/src/emu/cpu/hmcs40/hmcs40.h @@ -27,6 +27,74 @@ hmcs40_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb); +enum +{ + HMCS40_PORT_R0X = 0, + HMCS40_PORT_R1X, + HMCS40_PORT_R2X, + HMCS40_PORT_R3X, + HMCS40_PORT_R4X, + HMCS40_PORT_R5X, + HMCS40_PORT_R6X, + HMCS40_PORT_R7X +}; + + +// pinout reference + +/* + _________________ + D3 1 |* | 42 D2 + D4 2 | | 41 D1 + D5 3 | | 40 D0 + D6 4 | | 39 R33 + D7 5 | | 38 R32 + D8 6 | | 37 R31 + D9 7 | | 36 R30 + D10 8 | | 35 R23 ....................................... + D11 9 | | 34 R22 : + D12 10 | HD38750 | 33 R21 : + D13 11 | HD38800 | 32 R20 : + D14 12 | | 31 INT1 : + D15 13 | | 30 INT0 : _________________ + Vdisp 14 | | 29 R13 : D4 1 |* | 64 D3 + RESET 15 | | 28 R12 : D5 2 | | 63 D2 + Vbb 16 | | 27 R11 : D6 3 | | 62 D1 + Vdd 17 | | 26 R10 : D7 4 | | 61 D0 + OSC 18 | | 25 R03 : D8 5 | | 60 R63 + 19 | | 24 R02 : D9 6 | | 59 R62 + /TEST 20 | | 23 R01 : 7 | | 58 + Vss 21 |_________________| 22 R00 : 8 | | 57 + 9 | | 56 + D10 10 | | 55 R61 + D8 D7 D6 D5 D4 D3 D2 D1 D0 D11 11 | | 54 R60 + 5 4 3 2 1 54 53 52 51 50 D12 12 | | 53 R33 + __________________________________ D13 13 | | 52 R32 + / | D14 14 | | 51 R31 + D9 6 | | 49 R63 D15 15 | | 50 R30 + D10 7 | | 48 R62 R40 16 | | 49 R23 + D11 8 | | 47 R61 R41 17 | | 48 R22 + D12 9 | | 46 R60 R42 18 | | 47 R21 + D13 10 | | 45 R33 R43 19 | | 46 R20 + D14 11 | | 44 R32 R50 20 | | 45 INT1 + D15 12 | | 43 R31 R51 21 | | 44 INT0 + R40 13 | HD38820 | 42 R30 R52 22 | HD38820 | 43 R13 + R41 14 | (FP-54 pkg) | 41 R23 R53 23 | (DP-64S pkg) | 42 R12 + R42 15 | | 40 R22 Vdisp 24 | | 41 + R43 16 | | 39 R21 25 | | 40 + R50 17 | | 38 R20 RESET 26 | | 39 + R51 18 | | 37 INT1 Vbb 27 | | 38 R11 + R52 19 | | 36 INT0 Vdd 28 | | 37 R10 + R53 20 | | 35 R13 OSC 29 | | 36 R03 + Vdisp 21 | | 34 R12 30 | | 35 R02 + RESET 22 | | 33 R11 /TEST 31 | | 34 R01 + |__________________________________| Vss 32 |_________________| 33 R00 + + 23 24 25 26 27 28 29 30 31 32 + Vbb | OSC | Vss R00 | R02 | R10 + Vdd /TEST R01 R03 +*/ + class hmcs40_cpu_device : public cpu_device { diff --git a/src/emu/cpu/ucom4/ucom4.h b/src/emu/cpu/ucom4/ucom4.h index c215b2336f2..8e872e41c8f 100644 --- a/src/emu/cpu/ucom4/ucom4.h +++ b/src/emu/cpu/ucom4/ucom4.h @@ -59,6 +59,36 @@ enum }; +// pinout reference + +/* + _______ _______ + CL1 1 |* \_/ | 42 CL0 + PC0 2 | | 41 Vgg + PC1 3 | | 40 PB3 + PC2 4 | | 39 PB2 + PC3 5 | | 38 PB1 + /INT 6 | | 37 PB0 + RESET 7 | | 36 PA3 + PD0 8 | | 35 PA2 + PD1 9 | uPD552 | 34 PA1 + PD2 10 | uPD553 | 33 PA0 + PD3 11 | uPD650* | 32 PI2 + PE0 12 | | 31 PI1 + PE1 13 | | 30 PI0 + PE2 14 | | 29 PH3 + PE3 15 | | 28 PH2 + PF0 16 | | 27 PH1 + PF1 17 | | 26 PH0 + PF2 18 | | 25 PG3 + PF3 19 | | 24 PG2 + TEST 20 | | 23 PG1 + Vss 21 |_________________| 22 PG0 + + *: pin 21 is Vcc, pin 41 is Vss + +*/ + class ucom4_cpu_device : public cpu_device { diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 68b84e28596..7a0f93156aa 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -95,6 +95,11 @@ public: DECLARE_WRITE8_MEMBER(alnattck_plate_w); DECLARE_READ16_MEMBER(alnattck_d_r); DECLARE_WRITE16_MEMBER(alnattck_d_w); + + void egalaxn2_display(); + DECLARE_READ8_MEMBER(egalaxn2_input_r); + DECLARE_WRITE8_MEMBER(egalaxn2_plate_w); + DECLARE_WRITE16_MEMBER(egalaxn2_grid_w); }; @@ -566,7 +571,71 @@ MACHINE_CONFIG_END ***************************************************************************/ +void hh_hmcs40_state::egalaxn2_display() +{ + UINT32 grid = BITSWAP16(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14); + UINT32 plate = BITSWAP24(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8); + + display_matrix(24, 15, plate, grid); +} + +WRITE16_MEMBER(hh_hmcs40_state::egalaxn2_grid_w) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D4: input mux + m_inp_mux = data >> 1 & 0xf; + + // D1-D15: vfd matrix grid + m_grid = data >> 1; + egalaxn2_display(); +} + +WRITE8_MEMBER(hh_hmcs40_state::egalaxn2_plate_w) +{ + // R10-R63: vfd matrix plate + int shift = (offset - HMCS40_PORT_R1X) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + egalaxn2_display(); +} + +READ8_MEMBER(hh_hmcs40_state::egalaxn2_input_r) +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + + static INPUT_PORTS_START( egalaxn2 ) + PORT_START("IN.0") // D1 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // " + + PORT_START("IN.1") // D2 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY // " + + PORT_START("IN.2") // D3 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D4 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, "Skill" ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x0c, 0x00, "Players" ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) INPUT_PORTS_END @@ -574,8 +643,16 @@ static MACHINE_CONFIG_START( egalaxn2, hh_hmcs40_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation - RC osc. + MCFG_HMCS40_READ_R_CB(0, READ8(hh_hmcs40_state, egalaxn2_input_r)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(4, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(5, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(6, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(hh_hmcs40_state, egalaxn2_grid_w)) -// MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) /* no video! */ diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 61af487386e..4eaa029fffc 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -850,10 +850,10 @@ WRITE8_MEMBER(hh_ucom4_state::tmpacman_plate_w) static INPUT_PORTS_START( tmpacman ) PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // 4 separate directional buttons, hence 16way - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY // " PORT_START("IN.1") // port B PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) @@ -967,9 +967,9 @@ static INPUT_PORTS_START( alnchase ) PORT_START("IN.1") // D0 port A PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // on non-mirrored view, swap P2 left/right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_START("IN.2") // port B PORT_CONFNAME( 0x01, 0x01, "Players" ) From 42a6a828de29048d778ec0f73a557990afc9fe34 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Mar 2015 00:17:20 +0100 Subject: [PATCH 040/201] nw shuffle --- src/mess/drivers/hh_hmcs40.c | 16 +-- src/mess/drivers/hh_tms1k.c | 207 ++++++++++++++++++----------------- src/mess/drivers/hh_ucom4.c | 56 +++++----- src/mess/drivers/ticalc1x.c | 64 +++++------ 4 files changed, 172 insertions(+), 171 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 7a0f93156aa..2d02d6bbd62 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -93,13 +93,13 @@ public: // game-specific handlers DECLARE_WRITE8_MEMBER(alnattck_plate_w); - DECLARE_READ16_MEMBER(alnattck_d_r); DECLARE_WRITE16_MEMBER(alnattck_d_w); + DECLARE_READ16_MEMBER(alnattck_d_r); void egalaxn2_display(); - DECLARE_READ8_MEMBER(egalaxn2_input_r); DECLARE_WRITE8_MEMBER(egalaxn2_plate_w); DECLARE_WRITE16_MEMBER(egalaxn2_grid_w); + DECLARE_READ8_MEMBER(egalaxn2_input_r); }; @@ -347,12 +347,6 @@ WRITE8_MEMBER(hh_hmcs40_state::alnattck_plate_w) display_matrix(20, 10, plate, m_grid); } -READ16_MEMBER(hh_hmcs40_state::alnattck_d_r) -{ - // D5: inputs - return (read_inputs(7) & 1) << 5; -} - WRITE16_MEMBER(hh_hmcs40_state::alnattck_d_w) { // D4: speaker out @@ -368,6 +362,12 @@ WRITE16_MEMBER(hh_hmcs40_state::alnattck_d_w) alnattck_plate_w(space, 4, data & 0xf); } +READ16_MEMBER(hh_hmcs40_state::alnattck_d_r) +{ + // D5: inputs + return (read_inputs(7) & 1) << 5; +} + static INPUT_PORTS_START( alnattck ) PORT_START("IN.0") // D5 D7 diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 55d3873b6ea..219a0311129 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -136,74 +136,74 @@ public: // game-specific handlers void mathmagi_display(); - DECLARE_READ8_MEMBER(mathmagi_read_k); DECLARE_WRITE16_MEMBER(mathmagi_write_r); DECLARE_WRITE16_MEMBER(mathmagi_write_o); + DECLARE_READ8_MEMBER(mathmagi_read_k); void amaztron_display(); - DECLARE_READ8_MEMBER(amaztron_read_k); DECLARE_WRITE16_MEMBER(amaztron_write_r); DECLARE_WRITE16_MEMBER(amaztron_write_o); + DECLARE_READ8_MEMBER(amaztron_read_k); void tc4_display(); - DECLARE_READ8_MEMBER(tc4_read_k); DECLARE_WRITE16_MEMBER(tc4_write_r); DECLARE_WRITE16_MEMBER(tc4_write_o); + DECLARE_READ8_MEMBER(tc4_read_k); void ebball_display(); - DECLARE_READ8_MEMBER(ebball_read_k); DECLARE_WRITE16_MEMBER(ebball_write_r); DECLARE_WRITE16_MEMBER(ebball_write_o); + DECLARE_READ8_MEMBER(ebball_read_k); void ebball3_display(); - DECLARE_READ8_MEMBER(ebball3_read_k); DECLARE_WRITE16_MEMBER(ebball3_write_r); DECLARE_WRITE16_MEMBER(ebball3_write_o); + DECLARE_READ8_MEMBER(ebball3_read_k); void ebball3_set_clock(); DECLARE_INPUT_CHANGED_MEMBER(ebball3_difficulty_switch); DECLARE_MACHINE_RESET(ebball3); - DECLARE_READ8_MEMBER(elecdet_read_k); DECLARE_WRITE16_MEMBER(elecdet_write_r); DECLARE_WRITE16_MEMBER(elecdet_write_o); + DECLARE_READ8_MEMBER(elecdet_read_k); void starwbc_display(); - DECLARE_READ8_MEMBER(starwbc_read_k); DECLARE_WRITE16_MEMBER(starwbc_write_r); DECLARE_WRITE16_MEMBER(starwbc_write_o); + DECLARE_READ8_MEMBER(starwbc_read_k); - DECLARE_READ8_MEMBER(comp4_read_k); DECLARE_WRITE16_MEMBER(comp4_write_r); DECLARE_WRITE16_MEMBER(comp4_write_o); + DECLARE_READ8_MEMBER(comp4_read_k); - DECLARE_READ8_MEMBER(simon_read_k); DECLARE_WRITE16_MEMBER(simon_write_r); DECLARE_WRITE16_MEMBER(simon_write_o); + DECLARE_READ8_MEMBER(simon_read_k); - DECLARE_READ8_MEMBER(cnsector_read_k); DECLARE_WRITE16_MEMBER(cnsector_write_r); DECLARE_WRITE16_MEMBER(cnsector_write_o); + DECLARE_READ8_MEMBER(cnsector_read_k); - DECLARE_READ8_MEMBER(merlin_read_k); DECLARE_WRITE16_MEMBER(merlin_write_r); DECLARE_WRITE16_MEMBER(merlin_write_o); + DECLARE_READ8_MEMBER(merlin_read_k); - DECLARE_READ8_MEMBER(stopthief_read_k); DECLARE_WRITE16_MEMBER(stopthief_write_r); DECLARE_WRITE16_MEMBER(stopthief_write_o); + DECLARE_READ8_MEMBER(stopthief_read_k); - DECLARE_READ8_MEMBER(bankshot_read_k); DECLARE_WRITE16_MEMBER(bankshot_write_r); DECLARE_WRITE16_MEMBER(bankshot_write_o); + DECLARE_READ8_MEMBER(bankshot_read_k); - DECLARE_READ8_MEMBER(splitsec_read_k); DECLARE_WRITE16_MEMBER(splitsec_write_r); DECLARE_WRITE16_MEMBER(splitsec_write_o); + DECLARE_READ8_MEMBER(splitsec_read_k); void tandy12_display(); - DECLARE_READ8_MEMBER(tandy12_read_k); DECLARE_WRITE16_MEMBER(tandy12_write_r); DECLARE_WRITE16_MEMBER(tandy12_write_o); + DECLARE_READ8_MEMBER(tandy12_read_k); }; @@ -408,11 +408,6 @@ void hh_tms1k_state::mathmagi_display() display_update(); } -READ8_MEMBER(hh_tms1k_state::mathmagi_read_k) -{ - return read_inputs(6); -} - WRITE16_MEMBER(hh_tms1k_state::mathmagi_write_r) { // R3,R5-R7,R9,R10: input mux @@ -431,6 +426,11 @@ WRITE16_MEMBER(hh_tms1k_state::mathmagi_write_o) m_o = data; } +READ8_MEMBER(hh_tms1k_state::mathmagi_read_k) +{ + return read_inputs(6); +} + /* physical button layout and labels is like this: @@ -568,15 +568,6 @@ void hh_tms1k_state::amaztron_display() display_update(); } -READ8_MEMBER(hh_tms1k_state::amaztron_read_k) -{ - UINT8 k = read_inputs(6); - - // the 5th column is tied to K4+K8 - if (k & 0x10) k |= 0xc; - return k & 0xf; -} - WRITE16_MEMBER(hh_tms1k_state::amaztron_write_r) { // R0-R5: input mux @@ -598,6 +589,15 @@ WRITE16_MEMBER(hh_tms1k_state::amaztron_write_o) amaztron_display(); } +READ8_MEMBER(hh_tms1k_state::amaztron_read_k) +{ + UINT8 k = read_inputs(6); + + // the 5th column is tied to K4+K8 + if (k & 0x10) k |= 0xc; + return k & 0xf; +} + static INPUT_PORTS_START( amaztron ) PORT_START("IN.0") // R0 @@ -711,17 +711,6 @@ void hh_tms1k_state::tc4_display() display_matrix(9, 10, (m_o | (m_r << 2 & 0x100)), m_r); } -READ8_MEMBER(hh_tms1k_state::tc4_read_k) -{ - UINT8 k = read_inputs(6); - - // read from cartridge - if (m_inp_mux & 0x200) - k |= m_inp_matrix[6]->read(); - - return k; -} - WRITE16_MEMBER(hh_tms1k_state::tc4_write_r) { // R10: speaker out @@ -744,6 +733,17 @@ WRITE16_MEMBER(hh_tms1k_state::tc4_write_o) tc4_display(); } +READ8_MEMBER(hh_tms1k_state::tc4_read_k) +{ + UINT8 k = read_inputs(6); + + // read from cartridge + if (m_inp_mux & 0x200) + k |= m_inp_matrix[6]->read(); + + return k; +} + static INPUT_PORTS_START( tc4 ) PORT_START("IN.0") // R0 @@ -853,12 +853,6 @@ void hh_tms1k_state::ebball_display() display_matrix(7, 9, ~m_o, m_r); } -READ8_MEMBER(hh_tms1k_state::ebball_read_k) -{ - // note: K8(Vss row) is always on - return m_inp_matrix[5]->read() | read_inputs(5); -} - WRITE16_MEMBER(hh_tms1k_state::ebball_write_r) { // R1-R5: input mux @@ -880,6 +874,12 @@ WRITE16_MEMBER(hh_tms1k_state::ebball_write_o) ebball_display(); } +READ8_MEMBER(hh_tms1k_state::ebball_read_k) +{ + // note: K8(Vss row) is always on + return m_inp_matrix[5]->read() | read_inputs(5); +} + static INPUT_PORTS_START( ebball ) PORT_START("IN.0") // R1 @@ -989,11 +989,6 @@ void hh_tms1k_state::ebball3_display() display_update(); } -READ8_MEMBER(hh_tms1k_state::ebball3_read_k) -{ - return read_inputs(3); -} - WRITE16_MEMBER(hh_tms1k_state::ebball3_write_r) { // R0-R2: input mux @@ -1015,6 +1010,11 @@ WRITE16_MEMBER(hh_tms1k_state::ebball3_write_o) ebball3_display(); } +READ8_MEMBER(hh_tms1k_state::ebball3_read_k) +{ + return read_inputs(3); +} + /* physical button layout and labels is like this: @@ -1113,12 +1113,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::elecdet_read_k) -{ - // note: the Vss row is always on - return m_inp_matrix[4]->read() | read_inputs(4); -} - WRITE16_MEMBER(hh_tms1k_state::elecdet_write_r) { // R7,R8: speaker on @@ -1141,6 +1135,12 @@ WRITE16_MEMBER(hh_tms1k_state::elecdet_write_o) m_o = data; } +READ8_MEMBER(hh_tms1k_state::elecdet_read_k) +{ + // note: the Vss row is always on + return m_inp_matrix[4]->read() | read_inputs(4); +} + /* physical button layout and labels is like this: @@ -1233,11 +1233,6 @@ void hh_tms1k_state::starwbc_display() display_matrix(8, 10, m_o, m_r); } -READ8_MEMBER(hh_tms1k_state::starwbc_read_k) -{ - return read_inputs(5); -} - WRITE16_MEMBER(hh_tms1k_state::starwbc_write_r) { // R0,R1,R3,R5,R7: input mux @@ -1258,6 +1253,11 @@ WRITE16_MEMBER(hh_tms1k_state::starwbc_write_o) starwbc_display(); } +READ8_MEMBER(hh_tms1k_state::starwbc_read_k) +{ + return read_inputs(5); +} + /* physical button layout and labels is like this: @@ -1339,11 +1339,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::comp4_read_k) -{ - return read_inputs(3); -} - WRITE16_MEMBER(hh_tms1k_state::comp4_write_r) { // leds: @@ -1367,6 +1362,11 @@ WRITE16_MEMBER(hh_tms1k_state::comp4_write_o) display_matrix(11, 1, m_r, m_o); } +READ8_MEMBER(hh_tms1k_state::comp4_read_k) +{ + return read_inputs(3); +} + static INPUT_PORTS_START( comp4 ) PORT_START("IN.0") // O1 @@ -1422,11 +1422,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::simon_read_k) -{ - return read_inputs(4); -} - WRITE16_MEMBER(hh_tms1k_state::simon_write_r) { // R4-R8 go through an 75494 IC first: @@ -1450,6 +1445,11 @@ WRITE16_MEMBER(hh_tms1k_state::simon_write_o) // N/C } +READ8_MEMBER(hh_tms1k_state::simon_read_k) +{ + return read_inputs(4); +} + static INPUT_PORTS_START( simon ) PORT_START("IN.0") // R0 @@ -1514,11 +1514,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::cnsector_read_k) -{ - return read_inputs(5); -} - WRITE16_MEMBER(hh_tms1k_state::cnsector_write_r) { m_display_maxx = 8; @@ -1546,6 +1541,11 @@ WRITE16_MEMBER(hh_tms1k_state::cnsector_write_o) m_o = data; } +READ8_MEMBER(hh_tms1k_state::cnsector_read_k) +{ + return read_inputs(5); +} + static INPUT_PORTS_START( cnsector ) PORT_START("IN.0") // O0 @@ -1622,11 +1622,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::merlin_read_k) -{ - return read_inputs(4); -} - WRITE16_MEMBER(hh_tms1k_state::merlin_write_r) { /* leds: @@ -1651,6 +1646,11 @@ WRITE16_MEMBER(hh_tms1k_state::merlin_write_o) m_inp_mux = data & 0xf; } +READ8_MEMBER(hh_tms1k_state::merlin_read_k) +{ + return read_inputs(4); +} + static INPUT_PORTS_START( merlin ) PORT_START("IN.0") // O0 @@ -1716,12 +1716,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::stopthief_read_k) -{ - // note: the Vss row is always on - return m_inp_matrix[2]->read() | read_inputs(2); -} - WRITE16_MEMBER(hh_tms1k_state::stopthief_write_r) { m_display_maxx = 7; @@ -1751,6 +1745,12 @@ WRITE16_MEMBER(hh_tms1k_state::stopthief_write_o) m_o = data; } +READ8_MEMBER(hh_tms1k_state::stopthief_read_k) +{ + // note: the Vss row is always on + return m_inp_matrix[2]->read() | read_inputs(2); +} + /* physical button layout and labels is like this: @@ -1824,11 +1824,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::bankshot_read_k) -{ - return read_inputs(2); -} - WRITE16_MEMBER(hh_tms1k_state::bankshot_write_r) { // R0: speaker out @@ -1850,6 +1845,11 @@ WRITE16_MEMBER(hh_tms1k_state::bankshot_write_o) display_matrix(7, 11, m_o, m_r); } +READ8_MEMBER(hh_tms1k_state::bankshot_read_k) +{ + return read_inputs(2); +} + /* physical button layout and labels is like this: (note: remember that you can rotate the display in MESS) @@ -1931,11 +1931,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_tms1k_state::splitsec_read_k) -{ - return read_inputs(2); -} - WRITE16_MEMBER(hh_tms1k_state::splitsec_write_r) { // R8: speaker out @@ -1957,6 +1952,12 @@ WRITE16_MEMBER(hh_tms1k_state::splitsec_write_o) display_matrix(7, 8, m_o, m_r); } +READ8_MEMBER(hh_tms1k_state::splitsec_read_k) +{ + return read_inputs(2); +} + + static INPUT_PORTS_START( splitsec ) PORT_START("IN.0") // R9 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 4 separate directional buttons, hence 16way @@ -2021,11 +2022,6 @@ void hh_tms1k_state::tandy12_display() display_matrix(13, 1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00), 1); } -READ8_MEMBER(hh_tms1k_state::tandy12_read_k) -{ - return read_inputs(5); -} - WRITE16_MEMBER(hh_tms1k_state::tandy12_write_r) { // R10: speaker out @@ -2045,6 +2041,11 @@ WRITE16_MEMBER(hh_tms1k_state::tandy12_write_o) tandy12_display(); } +READ8_MEMBER(hh_tms1k_state::tandy12_read_k) +{ + return read_inputs(5); +} + /* physical button layout and labels is like this: diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 4eaa029fffc..c52ffb8ed88 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -79,14 +79,14 @@ public: // game-specific handlers void ssfball_display(); - DECLARE_READ8_MEMBER(ssfball_input_b_r); DECLARE_WRITE8_MEMBER(ssfball_grid_w); DECLARE_WRITE8_MEMBER(ssfball_plate_w); + DECLARE_READ8_MEMBER(ssfball_input_b_r); void splasfgt_display(); - DECLARE_READ8_MEMBER(splasfgt_input_b_r); DECLARE_WRITE8_MEMBER(splasfgt_grid_w); DECLARE_WRITE8_MEMBER(splasfgt_plate_w); + DECLARE_READ8_MEMBER(splasfgt_input_b_r); void astrocmd_display(); DECLARE_WRITE8_MEMBER(astrocmd_grid_w); @@ -95,10 +95,10 @@ public: DECLARE_WRITE8_MEMBER(edracula_grid_w); DECLARE_WRITE8_MEMBER(edracula_plate_w); - DECLARE_READ8_MEMBER(tmtennis_input_r); DECLARE_WRITE8_MEMBER(tmtennis_grid_w); DECLARE_WRITE8_MEMBER(tmtennis_plate_w); DECLARE_WRITE8_MEMBER(tmtennis_port_e_w); + DECLARE_READ8_MEMBER(tmtennis_input_r); void tmtennis_set_clock(); DECLARE_INPUT_CHANGED_MEMBER(tmtennis_difficulty_switch); DECLARE_MACHINE_RESET(tmtennis); @@ -107,8 +107,8 @@ public: DECLARE_WRITE8_MEMBER(tmpacman_grid_w); DECLARE_WRITE8_MEMBER(tmpacman_plate_w); - DECLARE_READ8_MEMBER(alnchase_input_r); DECLARE_WRITE8_MEMBER(alnchase_output_w); + DECLARE_READ8_MEMBER(alnchase_input_r); }; @@ -253,12 +253,6 @@ void hh_ucom4_state::ssfball_display() display_matrix(16, 9, plate, m_grid); } -READ8_MEMBER(hh_ucom4_state::ssfball_input_b_r) -{ - // B: input port 2, where B3 is multiplexed - return m_inp_matrix[2]->read() | read_inputs(2); -} - WRITE8_MEMBER(hh_ucom4_state::ssfball_grid_w) { // C,D(,E): vfd matrix grid 0-7(,8) @@ -287,6 +281,12 @@ WRITE8_MEMBER(hh_ucom4_state::ssfball_plate_w) ssfball_display(); } +READ8_MEMBER(hh_ucom4_state::ssfball_input_b_r) +{ + // B: input port 2, where B3 is multiplexed + return m_inp_matrix[2]->read() | read_inputs(2); +} + static INPUT_PORTS_START( ssfball ) PORT_START("IN.0") // F3 port B3 @@ -362,12 +362,6 @@ void hh_ucom4_state::splasfgt_display() display_matrix(16, 9, plate, m_grid); } -READ8_MEMBER(hh_ucom4_state::splasfgt_input_b_r) -{ - // B: multiplexed buttons - return read_inputs(4); -} - WRITE8_MEMBER(hh_ucom4_state::splasfgt_grid_w) { // G,H,I0: vfd matrix grid @@ -397,6 +391,12 @@ WRITE8_MEMBER(hh_ucom4_state::splasfgt_plate_w) ssfball_display(); } +READ8_MEMBER(hh_ucom4_state::splasfgt_input_b_r) +{ + // B: multiplexed buttons + return read_inputs(4); +} + /* physical button layout and labels is like this: @@ -674,12 +674,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_ucom4_state::tmtennis_input_r) -{ - // A,B: multiplexed buttons - return ~read_inputs(2) >> (offset*4); -} - WRITE8_MEMBER(hh_ucom4_state::tmtennis_grid_w) { // G,H,I: vfd matrix grid @@ -708,6 +702,12 @@ WRITE8_MEMBER(hh_ucom4_state::tmtennis_port_e_w) m_speaker->level_w(data >> 2 & 1); } +READ8_MEMBER(hh_ucom4_state::tmtennis_input_r) +{ + // A,B: multiplexed buttons + return ~read_inputs(2) >> (offset*4); +} + /* Pro-Tennis physical button layout and labels is like this: @@ -910,12 +910,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(hh_ucom4_state::alnchase_input_r) -{ - // A: buttons - return read_inputs(2); -} - WRITE8_MEMBER(hh_ucom4_state::alnchase_output_w) { if (offset <= NEC_UCOM4_PORTE) @@ -943,6 +937,12 @@ WRITE8_MEMBER(hh_ucom4_state::alnchase_output_w) display_matrix(17, 9, m_plate, m_grid); } +READ8_MEMBER(hh_ucom4_state::alnchase_input_r) +{ + // A: buttons + return read_inputs(2); +} + /* physical button layout and labels is like this: diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 152b3a76088..076d49c7000 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -70,26 +70,26 @@ public: void display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask); // calculator-specific handlers - DECLARE_READ8_MEMBER(tisr16_read_k); + void tisr16_display_update(); DECLARE_WRITE16_MEMBER(tisr16_write_o); DECLARE_WRITE16_MEMBER(tisr16_write_r); - void tisr16_display_update(); + DECLARE_READ8_MEMBER(tisr16_read_k); - DECLARE_READ8_MEMBER(ti1270_read_k); DECLARE_WRITE16_MEMBER(ti1270_write_o); DECLARE_WRITE16_MEMBER(ti1270_write_r); + DECLARE_READ8_MEMBER(ti1270_read_k); - DECLARE_READ8_MEMBER(wizatron_read_k); DECLARE_WRITE16_MEMBER(wizatron_write_o); DECLARE_WRITE16_MEMBER(wizatron_write_r); + DECLARE_READ8_MEMBER(wizatron_read_k); - DECLARE_READ8_MEMBER(lilprof_read_k); DECLARE_WRITE16_MEMBER(lilprof_write_o); DECLARE_WRITE16_MEMBER(lilprof_write_r); + DECLARE_READ8_MEMBER(lilprof_read_k); - DECLARE_READ8_MEMBER(ti30_read_k); DECLARE_WRITE16_MEMBER(ti30_write_o); DECLARE_WRITE16_MEMBER(ti30_write_r); + DECLARE_READ8_MEMBER(ti30_read_k); }; @@ -262,11 +262,6 @@ void ticalc1x_state::tisr16_display_update() display_update(); } -READ8_MEMBER(ticalc1x_state::tisr16_read_k) -{ - return read_inputs(11); -} - WRITE16_MEMBER(ticalc1x_state::tisr16_write_r) { // R0-R10: input mux @@ -282,6 +277,11 @@ WRITE16_MEMBER(ticalc1x_state::tisr16_write_o) tisr16_display_update(); } +READ8_MEMBER(ticalc1x_state::tisr16_read_k) +{ + return read_inputs(11); +} + static INPUT_PORTS_START( tisr16 ) PORT_START("IN.0") // R0 @@ -379,11 +379,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(ticalc1x_state::ti1270_read_k) -{ - return read_inputs(6); -} - WRITE16_MEMBER(ticalc1x_state::ti1270_write_r) { // R0-R7: select digit (right-to-left) @@ -398,6 +393,11 @@ WRITE16_MEMBER(ticalc1x_state::ti1270_write_o) m_o = data; } +READ8_MEMBER(ticalc1x_state::ti1270_read_k) +{ + return read_inputs(6); +} + static INPUT_PORTS_START( ti1270 ) PORT_START("IN.0") // O1 @@ -465,11 +465,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(ticalc1x_state::wizatron_read_k) -{ - return read_inputs(4); -} - WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) { // note: 6th digit is custom(not 7seg), for math symbols, and 3rd digit @@ -489,6 +484,11 @@ WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) m_o = data & 0x7f; } +READ8_MEMBER(ticalc1x_state::wizatron_read_k) +{ + return read_inputs(4); +} + static INPUT_PORTS_START( wizatron ) PORT_START("IN.0") // O1 @@ -544,11 +544,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(ticalc1x_state::lilprof_read_k) -{ - return read_inputs(5); -} - WRITE16_MEMBER(ticalc1x_state::lilprof_write_r) { // update leds state @@ -578,6 +573,11 @@ WRITE16_MEMBER(ticalc1x_state::lilprof_write_o) m_o = data; } +READ8_MEMBER(ticalc1x_state::lilprof_read_k) +{ + return read_inputs(5); +} + static INPUT_PORTS_START( lilprof ) PORT_START("IN.0") // O0 @@ -642,12 +642,6 @@ MACHINE_CONFIG_END ***************************************************************************/ -READ8_MEMBER(ticalc1x_state::ti30_read_k) -{ - // note: the Vss row is always on - return m_inp_matrix[7]->read() | read_inputs(7); -} - WRITE16_MEMBER(ticalc1x_state::ti30_write_r) { // note: 1st digit only has segments B,F,G,DP @@ -665,6 +659,12 @@ WRITE16_MEMBER(ticalc1x_state::ti30_write_o) m_o = data; } +READ8_MEMBER(ticalc1x_state::ti30_read_k) +{ + // note: the Vss row is always on + return m_inp_matrix[7]->read() | read_inputs(7); +} + static INPUT_PORTS_START( ti30 ) PORT_START("IN.0") // O0 From b1abbbd0296891356a2fda0eff2a479ce804bf55 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Mar 2015 00:35:11 +0100 Subject: [PATCH 041/201] added epacman2 i/o (judging from disasm, these two and coleco alien attack have the simplest code) --- src/mess/drivers/hh_hmcs40.c | 40 +++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 2d02d6bbd62..852da84948c 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -677,7 +677,37 @@ MACHINE_CONFIG_END ***************************************************************************/ +// hardware is identical to Galaxian 2, so we can use those handlers +// note: plate numbers are 0-23, not 1-24(with 0 always-on) + static INPUT_PORTS_START( epacman2 ) + PORT_START("IN.0") // D1 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // " + + PORT_START("IN.1") // D2 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY // " + + PORT_START("IN.2") // D3 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Skill Control") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Demo Light Test") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D4 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, "Skill" ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x0c, 0x00, "Players" ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) INPUT_PORTS_END @@ -685,8 +715,16 @@ static MACHINE_CONFIG_START( epacman2, hh_hmcs40_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", HD38820, 400000) // approximation - RC osc. + MCFG_HMCS40_READ_R_CB(0, READ8(hh_hmcs40_state, egalaxn2_input_r)) + MCFG_HMCS40_WRITE_R_CB(1, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(2, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(3, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(4, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(5, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_R_CB(6, WRITE8(hh_hmcs40_state, egalaxn2_plate_w)) + MCFG_HMCS40_WRITE_D_CB(WRITE16(hh_hmcs40_state, egalaxn2_grid_w)) -// MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_hmcs40_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_hh_hmcs40_test) /* no video! */ From b685e5264ead9ed98ff8c7d2dafa038618fb957c Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Mar 2015 00:41:00 +0100 Subject: [PATCH 042/201] ah, i forgot to add the /4 divider --- src/emu/cpu/hmcs40/hmcs40.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/emu/cpu/hmcs40/hmcs40.h b/src/emu/cpu/hmcs40/hmcs40.h index 38750c0dd6a..6dd5166df87 100644 --- a/src/emu/cpu/hmcs40/hmcs40.h +++ b/src/emu/cpu/hmcs40/hmcs40.h @@ -144,6 +144,8 @@ protected: virtual void device_reset(); // device_execute_interface overrides + virtual UINT64 execute_clocks_to_cycles(UINT64 clocks) const { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle + virtual UINT64 execute_cycles_to_clocks(UINT64 cycles) const { return (cycles * 4); } // " virtual UINT32 execute_min_cycles() const { return 1; } virtual UINT32 execute_max_cycles() const { return 2; } virtual UINT32 execute_input_lines() const { return 2+1; } // 3rd one is internal From 366a5b7272b828f1273f371e2647982f68bd921f Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Sun, 15 Mar 2015 21:06:36 -0700 Subject: [PATCH 043/201] osd_opengl.h: fix compile on MSVC 2012 (nw) --- src/osd/modules/opengl/osd_opengl.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/osd/modules/opengl/osd_opengl.h b/src/osd/modules/opengl/osd_opengl.h index 94eab4e145b..3e9adbb010c 100644 --- a/src/osd/modules/opengl/osd_opengl.h +++ b/src/osd/modules/opengl/osd_opengl.h @@ -89,16 +89,25 @@ #define OSD_GL(ret,func,params) ret (APIENTRY *func) params; #define OSD_GL_UNUSED(ret,func,params) - struct osd_gl_dispatch +#ifdef _MSC_VER + extern "C" { +#else { - #define GET_GLFUNC 1 - #include "osd_opengl.h" - #undef GET_GLFUNC - }; +#endif + struct osd_gl_dispatch + { + #define GET_GLFUNC 1 + #include "osd_opengl.h" + #undef GET_GLFUNC + }; + } #undef OSD_GL #undef OSD_GL_UNUSED +#ifdef _MSC_VER + extern "C" osd_gl_dispatch *gl_dispatch; +#endif extern osd_gl_dispatch *gl_dispatch; /* From 0b9a644a76a2bd86f1d09e4b149dc7a6de94a4c5 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 16 Mar 2015 16:20:59 +1100 Subject: [PATCH 044/201] Make Cherry Bonus artwork clickable --- src/mame/drivers/goldstar.c | 56 +++--------------------------------- src/mame/layout/cherryb3.lay | 24 ++++++++-------- 2 files changed, 16 insertions(+), 64 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index b55af56df68..d9e6f40492b 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -6957,56 +6957,6 @@ PALETTE_INIT_MEMBER(goldstar_state, lucky8) } -static MACHINE_CONFIG_START( chrygld, cb3_state ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK) - MCFG_CPU_PROGRAM_MAP(ncb3_map) - MCFG_CPU_IO_MAP(ncb3_readwriteport) - MCFG_CPU_VBLANK_INT_DRIVER("screen", goldstar_state, irq0_line_hold) - - MCFG_DEVICE_ADD("ppi8255_0", I8255A, 0) - MCFG_I8255_IN_PORTA_CB(IOPORT("IN0")) - MCFG_I8255_IN_PORTB_CB(IOPORT("IN3")) //Player2 controls, confirmed - - MCFG_DEVICE_ADD("ppi8255_1", I8255A, 0) - MCFG_I8255_IN_PORTA_CB(IOPORT("IN1")) - MCFG_I8255_IN_PORTB_CB(IOPORT("IN2")) - MCFG_I8255_IN_PORTC_CB(IOPORT("DSW1")) - - MCFG_DEVICE_ADD("ppi8255_2", I8255A, 0) - MCFG_I8255_IN_PORTA_CB(IOPORT("DSW2")) - - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) -// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE_DRIVER(goldstar_state, screen_update_goldstar) - MCFG_SCREEN_PALETTE("palette") - - MCFG_GFXDECODE_ADD("gfxdecode", "palette", chry10) - MCFG_PALETTE_ADD("palette", 256) - MCFG_PALETTE_INIT_OWNER(goldstar_state,cm) - MCFG_NVRAM_ADD_1FILL("nvram") - - MCFG_VIDEO_START_OVERRIDE(goldstar_state,goldstar) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - - MCFG_SOUND_ADD("snsnd", SN76489, PSG_CLOCK) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) - - MCFG_SOUND_ADD("aysnd", AY8910, AY_CLOCK) - MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW4")) - MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW3")) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) -MACHINE_CONFIG_END - - - static MACHINE_CONFIG_START( ncb3, cb3_state ) /* basic machine hardware */ @@ -7064,6 +7014,10 @@ static MACHINE_CONFIG_DERIVED( cb3e, ncb3 ) MCFG_GFXDECODE_MODIFY("gfxdecode", cb3e) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( chrygld, ncb3 ) + MCFG_GFXDECODE_MODIFY("gfxdecode", chry10) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( cherrys, ncb3 ) MCFG_GFXDECODE_MODIFY("gfxdecode", cherrys) MACHINE_CONFIG_END @@ -7073,7 +7027,6 @@ static MACHINE_CONFIG_DERIVED( cm97, ncb3 ) MACHINE_CONFIG_END - static MACHINE_CONFIG_START( wcherry, goldstar_state ) /* basic machine hardware */ @@ -7123,7 +7076,6 @@ static MACHINE_CONFIG_START( wcherry, goldstar_state ) MACHINE_CONFIG_END - static MACHINE_CONFIG_START( cm, cmaster_state ) /* basic machine hardware */ diff --git a/src/mame/layout/cherryb3.lay b/src/mame/layout/cherryb3.lay index e6822b47a8e..8c448019aca 100644 --- a/src/mame/layout/cherryb3.lay +++ b/src/mame/layout/cherryb3.lay @@ -214,50 +214,50 @@ - + - + - + - + - + - + - + - + - + - + - + - + From 45522916d3ad443d45d1c43ed0c4245c53e44a4d Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 16 Mar 2015 20:05:31 +1100 Subject: [PATCH 045/201] Hook up second set of lamps for games with two sets of controls Add second set of lamps to layouts for games with two sets of controls Make Wing Co layouts (bingowng/lucky8) prettier Add views to show either or both sets of button lamps --- src/mame/drivers/goldstar.c | 88 ++++------ src/mame/includes/goldstar.h | 5 +- src/mame/layout/bingowng.lay | 282 ++++++++++++++++++++++++----- src/mame/layout/cherryb3.lay | 224 ++++++++++++++++++----- src/mame/layout/chrygld.lay | 265 ++++++++++++++++++++++++++++ src/mame/layout/lucky8.lay | 332 ++++++++++++++++++++++++++++------- src/mame/mame.mak | 1 + 7 files changed, 989 insertions(+), 208 deletions(-) create mode 100644 src/mame/layout/chrygld.lay diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index d9e6f40492b..96aae293067 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -157,6 +157,7 @@ #include "bingowng.lh" #include "cherryb3.lh" +#include "chrygld.lh" #include "cmaster.lh" #include "cmasterb.lh" #include "cmasterc.lh" @@ -187,16 +188,16 @@ READ8_MEMBER(goldstar_state::protection_r) return data[m_dataoffset++]; } -WRITE8_MEMBER(goldstar_state::goldstar_lamps_w) +WRITE8_MEMBER(goldstar_state::p1_lamps_w) { /* bits - 7654 3210 goldstar crazybon - ---- ---x Bet Red / Card 2 - ---- --x- Stop 3 / Small / Info / Card 1 Start - ---- -x-- Bet Blue / Double Up / Card 3 - ---- x--- Stop 1 / Take Bet - ---x ---- Stop 2 / Big / Bonus Stop All / Take Score - --x- ---- Start / Stop All / Card 4 Double Up + 7654 3210 goldstar crazybon ncb3/cb3a lucky8/bingowng + ---- ---x Bet Red / Card 2 Stop 2 / Big + ---- --x- Stop 3 / Small / Info / Card 1 Start Blue Bet / Double D-UP + ---- -x-- Bet Blue / Double Up / Card 3 Stop 1/Take TAKE + ---- x--- Stop 1 / Take Bet Red Bet BET + ---x ---- Stop 2 / Big / Bonus Stop All / Take Score Stop 3 / Small / Info INFO + --x- ---- Start / Stop All / Card 4 Double Up Start / Stop All START -x-- ---- Small / Info x--- ---- Big @@ -223,30 +224,21 @@ WRITE8_MEMBER(goldstar_state::goldstar_lamps_w) output_set_lamp_value(6, (data >> 6) & 1); output_set_lamp_value(7, (data >> 7) & 1); -// popmessage("lamps: %02X", data); +// popmessage("p1 lamps: %02X", data); } -WRITE8_MEMBER(goldstar_state::cb3_lamps_w) +WRITE8_MEMBER(goldstar_state::p2_lamps_w) { -/* bits - 7654 3210 - ---- ---x Stop 2 / Big - ---- --x- Blue Bet / Double - ---- -x-- Stop 1 / Take - ---- x--- Red Bet - ---x ---- Stop 3 / Small / Info - --x- ---- Start / Stop All + output_set_lamp_value(8 + 0, (data >> 0) & 1); + output_set_lamp_value(8 + 1, (data >> 1) & 1); + output_set_lamp_value(8 + 2, (data >> 2) & 1); + output_set_lamp_value(8 + 3, (data >> 3) & 1); + output_set_lamp_value(8 + 4, (data >> 4) & 1); + output_set_lamp_value(8 + 5, (data >> 5) & 1); + output_set_lamp_value(8 + 6, (data >> 6) & 1); + output_set_lamp_value(8 + 7, (data >> 7) & 1); - TODO: there are two sets of lamps for the two players at 0xf850 and 0xf860 - handle them independently -*/ - output_set_lamp_value(0, (data) & 1); /* Stop 2 / Big */ - output_set_lamp_value(1, (data >> 1) & 1); /* Blue Bet / Double */ - output_set_lamp_value(2, (data >> 2) & 1); /* Stop 1 / Take */ - output_set_lamp_value(3, (data >> 3) & 1); /* Red Bet */ - output_set_lamp_value(4, (data >> 4) & 1); /* Stop 3 / Small / Info */ - output_set_lamp_value(5, (data >> 5) & 1); /* Start / Stop All */ - -// popmessage("lamps: %02X", data); +// popmessage("p2 lamps: %02X", data); } @@ -275,7 +267,7 @@ static ADDRESS_MAP_START( goldstar_map, AS_PROGRAM, 8, goldstar_state ) AM_RANGE(0xf820, 0xf820) AM_READ_PORT("DSW2") AM_RANGE(0xf830, 0xf830) AM_DEVREADWRITE("aysnd", ay8910_device, data_r, data_w) AM_RANGE(0xf840, 0xf840) AM_DEVWRITE("aysnd", ay8910_device, address_w) - AM_RANGE(0xf900, 0xf900) AM_WRITE(goldstar_lamps_w) + AM_RANGE(0xf900, 0xf900) AM_WRITE(p1_lamps_w) AM_RANGE(0xfa00, 0xfa00) AM_WRITE(goldstar_fa00_w) AM_RANGE(0xfb00, 0xfb00) AM_DEVREADWRITE("oki", okim6295_device, read, write) AM_RANGE(0xfd00, 0xfdff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") @@ -543,8 +535,8 @@ static ADDRESS_MAP_START( ncb3_map, AS_PROGRAM, 8, cb3_state ) AM_RANGE(0xf830, 0xf830) AM_DEVREADWRITE("aysnd", ay8910_device, data_r, data_w) AM_RANGE(0xf840, 0xf840) AM_DEVWRITE("aysnd", ay8910_device, address_w) - AM_RANGE(0xf850, 0xf850) AM_WRITE(cb3_lamps_w) /* Control Set 1 lamps */ - AM_RANGE(0xf860, 0xf860) AM_WRITE(cb3_lamps_w) /* Control Set 2 lamps */ + AM_RANGE(0xf850, 0xf850) AM_WRITE(p1_lamps_w) /* Control Set 1 lamps */ + AM_RANGE(0xf860, 0xf860) AM_WRITE(p2_lamps_w) /* Control Set 2 lamps */ AM_RANGE(0xf870, 0xf870) AM_DEVWRITE("snsnd", sn76489_device, write) /* guess... device is initialized, but doesn't seems to be used.*/ ADDRESS_MAP_END @@ -724,7 +716,7 @@ static ADDRESS_MAP_START( cm_portmap, AS_IO, 8, cmaster_state ) AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) /* DIP switches */ AM_RANGE(0x10, 0x10) AM_WRITE(outport0_w) AM_RANGE(0x11, 0x11) AM_WRITE(cm_coincount_w) - AM_RANGE(0x12, 0x12) AM_WRITE(goldstar_lamps_w) + AM_RANGE(0x12, 0x12) AM_WRITE(p1_lamps_w) AM_RANGE(0x13, 0x13) AM_WRITE(background_col_w) AM_RANGE(0x14, 0x14) AM_WRITE(girl_scroll_w) ADDRESS_MAP_END @@ -743,7 +735,7 @@ static ADDRESS_MAP_START( pkrmast_portmap, AS_IO, 8, goldstar_state ) AM_RANGE(0x20, 0x20) AM_READ_PORT("DSW3-0") AM_RANGE(0x21, 0x21) AM_READ_PORT("DSW3-1") - AM_RANGE(0x22, 0x22) AM_WRITE(goldstar_lamps_w) + AM_RANGE(0x22, 0x22) AM_WRITE(p1_lamps_w) AM_RANGE(0x24, 0x24) AM_WRITE(cm_coincount_w) AM_RANGE(0x25, 0x25) AM_READ_PORT("DSW1") @@ -770,7 +762,7 @@ static ADDRESS_MAP_START( amcoe1_portmap, AS_IO, 8, cmaster_state ) AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) /* DIP switches */ AM_RANGE(0x10, 0x10) AM_WRITE(outport0_w) AM_RANGE(0x11, 0x11) AM_WRITE(cm_coincount_w) - AM_RANGE(0x12, 0x12) AM_WRITE(goldstar_lamps_w) + AM_RANGE(0x12, 0x12) AM_WRITE(p1_lamps_w) AM_RANGE(0x13, 0x13) AM_WRITE(background_col_w) AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("oki", okim6295_device, read, write) ADDRESS_MAP_END @@ -783,24 +775,11 @@ static ADDRESS_MAP_START( amcoe2_portmap, AS_IO, 8, cmaster_state ) AM_RANGE(0x08, 0x0b) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) /* DIP switches */ AM_RANGE(0x10, 0x10) AM_WRITE(outport0_w) AM_RANGE(0x11, 0x11) AM_WRITE(cm_coincount_w) - AM_RANGE(0x12, 0x12) AM_WRITE(goldstar_lamps_w) + AM_RANGE(0x12, 0x12) AM_WRITE(p1_lamps_w) AM_RANGE(0x13, 0x13) AM_WRITE(background_col_w) ADDRESS_MAP_END -WRITE8_MEMBER(goldstar_state::lucky8_lamps_w) -{ - /* lamps */ - output_set_lamp_value(0, (data >> 1) & 1); /* D-UP Lamp */ - output_set_lamp_value(1, (data >> 2) & 1); /* TAKE Lamp */ - output_set_lamp_value(2, (data >> 3) & 1); /* BET Lamp */ - output_set_lamp_value(3, (data >> 4) & 1); /* INFO Lamp */ - output_set_lamp_value(4, (data >> 5) & 1); /* START Lamp */ - -// popmessage("lucky8_lamps_w %02x\n", data); - -} - static ADDRESS_MAP_START( lucky8_map, AS_PROGRAM, 8, goldstar_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("nvram") @@ -818,7 +797,8 @@ static ADDRESS_MAP_START( lucky8_map, AS_PROGRAM, 8, goldstar_state ) AM_RANGE(0xb820, 0xb823) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) /* Input/Output Ports */ AM_RANGE(0xb830, 0xb830) AM_DEVREADWRITE("aysnd", ay8910_device, data_r, data_w) AM_RANGE(0xb840, 0xb840) AM_DEVWRITE("aysnd", ay8910_device, address_w) /* no sound... only use both ports for DSWs */ - AM_RANGE(0xb850, 0xb850) AM_WRITE(lucky8_lamps_w) + AM_RANGE(0xb850, 0xb850) AM_WRITE(p1_lamps_w) + AM_RANGE(0xb860, 0xb860) AM_WRITE(p2_lamps_w) AM_RANGE(0xb870, 0xb870) AM_DEVWRITE("snsnd", sn76489_device, write) /* sound */ AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END @@ -885,7 +865,7 @@ static ADDRESS_MAP_START( kkotnoli_map, AS_PROGRAM, 8, goldstar_state ) AM_RANGE(0xb820, 0xb823) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) /* Input Port */ AM_RANGE(0xb830, 0xb830) AM_WRITENOP /* no ay8910 */ AM_RANGE(0xb840, 0xb840) AM_WRITENOP /* no ay8910 */ - AM_RANGE(0xb850, 0xb850) AM_WRITE(lucky8_lamps_w) + AM_RANGE(0xb850, 0xb850) AM_WRITE(p1_lamps_w) AM_RANGE(0xb870, 0xb870) AM_DEVWRITE("snsnd", sn76489_device, write) /* sound */ AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END @@ -945,7 +925,7 @@ static ADDRESS_MAP_START( wcat3_map, AS_PROGRAM, 8, goldstar_state ) AM_RANGE(0xb820, 0xb823) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) /* Input/Output Ports */ AM_RANGE(0xb830, 0xb830) AM_DEVREADWRITE("aysnd", ay8910_device, data_r, data_w) AM_RANGE(0xb840, 0xb840) AM_DEVWRITE("aysnd", ay8910_device, address_w) /* no sound... only use both ports for DSWs */ - AM_RANGE(0xb850, 0xb850) AM_WRITE(lucky8_lamps_w) + AM_RANGE(0xb850, 0xb850) AM_WRITE(p1_lamps_w) AM_RANGE(0xb870, 0xb870) AM_DEVWRITE("snsnd", sn76489_device, write) /* sound */ // AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE("ppi8255_3", i8255_device, read, write) /* Other PPI initialized? */ AM_RANGE(0xd000, 0xefff) AM_ROM @@ -12898,8 +12878,8 @@ DRIVER_INIT_MEMBER(goldstar_state, wcherry) GAMEL( 199?, goldstar, 0, goldstar, goldstar, goldstar_state, goldstar, ROT0, "IGS", "Golden Star", 0, layout_goldstar ) GAMEL( 199?, goldstbl, goldstar, goldstbl, goldstar, driver_device, 0, ROT0, "IGS", "Golden Star (Blue version)", 0, layout_goldstar ) GAME( 199?, moonlght, goldstar, moonlght, goldstar, driver_device, 0, ROT0, "bootleg", "Moon Light (bootleg of Golden Star)", 0 ) -GAME( 199?, chrygld, 0, chrygld, chrygld, cb3_state, chrygld, ROT0, "bootleg", "Cherry Gold I", 0 ) -GAME( 199?, chry10, 0, chrygld, chry10, cb3_state, chry10, ROT0, "bootleg", "Cherry 10 (bootleg with PIC16F84)", 0 ) +GAMEL( 199?, chrygld, 0, chrygld, chrygld, cb3_state, chrygld, ROT0, "bootleg", "Cherry Gold I", 0, layout_chrygld ) +GAMEL( 199?, chry10, 0, chrygld, chry10, cb3_state, chry10, ROT0, "bootleg", "Cherry 10 (bootleg with PIC16F84)", 0, layout_chrygld ) GAME( 199?, goldfrui, goldstar, goldfrui, goldstar, driver_device, 0, ROT0, "bootleg", "Gold Fruit", 0 ) // maybe fullname should be 'Gold Fruit (main 40%)' GAME( 2001, super9, goldstar, super9, goldstar, goldstar_state, super9, ROT0, "Playmark", "Super Nove (Playmark)", GAME_NOT_WORKING ) // need to decode gfx and see the program loops/reset... GAME( 2001, wcherry, 0, wcherry, chrygld, goldstar_state, wcherry, ROT0, "bootleg", "Win Cherry (ver 0.16 - 19990219)", GAME_NOT_WORKING ) @@ -12914,7 +12894,7 @@ GAMEL( 199?, cb3, ncb3, ncb3, ncb3, cb3_state, cb3, GAMEL( 199?, cb3b, ncb3, cherrys, ncb3, cb3_state, cherrys, ROT0, "Dyna", "Cherry Bonus III (alt)", 0, layout_cherryb3 ) GAME( 199?, cb3c, ncb3, cb3c, chrygld, cb3_state, cb3, ROT0, "bootleg", "Cherry Bonus III (alt, set 2)", GAME_NOT_WORKING) GAMEL( 199?, cb3d, ncb3, ncb3, ncb3, driver_device, 0, ROT0, "bootleg", "Cherry Bonus III (set 3)", 0, layout_cherryb3 ) -GAMEL( 199?, cb3e, ncb3, cb3e, chrygld, cb3_state, cb3e, ROT0, "bootleg", "Cherry Bonus III (set 4, encrypted bootleg)", 0, layout_cherryb3 ) +GAMEL( 199?, cb3e, ncb3, cb3e, chrygld, cb3_state, cb3e, ROT0, "bootleg", "Cherry Bonus III (set 4, encrypted bootleg)", 0, layout_chrygld ) GAME( 1996, cmast97, ncb3, cm97, chrygld, driver_device, 0, ROT0, "Dyna", "Cherry Master '97", GAME_NOT_WORKING) // fix prom decode diff --git a/src/mame/includes/goldstar.h b/src/mame/includes/goldstar.h index ae548f1215a..80b806493d5 100644 --- a/src/mame/includes/goldstar.h +++ b/src/mame/includes/goldstar.h @@ -21,10 +21,9 @@ public: DECLARE_WRITE8_MEMBER(protection_w); DECLARE_READ8_MEMBER(protection_r); - DECLARE_WRITE8_MEMBER(lucky8_lamps_w); + DECLARE_WRITE8_MEMBER(p1_lamps_w); + DECLARE_WRITE8_MEMBER(p2_lamps_w); DECLARE_WRITE8_MEMBER(ncb3_port81_w); - DECLARE_WRITE8_MEMBER(goldstar_lamps_w); - DECLARE_WRITE8_MEMBER(cb3_lamps_w); DECLARE_WRITE8_MEMBER(cm_coincount_w); DECLARE_WRITE8_MEMBER(ladylinr_outport_w); DECLARE_WRITE8_MEMBER(goldstar_fg_vidram_w); diff --git a/src/mame/layout/bingowng.lay b/src/mame/layout/bingowng.lay index 27e21b70e4f..5a0bd24e575 100644 --- a/src/mame/layout/bingowng.lay +++ b/src/mame/layout/bingowng.lay @@ -1,12 +1,9 @@ + - - - - - - + + @@ -14,12 +11,8 @@ - - - - - - + + @@ -27,12 +20,8 @@ - - - - - - + + @@ -40,26 +29,17 @@ - - - - - - + + - - - - - - - + + @@ -67,26 +47,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/cherryb3.lay b/src/mame/layout/cherryb3.lay index 8c448019aca..72a19d4b656 100644 --- a/src/mame/layout/cherryb3.lay +++ b/src/mame/layout/cherryb3.lay @@ -156,60 +156,40 @@ - - - + - - - + - - - + - - - + + + + - - - - + - - - + + + + + - - - - - - - - - - - - - - - - - - - + + + + + @@ -221,7 +201,6 @@ - @@ -229,7 +208,6 @@ - @@ -237,7 +215,6 @@ - @@ -245,7 +222,6 @@ - @@ -253,7 +229,6 @@ - @@ -261,5 +236,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/chrygld.lay b/src/mame/layout/chrygld.lay new file mode 100644 index 00000000000..f0c98344f8d --- /dev/null +++ b/src/mame/layout/chrygld.lay @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/lucky8.lay b/src/mame/layout/lucky8.lay index f481c547fad..ef0f1b80c60 100644 --- a/src/mame/layout/lucky8.lay +++ b/src/mame/layout/lucky8.lay @@ -1,77 +1,54 @@ + - - - - - - + + - + - - - - - - + + - + - - - - - - + + - + - - - - - - + + - + - - - - - - + + - + - - - - - - - + + + @@ -83,29 +60,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.mak b/src/mame/mame.mak index edefdb39d97..79420ebb9da 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -2675,6 +2675,7 @@ $(DRIVERS)/lbeach.o: $(LAYOUT)/lbeach.lh $(DRIVERS)/goldstar.o: $(LAYOUT)/goldstar.lh \ $(LAYOUT)/bingowng.lh \ $(LAYOUT)/cherryb3.lh \ + $(LAYOUT)/chrygld.lh \ $(LAYOUT)/cmaster.lh \ $(LAYOUT)/cmasterb.lh \ $(LAYOUT)/cmasterc.lh \ From 41cfcb26c4ecbcfae6f9648dd3eec53902219d77 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 16 Mar 2015 10:29:26 +0100 Subject: [PATCH 046/201] some compilers have trouble with this (nw) --- src/osd/modules/opengl/osd_opengl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osd/modules/opengl/osd_opengl.h b/src/osd/modules/opengl/osd_opengl.h index 3e9adbb010c..829cad43bf5 100644 --- a/src/osd/modules/opengl/osd_opengl.h +++ b/src/osd/modules/opengl/osd_opengl.h @@ -91,8 +91,6 @@ #ifdef _MSC_VER extern "C" { -#else - { #endif struct osd_gl_dispatch { @@ -100,7 +98,9 @@ #include "osd_opengl.h" #undef GET_GLFUNC }; - } +#ifdef _MSC_VER + } +#endif #undef OSD_GL #undef OSD_GL_UNUSED From b1a0e0167d8655e75275f7560958580ebce2d077 Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Thu, 12 Feb 2015 10:42:02 +0100 Subject: [PATCH 047/201] ui: use per-container pixel aspect (LUA draw_text bugfix) Do not assume ui-container aspect when drawing on other containers. This fixes LUA draw_text() in multi-screens games, where the font aspect for each screen is wrongly computed on the aggregated target. Signed-off-by: Luca Bruno --- src/emu/render.c | 39 +++++++++++++++++++++++++++------------ src/emu/render.h | 2 +- src/emu/ui/ui.c | 4 ++-- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/emu/render.c b/src/emu/render.c index 2eed9176550..46ae77e8909 100644 --- a/src/emu/render.c +++ b/src/emu/render.c @@ -2483,26 +2483,41 @@ render_target *render_manager::target_by_index(int index) const // fonts //------------------------------------------------- -float render_manager::ui_aspect() +float render_manager::ui_aspect(render_container *rc) { - int orient = orientation_add(m_ui_target->orientation(), m_ui_container->orientation()); + int orient = 0; + float aspect = 1.0f; - // based on the orientation of the target, compute height/width or width/height - float aspect; - if (!(orient & ORIENTATION_SWAP_XY)) - aspect = (float)m_ui_target->height() / (float)m_ui_target->width(); - else - aspect = (float)m_ui_target->width() / (float)m_ui_target->height(); + if (rc == m_ui_container || rc == NULL) { + // ui container, aggregated multi-screen target - // if we have a valid pixel aspect, apply that and return - if (m_ui_target->pixel_aspect() != 0.0f) - return aspect / m_ui_target->pixel_aspect(); + orient = orientation_add(m_ui_target->orientation(), m_ui_container->orientation()); + // based on the orientation of the target, compute height/width or width/height + if (!(orient & ORIENTATION_SWAP_XY)) + aspect = (float)m_ui_target->height() / (float)m_ui_target->width(); + else + aspect = (float)m_ui_target->width() / (float)m_ui_target->height(); - // if not, clamp for extreme proportions + // if we have a valid pixel aspect, apply that and return + if (m_ui_target->pixel_aspect() != 0.0f) + return (aspect / m_ui_target->pixel_aspect()); + } else { + // single screen container + + orient = rc->orientation(); + // based on the orientation of the target, compute height/width or width/height + if (!(orient & ORIENTATION_SWAP_XY)) + aspect = (float)rc->screen()->visible_area().height() / (float)rc->screen()->visible_area().width(); + else + aspect = (float)rc->screen()->visible_area().width() / (float)rc->screen()->visible_area().height(); + } + + // clamp for extreme proportions if (aspect < 0.66f) aspect = 0.66f; if (aspect > 1.5f) aspect = 1.5f; + return aspect; } diff --git a/src/emu/render.h b/src/emu/render.h index 2ee8e108a09..bf058258577 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -744,7 +744,7 @@ public: // UI targets render_target &ui_target() const { assert(m_ui_target != NULL); return *m_ui_target; } void set_ui_target(render_target &target) { m_ui_target = ⌖ } - float ui_aspect(); + float ui_aspect(render_container *rc = NULL); // UI containers render_container &ui_container() const { assert(m_ui_container != NULL); return *m_ui_container; } diff --git a/src/emu/ui/ui.c b/src/emu/ui/ui.c index 664775f2b1b..b968937cbea 100644 --- a/src/emu/ui/ui.c +++ b/src/emu/ui/ui.c @@ -456,7 +456,7 @@ void ui_manager::update_and_render(render_container *container) { float mouse_y=-1,mouse_x=-1; if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y)) { - container->add_quad(mouse_x,mouse_y,mouse_x + 0.05*container->manager().ui_aspect(),mouse_y + 0.05,UI_TEXT_COLOR,m_mouse_arrow_texture,PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container->add_quad(mouse_x,mouse_y,mouse_x + 0.05*container->manager().ui_aspect(container),mouse_y + 0.05,UI_TEXT_COLOR,m_mouse_arrow_texture,PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } } } @@ -600,7 +600,7 @@ void ui_manager::draw_text_full(render_container *container, const char *origs, const char *linestart; float cury = y; float maxwidth = 0; - float aspect = machine().render().ui_aspect(); + float aspect = machine().render().ui_aspect(container); // if we don't want wrapping, guarantee a huge wrapwidth if (wrap == WRAP_NEVER) From 05609ab9b1504a2ba62a6a23955590c82fd3865d Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Mon, 9 Mar 2015 08:43:17 +0100 Subject: [PATCH 048/201] luaengine: clip screen coordinates to screen size Several users reported that negative coordinates are wrongly handled. This happens because we assumed using unsigned values only, while unfortunately in many real cases negative values happen when tracking objects partly off-screen. This patch makes all screen drawing methods accept unsigned values, but crop them between 0 and screen size values. Signed-off-by: Luca Bruno --- src/emu/luaengine.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/emu/luaengine.c b/src/emu/luaengine.c index 59eae3870d5..f066bdeda6d 100644 --- a/src/emu/luaengine.c +++ b/src/emu/luaengine.c @@ -639,11 +639,13 @@ int lua_engine::lua_screen::l_draw_box(lua_State *L) luaL_argcheck(L, lua_isnumber(L, 7), 7, "outline color (integer) expected"); // retrieve all parameters + int sc_width = sc->visible_area().width(); + int sc_height = sc->visible_area().height(); float x1, y1, x2, y2; - x1 = MIN(lua_tounsigned(L, 2) / static_cast(sc->visible_area().width()) , 1.0f); - y1 = MIN(lua_tounsigned(L, 3) / static_cast(sc->visible_area().height()), 1.0f); - x2 = MIN(lua_tounsigned(L, 4) / static_cast(sc->visible_area().width()) , 1.0f); - y2 = MIN(lua_tounsigned(L, 5) / static_cast(sc->visible_area().height()), 1.0f); + x1 = MIN(MAX(0, lua_tointeger(L, 2)), sc_width-1) / static_cast(sc_width); + y1 = MIN(MAX(0, lua_tointeger(L, 3)), sc_height-1) / static_cast(sc_height); + x2 = MIN(MAX(0, lua_tointeger(L, 4)), sc_width-1) / static_cast(sc_width); + y2 = MIN(MAX(0, lua_tointeger(L, 5)), sc_height-1) / static_cast(sc_height); UINT32 bgcolor = lua_tounsigned(L, 6); UINT32 fgcolor = lua_tounsigned(L, 7); @@ -675,11 +677,13 @@ int lua_engine::lua_screen::l_draw_line(lua_State *L) luaL_argcheck(L, lua_isnumber(L, 6), 6, "color (integer) expected"); // retrieve all parameters + int sc_width = sc->visible_area().width(); + int sc_height = sc->visible_area().height(); float x1, y1, x2, y2; - x1 = MIN(lua_tounsigned(L, 2) / static_cast(sc->visible_area().width()) , 1.0f); - y1 = MIN(lua_tounsigned(L, 3) / static_cast(sc->visible_area().height()), 1.0f); - x2 = MIN(lua_tounsigned(L, 4) / static_cast(sc->visible_area().width()) , 1.0f); - y2 = MIN(lua_tounsigned(L, 5) / static_cast(sc->visible_area().height()), 1.0f); + x1 = MIN(MAX(0, lua_tointeger(L, 2)), sc_width-1) / static_cast(sc_width); + y1 = MIN(MAX(0, lua_tointeger(L, 3)), sc_height-1) / static_cast(sc_height); + x2 = MIN(MAX(0, lua_tointeger(L, 4)), sc_width-1) / static_cast(sc_width); + y2 = MIN(MAX(0, lua_tointeger(L, 5)), sc_height-1) / static_cast(sc_height); UINT32 color = lua_tounsigned(L, 6); // draw the line @@ -705,8 +709,10 @@ int lua_engine::lua_screen::l_draw_text(lua_State *L) luaL_argcheck(L, lua_isstring(L, 4), 4, "message (string) expected"); // retrieve all parameters - float x = MIN(lua_tounsigned(L, 2) / static_cast(sc->visible_area().width()) , 1.0f); - float y = MIN(lua_tounsigned(L, 3) / static_cast(sc->visible_area().height()), 1.0f); + int sc_width = sc->visible_area().width(); + int sc_height = sc->visible_area().height(); + float x = MIN(MAX(0, lua_tointeger(L, 2)), sc_width-1) / static_cast(sc_width); + float y = MIN(MAX(0, lua_tointeger(L, 3)), sc_height-1) / static_cast(sc_height); const char *msg = luaL_checkstring(L,4); // TODO: add optional parameters (colors, etc.) From 3147b2ebeb72a0bc58d0f82942991535d70de90f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Mon, 16 Mar 2015 11:53:50 +0100 Subject: [PATCH 049/201] fixed nltool linking with Visual Studio (nw) --- src/tools/tools.mak | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tools/tools.mak b/src/tools/tools.mak index 85a8fecc114..ada7c290a49 100644 --- a/src/tools/tools.mak +++ b/src/tools/tools.mak @@ -217,7 +217,8 @@ NLTOOLOBJS = \ $(TOOLSOBJ)/nltool.o \ $(NETLISTOBJS) \ -$(BIN)nltool$(EXE): $(NLTOOLOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) $(EXPAT) +# TODO: Visual Studio wants $(FLAC_LIB) and $(7Z_LIB) during linking... +$(BIN)nltool$(EXE): $(NLTOOLOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) $(EXPAT) $(FLAC_LIB) $(7Z_LIB) @echo Linking $@... $(LD) $(LDFLAGS) $^ $(BASELIBS) -o $@ From 1fa8b4ea4febee62516ea45a57568d0274cbd09a Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Mon, 16 Mar 2015 11:35:38 +0100 Subject: [PATCH 050/201] docs: add initial documentation for luaengine API This commits add some initial documentation for current API exposed via luaengine. This doc is meant to be a quick walkthrough for script writers coming from mame-rr. Full methods reference is not yet included, as the API is still rapidly changing. Signed-off-by: Luca Bruno --- docs/luaengine.md | 154 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 docs/luaengine.md diff --git a/docs/luaengine.md b/docs/luaengine.md new file mode 100644 index 00000000000..c2f2b961492 --- /dev/null +++ b/docs/luaengine.md @@ -0,0 +1,154 @@ +# Scripting MAME via LUA + +## Introduction + +It is now possible to externally drive MAME via LUA scripts. +This feature initially appeared in version 0.148, when a minimal `luaengine` +was implemented. Nowadays, the LUA interface is rich enough +to let you inspect and manipulate devices state, access CPU +registers, read and write memory, and draw a custom HUD on screen. + +Internally, MAME makes extensive use of `luabridge` to implement +this feature: the idea is to transparently expose as many of +the useful internals as possible. + +Finally, a warning: LUA API is not yet declared stable and may +suddenly change without prior notice. +However, we expose methods to let you know at runtime which API +version you are running against, and you can introspect most of the +objects at runtime. + +## Features + +The API is not yet complete, but this is a partial list of capabilities +currently available to LUA scripts: + + * machine metadata (app version, current rom, rom details) + * machine control (starting, pausing, resetting, stopping) + * machine hooks (on frame painting and on user events) + * devices introspection (device tree listing, memory and register enumeration) + * screens introspection (screens listing, screen details, frames counting) + * screen HUD drawing (text, lines, boxes on multiple screens) + * memory read/write (8/16/32/64 bits, signed and unsigned) + * registers and states control (states enumeration, get and set) + +## Usage + +MAME supports external scripting via LUA (>= 5.3) scripts, either +written on the interactive console or loaded as a file. +To reach the console, just run MAME with `-console`; you will be +greeted by a naked `>` prompt where you can input your script. + +To load a whole script at once, store it in a plaintext file and +pass it via the `-autoboot_script`. Please note that script +loading may be delayed (few seconds by default), but you can +override the default with the `-autoboot_delay` argument. + +To control the execution of your code, you can use a loop-based or +an event-based approach. The former is not encouraged as it is +resource-intensive and makes control flow unnecessarily complex. +Instead, we suggest to register custom hooks to be invoked on specific +events (eg. at each frame rendering). + +## Walktrough + +Let's first run MAME in a terminal to reach the LUA console: +``` +$ mame -console YOUR_ROM +M.A.M.E. v0.158 (Feb 5 2015) - Multiple Arcade Machine Emulator +Copyright Nicola Salmoria and the MAME team +Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio + +> +``` + +At this point, your game is probably running in demo mode, let's pause it: +``` +> emu.pause() +> +``` +Even without textual feedback on the console, you'll notice the game is now paused. +In general, commands are quiet and only print back error messages. + +You can check at runtime which version of MAME you are running, with: +``` +> print(emu.app_name() .. " " .. emu.app_version()) +mame 0.158 +``` + +We now start exploring screen related methods. First, let's enumerate available screens: +``` +> for i,v in pairs(manager:machine().screens) do print(i) end +:screen +``` + +`manager:machine()` is the root object of your currently running machine: +we will be using this often. `screens` is a table with all available screens; +most machines only have one main screen. +In our case, the main and only screen is tagged as `:screen`, and we can further +inspect it: +``` +> -- let's define a shorthand for the main screen +> s = manager:machine().screens[":screen"] +> print(s:width() .. "x" .. s:height()) +320x224 +``` + +We have several methods to draw on the screen a HUD composed of lines, boxes and text: +``` +> -- we define a HUD-drawing function, and then call it +> function draw_hud() +>> s:draw_text(40, 40, "foo"); -- (x0, y0, msg) +>> s:draw_box(20, 20, 80, 80, 0, 0xff00ffff); -- (x0, y0, x1, y1, fill-color, line-color) +>> s:draw_line(20, 20, 80, 80, 0xff00ffff); -- (x0, y0, x1, y1, line-color) +>> end +> draw_hud(); +``` + +This will draw some useless art on the screen. However, when unpausing the game, your HUD +needs to be refreshed otherwise it will just disappear. In order to do this, you have to register +your hook to be called on every frame repaint: +``` +> emu.sethook(draw_hud, "frame") +``` + +Similarly to screens, you can inspect all the devices attached to a +machine: +``` +> for k,v in pairs(manager:machine().devices) do print(k) end +:audiocpu +:maincpu +:saveram +:screen +:palette +[...] +``` + +On some of them, you can also inspect and manipulate memory and state: +``` +> cpu = manager:machine().devices[":maincpu"] +> -- enumerate, read and write state registers +> for k,v in pairs(cpu.state) do print(k) end +D5 +SP +A4 +A3 +D0 +PC +[...] +> print(cpu.state["D0"].value) +303 +> cpu.state["D0"].value = 255 +> print(cpu.state["D0"].value) +255 +``` + +``` +> -- inspect memory +> for k,v in pairs(cpu.spaces) do print(k) end +program +> mem = cpu.spaces["program"] +> print(mem:read_i8(0xC000)) +41 +``` + From 9b2a16c12faef045602b4eb3cab06fe1e70e0ee4 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 16 Mar 2015 17:37:07 +0100 Subject: [PATCH 051/201] Added ability to completely disable MIDI [qmc2] (nw) --- src/osd/modules/lib/osdobj_common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/osd/modules/lib/osdobj_common.c b/src/osd/modules/lib/osdobj_common.c index 222a7d0aca6..f9ce3321cbf 100644 --- a/src/osd/modules/lib/osdobj_common.c +++ b/src/osd/modules/lib/osdobj_common.c @@ -179,7 +179,9 @@ void osd_common_t::register_options() REGISTER_MODULE(m_mod_man, NETDEV_PCAP); REGISTER_MODULE(m_mod_man, NETDEV_NONE); +#ifndef NO_USE_MIDI REGISTER_MODULE(m_mod_man, MIDI_PM); +#endif REGISTER_MODULE(m_mod_man, MIDI_NONE); // after initialization we know which modules are supported From 71bff813e4ecaf3303ee9f6479519f1bb4770733 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Mar 2015 19:49:04 +0100 Subject: [PATCH 052/201] note --- src/mess/drivers/hh_tms1k.c | 15 ++++++++++----- src/mess/drivers/hh_ucom4.c | 3 ++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 219a0311129..da9218581e3 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -15,6 +15,7 @@ @MP0905B TMS0970 1977, Parker Brothers Codename Sector *MP0168 TMS1000? 1979, Conic Basketball @MP0914 TMS1000 1979, Entex Baseball 1 + *MP0923 TMS1000? 1979, Entex Baseball 2 @MP1030 TMS1100 1980, APF Mathemagician @MP1204 TMS1100 1980, Entex Baseball 3 *MP1221 TMS1100 1980, Entex Raise The Devil @@ -22,7 +23,7 @@ *MP2788 ? 1980, Bandai Flight Time @MP3226 TMS1000 1978, Milton Bradley Simon *MP3320A TMS1000 1979, Coleco Head to Head Basketball - MP3403 TMS1100 1978, Marx Electronic Bowling + MP3403 TMS1100 1978, Marx Electronic Bowling -> elecbowl.c @MP3404 TMS1100 1978, Parker Brothers Merlin @MP3405 TMS1100 1979, Coleco Amaze-A-Tron @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command @@ -32,6 +33,7 @@ MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster MP3474 TMS1100 1979, MicroVision cartridge: Vegas Slots MP3475 TMS1100 1979, MicroVision cartridge: Bowling + *MP3476 TMS1100? 1979, Milton Bradley Super Simon MP3479 TMS1100 1980, MicroVision cartridge: Baseball MP3481 TMS1100 1979, MicroVision cartridge: Connect Four MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel @@ -2358,7 +2360,7 @@ CONS( 1981, tc4, 0, 0, tc4, tc4, driver_device, 0, "Col CONS( 1979, ebball, 0, 0, ebball, ebball, driver_device, 0, "Entex", "Electronic Baseball (Entex)", GAME_SUPPORTS_SAVE ) CONS( 1980, ebball3, 0, 0, ebball3, ebball3, driver_device, 0, "Entex", "Electronic Baseball 3 (Entex)", GAME_SUPPORTS_SAVE ) -CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE ) // unplayable without game cards +CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE ) // *** CONS( 1979, starwbc, 0, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command", GAME_SUPPORTS_SAVE ) CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Kenner", "Star Wars - Electronic Battle Command (prototype)", GAME_SUPPORTS_SAVE ) @@ -2366,11 +2368,14 @@ CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Ken CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE ) -CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // unplayable without writing board +CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // *** CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin - The Electronic Wizard", GAME_SUPPORTS_SAVE ) -CONS( 1979, stopthie, 0, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE ) // unplayable without game board +CONS( 1979, stopthie, 0, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner)", GAME_SUPPORTS_SAVE ) // *** CONS( 1979, stopthiep, stopthie, 0, stopthief, stopthief, driver_device, 0, "Parker Brothers", "Stop Thief (Electronic Crime Scanner) (prototype)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) CONS( 1980, bankshot, 0, 0, bankshot, bankshot, driver_device, 0, "Parker Brothers", "Bank Shot - Electronic Pool", GAME_SUPPORTS_SAVE ) CONS( 1980, splitsec, 0, 0, splitsec, splitsec, driver_device, 0, "Parker Brothers", "Split Second", GAME_SUPPORTS_SAVE ) -CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE ) // partially unplayable without cards/dice/.. +CONS( 1981, tandy12, 0, 0, tandy12, tandy12, driver_device, 0, "Tandy Radio Shack", "Tandy-12: Computerized Arcade", GAME_SUPPORTS_SAVE ) // some of the minigames: *** + +// ***: As far as MESS is concerned, the game is emulated fine. But for it to be playable, it requires interaction +// with other, unemulatable, things eg. game board/pieces, playing cards, pen & paper, etc. diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index c52ffb8ed88..c31c962d08f 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -17,10 +17,11 @@ *102 uPD553C 1981, Bandai Block Out *127 uPD650C 198? Sony OA-S1100 Typecorder (subcpu, have dump) *128 uPD650C 1982, Roland TR-606 - 133 uPD650C 1982, Roland TB-303 + 133 uPD650C 1982, Roland TB-303 -> tb303.c @160 uPD553C 1982, Tomy Pac Man (TN-08) @202 uPD553C 1982, Epoch Astro Command @206 uPD553C 1982, Epoch Dracula + *209 uPD553C 1982, Tomy Caveman (TN-12) @258 uPD553C 1984, Tomy Alien Chase (TN-16) (* denotes not yet emulated by MESS, @ denotes it's in this driver) From bbffffe91e221c7e70f278e15a21d8589f269675 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 16 Mar 2015 21:32:30 +0100 Subject: [PATCH 053/201] fix hmcs40 interrupt bug --- src/emu/cpu/hmcs40/hmcs40.c | 4 ++-- src/mess/drivers/hh_tms1k.c | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index bbf4b4327bd..66663da73c0 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -556,8 +556,8 @@ void hmcs40_cpu_device::execute_run() if ((m_prev_op & 0x3e0) == 0x340) m_pc = ((m_page << 6) | (m_pc & 0x3f)) & m_pcmask; - // check/handle interrupt - else if (m_ie && (m_iri || m_irt)) + // check/handle interrupt, but not in the middle of a long jump + if (m_ie && (m_iri || m_irt) && (m_op & 0x3e0) != 0x340) do_interrupt(); // remember previous state diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index da9218581e3..6e86d6489f3 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -17,8 +17,10 @@ @MP0914 TMS1000 1979, Entex Baseball 1 *MP0923 TMS1000? 1979, Entex Baseball 2 @MP1030 TMS1100 1980, APF Mathemagician + *MP1133 ? 1979, Kosmos Astro @MP1204 TMS1100 1980, Entex Baseball 3 *MP1221 TMS1100 1980, Entex Raise The Devil + *MP1312 TMS1100 198?, Tandy/RadioShack Science Fair Microcomputer Trainer *MP2139 ? 1982, Gakken Galaxy Invader 1000 *MP2788 ? 1980, Bandai Flight Time @MP3226 TMS1000 1978, Milton Bradley Simon @@ -33,10 +35,13 @@ MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster MP3474 TMS1100 1979, MicroVision cartridge: Vegas Slots MP3475 TMS1100 1979, MicroVision cartridge: Bowling - *MP3476 TMS1100? 1979, Milton Bradley Super Simon + *MP3476 TMS1100 1979, Milton Bradley Super Simon MP3479 TMS1100 1980, MicroVision cartridge: Baseball MP3481 TMS1100 1979, MicroVision cartridge: Connect Four MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel + M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders (note: MP3498, MP3499, M34000, ..) + M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter + M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster @MP6100A TMS0980 1979, Ideal Electronic Detective @MP6101B TMS0980 1979, Parker Brothers Stop Thief *MP6361 ? 1983, Defender Strikes @@ -48,11 +53,7 @@ inconsistent: - M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders - M34017 TMS1100 1981, MicroVision cartridge: Cosmic Hunter - M34047 TMS1100 1982, MicroVision cartridge: Super Blockbuster - - @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) + @CD7282SL TMS1100 1981, Tandy/RadioShack Tandy-12 (serial is similar to TI Speak & Spell series?) (* denotes not yet emulated by MESS, @ denotes it's in this driver) From a9a20f08892ecb4232b6665ef893a5704eaf7dff Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 16 Mar 2015 17:44:09 -0500 Subject: [PATCH 054/201] (mess) m24: keyboard [Carl, any] --- src/mess/drivers/m24.c | 56 ++++--- src/mess/machine/m24_kbd.c | 290 +++++++++++++++++++++++++++++++++++++ src/mess/machine/m24_kbd.h | 45 ++++++ src/mess/mess.mak | 1 + 4 files changed, 375 insertions(+), 17 deletions(-) create mode 100644 src/mess/machine/m24_kbd.c create mode 100644 src/mess/machine/m24_kbd.h diff --git a/src/mess/drivers/m24.c b/src/mess/drivers/m24.c index ff388e6a1b2..b29edcf54ae 100644 --- a/src/mess/drivers/m24.c +++ b/src/mess/drivers/m24.c @@ -4,7 +4,7 @@ #include "cpu/tms7000/tms7000.h" #include "bus/isa/isa.h" #include "bus/isa/isa_cards.h" -#include "machine/pckeybrd.h" +#include "machine/m24_kbd.h" #include "machine/mm58274c.h" #include "includes/genpc.h" @@ -15,11 +15,13 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_mb(*this, "mb"), - m_kbc(*this, "kbc") + m_kbc(*this, "kbc"), + m_keyboard(*this, "keyboard") { } required_device m_maincpu; required_device m_mb; required_device m_kbc; + required_device m_keyboard; DECLARE_READ8_MEMBER(keyboard_r); DECLARE_WRITE8_MEMBER(keyboard_w); @@ -27,19 +29,30 @@ public: DECLARE_WRITE8_MEMBER(pb_w); DECLARE_READ8_MEMBER(kbcdata_r); DECLARE_WRITE8_MEMBER(kbcdata_w); + DECLARE_WRITE_LINE_MEMBER(kbcin_w); - UINT8 m_sysctl, m_pa, m_kbcdata; - bool m_kbcibf; + void machine_reset(); + + UINT8 m_sysctl, m_pa, m_kbcin, m_kbcout; + bool m_kbcibf, m_kbdata; }; +void m24_state::machine_reset() +{ + m_sysctl = 0; + m_pa = 0x40; + m_kbcibf = false; + m_kbdata = true; +} + READ8_MEMBER(m24_state::keyboard_r) { switch(offset) { case 0: - m_pa &= ~0x40; + m_pa |= 0x40; m_mb->m_pic8259->ir1_w(0); - return m_kbcdata; + return m_kbcout; case 1: return m_sysctl; case 2: @@ -57,41 +70,49 @@ WRITE8_MEMBER(m24_state::keyboard_w) case 0: m_kbc->set_input_line(TMS7000_INT1_LINE, ASSERT_LINE); m_kbcibf = true; - m_kbcdata = data; + m_kbcin = data; break; case 1: m_sysctl = data; m_mb->m_pit8253->write_gate2(BIT(data, 0)); m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); if(BIT(data, 6)) - m_pa |= 2; + m_pa |= 4; else - m_pa &= ~2; + m_pa &= ~4; break; } } READ8_MEMBER(m24_state::pa_r) { - return m_pa; + return m_pa & (m_kbdata ? 0xff : 0xfd); } WRITE8_MEMBER(m24_state::pb_w) { + m_keyboard->clock_w(!BIT(data, 0)); + m_keyboard->data_w(!BIT(data, 1)); + m_pa = (m_pa & ~3) | (~data & 3); } READ8_MEMBER(m24_state::kbcdata_r) { m_kbc->set_input_line(TMS7000_INT1_LINE, CLEAR_LINE); m_kbcibf = false; - return m_kbcdata; + return m_kbcin; } WRITE8_MEMBER(m24_state::kbcdata_w) { - m_pa |= 0x40; + m_pa &= ~0x40; m_mb->m_pic8259->ir1_w(1); - m_kbcdata = data; + m_kbcout = data; +} + +WRITE_LINE_MEMBER(m24_state::kbcin_w) +{ + m_kbdata = state; } static ADDRESS_MAP_START( m24_map, AS_PROGRAM, 16, m24_state ) @@ -159,8 +180,6 @@ static INPUT_PORTS_START( m24 ) PORT_DIPSETTING( 0x4000, "2" ) PORT_DIPSETTING( 0x8000, "3" ) PORT_DIPSETTING( 0xc000, "4" ) - - PORT_INCLUDE(pc_keyboard) INPUT_PORTS_END static MACHINE_CONFIG_START( olivetti, m24_state ) @@ -185,6 +204,9 @@ static MACHINE_CONFIG_START( olivetti, m24_state ) MCFG_CPU_PROGRAM_MAP(kbc_map) MCFG_CPU_IO_MAP(kbc_io) + MCFG_DEVICE_ADD("keyboard", M24_KEYBOARD, 0) + MCFG_M24_KEYBOARD_OUT_DATA_HANDLER(WRITELINE(m24_state, kbcin_w)) + MCFG_DEVICE_ADD("mm58174an", MM58274C, 0) MCFG_MM58274C_MODE24(1) // ? MCFG_MM58274C_DAY1(1) // ? @@ -199,7 +221,7 @@ ROM_START( m24 ) ROMX_LOAD("olivetti_m24_version_1.43_low.bin", 0x4000, 0x2000, CRC(ff7e0f10) SHA1(13423011a9bae3f3193e8c199f98a496cab48c0f), ROM_SKIP(1)) ROM_REGION(0x800, "kbc", 0) - ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) + ROM_LOAD("pdbd.tms2516.keyboardmcureplacementdaughterboard_10u", 0x000, 0x800, CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) ROM_END ROM_START( m240 ) @@ -209,7 +231,7 @@ ROM_START( m240 ) // is this one the same? ROM_REGION(0x800, "kbc", 0) - ROM_LOAD("PDBD.tms2516.KeyboardMCUReplacementDaughterboard_10U", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) + ROM_LOAD("pdbd.tms2516.keyboardmcureplacementdaughterboard_10u", 0x000, 0x800, BAD_DUMP CRC(b8c4c18a) SHA1(25b4c24e19ff91924c53557c66513ab242d926c6)) ROM_END COMP( 1983, m24, ibm5150, 0, olivetti, m24, driver_device, 0, "Olivetti", "M24", GAME_NOT_WORKING) diff --git a/src/mess/machine/m24_kbd.c b/src/mess/machine/m24_kbd.c new file mode 100644 index 00000000000..5a60d22e555 --- /dev/null +++ b/src/mess/machine/m24_kbd.c @@ -0,0 +1,290 @@ +#include "m24_kbd.h" + +const device_type M24_KEYBOARD = &device_creator; + +ROM_START( m24_keyboard ) + ROM_REGION(0x800, "mcu", 0) + ROM_LOAD("m24_8049_int.bin", 0x0000, 0x800, CRC(ef26ca15) SHA1(b5076d40c255e17dc93478e2254ea19aff4918b3)) +ROM_END + + +const rom_entry *m24_keyboard_device::device_rom_region() const +{ + return ROM_NAME( m24_keyboard ); +} + +static ADDRESS_MAP_START( m24_keyboard_io, AS_IO, 8, m24_keyboard_device ) + AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(bus_w) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(p1_r, p1_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READ(p2_r) AM_WRITENOP + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_r) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( m24_keyboard ) + MCFG_CPU_ADD("mcu", I8049, XTAL_6MHz) + MCFG_CPU_IO_MAP(m24_keyboard_io) +MACHINE_CONFIG_END + +machine_config_constructor m24_keyboard_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( m24_keyboard ); +} + +INPUT_PORTS_START( m24_keyboard ) + PORT_START("ROW.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + + PORT_START("ROW.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + 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_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + + PORT_START("ROW.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + + PORT_START("ROW.3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + + PORT_START("ROW.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + + PORT_START("ROW.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + 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_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + + PORT_START("ROW.6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + 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_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + + PORT_START("ROW.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') 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_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + + PORT_START("ROW.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + + PORT_START("ROW.9") + 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_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('?') PORT_CHAR('/') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + + PORT_START("ROW.10") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.11") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.12") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.13") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.14") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ROW.15") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Unknown 0x2A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + + PORT_START("MOUSEBTN") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Btn") PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Middle Btn") PORT_CODE(MOUSECODE_BUTTON3) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Btn") PORT_CODE(MOUSECODE_BUTTON2) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + +ioport_constructor m24_keyboard_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( m24_keyboard ); +} + +m24_keyboard_device::m24_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, M24_KEYBOARD, "Olivetti M24 Keyboard", tag, owner, clock, "m24_kbd", __FILE__), + m_rows(*this, "ROW"), + m_mousebtn(*this, "MOUSEBTN"), + m_out_data(*this), + m_mcu(*this, "mcu") +{ +} + +void m24_keyboard_device::device_start() +{ + m_out_data.resolve_safe(); + m_out_data(1); + m_reset_timer = timer_alloc(); +} + +void m24_keyboard_device::device_reset() +{ + m_kbcdata = true; +} + +void m24_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + m_out_data(1); +} + +READ8_MEMBER( m24_keyboard_device::p1_r ) +{ + return m_p1 | (m_kbcdata ? 0 : 2); +} + +WRITE8_MEMBER( m24_keyboard_device::p1_w ) +{ + // bit 3 and 4 are leds and bits 6 and 7 are jumpers to ground + m_p1 = data & ~0xc0; + if(m_p1 & 4) + m_p1 |= 2; + else + m_p1 &= ~2; + m_out_data(!BIT(data, 2)); +} + +READ8_MEMBER( m24_keyboard_device::p2_r ) +{ + return (m_keypress << 7) | m_mousebtn->read(); +} + +READ8_MEMBER( m24_keyboard_device::t0_r ) +{ + return 0; +} + +READ8_MEMBER( m24_keyboard_device::t1_r ) +{ + return 0; +} + +WRITE8_MEMBER( m24_keyboard_device::bus_w ) +{ + UINT8 col = m_rows[(data >> 3) & 0xf]->read(); + m_keypress = (col & (1 << (data & 7))) ? 1 : 0; +} + +WRITE_LINE_MEMBER( m24_keyboard_device::clock_w ) +{ + m_mcu->set_input_line(MCS48_INPUT_IRQ, !state); + if(!state) + m_reset_timer->adjust(attotime::from_msec(50)); + else + { + m_reset_timer->adjust(attotime::never); + m_mcu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + } +} + +WRITE_LINE_MEMBER( m24_keyboard_device::data_w ) +{ + m_kbcdata = state; +} diff --git a/src/mess/machine/m24_kbd.h b/src/mess/machine/m24_kbd.h new file mode 100644 index 00000000000..6a5dac2c6f7 --- /dev/null +++ b/src/mess/machine/m24_kbd.h @@ -0,0 +1,45 @@ +#ifndef M24KBD_H_ +#define M24KBD_H_ + +#include "emu.h" +#include "cpu/mcs48/mcs48.h" + +#define MCFG_M24_KEYBOARD_OUT_DATA_HANDLER(_devcb) \ + devcb = &m24_keyboard_device::set_out_data_handler(*device, DEVCB_##_devcb); + +class m24_keyboard_device : public device_t +{ +public: + m24_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template static devcb_base &set_out_data_handler(device_t &device, _Object object) { return downcast(device).m_out_data.set_callback(object); } + + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + + void device_start(); + void device_reset(); + void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + DECLARE_WRITE8_MEMBER(bus_w); + DECLARE_READ8_MEMBER(p1_r); + DECLARE_WRITE8_MEMBER(p1_w); + DECLARE_READ8_MEMBER(p2_r); + DECLARE_READ8_MEMBER(t0_r); + DECLARE_READ8_MEMBER(t1_r); + DECLARE_WRITE_LINE_MEMBER(clock_w); + DECLARE_WRITE_LINE_MEMBER(data_w); +private: + required_ioport_array<16> m_rows; + required_ioport m_mousebtn; + UINT8 m_p1; + bool m_keypress, m_kbcdata; + devcb_write_line m_out_data; + required_device m_mcu; + emu_timer *m_reset_timer; +}; + +extern const device_type M24_KEYBOARD; + +#endif /* M24KBD_H_ */ diff --git a/src/mess/mess.mak b/src/mess/mess.mak index b26b547f594..0fe95ee9534 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1477,6 +1477,7 @@ $(MESSOBJ)/novag.a: \ $(MESSOBJ)/olivetti.a: \ $(MESS_DRIVERS)/m20.o \ $(MESS_DRIVERS)/m24.o \ + $(MESS_MACHINE)/m24_kbd.o \ $(MESSOBJ)/omnibyte.a: \ $(MESS_DRIVERS)/msbc1.o \ From 672ce6c666a14418467c370ece126ce240da523b Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Mon, 16 Mar 2015 17:35:10 -0700 Subject: [PATCH 055/201] debugwin.c: avoid race condition where debugger window update request is made before debugger is initialised [Peter Ferrie] --- src/osd/modules/debugger/debugwin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/modules/debugger/debugwin.c b/src/osd/modules/debugger/debugwin.c index 1ae50bc3c8d..73bcd59c6e3 100644 --- a/src/osd/modules/debugger/debugwin.c +++ b/src/osd/modules/debugger/debugwin.c @@ -154,7 +154,7 @@ void debugger_windows::wait_for_debugger(device_t &device, bool firststop) void debugger_windows::debugger_update() { // if we're running live, do some checks - if (!winwindow_has_focus() && !debug_cpu_is_stopped(*m_machine) && (m_machine->phase() == MACHINE_PHASE_RUNNING)) + if (!winwindow_has_focus() && m_machine && !debug_cpu_is_stopped(*m_machine) && (m_machine->phase() == MACHINE_PHASE_RUNNING)) { // see if the interrupt key is pressed and break if it is if (seq_pressed()) From 4f68f47d3a6fb103da2248d8e87861bcd853f421 Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Tue, 17 Mar 2015 01:45:24 +0100 Subject: [PATCH 056/201] i960: guess, pretty unlikely that cosr opcode uses sine ... (nw) --- src/emu/cpu/i960/i960.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emu/cpu/i960/i960.c b/src/emu/cpu/i960/i960.c index 74666a6671e..8ddd2b6ec3e 100644 --- a/src/emu/cpu/i960/i960.c +++ b/src/emu/cpu/i960/i960.c @@ -1436,7 +1436,7 @@ void i960_cpu_device::execute_op(UINT32 opcode) case 0xd: // cosr m_icount -= 406; t1f = get_1_rif(opcode); - set_rif(opcode, sin(t1f)); + set_rif(opcode, cos(t1f)); break; case 0xe: // tanr From c14b7008256da37f3c1a947276eb47f1a37e7d26 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Tue, 17 Mar 2015 11:08:12 +0100 Subject: [PATCH 057/201] Sync with latest (nw) --- 3rdparty/bgfx/README.md | 31 +- .../bgfx/examples/08-update/fs_update_3d.sc | 17 + 3rdparty/bgfx/examples/08-update/update.cpp | 72 ++- .../bgfx/examples/common/entry/entry_osx.mm | 4 +- .../bgfx/examples/common/entry/entry_sdl.cpp | 33 +- 3rdparty/bgfx/examples/common/imgui/imgui.cpp | 174 +++--- 3rdparty/bgfx/examples/common/imgui/imgui.h | 3 +- .../bgfx/examples/common/nanovg/nanovg.cpp | 11 +- 3rdparty/bgfx/examples/common/nanovg/nanovg.h | 3 +- .../examples/common/nanovg/nanovg_bgfx.cpp | 7 +- .../runtime/shaders/dx11/fs_update_3d.bin | Bin 0 -> 489 bytes .../runtime/shaders/dx9/fs_update_3d.bin | Bin 0 -> 410 bytes .../runtime/shaders/gles/fs_update_3d.bin | Bin 0 -> 374 bytes .../runtime/shaders/glsl/fs_update_3d.bin | Bin 0 -> 306 bytes 3rdparty/bgfx/scripts/bgfx.lua | 5 + 3rdparty/bgfx/src/renderer_d3d11.cpp | 44 +- 3rdparty/bgfx/src/renderer_d3d9.h | 2 +- 3rdparty/bgfx/src/renderer_gl.cpp | 121 +++-- 3rdparty/bgfx/src/renderer_gl.h | 40 ++ 3rdparty/bx/include/bx/platform.h | 14 + 3rdparty/bx/tools/bin/darwin/genie | Bin 385392 -> 389488 bytes 3rdparty/bx/tools/bin/linux/genie | Bin 372064 -> 372064 bytes 3rdparty/bx/tools/bin/windows/genie.exe | Bin 354816 -> 355328 bytes 3rdparty/genie/README.md | 2 +- 3rdparty/genie/build/gmake.darwin/genie.make | 510 +++++++++--------- 3rdparty/genie/build/gmake.linux/genie.make | 362 +++++++------ 3rdparty/genie/build/gmake.windows/genie.make | 366 +++++++------ 3rdparty/genie/makefile | 5 + 3rdparty/genie/src/actions/make/make_cpp.lua | 23 +- .../genie/src/actions/vstudio/_vstudio.lua | 2 +- 3rdparty/genie/src/host/scripts.c | 32 +- 31 files changed, 1096 insertions(+), 787 deletions(-) create mode 100644 3rdparty/bgfx/examples/08-update/fs_update_3d.sc create mode 100644 3rdparty/bgfx/examples/runtime/shaders/dx11/fs_update_3d.bin create mode 100644 3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin create mode 100644 3rdparty/bgfx/examples/runtime/shaders/gles/fs_update_3d.bin create mode 100644 3rdparty/bgfx/examples/runtime/shaders/glsl/fs_update_3d.bin diff --git a/3rdparty/bgfx/README.md b/3rdparty/bgfx/README.md index bdad511f2cb..bd82dbb4e8e 100644 --- a/3rdparty/bgfx/README.md +++ b/3rdparty/bgfx/README.md @@ -319,18 +319,27 @@ Building Steps bellow are for default build system inside bgfx repository. There is alterative way to build bgfx and examples with [fips](https://github.com/floooh/fips-bgfx/#fips-bgfx). -### Prerequisites - -Windows users download GnuWin32 utilities from: -[http://gnuwin32.sourceforge.net/packages/make.htm](http://gnuwin32.sourceforge.net/packages/make.htm) -[http://gnuwin32.sourceforge.net/packages/coreutils.htm](http://gnuwin32.sourceforge.net/packages/coreutils.htm) -[http://gnuwin32.sourceforge.net/packages/libiconv.htm](http://gnuwin32.sourceforge.net/packages/libiconv.htm) -[http://gnuwin32.sourceforge.net/packages/libintl.htm](http://gnuwin32.sourceforge.net/packages/libintl.htm) - ### Getting source git clone git://github.com/bkaradzic/bx.git git clone git://github.com/bkaradzic/bgfx.git + +### Quick start (Windows with Visual Studio) + +Enter bgfx directory: + + cd bgfx + +Generate Visual Studio 2013 project files: + + ..\bx\tools\bin\windows\genie vs2013 + +Open bgfx solution in Visual Studio 2013: + + start .build\projects\vs2013\bgfx.sln + +### Generating project files for all targets + cd bgfx make @@ -361,6 +370,12 @@ Download Native Client SDK from: ### Prerequisites for Windows +Windows users download GnuWin32 utilities from: +[http://gnuwin32.sourceforge.net/packages/make.htm](http://gnuwin32.sourceforge.net/packages/make.htm) +[http://gnuwin32.sourceforge.net/packages/coreutils.htm](http://gnuwin32.sourceforge.net/packages/coreutils.htm) +[http://gnuwin32.sourceforge.net/packages/libiconv.htm](http://gnuwin32.sourceforge.net/packages/libiconv.htm) +[http://gnuwin32.sourceforge.net/packages/libintl.htm](http://gnuwin32.sourceforge.net/packages/libintl.htm) + When building on Windows, you have to set DXSDK_DIR environment variable to point to DirectX SDK directory. diff --git a/3rdparty/bgfx/examples/08-update/fs_update_3d.sc b/3rdparty/bgfx/examples/08-update/fs_update_3d.sc new file mode 100644 index 00000000000..dad87e9cfdb --- /dev/null +++ b/3rdparty/bgfx/examples/08-update/fs_update_3d.sc @@ -0,0 +1,17 @@ +$input v_texcoord0 + +/* + * Copyright 2011-2015 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "../common/common.sh" + +SAMPLER3D(u_texColor, 0); +uniform float u_time; + +void main() +{ + vec3 uvw = vec3(v_texcoord0.xy*0.5+0.5, sin(u_time)*0.5+0.5); + gl_FragColor = vec4_splat(texture3D(u_texColor, uvw).x); +} diff --git a/3rdparty/bgfx/examples/08-update/update.cpp b/3rdparty/bgfx/examples/08-update/update.cpp index 0ed14fa3f9d..d87371aeb92 100644 --- a/3rdparty/bgfx/examples/08-update/update.cpp +++ b/3rdparty/bgfx/examples/08-update/update.cpp @@ -149,6 +149,31 @@ int _main_(int /*_argc*/, char** /*_argv*/) loadTexture("texture_compression_ptc24.pvr"), }; + const bgfx::Memory* mem8 = bgfx::alloc(32*32*32); + const bgfx::Memory* mem16f = bgfx::alloc(32*32*32*2); + const bgfx::Memory* mem32f = bgfx::alloc(32*32*32*4); + for (uint8_t zz = 0; zz < 32; ++zz) + { + for (uint8_t yy = 0; yy < 32; ++yy) + { + for (uint8_t xx = 0; xx < 32; ++xx) + { + const uint32_t offset = ( (zz*32+yy)*32+xx); + const uint32_t val = xx ^ yy ^ zz; + mem8->data[offset] = val<<3; + *(uint16_t*)&mem16f->data[offset*2] = bx::halfFromFloat( (float)val/32.0f); + *(float*)&mem32f->data[offset*4] = (float)val/32.0f; + } + } + } + + bgfx::TextureHandle textures3d[] = + { + bgfx::createTexture3D(32, 32, 32, 0, bgfx::TextureFormat::R8, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem8), + bgfx::createTexture3D(32, 32, 32, 0, bgfx::TextureFormat::R16F, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem16f), + bgfx::createTexture3D(32, 32, 32, 0, bgfx::TextureFormat::R32F, BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP|BGFX_TEXTURE_W_CLAMP, mem32f), + }; + // Create static vertex buffer. bgfx::VertexBufferHandle vbh = bgfx::createVertexBuffer(bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ), PosTexcoordVertex::ms_decl); @@ -156,12 +181,14 @@ int _main_(int /*_argc*/, char** /*_argv*/) bgfx::IndexBufferHandle ibh = bgfx::createIndexBuffer(bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ) ); // Create texture sampler uniforms. - bgfx::UniformHandle u_texCube = bgfx::createUniform("u_texCube", bgfx::UniformType::Uniform1iv); - + bgfx::UniformHandle u_texCube = bgfx::createUniform("u_texCube", bgfx::UniformType::Uniform1iv); bgfx::UniformHandle u_texColor = bgfx::createUniform("u_texColor", bgfx::UniformType::Uniform1iv); - bgfx::ProgramHandle program = loadProgram("vs_update", "fs_update"); - bgfx::ProgramHandle programCmp = loadProgram("vs_update", "fs_update_cmp"); + bgfx::UniformHandle u_time = bgfx::createUniform("u_time", bgfx::UniformType::Uniform1f); + + bgfx::ProgramHandle program = loadProgram("vs_update", "fs_update"); + bgfx::ProgramHandle programCmp = loadProgram("vs_update", "fs_update_cmp"); + bgfx::ProgramHandle program3d = loadProgram("vs_update", "fs_update_3d"); const uint32_t textureSide = 2048; @@ -210,6 +237,7 @@ int _main_(int /*_argc*/, char** /*_argv*/) const int64_t freq = bx::getHPFrequency(); const double toMs = 1000.0/double(freq); float time = (float)( (now - timeOffset)/double(bx::getHPFrequency() ) ); + bgfx::setUniform(u_time, &time); // Use debug font to print information about this example. bgfx::dbgTextClear(); @@ -345,10 +373,11 @@ int _main_(int /*_argc*/, char** /*_argv*/) // Submit primitive for rendering to view 1. bgfx::submit(1); + const float xpos = -8.0f - BX_COUNTOF(textures)*0.1f*0.5f; for (uint32_t ii = 0; ii < BX_COUNTOF(textures); ++ii) { - bx::mtxTranslate(mtx, -8.0f - BX_COUNTOF(textures)*0.1f*0.5f + ii*2.1f, 4.0f, 0.0f); + bx::mtxTranslate(mtx, xpos + ii*2.1f, 4.0f, 0.0f); // Set model matrix for rendering. bgfx::setTransform(mtx); @@ -370,9 +399,33 @@ int _main_(int /*_argc*/, char** /*_argv*/) bgfx::submit(1); } + for (uint32_t ii = 0; ii < BX_COUNTOF(textures3d); ++ii) + { + bx::mtxTranslate(mtx, xpos + ii*2.1f, -4.0f, 0.0f); + + // Set model matrix for rendering. + bgfx::setTransform(mtx); + + // Set vertex and fragment shaders. + bgfx::setProgram(program3d); + + // Set vertex and index buffer. + bgfx::setVertexBuffer(vbh); + bgfx::setIndexBuffer(ibh, 0, 6); + + // Bind texture. + bgfx::setTexture(0, u_texColor, textures3d[ii]); + + // Set render states. + bgfx::setState(BGFX_STATE_DEFAULT); + + // Submit primitive for rendering to view 1. + bgfx::submit(1); + } + for (uint32_t ii = 0; ii < 3; ++ii) { - bx::mtxTranslate(mtx, -8.0f - BX_COUNTOF(textures)*0.1f*0.5f + 8*2.1f, -4.0f + ii*2.1f, 0.0f); + bx::mtxTranslate(mtx, xpos + 8*2.1f, -4.0f + ii*2.1f, 0.0f); // Set model matrix for rendering. bgfx::setTransform(mtx); @@ -412,12 +465,19 @@ int _main_(int /*_argc*/, char** /*_argv*/) bgfx::destroyTexture(textures[ii]); } + for (uint32_t ii = 0; ii < BX_COUNTOF(textures3d); ++ii) + { + bgfx::destroyTexture(textures3d[ii]); + } + bgfx::destroyTexture(texture2d); bgfx::destroyTexture(textureCube); bgfx::destroyIndexBuffer(ibh); bgfx::destroyVertexBuffer(vbh); + bgfx::destroyProgram(program3d); bgfx::destroyProgram(programCmp); bgfx::destroyProgram(program); + bgfx::destroyUniform(u_time); bgfx::destroyUniform(u_texColor); bgfx::destroyUniform(u_texCube); diff --git a/3rdparty/bgfx/examples/common/entry/entry_osx.mm b/3rdparty/bgfx/examples/common/entry/entry_osx.mm index b46fbdb4b9f..14a4930128a 100644 --- a/3rdparty/bgfx/examples/common/entry/entry_osx.mm +++ b/3rdparty/bgfx/examples/common/entry/entry_osx.mm @@ -584,10 +584,10 @@ namespace entry if (!s_ctx.m_fullscreen) { - [NSMenu setMenuBarVisible: false]; s_ctx.m_style &= ~NSTitledWindowMask; dispatch_async(dispatch_get_main_queue() , ^{ + [NSMenu setMenuBarVisible: false]; [window setStyleMask: s_ctx.m_style]; [window setFrame:screenRect display:YES]; }); @@ -596,10 +596,10 @@ namespace entry } else { - [NSMenu setMenuBarVisible: true]; s_ctx.m_style |= NSTitledWindowMask; dispatch_async(dispatch_get_main_queue() , ^{ + [NSMenu setMenuBarVisible: true]; [window setStyleMask: s_ctx.m_style]; [window setFrame:s_ctx.m_windowFrame display:YES]; }); diff --git a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp index c279f0fd2a6..b9564339c11 100644 --- a/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp +++ b/3rdparty/bgfx/examples/common/entry/entry_sdl.cpp @@ -211,6 +211,9 @@ namespace entry : m_width(ENTRY_DEFAULT_WIDTH) , m_height(ENTRY_DEFAULT_HEIGHT) , m_aspectRatio(16.0f/9.0f) + , m_mx(0) + , m_my(0) + , m_mz(0) , m_mouseLock(false) , m_fullscreen(false) { @@ -376,10 +379,13 @@ namespace entry case SDL_MOUSEMOTION: { const SDL_MouseMotionEvent& mev = event.motion; + m_mx = mev.x; + m_my = mev.y; + WindowHandle handle = findHandle(mev.windowID); if (isValid(handle) ) { - m_eventQueue.postMouseEvent(handle, mev.x, mev.y, 0); + m_eventQueue.postMouseEvent(handle, m_mx, m_my, m_mz); } } break; @@ -411,6 +417,30 @@ namespace entry } break; + case SDL_MOUSEWHEEL: + { + const SDL_MouseWheelEvent& mev = event.wheel; + m_mz += mev.y; + + WindowHandle handle = findHandle(mev.windowID); + if (isValid(handle) ) + { + m_eventQueue.postMouseEvent(handle, m_mx, m_my, m_mz); + } + } + break; + + case SDL_TEXTINPUT: + { + const SDL_TextInputEvent& tev = event.text; + WindowHandle handle = findHandle(tev.windowID); + if (isValid(handle) ) + { + m_eventQueue.postCharEvent(handle, 1, (const uint8_t*)tev.text); + } + } + break; + case SDL_KEYDOWN: { const SDL_KeyboardEvent& kev = event.key; @@ -745,6 +775,7 @@ namespace entry int32_t m_mx; int32_t m_my; + int32_t m_mz; bool m_mouseLock; bool m_fullscreen; }; diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.cpp b/3rdparty/bgfx/examples/common/imgui/imgui.cpp index a2f572022d8..00e0bc675a4 100644 --- a/3rdparty/bgfx/examples/common/imgui/imgui.cpp +++ b/3rdparty/bgfx/examples/common/imgui/imgui.cpp @@ -388,6 +388,8 @@ struct Imgui , m_halfTexel(0.0f) , m_nvg(NULL) , m_view(255) + , m_surfaceWidth(0) + , m_surfaceHeight(0) , m_viewWidth(0) , m_viewHeight(0) , m_currentFontIdx(0) @@ -810,21 +812,31 @@ struct Imgui m_char = _inputChar; } - void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view) + void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view) { - IMGUI_beginFrame(_mx, _my, _button, _width, _height, _inputChar, _view); - nvgViewId(m_nvg, _view); - m_view = _view; m_viewWidth = _width; m_viewHeight = _height; + m_surfaceWidth = _surfaceWidth; + m_surfaceHeight = _surfaceHeight; + + const float xscale = float(m_surfaceWidth) /float(m_viewWidth); + const float yscale = float(m_surfaceHeight)/float(m_viewHeight); + const int32_t mx = int32_t(float(_mx)*xscale); + const int32_t my = int32_t(float(_my)*yscale); + + IMGUI_beginFrame(mx, my, _button, _width, _height, _inputChar, _view); + nvgBeginFrameScaled(m_nvg, m_viewWidth, m_viewHeight, m_surfaceWidth, m_surfaceHeight, 1.0f); + nvgViewId(m_nvg, _view); + bgfx::setViewName(_view, "IMGUI"); bgfx::setViewSeq(_view, true); const bgfx::HMD* hmd = bgfx::getHMD(); if (NULL != hmd) { - m_viewWidth = _width / 2; + m_viewWidth = _width / 2; + m_surfaceWidth = _surfaceWidth / 2; float proj[16]; bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f); @@ -837,22 +849,22 @@ struct Imgui const float offset1 = -proj[8] + (hmd->eye[1].viewOffset[0] / dist * proj[0]); float ortho[2][16]; - const float viewOffset = _width/4.0f; - const float viewWidth = _width/2.0f; - bx::mtxOrtho(ortho[0], viewOffset, viewOffset + viewWidth, (float)m_viewHeight, 0.0f, 0.0f, 1000.0f, offset0); - bx::mtxOrtho(ortho[1], viewOffset, viewOffset + viewWidth, (float)m_viewHeight, 0.0f, 0.0f, 1000.0f, offset1); + const float viewOffset = _surfaceWidth/4.0f; + const float viewWidth = _surfaceWidth/2.0f; + bx::mtxOrtho(ortho[0], viewOffset, viewOffset + viewWidth, (float)m_surfaceHeight, 0.0f, 0.0f, 1000.0f, offset0); + bx::mtxOrtho(ortho[1], viewOffset, viewOffset + viewWidth, (float)m_surfaceHeight, 0.0f, 0.0f, 1000.0f, offset1); bgfx::setViewTransform(_view, NULL, ortho[0], BGFX_VIEW_STEREO, ortho[1]); bgfx::setViewRect(_view, 0, 0, hmd->width, hmd->height); } else { float ortho[16]; - bx::mtxOrtho(ortho, 0.0f, (float)m_viewWidth, (float)m_viewHeight, 0.0f, 0.0f, 1000.0f); + bx::mtxOrtho(ortho, 0.0f, (float)m_surfaceWidth, (float)m_surfaceHeight, 0.0f, 0.0f, 1000.0f); bgfx::setViewTransform(_view, NULL, ortho); bgfx::setViewRect(_view, 0, 0, _width, _height); } - updateInput(_mx, _my, _button, _scroll, _inputChar); + updateInput(mx, my, _button, _scroll, _inputChar); m_hot = m_hotToBe; m_hotToBe = 0; @@ -884,6 +896,7 @@ struct Imgui clearInput(); + nvgEndFrame(m_nvg); IMGUI_endFrame(); } @@ -937,12 +950,7 @@ struct Imgui setEnabled(m_areaId); } - nvgScissor(m_nvg - , float(area.m_scissorX) - , float(area.m_scissorY-1) - , float(area.m_scissorWidth) - , float(area.m_scissorHeight+1) - ); + nvgScissor(m_nvg, area); m_insideArea |= area.m_inside; @@ -1080,12 +1088,7 @@ struct Imgui } } - nvgScissor(m_nvg - , float(parentArea.m_scissorX) - , float(parentArea.m_scissorY-1) - , float(parentArea.m_scissorWidth) - , float(parentArea.m_scissorHeight+1) - ); + nvgScissor(m_nvg, parentArea); } bool beginArea(const char* _name, int32_t _x, int32_t _y, int32_t _width, int32_t _height, bool _enabled, int32_t _r) @@ -1159,13 +1162,7 @@ struct Imgui } area.m_scissorEnabled = true; - nvgBeginFrame(m_nvg, m_viewWidth, m_viewHeight, 1.0f); - nvgScissor(m_nvg - , float(area.m_scissorX) - , float(area.m_scissorY-1) - , float(area.m_scissorWidth) - , float(area.m_scissorHeight+1) - ); + nvgScissor(m_nvg, area); m_insideArea |= area.m_inside; return area.m_inside; @@ -1173,8 +1170,8 @@ struct Imgui void endArea() { + m_areaId.pop(); nvgResetScissor(m_nvg); - nvgEndFrame(m_nvg); } bool button(const char* _text, bool _enabled, ImguiAlign::Enum _align, uint32_t _rgb0, int32_t _r) @@ -1203,7 +1200,7 @@ struct Imgui //|| ImguiAlign::CenterIndented == _align). { xx = area.m_widgetX; - width = area.m_widgetW - (area.m_widgetX-area.m_scissorX); + width = area.m_widgetW - (area.m_widgetX-area.m_contentX); } const bool enabled = _enabled && isEnabled(m_areaId); @@ -1386,7 +1383,7 @@ struct Imgui //|| ImguiAlign::CenterIndented == _align). { xx = area.m_widgetX; - width = area.m_widgetW - (area.m_widgetX-area.m_scissorX); + width = area.m_widgetW - (area.m_widgetX-area.m_contentX); } const bool drawLabel = (NULL != _label && _label[0] != '\0'); @@ -1525,7 +1522,7 @@ struct Imgui //|| ImguiAlign::CenterIndented == _align). { xx = area.m_widgetX; - width = area.m_widgetW - (area.m_widgetX-area.m_scissorX); + width = area.m_widgetW - (area.m_widgetX-area.m_contentX); } uint8_t selected = _selected; @@ -1745,7 +1742,7 @@ struct Imgui //|| ImguiAlign::CenterIndented == _align). { xx = area.m_widgetX; - width = area.m_widgetW - (area.m_widgetX-area.m_scissorX); + width = area.m_widgetW - (area.m_widgetX-area.m_contentX); } const int32_t height = width/2; @@ -1798,7 +1795,7 @@ struct Imgui //|| ImguiAlign::CenterIndented == _align). { xx = area.m_widgetX; - width = area.m_widgetW - (area.m_widgetX-area.m_scissorX); + width = area.m_widgetW - (area.m_widgetX-area.m_contentX); } const bool adjustHeight = (_cross && _sameHeight); @@ -2024,39 +2021,39 @@ struct Imgui xx = -borderSize; yy = -1; width = 2*borderSize+1; - height = m_viewHeight+1; + height = m_surfaceHeight+1; triX = 0; - triY = (m_viewHeight-triSize)/2; + triY = (m_surfaceHeight-triSize)/2; orientation = _checked ? TriangleOrientation::Left : TriangleOrientation::Right; } else if (ImguiBorder::Right == _border) { - xx = m_viewWidth - borderSize; + xx = m_surfaceWidth - borderSize; yy = -1; width = 2*borderSize+1; - height = m_viewHeight+1; - triX = m_viewWidth - triSize - 2; - triY = (m_viewHeight-width)/2; + height = m_surfaceHeight+1; + triX = m_surfaceWidth - triSize - 2; + triY = (m_surfaceHeight-width)/2; orientation = _checked ? TriangleOrientation::Right : TriangleOrientation::Left; } else if (ImguiBorder::Top == _border) { xx = 0; yy = -borderSize; - width = m_viewWidth; + width = m_surfaceWidth; height = 2*borderSize; - triX = (m_viewWidth-triSize)/2; + triX = (m_surfaceWidth-triSize)/2; triY = 0; orientation = _checked ? TriangleOrientation::Up : TriangleOrientation::Down; } else //if (ImguiBorder::Bottom == _border). { xx = 0; - yy = m_viewHeight - borderSize; - width = m_viewWidth; + yy = m_surfaceHeight - borderSize; + width = m_surfaceWidth; height = 2*borderSize; - triX = (m_viewWidth-triSize)/2; - triY = m_viewHeight-triSize; + triX = (m_surfaceWidth-triSize)/2; + triY = m_surfaceHeight-triSize; orientation = _checked ? TriangleOrientation::Down : TriangleOrientation::Up; } @@ -2147,7 +2144,7 @@ struct Imgui //|| ImguiAlign::CenterIndented == _align). { xx = area.m_widgetX; - width = area.m_widgetW - (area.m_widgetX-area.m_scissorX); + width = area.m_widgetW - (area.m_widgetX-area.m_contentX); } drawRoundedRect( (float)xx, (float)yy, (float)width, (float)height, 4.0f, imguiRGBA(0, 0, 0, 128) ); @@ -2265,19 +2262,40 @@ struct Imgui area.m_widgetY += _height; } - void separatorLine(uint16_t _height) + void separatorLine(uint16_t _height, ImguiAlign::Enum _align) { Area& area = getCurrentArea(); - const int32_t rectWidth = area.m_widgetW; - const int32_t rectHeight = 1; - const int32_t xx = area.m_widgetX; - const int32_t yy = area.m_widgetY + _height/2 - rectHeight; + //const int32_t width = area.m_widgetW; + const int32_t height = 1; + //const int32_t xx = area.m_widgetX; + const int32_t yy = area.m_widgetY + _height/2 - height; + + int32_t xx; + int32_t width; + if (ImguiAlign::Left == _align) + { + xx = area.m_contentX + SCROLL_AREA_PADDING; + width = area.m_widgetW; + } + else if (ImguiAlign::LeftIndented == _align + || ImguiAlign::Right == _align) + { + xx = area.m_widgetX; + width = area.m_widgetW; + } + else //if (ImguiAlign::Center == _align + //|| ImguiAlign::CenterIndented == _align). + { + xx = area.m_widgetX; + width = area.m_widgetW - (area.m_widgetX-area.m_contentX) + 1; + } + area.m_widgetY += _height; drawRect( (float)xx , (float)yy - , (float)rectWidth - , (float)rectHeight + , (float)width + , (float)height , imguiRGBA(255, 255, 255, 32) ); } @@ -3048,10 +3066,16 @@ struct Imgui const Area& area = getCurrentArea(); if (area.m_scissorEnabled) { - bgfx::setScissor(uint16_t(IMGUI_MAX(0, area.m_scissorX) ) - , uint16_t(IMGUI_MAX(0, area.m_scissorY-1) ) - , area.m_scissorWidth - , area.m_scissorHeight+1 + const float xscale = float(m_viewWidth) /float(m_surfaceWidth); + const float yscale = float(m_viewHeight)/float(m_surfaceHeight); + const int16_t scissorX = int16_t(float(area.m_scissorX)*xscale); + const int16_t scissorY = int16_t(float(area.m_scissorY)*yscale); + const int16_t scissorWidth = int16_t(float(area.m_scissorWidth)*xscale); + const int16_t scissorHeight = int16_t(float(area.m_scissorHeight)*yscale); + bgfx::setScissor(uint16_t(IMGUI_MAX(0, scissorX) ) + , uint16_t(IMGUI_MAX(0, scissorY-1) ) + , scissorWidth + , scissorHeight+1 ); } else @@ -3060,6 +3084,23 @@ struct Imgui } } + inline void nvgScissor(NVGcontext* _ctx, const Area& _area) + { + if (_area.m_scissorEnabled) + { + ::nvgScissor(_ctx + , float(IMGUI_MAX(0, _area.m_scissorX) ) + , float(IMGUI_MAX(0, _area.m_scissorY-1) ) + , float(_area.m_scissorWidth) + , float(_area.m_scissorHeight+1) + ); + } + else + { + nvgResetScissor(_ctx); + } + } + template struct IdStack { @@ -3149,6 +3190,8 @@ struct Imgui uint8_t m_view; uint16_t m_viewWidth; uint16_t m_viewHeight; + uint16_t m_surfaceWidth; + uint16_t m_surfaceHeight; #if !USE_NANOVG_FONT struct Font @@ -3203,9 +3246,14 @@ ImguiFontHandle imguiGetCurrentFont() return handle; } +void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view) +{ + s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _surfaceWidth, _surfaceHeight, _inputChar, _view); +} + void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view) { - s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _inputChar, _view); + s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _width, _height, _inputChar, _view); } void imguiEndFrame() @@ -3288,9 +3336,9 @@ void imguiSeparator(uint16_t _height) s_imgui.separator(_height); } -void imguiSeparatorLine(uint16_t _height) +void imguiSeparatorLine(uint16_t _height, ImguiAlign::Enum _align) { - s_imgui.separatorLine(_height); + s_imgui.separatorLine(_height, _align); } int32_t imguiGetWidgetX() diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.h b/3rdparty/bgfx/examples/common/imgui/imgui.h index ba99291a7f7..0ab69038d3f 100644 --- a/3rdparty/bgfx/examples/common/imgui/imgui.h +++ b/3rdparty/bgfx/examples/common/imgui/imgui.h @@ -137,6 +137,7 @@ ImguiFontHandle imguiCreate(const void* _data = NULL, uint32_t _size = 0, float void imguiDestroy(); void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar = 0, uint8_t _view = 255); +void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar = 0, uint8_t _view = 255); void imguiEndFrame(); void imguiDrawText(int _x, int _y, ImguiTextAlign::Enum _align, const char* _text, uint32_t _argb); @@ -158,7 +159,7 @@ void imguiEndScrollArea(int32_t _r = IMGUI_SCROLL_BAR_R); void imguiIndent(uint16_t _width = IMGUI_INDENT_VALUE); void imguiUnindent(uint16_t _width = IMGUI_INDENT_VALUE); void imguiSeparator(uint16_t _height = IMGUI_SEPARATOR_VALUE); -void imguiSeparatorLine(uint16_t _height = IMGUI_SEPARATOR_VALUE); +void imguiSeparatorLine(uint16_t _height = IMGUI_SEPARATOR_VALUE, ImguiAlign::Enum = ImguiAlign::LeftIndented); int32_t imguiGetWidgetX(); int32_t imguiGetWidgetY(); diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp index 1cbb58b5794..bb0e6bb3571 100644 --- a/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp +++ b/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp @@ -296,7 +296,7 @@ void nvgDeleteInternal(NVGcontext* ctx) free(ctx); } -void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio) +void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int surfaceWidth, int surfaceHeight, float devicePixelRatio) { /* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n", ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount, @@ -307,8 +307,8 @@ void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float dev nvgReset(ctx); nvg__setDevicePixelRatio(ctx, devicePixelRatio); - - ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight); + + ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight, surfaceWidth, surfaceHeight); ctx->drawCallCount = 0; ctx->fillTriCount = 0; @@ -316,6 +316,11 @@ void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float dev ctx->textTriCount = 0; } +void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio) +{ + nvgBeginFrameScaled(ctx, windowWidth, windowHeight, windowWidth, windowHeight, devicePixelRatio); +} + void nvgCancelFrame(NVGcontext* ctx) { ctx->params.renderCancel(ctx->params.userPtr); diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg.h b/3rdparty/bgfx/examples/common/nanovg/nanovg.h index 8709db210d2..f43f90f4651 100644 --- a/3rdparty/bgfx/examples/common/nanovg/nanovg.h +++ b/3rdparty/bgfx/examples/common/nanovg/nanovg.h @@ -116,6 +116,7 @@ enum NVGimageFlags { // frame buffer size. In that case you would set windowWidth/Height to the window size // devicePixelRatio to: frameBufferWidth / windowWidth. void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio); +void nvgBeginFrameScaled(NVGcontext* ctx, int windowWidth, int windowHeight, int surfaceWidth, int surfaceHeight, float devicePixelRatio); // Cancels drawing the current frame. void nvgCancelFrame(NVGcontext* ctx); @@ -588,7 +589,7 @@ struct NVGparams { int (*renderDeleteTexture)(void* uptr, int image); int (*renderUpdateTexture)(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data); int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h); - void (*renderViewport)(void* uptr, int width, int height); + void (*renderViewport)(void* uptr, int width, int height, int surfaceWidth, int surfaceHeight); void (*renderCancel)(void* uptr); void (*renderFlush)(void* uptr); void (*renderFill)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths); diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp index 6be7bbf9052..39402237031 100644 --- a/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp +++ b/3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp @@ -132,6 +132,7 @@ namespace struct GLNVGtexture* textures; float view[2]; + float surface[2]; int ntextures; int ctextures; int textureId; @@ -516,11 +517,13 @@ namespace gl->th = handle; } - static void nvgRenderViewport(void* _userPtr, int width, int height) + static void nvgRenderViewport(void* _userPtr, int width, int height, int surfaceWidth, int surfaceHeight) { struct GLNVGcontext* gl = (struct GLNVGcontext*)_userPtr; gl->view[0] = (float)width; gl->view[1] = (float)height; + gl->surface[0] = (float)surfaceWidth; + gl->surface[1] = (float)surfaceHeight; bgfx::setViewRect(gl->viewid, 0, 0, width, height); } @@ -720,7 +723,7 @@ namespace ); } - bgfx::setUniform(gl->u_viewSize, gl->view); + bgfx::setUniform(gl->u_viewSize, gl->surface); for (uint32_t ii = 0, num = gl->ncalls; ii < num; ++ii) { diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_update_3d.bin b/3rdparty/bgfx/examples/runtime/shaders/dx11/fs_update_3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..e73f85355effce657ff52cfa7330bb23e820f9d1 GIT binary patch literal 489 zcmYjNy-LGi6g^35twCrICkM&k;GiHK#6g!1Mh?ym0Ql-#zF4BvID2uGX9T2C6sX*~R5_6&tpJHzORj0?+y$oqqm& zRBEqZcW2wIgA8CXZV?Z}3lV3XUZ2qQ~tgk`xjngG-&_; literal 0 HcmV?d00001 diff --git a/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin b/3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..08c745a4e7fc99dda362bfb965478fcb5e3b4547 GIT binary patch literal 410 zcmYjN%SyvQ6g|_Vl8t1cOVJ<*x-gg)7Xhi-h*YSc#;l`gq=A+xeL#1P_yhfftnE*@ z^&7g)Pq;CjNfdgMlY8f!`MyKFbIJfZs@f=5IT>o&?B_5dol}TUyiUau})1tl~t3m(4AKK;W%!_N4QR( zMsh4)CeHrdfz#=RT_@~4J|`n5kb_~`XW+XH-}R3hZqxHT+yZq0JA41$ZE?cs(*8PI z+E<@DT&oT!&YA0&S_aF`xCdiH3FMgx@Dk hi!`W5Syf|D&*%SKyZmjo<`k@)dECL$XQ-m!_ZMHcN?`y1 literal 0 HcmV?d00001 diff --git a/3rdparty/bgfx/examples/runtime/shaders/gles/fs_update_3d.bin b/3rdparty/bgfx/examples/runtime/shaders/gles/fs_update_3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..636d67fcb2106efddc7bf7fcc6cff61c8e73903a GIT binary patch literal 374 zcmZWl-EM*~6h@bL(T6bS5}YBZ+ZCHPTgZ0p1CT~5HfcGe0>X^%?rD*LS=03A^!qtq zlikk?&bJ>^k5y?YnlDsnyopD1Mg^(G#9e-At+{Dsp210GrvhrR-#~3Sdqi`HVpiqy zh(?3LO95xD3nk3v8wTA0(n%Z@^3uMOP0VVP2hd#R;0Nr=VC+-sg51+pOy&L@HZ6RD z?~i)0r3FOcdjPL)d&2)Y_*v$DXBqs*y4ES#Tko VSWc$W#PH1hr{#44Nbbg%cL$L-a~1#q literal 0 HcmV?d00001 diff --git a/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_update_3d.bin b/3rdparty/bgfx/examples/runtime/shaders/glsl/fs_update_3d.bin new file mode 100644 index 0000000000000000000000000000000000000000..0dd12aaa48eb9a42fa8e73c6068f4f88e6fe40f2 GIT binary patch literal 306 zcmZWl%MOAt5Cn}L`VnT2poU^8cb zr)qK7O)OH!6>ECheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT, &data, sizeof(data) ) ); - support |= 0 != (data.OutFormatSupport & (0 - | D3D11_FORMAT_SUPPORT_TEXTURE2D - | D3D11_FORMAT_SUPPORT_TEXTURE3D - | D3D11_FORMAT_SUPPORT_TEXTURECUBE - ) ) - ? BGFX_CAPS_FORMAT_TEXTURE_COLOR - : BGFX_CAPS_FORMAT_TEXTURE_NONE - ; + HRESULT hr = m_device->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT, &data, sizeof(data) ); + if (SUCCEEDED(hr) ) + { + support |= 0 != (data.OutFormatSupport & (0 + | D3D11_FORMAT_SUPPORT_TEXTURE2D + | D3D11_FORMAT_SUPPORT_TEXTURE3D + | D3D11_FORMAT_SUPPORT_TEXTURECUBE + ) ) + ? BGFX_CAPS_FORMAT_TEXTURE_COLOR + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; - support |= 0 != (data.OutFormatSupport & (0 - | D3D11_FORMAT_SUPPORT_BUFFER - | D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER - | D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER - ) ) - ? BGFX_CAPS_FORMAT_TEXTURE_VERTEX - : BGFX_CAPS_FORMAT_TEXTURE_NONE - ; + support |= 0 != (data.OutFormatSupport & (0 + | D3D11_FORMAT_SUPPORT_BUFFER + | D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER + | D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER + ) ) + ? BGFX_CAPS_FORMAT_TEXTURE_VERTEX + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; + } + else + { + BX_TRACE("CheckFeatureSupport failed with %x for format %s.", hr, getName(TextureFormat::Enum(ii) ) ); + } } g_caps.formats[ii] = support; diff --git a/3rdparty/bgfx/src/renderer_d3d9.h b/3rdparty/bgfx/src/renderer_d3d9.h index 586a41f81b8..e32a91a18d8 100644 --- a/3rdparty/bgfx/src/renderer_d3d9.h +++ b/3rdparty/bgfx/src/renderer_d3d9.h @@ -10,7 +10,7 @@ #if BX_PLATFORM_WINDOWS # if !BGFX_CONFIG_RENDERER_DIRECT3D9EX -# define D3D_DISABLE_9EX +//# define D3D_DISABLE_9EX # endif // !BGFX_CONFIG_RENDERER_DIRECT3D9EX # include diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp index 03503be7d88..ff59a739214 100644 --- a/3rdparty/bgfx/src/renderer_gl.cpp +++ b/3rdparty/bgfx/src/renderer_gl.cpp @@ -713,6 +713,16 @@ namespace bgfx NULL }; + static const char* s_uisamplers[] = + { + "isampler2D", + "usampler2D", + "isampler3D", + "usampler3D", + "isamplerCube", + "usamplerCube", + }; + static void GL_APIENTRY stubVertexAttribDivisor(GLuint /*_index*/, GLuint /*_divisor*/) { } @@ -2603,25 +2613,35 @@ namespace bgfx GLSL_TYPE(GL_FLOAT_MAT2); GLSL_TYPE(GL_FLOAT_MAT3); GLSL_TYPE(GL_FLOAT_MAT4); -// GLSL_TYPE(GL_FLOAT_MAT2x3); -// GLSL_TYPE(GL_FLOAT_MAT2x4); -// GLSL_TYPE(GL_FLOAT_MAT3x2); -// GLSL_TYPE(GL_FLOAT_MAT3x4); -// GLSL_TYPE(GL_FLOAT_MAT4x2); -// GLSL_TYPE(GL_FLOAT_MAT4x3); -// GLSL_TYPE(GL_SAMPLER_1D); - GLSL_TYPE(GL_SAMPLER_2D); + + GLSL_TYPE(GL_SAMPLER_2D); + GLSL_TYPE(GL_INT_SAMPLER_2D); + GLSL_TYPE(GL_UNSIGNED_INT_SAMPLER_2D); + GLSL_TYPE(GL_SAMPLER_3D); + GLSL_TYPE(GL_INT_SAMPLER_3D); + GLSL_TYPE(GL_UNSIGNED_INT_SAMPLER_3D); + GLSL_TYPE(GL_SAMPLER_CUBE); -// GLSL_TYPE(GL_SAMPLER_1D_SHADOW); + GLSL_TYPE(GL_INT_SAMPLER_CUBE); + GLSL_TYPE(GL_UNSIGNED_INT_SAMPLER_CUBE); + GLSL_TYPE(GL_SAMPLER_2D_SHADOW); + GLSL_TYPE(GL_IMAGE_1D); - GLSL_TYPE(GL_IMAGE_2D); - GLSL_TYPE(GL_IMAGE_3D); - GLSL_TYPE(GL_IMAGE_CUBE); + GLSL_TYPE(GL_INT_IMAGE_1D); GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_1D); + + GLSL_TYPE(GL_IMAGE_2D); + GLSL_TYPE(GL_INT_IMAGE_2D); GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_2D); + + GLSL_TYPE(GL_IMAGE_3D); + GLSL_TYPE(GL_INT_IMAGE_3D); GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_3D); + + GLSL_TYPE(GL_IMAGE_CUBE); + GLSL_TYPE(GL_INT_IMAGE_CUBE); GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_CUBE); } @@ -2687,27 +2707,34 @@ namespace bgfx case GL_FLOAT_MAT4: return UniformType::Uniform4x4fv; -// case GL_FLOAT_MAT2x3: -// case GL_FLOAT_MAT2x4: -// case GL_FLOAT_MAT3x2: -// case GL_FLOAT_MAT3x4: -// case GL_FLOAT_MAT4x2: -// case GL_FLOAT_MAT4x3: -// break; - -// case GL_SAMPLER_1D: case GL_SAMPLER_2D: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_SAMPLER_3D: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_SAMPLER_CUBE: -// case GL_SAMPLER_1D_SHADOW: - case GL_SAMPLER_2D_SHADOW: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + + case GL_SAMPLER_2D_SHADOW: + case GL_IMAGE_1D: - case GL_IMAGE_2D: - case GL_IMAGE_3D: - case GL_IMAGE_CUBE: + case GL_INT_IMAGE_1D: case GL_UNSIGNED_INT_IMAGE_1D: + + case GL_IMAGE_2D: + case GL_INT_IMAGE_2D: case GL_UNSIGNED_INT_IMAGE_2D: + + case GL_IMAGE_3D: + case GL_INT_IMAGE_3D: case GL_UNSIGNED_INT_IMAGE_3D: + + case GL_IMAGE_CUBE: + case GL_INT_IMAGE_CUBE: case GL_UNSIGNED_INT_IMAGE_CUBE: return UniformType::Uniform1iv; }; @@ -2899,16 +2926,33 @@ namespace bgfx switch (gltype) { case GL_SAMPLER_2D: + case GL_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_SAMPLER_3D: + case GL_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_SAMPLER_CUBE: + case GL_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_SAMPLER_2D_SHADOW: + case GL_IMAGE_1D: - case GL_IMAGE_2D: - case GL_IMAGE_3D: - case GL_IMAGE_CUBE: + case GL_INT_IMAGE_1D: case GL_UNSIGNED_INT_IMAGE_1D: + + case GL_IMAGE_2D: + case GL_INT_IMAGE_2D: case GL_UNSIGNED_INT_IMAGE_2D: + + case GL_IMAGE_3D: + case GL_INT_IMAGE_3D: case GL_UNSIGNED_INT_IMAGE_3D: + + case GL_IMAGE_CUBE: + case GL_INT_IMAGE_CUBE: case GL_UNSIGNED_INT_IMAGE_CUBE: BX_TRACE("Sampler #%d at location %d.", m_numSamplers, loc); m_sampler[m_numSamplers] = loc; @@ -3285,13 +3329,14 @@ namespace bgfx blockHeight = blockInfo.blockHeight; } - BX_TRACE("Texture %3d: %s (requested: %s), %dx%d%s%s." + BX_TRACE("Texture%-4s %3d: %s (requested: %s), %dx%dx%d%s." + , imageContainer.m_cubeMap ? "Cube" : (1 < imageContainer.m_depth ? "3D" : "2D") , this - s_renderGL->m_textures , getName( (TextureFormat::Enum)m_textureFormat) , getName( (TextureFormat::Enum)m_requestedFormat) , textureWidth , textureHeight - , imageContainer.m_cubeMap ? "x6" : "" + , imageContainer.m_cubeMap ? 6 : (1 < imageContainer.m_depth ? imageContainer.m_depth : 0) , 0 != (m_flags&BGFX_TEXTURE_RT_MASK) ? " (render target)" : "" ); @@ -3871,14 +3916,22 @@ namespace bgfx else if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) && BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL <= 21) ) { - bool usesTextureLod = s_extension[Extension::ARB_shader_texture_lod].m_supported + bool usesTextureLod = true + && s_extension[Extension::ARB_shader_texture_lod].m_supported && bx::findIdentifierMatch(code, s_ARB_shader_texture_lod) ; + bool usesIUsamplers = bx::findIdentifierMatch(code, s_uisamplers); + + uint32_t version = usesIUsamplers ? 130 : (usesTextureLod ? 120 : 0); + + if (0 != version) + { + writeStringf(&writer, "#version %d\n", version); + } + if (usesTextureLod) { - writeString(&writer, "#version 120\n"); - if (m_type == GL_FRAGMENT_SHADER) { writeString(&writer, "#extension GL_ARB_shader_texture_lod : enable\n"); diff --git a/3rdparty/bgfx/src/renderer_gl.h b/3rdparty/bgfx/src/renderer_gl.h index b65a8499670..9160fbfe44f 100644 --- a/3rdparty/bgfx/src/renderer_gl.h +++ b/3rdparty/bgfx/src/renderer_gl.h @@ -424,6 +424,30 @@ typedef uint64_t GLuint64; # define GL_COMPARE_REF_TO_TEXTURE 0x884E #endif // GL_COMPARE_REF_TO_TEXTURE +#ifndef GL_INT_SAMPLER_2D +# define GL_INT_SAMPLER_2D 0x8DCA +#endif // GL_INT_SAMPLER_2D + +#ifndef GL_UNSIGNED_INT_SAMPLER_2D +# define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#endif // GL_UNSIGNED_INT_SAMPLER_2D + +#ifndef GL_INT_SAMPLER_3D +# define GL_INT_SAMPLER_3D 0x8DCB +#endif // GL_INT_SAMPLER_3D + +#ifndef GL_UNSIGNED_INT_SAMPLER_3D +# define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#endif // GL_UNSIGNED_INT_SAMPLER_3D + +#ifndef GL_INT_SAMPLER_CUBE +# define GL_INT_SAMPLER_CUBE 0x8DCC +#endif // GL_INT_SAMPLER_CUBEER_3D + +#ifndef GL_UNSIGNED_INT_SAMPLER_CUBE +# define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#endif // GL_UNSIGNED_INT_SAMPLER_CUBE + #ifndef GL_SAMPLER_2D_SHADOW # define GL_SAMPLER_2D_SHADOW 0x8B62 #endif // GL_SAMPLER_2D_SHADOW @@ -484,6 +508,22 @@ typedef uint64_t GLuint64; # define GL_IMAGE_CUBE 0x9050 #endif // GL_IMAGE_CUBE +#ifndef GL_INT_IMAGE_1D +# define GL_INT_IMAGE_1D 0x9057 +#endif // GL_INT_IMAGE_1D + +#ifndef GL_INT_IMAGE_2D +# define GL_INT_IMAGE_2D 0x9058 +#endif // GL_INT_IMAGE_2D + +#ifndef GL_INT_IMAGE_3D +# define GL_INT_IMAGE_3D 0x9059 +#endif // GL_INT_IMAGE_3D + +#ifndef GL_INT_IMAGE_CUBE +# define GL_INT_IMAGE_CUBE 0x905B +#endif // GL_INT_IMAGE_CUBE + #ifndef GL_UNSIGNED_INT_IMAGE_1D # define GL_UNSIGNED_INT_IMAGE_1D 0x9062 #endif // GL_UNSIGNED_INT_IMAGE_1D diff --git a/3rdparty/bx/include/bx/platform.h b/3rdparty/bx/include/bx/platform.h index 373c991769a..c3eda5f4123 100644 --- a/3rdparty/bx/include/bx/platform.h +++ b/3rdparty/bx/include/bx/platform.h @@ -19,11 +19,13 @@ #define BX_PLATFORM_LINUX 0 #define BX_PLATFORM_NACL 0 #define BX_PLATFORM_OSX 0 +#define BX_PLATFORM_PS4 0 #define BX_PLATFORM_QNX 0 #define BX_PLATFORM_RPI 0 #define BX_PLATFORM_WINDOWS 0 #define BX_PLATFORM_WINRT 0 #define BX_PLATFORM_XBOX360 0 +#define BX_PLATFORM_XBOXONE 0 #define BX_CPU_ARM 0 #define BX_CPU_JIT 0 @@ -120,6 +122,9 @@ #if defined(_XBOX_VER) # undef BX_PLATFORM_XBOX360 # define BX_PLATFORM_XBOX360 1 +#elif defined (_DURANGO) +# undef BX_PLATFORM_XBOXONE +# define BX_PLATFORM_XBOXONE 1 #elif defined(_WIN32) || defined(_WIN64) // http://msdn.microsoft.com/en-us/library/6sehtctf.aspx # ifndef NOMINMAX @@ -173,6 +178,9 @@ #elif defined(EMSCRIPTEN) # undef BX_PLATFORM_EMSCRIPTEN # define BX_PLATFORM_EMSCRIPTEN 1 +#elif defined(__ORBIS__) +# undef BX_PLATFORM_PS4 +# define BX_PLATFORM_PS4 1 #elif defined(__QNX__) # undef BX_PLATFORM_QNX # define BX_PLATFORM_QNX 1 @@ -242,6 +250,8 @@ BX_STRINGIZE(BX_PLATFORM_NACL) #elif BX_PLATFORM_OSX # define BX_PLATFORM_NAME "OSX" +#elif BX_PLATFORM_PS4 +# define BX_PLATFORM_NAME "PlayStation 4" #elif BX_PLATFORM_QNX # define BX_PLATFORM_NAME "QNX" #elif BX_PLATFORM_RPI @@ -250,6 +260,10 @@ # define BX_PLATFORM_NAME "Windows" #elif BX_PLATFORM_WINRT # define BX_PLATFORM_NAME "WinRT" +#elif BX_PLATFORM_XBOX360 +# define BX_PLATFORM_NAME "Xbox 360" +#elif BX_PLATFORM_XBOXONE +# define BX_PLATFORM_NAME "Xbox One" #endif // BX_PLATFORM_ #if BX_CPU_ARM diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie index 461635ee772d1ed34b74350cbe4c1c30677a60e6..f9778fdef4952060466774db44a16d64d4c94a40 100644 GIT binary patch delta 64430 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

1uCUXCH&M!^FyY6nb@4lb~7-0~h&4 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 yf)f-~^VbzoRRE=#@G4gDV}Z3c=Klcropa9s diff --git a/3rdparty/bx/tools/bin/linux/genie b/3rdparty/bx/tools/bin/linux/genie index de23a2d3a516d9600f0651388ecd46a0a0392063..2c997da3db59b12f53f47b27a521136e5a7183f6 100644 GIT binary patch delta 64553 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ⅆa; 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

HmV1H;YLC9Y~TfuEG^l3WLLQa6y7f~Yk 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 Z_gh-~y9;DzPeSCnfFv=G?wBt2{BIpqhspo| delta 41708 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 diff --git a/3rdparty/genie/README.md b/3rdparty/genie/README.md index 4abe8049d68..c4df9cf633a 100644 --- a/3rdparty/genie/README.md +++ b/3rdparty/genie/README.md @@ -14,7 +14,7 @@ Supported project generators: Download (stable) ----------------- - version 215 (commit 76a21acb8d4c45fbcfd0e2e68feb912934094201) + version 219 (commit dfb6f5911fb55526a1dc9c7ae1139b2adbaff69a) Linux: https://github.com/bkaradzic/bx/raw/master/tools/bin/linux/genie diff --git a/3rdparty/genie/build/gmake.darwin/genie.make b/3rdparty/genie/build/gmake.darwin/genie.make index fb575d44efd..e21a886a482 100644 --- a/3rdparty/genie/build/gmake.darwin/genie.make +++ b/3rdparty/genie/build/gmake.darwin/genie.make @@ -3,8 +3,6 @@ ifndef config config=release endif -override undefine TARGET - ifndef verbose SILENT = @ endif @@ -53,56 +51,56 @@ ifeq ($(config),release) LIBS += $(LDDEPS) -framework CoreServices LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -129,56 +127,56 @@ ifeq ($(config),debug) LIBS += $(LDDEPS) -framework CoreServices LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -205,56 +203,56 @@ ifeq ($(config),releaseuniv32) LIBS += $(LDDEPS) -framework CoreServices LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -281,56 +279,56 @@ ifeq ($(config),debuguniv32) LIBS += $(LDDEPS) -framework CoreServices LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -343,8 +341,8 @@ endif OBJDIRS := \ $(OBJDIR) \ - $(OBJDIR)/src/host \ $(OBJDIR)/src/host/lua-5.2.3/src \ + $(OBJDIR)/src/host \ RESOURCES := \ @@ -365,8 +363,8 @@ $(TARGETDIR): $(OBJDIRS): @echo Creating $(OBJDIR) -$(call MKDIR,$(OBJDIR)) - -$(call MKDIR,$(OBJDIR)/src/host) -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) + -$(call MKDIR,$(OBJDIR)/src/host) clean: @echo Cleaning genie @@ -390,7 +388,7 @@ $(GCH): $(PCH) $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<" endif -$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c +$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -398,27 +396,23 @@ $(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c +$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c +$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -430,19 +424,23 @@ $(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/os_getversion.o: ../../src/host/os_getversion.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c +$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c +$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -454,79 +452,15 @@ $(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c +$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c +$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o: ../../src/host/lua-5.2.3/src/lbaselib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lvm.o: ../../src/host/lua-5.2.3/src/lvm.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o: ../../src/host/lua-5.2.3/src/lcorolib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o: ../../src/host/lua-5.2.3/src/ltablib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lobject.o: ../../src/host/lua-5.2.3/src/lobject.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lcode.o: ../../src/host/lua-5.2.3/src/lcode.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ldo.o: ../../src/host/lua-5.2.3/src/ldo.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/liolib.o: ../../src/host/lua-5.2.3/src/liolib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltable.o: ../../src/host/lua-5.2.3/src/ltable.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o: ../../src/host/lua-5.2.3/src/loadlib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lundump.o: ../../src/host/lua-5.2.3/src/lundump.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/loslib.o: ../../src/host/lua-5.2.3/src/loslib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o: ../../src/host/lua-5.2.3/src/lfunc.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/linit.o: ../../src/host/lua-5.2.3/src/linit.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lstate.o: ../../src/host/lua-5.2.3/src/lstate.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/llex.o: ../../src/host/lua-5.2.3/src/llex.c +$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -534,19 +468,23 @@ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o: ../../src/host/lua-5.2.3/src/ldump.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/lvm.o: ../../src/host/lua-5.2.3/src/lvm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltable.o: ../../src/host/lua-5.2.3/src/ltable.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o: ../../src/host/lua-5.2.3/src/lstrlib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o: ../../src/host/lua-5.2.3/src/lmathlib.c +$(OBJDIR)/src/host/lua-5.2.3/src/liolib.o: ../../src/host/lua-5.2.3/src/liolib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o: ../../src/host/lua-5.2.3/src/lauxlib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o: ../../src/host/lua-5.2.3/src/lopcodes.c +$(OBJDIR)/src/host/lua-5.2.3/src/lcode.o: ../../src/host/lua-5.2.3/src/lcode.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -554,11 +492,7 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o: ../../src/host/lua-5.2.3/src/lparser @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lapi.o: ../../src/host/lua-5.2.3/src/lapi.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o: ../../src/host/lua-5.2.3/src/ldblib.c +$(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o: ../../src/host/lua-5.2.3/src/loadlib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -566,23 +500,27 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o: ../../src/host/lua-5.2.3/src/lbitlib @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lgc.o: ../../src/host/lua-5.2.3/src/lgc.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltm.o: ../../src/host/lua-5.2.3/src/ltm.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o: ../../src/host/lua-5.2.3/src/lzio.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o: ../../src/host/lua-5.2.3/src/ldblib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o: ../../src/host/lua-5.2.3/src/lmathlib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o: ../../src/host/lua-5.2.3/src/lfunc.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o: ../../src/host/lua-5.2.3/src/lmem.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lctype.o: ../../src/host/lua-5.2.3/src/lctype.c +$(OBJDIR)/src/host/lua-5.2.3/src/lgc.o: ../../src/host/lua-5.2.3/src/lgc.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -590,6 +528,66 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o: ../../src/host/lua-5.2.3/src/lstring @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/linit.o: ../../src/host/lua-5.2.3/src/linit.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltm.o: ../../src/host/lua-5.2.3/src/ltm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lapi.o: ../../src/host/lua-5.2.3/src/lapi.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lctype.o: ../../src/host/lua-5.2.3/src/lctype.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lstate.o: ../../src/host/lua-5.2.3/src/lstate.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o: ../../src/host/lua-5.2.3/src/lbaselib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o: ../../src/host/lua-5.2.3/src/ltablib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o: ../../src/host/lua-5.2.3/src/lauxlib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o: ../../src/host/lua-5.2.3/src/lcorolib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/llex.o: ../../src/host/lua-5.2.3/src/llex.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ldo.o: ../../src/host/lua-5.2.3/src/ldo.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lundump.o: ../../src/host/lua-5.2.3/src/lundump.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o: ../../src/host/lua-5.2.3/src/lopcodes.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/loslib.o: ../../src/host/lua-5.2.3/src/loslib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lobject.o: ../../src/host/lua-5.2.3/src/lobject.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o: ../../src/host/lua-5.2.3/src/ldebug.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" diff --git a/3rdparty/genie/build/gmake.linux/genie.make b/3rdparty/genie/build/gmake.linux/genie.make index 7dbdb0534c3..56611f15140 100644 --- a/3rdparty/genie/build/gmake.linux/genie.make +++ b/3rdparty/genie/build/gmake.linux/genie.make @@ -3,8 +3,6 @@ ifndef config config=release endif -override undefine TARGET - ifndef verbose SILENT = @ endif @@ -53,56 +51,56 @@ ifeq ($(config),release) LIBS += $(LDDEPS) -ldl -lm LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -129,56 +127,56 @@ ifeq ($(config),debug) LIBS += $(LDDEPS) -ldl -lm LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -238,7 +236,7 @@ $(GCH): $(PCH) $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<" endif -$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c +$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -246,27 +244,23 @@ $(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c +$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c +$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -278,19 +272,23 @@ $(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/os_getversion.o: ../../src/host/os_getversion.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c +$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c +$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -302,79 +300,15 @@ $(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c +$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c +$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o: ../../src/host/lua-5.2.3/src/lbaselib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lvm.o: ../../src/host/lua-5.2.3/src/lvm.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o: ../../src/host/lua-5.2.3/src/lcorolib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o: ../../src/host/lua-5.2.3/src/ltablib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lobject.o: ../../src/host/lua-5.2.3/src/lobject.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lcode.o: ../../src/host/lua-5.2.3/src/lcode.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ldo.o: ../../src/host/lua-5.2.3/src/ldo.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/liolib.o: ../../src/host/lua-5.2.3/src/liolib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltable.o: ../../src/host/lua-5.2.3/src/ltable.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o: ../../src/host/lua-5.2.3/src/loadlib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lundump.o: ../../src/host/lua-5.2.3/src/lundump.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/loslib.o: ../../src/host/lua-5.2.3/src/loslib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o: ../../src/host/lua-5.2.3/src/lfunc.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/linit.o: ../../src/host/lua-5.2.3/src/linit.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lstate.o: ../../src/host/lua-5.2.3/src/lstate.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/llex.o: ../../src/host/lua-5.2.3/src/llex.c +$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -382,19 +316,23 @@ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o: ../../src/host/lua-5.2.3/src/ldump.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/lvm.o: ../../src/host/lua-5.2.3/src/lvm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltable.o: ../../src/host/lua-5.2.3/src/ltable.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o: ../../src/host/lua-5.2.3/src/lstrlib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o: ../../src/host/lua-5.2.3/src/lmathlib.c +$(OBJDIR)/src/host/lua-5.2.3/src/liolib.o: ../../src/host/lua-5.2.3/src/liolib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o: ../../src/host/lua-5.2.3/src/lauxlib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o: ../../src/host/lua-5.2.3/src/lopcodes.c +$(OBJDIR)/src/host/lua-5.2.3/src/lcode.o: ../../src/host/lua-5.2.3/src/lcode.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -402,11 +340,7 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o: ../../src/host/lua-5.2.3/src/lparser @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lapi.o: ../../src/host/lua-5.2.3/src/lapi.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o: ../../src/host/lua-5.2.3/src/ldblib.c +$(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o: ../../src/host/lua-5.2.3/src/loadlib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -414,23 +348,27 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o: ../../src/host/lua-5.2.3/src/lbitlib @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lgc.o: ../../src/host/lua-5.2.3/src/lgc.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltm.o: ../../src/host/lua-5.2.3/src/ltm.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o: ../../src/host/lua-5.2.3/src/lzio.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o: ../../src/host/lua-5.2.3/src/ldblib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o: ../../src/host/lua-5.2.3/src/lmathlib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o: ../../src/host/lua-5.2.3/src/lfunc.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o: ../../src/host/lua-5.2.3/src/lmem.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lctype.o: ../../src/host/lua-5.2.3/src/lctype.c +$(OBJDIR)/src/host/lua-5.2.3/src/lgc.o: ../../src/host/lua-5.2.3/src/lgc.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -438,6 +376,66 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o: ../../src/host/lua-5.2.3/src/lstring @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/linit.o: ../../src/host/lua-5.2.3/src/linit.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltm.o: ../../src/host/lua-5.2.3/src/ltm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lapi.o: ../../src/host/lua-5.2.3/src/lapi.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lctype.o: ../../src/host/lua-5.2.3/src/lctype.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lstate.o: ../../src/host/lua-5.2.3/src/lstate.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o: ../../src/host/lua-5.2.3/src/lbaselib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o: ../../src/host/lua-5.2.3/src/ltablib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o: ../../src/host/lua-5.2.3/src/lauxlib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o: ../../src/host/lua-5.2.3/src/lcorolib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/llex.o: ../../src/host/lua-5.2.3/src/llex.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ldo.o: ../../src/host/lua-5.2.3/src/ldo.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lundump.o: ../../src/host/lua-5.2.3/src/lundump.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o: ../../src/host/lua-5.2.3/src/lopcodes.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/loslib.o: ../../src/host/lua-5.2.3/src/loslib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lobject.o: ../../src/host/lua-5.2.3/src/lobject.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o: ../../src/host/lua-5.2.3/src/ldebug.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" diff --git a/3rdparty/genie/build/gmake.windows/genie.make b/3rdparty/genie/build/gmake.windows/genie.make index 3b63871b978..bf5f8b0dff0 100644 --- a/3rdparty/genie/build/gmake.windows/genie.make +++ b/3rdparty/genie/build/gmake.windows/genie.make @@ -3,8 +3,6 @@ ifndef config config=release endif -override undefine TARGET - ifndef verbose SILENT = @ endif @@ -53,56 +51,56 @@ ifeq ($(config),release) LIBS += $(LDDEPS) -lole32 LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -129,56 +127,56 @@ ifeq ($(config),debug) LIBS += $(LDDEPS) -lole32 LINKCMD = $(CC) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS) OBJECTS := \ - $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_getcwd.o \ $(OBJDIR)/src/host/os_stat.o \ - $(OBJDIR)/src/host/os_rmdir.o \ - $(OBJDIR)/src/host/os_copyfile.o \ - $(OBJDIR)/src/host/string_hash.o \ $(OBJDIR)/src/host/os_chdir.o \ - $(OBJDIR)/src/host/os_is64bit.o \ - $(OBJDIR)/src/host/os_match.o \ + $(OBJDIR)/src/host/premake_main.o \ + $(OBJDIR)/src/host/os_uuid.o \ + $(OBJDIR)/src/host/os_isfile.o \ + $(OBJDIR)/src/host/os_copyfile.o \ $(OBJDIR)/src/host/scripts.o \ $(OBJDIR)/src/host/string_endswith.o \ - $(OBJDIR)/src/host/os_mkdir.o \ $(OBJDIR)/src/host/os_getversion.o \ - $(OBJDIR)/src/host/premake_main.o \ - $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/string_hash.o \ + $(OBJDIR)/src/host/os_pathsearch.o \ + $(OBJDIR)/src/host/os_rmdir.o \ + $(OBJDIR)/src/host/os_match.o \ $(OBJDIR)/src/host/premake.o \ $(OBJDIR)/src/host/os_isdir.o \ - $(OBJDIR)/src/host/os_uuid.o \ - $(OBJDIR)/src/host/os_pathsearch.o \ - $(OBJDIR)/src/host/os_getcwd.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/os_mkdir.o \ + $(OBJDIR)/src/host/path_isabsolute.o \ + $(OBJDIR)/src/host/os_is64bit.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lvm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltable.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/liolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcode.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o \ - $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lgc.o \ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/linit.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltm.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lapi.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lctype.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lstate.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/llex.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/ldo.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lundump.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/loslib.o \ + $(OBJDIR)/src/host/lua-5.2.3/src/lobject.o \ $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o \ define PREBUILDCMDS @@ -191,8 +189,8 @@ endif OBJDIRS := \ $(OBJDIR) \ - $(OBJDIR)/src/host/lua-5.2.3/src \ $(OBJDIR)/src/host \ + $(OBJDIR)/src/host/lua-5.2.3/src \ RESOURCES := \ @@ -213,8 +211,8 @@ $(TARGETDIR): $(OBJDIRS): @echo Creating $(OBJDIR) -$(call MKDIR,$(OBJDIR)) - -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) -$(call MKDIR,$(OBJDIR)/src/host) + -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) clean: @echo Cleaning genie @@ -238,7 +236,7 @@ $(GCH): $(PCH) $(SILENT) $(CC) -x c-header $(ALL_CFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) -o "$@" -MF "$(@:%.gch=%.d)" -c "$<" endif -$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c +$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -246,27 +244,23 @@ $(OBJDIR)/src/host/os_stat.o: ../../src/host/os_stat.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/os_chdir.o: ../../src/host/os_chdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c +$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c +$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_isfile.o: ../../src/host/os_isfile.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_copyfile.o: ../../src/host/os_copyfile.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -278,19 +272,23 @@ $(OBJDIR)/src/host/string_endswith.o: ../../src/host/string_endswith.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/os_getversion.o: ../../src/host/os_getversion.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/premake_main.o: ../../src/host/premake_main.c +$(OBJDIR)/src/host/string_hash.o: ../../src/host/string_hash.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c +$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_rmdir.o: ../../src/host/os_rmdir.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/os_match.o: ../../src/host/os_match.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -302,79 +300,15 @@ $(OBJDIR)/src/host/os_isdir.o: ../../src/host/os_isdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_uuid.o: ../../src/host/os_uuid.c +$(OBJDIR)/src/host/os_mkdir.o: ../../src/host/os_mkdir.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_pathsearch.o: ../../src/host/os_pathsearch.c +$(OBJDIR)/src/host/path_isabsolute.o: ../../src/host/path_isabsolute.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/os_getcwd.o: ../../src/host/os_getcwd.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o: ../../src/host/lua-5.2.3/src/lbaselib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lvm.o: ../../src/host/lua-5.2.3/src/lvm.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o: ../../src/host/lua-5.2.3/src/lcorolib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o: ../../src/host/lua-5.2.3/src/ltablib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lobject.o: ../../src/host/lua-5.2.3/src/lobject.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lcode.o: ../../src/host/lua-5.2.3/src/lcode.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ldo.o: ../../src/host/lua-5.2.3/src/ldo.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/liolib.o: ../../src/host/lua-5.2.3/src/liolib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltable.o: ../../src/host/lua-5.2.3/src/ltable.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o: ../../src/host/lua-5.2.3/src/loadlib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lundump.o: ../../src/host/lua-5.2.3/src/lundump.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/loslib.o: ../../src/host/lua-5.2.3/src/loslib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o: ../../src/host/lua-5.2.3/src/lfunc.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/linit.o: ../../src/host/lua-5.2.3/src/linit.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lstate.o: ../../src/host/lua-5.2.3/src/lstate.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/llex.o: ../../src/host/lua-5.2.3/src/llex.c +$(OBJDIR)/src/host/os_is64bit.o: ../../src/host/os_is64bit.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -382,19 +316,23 @@ $(OBJDIR)/src/host/lua-5.2.3/src/ldump.o: ../../src/host/lua-5.2.3/src/ldump.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/lvm.o: ../../src/host/lua-5.2.3/src/lvm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltable.o: ../../src/host/lua-5.2.3/src/ltable.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/lstrlib.o: ../../src/host/lua-5.2.3/src/lstrlib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o: ../../src/host/lua-5.2.3/src/lmathlib.c +$(OBJDIR)/src/host/lua-5.2.3/src/liolib.o: ../../src/host/lua-5.2.3/src/liolib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o: ../../src/host/lua-5.2.3/src/lauxlib.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o: ../../src/host/lua-5.2.3/src/lopcodes.c +$(OBJDIR)/src/host/lua-5.2.3/src/lcode.o: ../../src/host/lua-5.2.3/src/lcode.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -402,11 +340,7 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lparser.o: ../../src/host/lua-5.2.3/src/lparser @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lapi.o: ../../src/host/lua-5.2.3/src/lapi.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o: ../../src/host/lua-5.2.3/src/ldblib.c +$(OBJDIR)/src/host/lua-5.2.3/src/loadlib.o: ../../src/host/lua-5.2.3/src/loadlib.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -414,23 +348,27 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lbitlib.o: ../../src/host/lua-5.2.3/src/lbitlib @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lgc.o: ../../src/host/lua-5.2.3/src/lgc.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - -$(OBJDIR)/src/host/lua-5.2.3/src/ltm.o: ../../src/host/lua-5.2.3/src/ltm.c - @echo $(notdir $<) - $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" - $(OBJDIR)/src/host/lua-5.2.3/src/lzio.o: ../../src/host/lua-5.2.3/src/lzio.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/ldblib.o: ../../src/host/lua-5.2.3/src/ldblib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lmathlib.o: ../../src/host/lua-5.2.3/src/lmathlib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lfunc.o: ../../src/host/lua-5.2.3/src/lfunc.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/lmem.o: ../../src/host/lua-5.2.3/src/lmem.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" -$(OBJDIR)/src/host/lua-5.2.3/src/lctype.o: ../../src/host/lua-5.2.3/src/lctype.c +$(OBJDIR)/src/host/lua-5.2.3/src/lgc.o: ../../src/host/lua-5.2.3/src/lgc.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" @@ -438,6 +376,66 @@ $(OBJDIR)/src/host/lua-5.2.3/src/lstring.o: ../../src/host/lua-5.2.3/src/lstring @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" +$(OBJDIR)/src/host/lua-5.2.3/src/linit.o: ../../src/host/lua-5.2.3/src/linit.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltm.o: ../../src/host/lua-5.2.3/src/ltm.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lapi.o: ../../src/host/lua-5.2.3/src/lapi.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lctype.o: ../../src/host/lua-5.2.3/src/lctype.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lstate.o: ../../src/host/lua-5.2.3/src/lstate.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lbaselib.o: ../../src/host/lua-5.2.3/src/lbaselib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ltablib.o: ../../src/host/lua-5.2.3/src/ltablib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lauxlib.o: ../../src/host/lua-5.2.3/src/lauxlib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lcorolib.o: ../../src/host/lua-5.2.3/src/lcorolib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/llex.o: ../../src/host/lua-5.2.3/src/llex.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/ldo.o: ../../src/host/lua-5.2.3/src/ldo.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lundump.o: ../../src/host/lua-5.2.3/src/lundump.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lopcodes.o: ../../src/host/lua-5.2.3/src/lopcodes.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/loslib.o: ../../src/host/lua-5.2.3/src/loslib.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + +$(OBJDIR)/src/host/lua-5.2.3/src/lobject.o: ../../src/host/lua-5.2.3/src/lobject.c + @echo $(notdir $<) + $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" + $(OBJDIR)/src/host/lua-5.2.3/src/ldebug.o: ../../src/host/lua-5.2.3/src/ldebug.c @echo $(notdir $<) $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF $(@:%.o=%.d) -c "$<" diff --git a/3rdparty/genie/makefile b/3rdparty/genie/makefile index 8908d3fa3fc..e1219351156 100644 --- a/3rdparty/genie/makefile +++ b/3rdparty/genie/makefile @@ -45,3 +45,8 @@ release-linux: $(GENIE) $(SILENT) git checkout src/host/version.h release: release-$(OS) + +dist: release + cp bin/linux/genie ../bx/tools/bin/linux/ + cp bin/windows/genie.exe ../bx/tools/bin/windows/ + cp bin/darwin/genie ../bx/tools/bin/darwin/ diff --git a/3rdparty/genie/src/actions/make/make_cpp.lua b/3rdparty/genie/src/actions/make/make_cpp.lua index 4492ac2bbd2..869727c236d 100644 --- a/3rdparty/genie/src/actions/make/make_cpp.lua +++ b/3rdparty/genie/src/actions/make/make_cpp.lua @@ -90,7 +90,8 @@ _p('\t$(SILENT) $(LINKCMD) $(OBJECTS)') else _p('\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))') - end + _p('\t$(SILENT) $(LINKCMD_NDX)') + end else if prj.msglinking then _p('\t@echo ' .. prj.msglinking) @@ -238,7 +239,7 @@ cpp.flags(cfg, cc) -- write out libraries, linker flags, and the link command - cpp.linker(cfg, cc) + cpp.linker(prj, cfg, cc) -- add objects for compilation, and remove any that are excluded per config. _p(' OBJECTS := \\') @@ -340,7 +341,7 @@ -- and the linker command. -- - function cpp.linker(cfg, cc) + function cpp.linker(prj, cfg, cc) -- Patch #3401184 changed the order _p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions))) @@ -351,10 +352,20 @@ if cfg.platform:startswith("Universal") then _p(' LINKCMD = libtool -o $(TARGET)') else - if cc.llvm then - _p(' LINKCMD = $(AR) rcs $(TARGET)') + if (not prj.options.ArchiveSplit) then + if cc.llvm then + _p(' LINKCMD = $(AR) rcs $(TARGET)') + else + _p(' LINKCMD = $(AR) -rcs $(TARGET)') + end else - _p(' LINKCMD = $(AR) -rcs $(TARGET)') + if cc.llvm then + _p(' LINKCMD = $(AR) qc $(TARGET)') + _p(' LINKCMD_NDX= $(AR) cs $(TARGET)') + else + _p(' LINKCMD = $(AR) -qc $(TARGET)') + _p(' LINKCMD_NDX= $(AR) -cs $(TARGET)') + end end end else diff --git a/3rdparty/genie/src/actions/vstudio/_vstudio.lua b/3rdparty/genie/src/actions/vstudio/_vstudio.lua index ab82613c3d9..22fdb9f99f8 100644 --- a/3rdparty/genie/src/actions/vstudio/_vstudio.lua +++ b/3rdparty/genie/src/actions/vstudio/_vstudio.lua @@ -11,7 +11,7 @@ -- local toolsets = { - vs2010 = "v90", + vs2010 = "v100", vs2012 = "v110", vs2013 = "v120", vs2015 = "v140" diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c index bc7542d5c03..562e5264b4b 100644 --- a/3rdparty/genie/src/host/scripts.c +++ b/3rdparty/genie/src/host/scripts.c @@ -180,16 +180,16 @@ const char* builtin_scripts[] = { /* actions/make/make_cpp.lua */ "premake.make.cpp = { }\npremake.make.override = { }\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\npremake.gmake_cpp_header(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nlocal objdirs = {}\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in pairs(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('al" - "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then \nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\nend\nelse\nif prj.msglinking the" - "n\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(OBJDIR)')\nend\n_p('\\t-$(call MKDIR,$(OBJDIR))')\nfor dir, _ in pairs(objdirs) do\n_p('\\t-$(call MKDIR,$(OBJDIR)/%s)', dir)\nend\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /," - "\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -" - "p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. " - " 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' de" - "fine POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions" - ", cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif cc.llvm then" - "\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o " - "\"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfu" - "nction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", + "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then \nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\n_p('\\t$(SILENT) $(LINKCMD_NDX)'" + ")\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(OBJDIR)')\nend\n_p('\\t-$(call MKDIR,$(OBJDIR))')\nfor dir, _ in pairs(objdirs) do\n_p('\\t-$(call MKDIR,$(OBJDIR)/%s)', dir)\nend\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /," + "\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))'" + ")\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET" + "\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"" + "\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table." + "join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = " + "libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)" + ").gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) ==" + " \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", /* actions/make/make_csharp.lua */ "local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\n local name = cfg.buildtarget.basename .. \".\"\n local dir = path.getdirectory(fname)\n if dir ~= \".\" then \nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Co" @@ -202,12 +202,12 @@ const char* builtin_scripts[] = { "ild commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p('endif')\n_p('')\nend\n", /* actions/vstudio/_vstudio.lua */ - "premake.vstudio = { }\nlocal toolsets = {\nvs2010 = \"v90\",\nvs2012 = \"v110\",\nvs2013 = \"v120\",\nvs2015 = \"v140\"\n}\npremake.vstudio.toolset = toolsets[_ACTION] or \"unknown?\"\nlocal vstudio = premake.vstudio\nvstudio.platforms = {\nany = \"Any CPU\",\nmixed = \"Mixed Platforms\",\nNative = \"Win32\",\nx86 = \"x86\",\nx32 = \"Win32\",\nx64 = \"x64\",\nPS3 = \"PS3\",\nXbox360 = \"Xbox 360\",\nARM = \"ARM\"\n}\nfunction vstudio.arch(prj)\nif (prj.language == \"C#\") then\nreturn \"Any CPU\"\nelse\nreturn \"Win32\"\nend\nend\nfunction vstudio.buildconfigs(sln)\nlocal cfgs = { }\nlocal platforms = premake.filterplatforms(sln, vstudio.platforms, \"Native\")\nlocal hascpp = premake.hascppproject(sln)\nlocal hasdotnet = premake.hasdotnetproject(sln)\nif hasdotnet and (_ACTION > \"vs2008\" or hascpp) then\ntable.insert(platforms, 1, \"mixed\")\nend\nif hasdotnet and (_ACTION < \"vs2010\" or not hascpp) then\ntable.insert(platforms, 1, \"any\")\nend\nif _ACTION > \"vs2008\" then\nl" - "ocal platforms2010 = { }\nfor _, platform in ipairs(platforms) do\nif vstudio.platforms[platform] == \"Win32\" then\nif hascpp then\ntable.insert(platforms2010, platform)\nend\nif hasdotnet then\ntable.insert(platforms2010, \"x86\")\nend\nelse\ntable.insert(platforms2010, platform)\nend\nend\nplatforms = platforms2010\nend\nfor _, buildcfg in ipairs(sln.configurations) do\nfor _, platform in ipairs(platforms) do\nlocal entry = { }\nentry.src_buildcfg = buildcfg\nentry.src_platform = platform\nif platform ~= \"PS3\" or _ACTION > \"vs2008\" then\nentry.buildcfg = buildcfg\nentry.platform = vstudio.platforms[platform]\nelse\nentry.buildcfg = platform .. \" \" .. buildcfg\nentry.platform = \"Win32\"\nend\nentry.name = entry.buildcfg .. \"|\" .. entry.platform\nentry.isreal = (platform ~= \"any\" and platform ~= \"mixed\")\ntable.insert(cfgs, entry)\nend\nend\nreturn cfgs\nend\nfunction vstudio.cleansolution(sln)\npremake.clean.file(sln, \"%%.sln\")\npremake.clean.file(sln, \"%%.suo\")\npremake.clean.file(sln, \"%%" - ".ncb\")\npremake.clean.file(sln, \"%%.userprefs\")\npremake.clean.file(sln, \"%%.usertasks\")\nend\nfunction vstudio.cleanproject(prj)\nlocal fname = premake.project.getfilename(prj, \"%%\")\nos.remove(fname .. \".vcproj\")\nos.remove(fname .. \".vcproj.user\")\nos.remove(fname .. \".vcxproj\")\nos.remove(fname .. \".vcxproj.user\")\nos.remove(fname .. \".vcxproj.filters\")\nos.remove(fname .. \".csproj\")\nos.remove(fname .. \".csproj.user\")\nos.remove(fname .. \".pidb\")\nos.remove(fname .. \".sdf\")\nend\nfunction vstudio.cleantarget(name)\nos.remove(name .. \".pdb\")\nos.remove(name .. \".idb\")\nos.remove(name .. \".ilk\")\nos.remove(name .. \".vshost.exe\")\nos.remove(name .. \".exe.manifest\")\nend\nfunction vstudio.projectfile(prj)\nlocal pattern\nif prj.language == \"C#\" then\npattern = \"%%.csproj\"\nelse\npattern = iif(_ACTION > \"vs2008\", \"%%.vcxproj\", \"%%.vcproj\")\nend\nlocal fname = premake.project.getbasename(prj.name, pattern)\nfname = path.join(prj.location, fname)\nreturn fname\nend\nf" - "unction vstudio.tool(prj)\nif (prj.language == \"C#\") then\nreturn \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\"\nelse\nreturn \"8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942\"\nend\nend\nnewaction {\ntrigger = \"vs2008\",\nshortname = \"Visual Studio 2008\",\ndescription = \"Generate Microsoft Visual Studio 2008 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcproj\", vstudio.vc200x.generate)\npremake.generate(prj, \"%%.vcproj.user\", vstudio.vc200x.generate_user)\nend\nend," - "\noncleansolution = vstudio.cleansolution,\noncleanproject = vstudio.cleanproject,\noncleantarget = vstudio.cleantarget,\nvstudio = {\nproductVersion = \"9.0.21022\",\nsolutionVersion = \"10\",\ntoolsVersion = \"3.5\",\n}\n}\nnewaction\n{\ntrigger = \"vs2010\",\nshortname = \"Visual Studio 2010\",\ndescription = \"Generate Microsoft Visual Studio 2010 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\"},\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, \"" - "%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filters\", vstudio.vc2010.generate_filters)\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nproductVersion = \"8.0.30703\",\nsolutionVersion = \"11\",\ntargetFramework = \"4.0\",\ntoolsVersion = \"4.0\",\n}\n}\n", + "premake.vstudio = { }\nlocal toolsets = {\nvs2010 = \"v100\",\nvs2012 = \"v110\",\nvs2013 = \"v120\",\nvs2015 = \"v140\"\n}\npremake.vstudio.toolset = toolsets[_ACTION] or \"unknown?\"\nlocal vstudio = premake.vstudio\nvstudio.platforms = {\nany = \"Any CPU\",\nmixed = \"Mixed Platforms\",\nNative = \"Win32\",\nx86 = \"x86\",\nx32 = \"Win32\",\nx64 = \"x64\",\nPS3 = \"PS3\",\nXbox360 = \"Xbox 360\",\nARM = \"ARM\"\n}\nfunction vstudio.arch(prj)\nif (prj.language == \"C#\") then\nreturn \"Any CPU\"\nelse\nreturn \"Win32\"\nend\nend\nfunction vstudio.buildconfigs(sln)\nlocal cfgs = { }\nlocal platforms = premake.filterplatforms(sln, vstudio.platforms, \"Native\")\nlocal hascpp = premake.hascppproject(sln)\nlocal hasdotnet = premake.hasdotnetproject(sln)\nif hasdotnet and (_ACTION > \"vs2008\" or hascpp) then\ntable.insert(platforms, 1, \"mixed\")\nend\nif hasdotnet and (_ACTION < \"vs2010\" or not hascpp) then\ntable.insert(platforms, 1, \"any\")\nend\nif _ACTION > \"vs2008\" then\n" + "local platforms2010 = { }\nfor _, platform in ipairs(platforms) do\nif vstudio.platforms[platform] == \"Win32\" then\nif hascpp then\ntable.insert(platforms2010, platform)\nend\nif hasdotnet then\ntable.insert(platforms2010, \"x86\")\nend\nelse\ntable.insert(platforms2010, platform)\nend\nend\nplatforms = platforms2010\nend\nfor _, buildcfg in ipairs(sln.configurations) do\nfor _, platform in ipairs(platforms) do\nlocal entry = { }\nentry.src_buildcfg = buildcfg\nentry.src_platform = platform\nif platform ~= \"PS3\" or _ACTION > \"vs2008\" then\nentry.buildcfg = buildcfg\nentry.platform = vstudio.platforms[platform]\nelse\nentry.buildcfg = platform .. \" \" .. buildcfg\nentry.platform = \"Win32\"\nend\nentry.name = entry.buildcfg .. \"|\" .. entry.platform\nentry.isreal = (platform ~= \"any\" and platform ~= \"mixed\")\ntable.insert(cfgs, entry)\nend\nend\nreturn cfgs\nend\nfunction vstudio.cleansolution(sln)\npremake.clean.file(sln, \"%%.sln\")\npremake.clean.file(sln, \"%%.suo\")\npremake.clean.file(sln, \"%" + "%.ncb\")\npremake.clean.file(sln, \"%%.userprefs\")\npremake.clean.file(sln, \"%%.usertasks\")\nend\nfunction vstudio.cleanproject(prj)\nlocal fname = premake.project.getfilename(prj, \"%%\")\nos.remove(fname .. \".vcproj\")\nos.remove(fname .. \".vcproj.user\")\nos.remove(fname .. \".vcxproj\")\nos.remove(fname .. \".vcxproj.user\")\nos.remove(fname .. \".vcxproj.filters\")\nos.remove(fname .. \".csproj\")\nos.remove(fname .. \".csproj.user\")\nos.remove(fname .. \".pidb\")\nos.remove(fname .. \".sdf\")\nend\nfunction vstudio.cleantarget(name)\nos.remove(name .. \".pdb\")\nos.remove(name .. \".idb\")\nos.remove(name .. \".ilk\")\nos.remove(name .. \".vshost.exe\")\nos.remove(name .. \".exe.manifest\")\nend\nfunction vstudio.projectfile(prj)\nlocal pattern\nif prj.language == \"C#\" then\npattern = \"%%.csproj\"\nelse\npattern = iif(_ACTION > \"vs2008\", \"%%.vcxproj\", \"%%.vcproj\")\nend\nlocal fname = premake.project.getbasename(prj.name, pattern)\nfname = path.join(prj.location, fname)\nreturn fname\nend\n" + "function vstudio.tool(prj)\nif (prj.language == \"C#\") then\nreturn \"FAE04EC0-301F-11D3-BF4B-00C04F79EFBC\"\nelse\nreturn \"8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942\"\nend\nend\nnewaction {\ntrigger = \"vs2008\",\nshortname = \"Visual Studio 2008\",\ndescription = \"Generate Microsoft Visual Studio 2008 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\" },\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcproj\", vstudio.vc200x.generate)\npremake.generate(prj, \"%%.vcproj.user\", vstudio.vc200x.generate_user)\nend\nend" + ",\noncleansolution = vstudio.cleansolution,\noncleanproject = vstudio.cleanproject,\noncleantarget = vstudio.cleantarget,\nvstudio = {\nproductVersion = \"9.0.21022\",\nsolutionVersion = \"10\",\ntoolsVersion = \"3.5\",\n}\n}\nnewaction\n{\ntrigger = \"vs2010\",\nshortname = \"Visual Studio 2010\",\ndescription = \"Generate Microsoft Visual Studio 2010 project files\",\nos = \"windows\",\nvalid_kinds = { \"ConsoleApp\", \"WindowedApp\", \"StaticLib\", \"SharedLib\" },\nvalid_languages = { \"C\", \"C++\", \"C#\"},\nvalid_tools = {\ncc = { \"msc\" },\ndotnet = { \"msnet\" },\n},\nonsolution = function(sln)\npremake.generate(sln, \"%%.sln\", vstudio.sln2005.generate)\nend,\nonproject = function(prj)\nif premake.isdotnetproject(prj) then\npremake.generate(prj, \"%%.csproj\", vstudio.cs2005.generate)\npremake.generate(prj, \"%%.csproj.user\", vstudio.cs2005.generate_user)\nelse\npremake.generate(prj, \"%%.vcxproj\", premake.vs2010_vcxproj)\npremake.generate(prj, " + "\"%%.vcxproj.user\", premake.vs2010_vcxproj_user)\npremake.generate(prj, \"%%.vcxproj.filters\", vstudio.vc2010.generate_filters)\nend\nend,\noncleansolution = premake.vstudio.cleansolution,\noncleanproject = premake.vstudio.cleanproject,\noncleantarget = premake.vstudio.cleantarget,\nvstudio = {\nproductVersion = \"8.0.30703\",\nsolutionVersion = \"11\",\ntargetFramework = \"4.0\",\ntoolsVersion = \"4.0\",\n}\n}\n", /* actions/vstudio/vs200x_vcproj.lua */ "premake.vstudio.vc200x = { }\nlocal vc200x = premake.vstudio.vc200x\nlocal tree = premake.tree\nlocal function bool(value)\nreturn iif(value, \"true\", \"false\")\nend\nfunction vc200x.optimization(cfg)\nlocal result = 0\nfor _, value in ipairs(cfg.flags) do\nif (value == \"Optimize\") then\nresult = 3\nelseif (value == \"OptimizeSize\") then\nresult = 1\nelseif (value == \"OptimizeSpeed\") then\nresult = 2\nend\nend\nreturn result\nend\nfunction vc200x.header(element)\nio.eol = \"\\r\\n\"\n_p('')\n_p('<%s', element)\n_p(1,'ProjectType=\"Visual C++\"')\n_p(1,'Version=\"9.00\"')\nend\nfunction vc200x.Configuration(name, cfg)\n_p(2,' Date: Tue, 17 Mar 2015 11:10:58 +0100 Subject: [PATCH 058/201] compile fix --- 3rdparty/bgfx/examples/common/imgui/imgui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdparty/bgfx/examples/common/imgui/imgui.cpp b/3rdparty/bgfx/examples/common/imgui/imgui.cpp index 00e0bc675a4..646d13b0d0a 100644 --- a/3rdparty/bgfx/examples/common/imgui/imgui.cpp +++ b/3rdparty/bgfx/examples/common/imgui/imgui.cpp @@ -3188,10 +3188,10 @@ struct Imgui NVGcontext* m_nvg; uint8_t m_view; - uint16_t m_viewWidth; - uint16_t m_viewHeight; uint16_t m_surfaceWidth; uint16_t m_surfaceHeight; + uint16_t m_viewWidth; + uint16_t m_viewHeight; #if !USE_NANOVG_FONT struct Font From becf4a8823c1f029ea6605e02fddd5f439c3e9b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 17 Mar 2015 13:57:13 +0100 Subject: [PATCH 059/201] fixed Visual Studio warning in bgfx code (nw) --- 3rdparty/bgfx/src/renderer_gl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp index ff59a739214..8285bfdea18 100644 --- a/3rdparty/bgfx/src/renderer_gl.cpp +++ b/3rdparty/bgfx/src/renderer_gl.cpp @@ -3921,7 +3921,7 @@ namespace bgfx && bx::findIdentifierMatch(code, s_ARB_shader_texture_lod) ; - bool usesIUsamplers = bx::findIdentifierMatch(code, s_uisamplers); + bool usesIUsamplers = !!bx::findIdentifierMatch(code, s_uisamplers); uint32_t version = usesIUsamplers ? 130 : (usesTextureLod ? 120 : 0); From 004c6ffa3738bb7a97e0fa6e90900002058fc446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 17 Mar 2015 13:58:00 +0100 Subject: [PATCH 060/201] write popmessage() to error.log as well - and command-line in DEBUG build (nw) --- src/emu/mame.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/emu/mame.c b/src/emu/mame.c index e6915e2cf48..9511df4e9df 100644 --- a/src/emu/mame.c +++ b/src/emu/mame.c @@ -286,6 +286,14 @@ void CLIB_DECL popmessage(const char *format, ...) // pop it in the UI machine_manager::instance()->machine()->ui().popup_time(temp.len() / 40 + 2, "%s", temp.cstr()); + + // also write to error.log + logerror("popmessage: %s\n", temp.cstr()); + +#ifdef MAME_DEBUG + // and to command-line in a DEBUG build + osd_printf_info("popmessage: %s\n", temp.cstr()); +#endif } } From 27460ff717057e70fb4e5b9a1044142ce139f324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 17 Mar 2015 14:10:24 +0100 Subject: [PATCH 061/201] =?UTF-8?q?added=20command-line=20option=20-[no]du?= =?UTF-8?q?mmywrite=20to=20create=20snaphots=20of=20each=20frame=20without?= =?UTF-8?q?=20writing=20them=20to=20a=20file=20[Oliver=20St=C3=B6neberg]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is a dummy implementation of -aviwrite/-mngwrite and is used in testruns to detect e.g. palette issues. the dummy implementation greatly speed up testrun since it avoids the snapshot to file format conversions as well as the I/O operations --- src/emu/emuopts.c | 1 + src/emu/emuopts.h | 2 ++ src/emu/video.c | 4 +++- src/emu/video.h | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/emu/emuopts.c b/src/emu/emuopts.c index 0b3c785fd5d..7c1bd9560cb 100644 --- a/src/emu/emuopts.c +++ b/src/emu/emuopts.c @@ -68,6 +68,7 @@ const options_entry emu_options::s_option_entries[] = { OPTION_SNAPBILINEAR, "1", OPTION_BOOLEAN, "specify if the snapshot/movie should have bilinear filtering applied" }, { OPTION_STATENAME, "%g", OPTION_STRING, "override of the default state subfolder naming; %g == gamename" }, { OPTION_BURNIN, "0", OPTION_BOOLEAN, "create burn-in snapshots for each screen" }, + { OPTION_DUMMYWRITE, "0", OPTION_BOOLEAN, "indicates if a snapshot should be created if each frame" }, // performance options { NULL, NULL, OPTION_HEADER, "CORE PERFORMANCE OPTIONS" }, diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h index 17deb586576..db71ccc5a7d 100644 --- a/src/emu/emuopts.h +++ b/src/emu/emuopts.h @@ -73,6 +73,7 @@ enum #define OPTION_RECORD "record" #define OPTION_MNGWRITE "mngwrite" #define OPTION_AVIWRITE "aviwrite" +#define OPTION_DUMMYWRITE "dummywrite" #define OPTION_WAVWRITE "wavwrite" #define OPTION_SNAPNAME "snapname" #define OPTION_SNAPSIZE "snapsize" @@ -241,6 +242,7 @@ public: const char *record() const { return value(OPTION_RECORD); } const char *mng_write() const { return value(OPTION_MNGWRITE); } const char *avi_write() const { return value(OPTION_AVIWRITE); } + const char *dummy_write() const { return value(OPTION_DUMMYWRITE); } const char *wav_write() const { return value(OPTION_WAVWRITE); } const char *snap_name() const { return value(OPTION_SNAPNAME); } const char *snap_size() const { return value(OPTION_SNAPSIZE); } diff --git a/src/emu/video.c b/src/emu/video.c index 2518bd101c0..13d2989704c 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -152,6 +152,8 @@ video_manager::video_manager(running_machine &machine) filename = machine.options().avi_write(); if (filename[0] != 0) begin_recording(filename, MF_AVI); + + m_dummy_recording = machine.options().dummy_write(); // if no screens, create a periodic timer to drive updates if (machine.first_screen() == NULL) @@ -1232,7 +1234,7 @@ file_error video_manager::open_next(emu_file &file, const char *extension) void video_manager::record_frame() { // ignore if nothing to do - if (m_mng_file == NULL && m_avi_file == NULL) + if (m_mng_file == NULL && m_avi_file == NULL && !m_dummy_recording) return; // start the profiler and get the current time diff --git a/src/emu/video.h b/src/emu/video.h index 5904b4c6c53..c5ca9c9e27b 100644 --- a/src/emu/video.h +++ b/src/emu/video.h @@ -176,6 +176,9 @@ private: attotime m_avi_frame_period; // period of a single movie frame attotime m_avi_next_frame_time; // time of next frame UINT32 m_avi_frame; // current movie frame number + + // movie recording - dummy + bool m_dummy_recording; // indicates if snapshot should be created of every frame static const UINT8 s_skiptable[FRAMESKIP_LEVELS][FRAMESKIP_LEVELS]; From 490ed5ce9b8f27412f8e69c7b0c47b106e75b632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 17 Mar 2015 15:48:28 +0100 Subject: [PATCH 062/201] disabled additional logging of popmessage() messages (nw) --- src/emu/mame.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/emu/mame.c b/src/emu/mame.c index 9511df4e9df..3d8380d8666 100644 --- a/src/emu/mame.c +++ b/src/emu/mame.c @@ -287,6 +287,7 @@ void CLIB_DECL popmessage(const char *format, ...) // pop it in the UI machine_manager::instance()->machine()->ui().popup_time(temp.len() / 40 + 2, "%s", temp.cstr()); + /* // also write to error.log logerror("popmessage: %s\n", temp.cstr()); @@ -294,6 +295,7 @@ void CLIB_DECL popmessage(const char *format, ...) // and to command-line in a DEBUG build osd_printf_info("popmessage: %s\n", temp.cstr()); #endif + */ } } From af0ead85bb9a1d01d7d330af4956d65cf939ad4c Mon Sep 17 00:00:00 2001 From: mamehaze Date: Tue, 17 Mar 2015 20:00:02 +0000 Subject: [PATCH 063/201] new clones Battle K-Road (Korean PCB) [Manuel Assoni] --- src/mame/drivers/psikyo.c | 40 ++++++++++++++++++++++++++++++++++++++- src/mame/mame.lst | 1 + 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/mame/drivers/psikyo.c b/src/mame/drivers/psikyo.c index e94c6b2c122..a53c7788fdf 100644 --- a/src/mame/drivers/psikyo.c +++ b/src/mame/drivers/psikyo.c @@ -1406,6 +1406,40 @@ ROM_START( btlkroad ) ROM_END + +ROM_START( btlkroadk ) + + ROM_REGION( 0x100000, "maincpu", 0 ) /* Main CPU Code */ + ROM_LOAD32_WORD_SWAP( "4(dot).u46", 0x000000, 0x040000, CRC(e724d429) SHA1(8b5f80366fd22d6f7e7d8a9623de4fe231303267) ) // 1&0 + ROM_LOAD32_WORD_SWAP( "5(dot).u39", 0x000002, 0x040000, CRC(c0d65765) SHA1(a6a26e6b9693a2ef245e9aaa4c9daa888aebb360)) // 3&2 + + ROM_REGION( 0x020000, "audiocpu", 0 ) /* Sound CPU Code */ + ROM_LOAD( "3(k).u71", 0x00000, 0x20000, CRC(e0f0c597) SHA1(cc337633f1f579baf0f8ba1dd65c5d51122a7e97) ) + + ROM_REGION( 0x700000, "gfx1", 0 ) /* Sprites */ + ROM_LOAD( "u14.bin", 0x000000, 0x200000, CRC(282d89c3) SHA1(3b4b17f4a37efa2f7e232488aaba7c77d10c84d2) ) + ROM_LOAD( "u24.bin", 0x200000, 0x200000, CRC(bbe9d3d1) SHA1(9da0b0b993e8271a8119e9c2f602e52325983f79) ) + ROM_LOAD( "u15.bin", 0x400000, 0x200000, CRC(d4d1b07c) SHA1(232109db8f6e137fbc8826f38a96057067cb19dc) ) +// ROM_LOAD( "u25.bin", 0x600000, 0x100000 NOT PRESENT + + ROM_REGION( 0x200000, "gfx2", 0 ) /* Layers 0 + 1 */ + ROM_LOAD( "u33.bin", 0x000000, 0x200000, CRC(4c8577f1) SHA1(d27043514632954a06667ac63f4a4e4a31870511) ) + + ROM_REGION( 0x100000, "ymsnd", 0 ) /* ADPCM Samples */ + ROM_LOAD( "u56.bin", 0x000000, 0x100000, CRC(51d73682) SHA1(562038d08e9a4389ffa39f3a659b2a29b94dc156) ) + + ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ + ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(0f33049f) SHA1(ca4fd5f3906685ace1af40b75f5678231d7324e8) ) + + ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_LOAD( "u3.bin", 0x000000, 0x040000, CRC(30d541ed) SHA1(6f7fb5f5ecbce7c086185392de164ebb6887e780) ) + + ROM_REGION( 0x0400, "plds", 0 ) + ROM_LOAD( "tibpal16l8.u69", 0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */ + ROM_LOAD( "tibpal16l8.u19", 0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */ + +ROM_END + /*************************************************************************** Strikers 1945 (Japan, unprotected) @@ -1956,18 +1990,22 @@ DRIVER_INIT_MEMBER(psikyo_state,s1945bl) ***************************************************************************/ -/* Working Games */ GAME( 1993, samuraia, 0, sngkace, samuraia, psikyo_state, sngkace, ROT270, "Psikyo", "Samurai Aces (World)", GAME_SUPPORTS_SAVE ) // Banpresto? GAME( 1993, sngkace, samuraia, sngkace, sngkace, psikyo_state, sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan)", GAME_SUPPORTS_SAVE ) // Banpresto? + GAME( 1994, gunbird, 0, gunbird, gunbird, psikyo_state, gunbird, ROT270, "Psikyo", "Gunbird (World)", GAME_SUPPORTS_SAVE ) GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, psikyo_state, gunbird, ROT270, "Psikyo", "Gunbird (Korea)", GAME_SUPPORTS_SAVE ) GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, psikyo_state, gunbird, ROT270, "Psikyo", "Gunbird (Japan)", GAME_SUPPORTS_SAVE ) + GAME( 1994, btlkroad, 0, gunbird, btlkroad, psikyo_state, gunbird, ROT0, "Psikyo", "Battle K-Road", GAME_SUPPORTS_SAVE ) +GAME( 1994, btlkroadk, btlkroad,gunbird, btlkroad, psikyo_state, gunbird, ROT0, "Psikyo", "Battle K-Road (Korean PCB)", GAME_SUPPORTS_SAVE ) // game code is still multi-region, but sound rom appears to be Korea specific at least + GAME( 1995, s1945, 0, s1945, s1945, psikyo_state, s1945, ROT270, "Psikyo", "Strikers 1945 (World)", GAME_SUPPORTS_SAVE ) GAME( 1995, s1945a, s1945, s1945, s1945a, psikyo_state, s1945a, ROT270, "Psikyo", "Strikers 1945 (Japan / World)", GAME_SUPPORTS_SAVE ) // Region dip - 0x0f=Japan, anything else=World GAME( 1995, s1945j, s1945, s1945, s1945j, psikyo_state, s1945j, ROT270, "Psikyo", "Strikers 1945 (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1995, s1945jn, s1945, gunbird, s1945j, psikyo_state, s1945jn, ROT270, "Psikyo", "Strikers 1945 (Japan, unprotected)", GAME_SUPPORTS_SAVE ) GAME( 1995, s1945k, s1945, s1945, s1945j, psikyo_state, s1945, ROT270, "Psikyo", "Strikers 1945 (Korea)", GAME_SUPPORTS_SAVE ) GAME( 1995, s1945bl, s1945, s1945bl, s1945bl, psikyo_state, s1945bl, ROT270, "bootleg","Strikers 1945 (Hong Kong, bootleg)", GAME_SUPPORTS_SAVE ) + GAME( 1996, tengai, 0, s1945, tengai, psikyo_state, tengai, ROT0, "Psikyo", "Tengai (World)", GAME_SUPPORTS_SAVE ) GAME( 1996, tengaij, tengai, s1945, tengaij, psikyo_state, tengai, ROT0, "Psikyo", "Sengoku Blade: Sengoku Ace Episode II / Tengai", GAME_SUPPORTS_SAVE ) // Region dip - 0x0f=Japan, anything else=World diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ffff6c5ac71..f55f0badb6b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -8773,6 +8773,7 @@ gunbird // (c) 1994 gunbirdk // (c) 1994 gunbirdj // (c) 1994 btlkroad // (c) 1994 +btlkroadk // (c) 1994 s1945 // (c) 1995 s1945a // (c) 1995 s1945j // (c) 1995 From d498d5cedfaa93a485f41ce85482114d1ffe916e Mon Sep 17 00:00:00 2001 From: Michael Zapf Date: Tue, 17 Mar 2015 21:09:39 +0100 Subject: [PATCH 064/201] (MESS) ti99: Added a sanity check for disk format detection and a non-locking Alphalock --- src/lib/formats/ti99_dsk.c | 3 +++ src/mess/drivers/ti99_4x.c | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/lib/formats/ti99_dsk.c b/src/lib/formats/ti99_dsk.c index ab6c564fb79..a2abbd2902f 100644 --- a/src/lib/formats/ti99_dsk.c +++ b/src/lib/formats/ti99_dsk.c @@ -835,6 +835,9 @@ void ti99_sdf_format::determine_sizes(io_generic *io, int& cell_size, int& secto have_vib = true; } + // Do we have a broken VIB? The Pascal disks are known to have such incomplete VIBs + if (heads == 0 || sector_count == 0) have_vib = false; + // We're also checking the size of the image int cell_size1 = 0; int sector_count1 = 0; diff --git a/src/mess/drivers/ti99_4x.c b/src/mess/drivers/ti99_4x.c index fff2de23de1..ee661e7c471 100644 --- a/src/mess/drivers/ti99_4x.c +++ b/src/mess/drivers/ti99_4x.c @@ -351,6 +351,12 @@ static INPUT_PORTS_START(ti99_4a) PORT_START("ALPHA") /* one more port for Alpha line */ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alpha Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE + /* another version of Alpha Lock which is non-toggling; this is useful when we want to attach + a real TI keyboard for input. For home computers, the Alpha Lock / Shift Lock was a physically + locking key. */ + PORT_START("ALPHA1") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alpha Lock non-toggle") PORT_CODE(KEYCODE_RWIN) + INPUT_PORTS_END @@ -462,7 +468,7 @@ READ8_MEMBER( ti99_4x_state::read_by_9901 ) // the line enough to make the TMS9901 sense the low level. // A reported, feasible fix was to cut the line and insert a diode // below the Alphalock key. - if ((ioport("ALPHABUG")!=0) && (m_model!=MODEL_4)) answer |= ioport("ALPHA")->read(); + if ((ioport("ALPHABUG")!=0) && (m_model!=MODEL_4)) answer |= (ioport("ALPHA")->read() | ioport("ALPHA1")->read()); } else { @@ -470,7 +476,7 @@ READ8_MEMBER( ti99_4x_state::read_by_9901 ) } if (m_check_alphalock) // never true for TI-99/4 { - answer &= ~(ioport("ALPHA")->read()); + answer &= ~(ioport("ALPHA")->read() | ioport("ALPHA1")->read()); } answer = (answer << 3); if (m_int1 == CLEAR_LINE) answer |= 0x02; From 5b170fd5aba4bd6561796edd406459c92e8455c2 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 17 Mar 2015 21:34:00 +0100 Subject: [PATCH 065/201] messing around --- src/emu/cpu/hmcs40/hmcs40.c | 66 +++++++++++++++++++++------------ src/emu/cpu/hmcs40/hmcs40op.inc | 4 +- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index 66663da73c0..f3b7f9a17dc 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -570,6 +570,9 @@ void hmcs40_cpu_device::execute_run() m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param increment_pc(); + // handle opcode + switch (m_op) + { /* op_ayy(); - @@ -585,42 +588,65 @@ op_alem(); - 324 124 op_blem(); - 267 024 op_lay(); - 118 + */ - // handle opcode - switch (m_op) - { case 0x118: op_lay(); // probably lay break; + + case 0x046: + op_daa(); + break; + case 0x045: + op_das(); + break; + + case 0x267: - op_blem(); break; // bnem or blem + op_blem(); // bnem or blem + break; + case 0x124: op_alem(); // alem or anem break; case 0x324: - op_anem(); break; // " + op_anem(); // " + break; + case 0x024: //op_nega(); //op_am(); op_illegal(); break; - case 0x234: - // sm? -#if 0 - m_a = ram_r() - m_a; - m_s = ~m_a >> 4 & 1; - m_a &= 0xf; -#else - op_am(); -#endif + + case 0x04b: + op_illegal(); + //op_rec(); break; case 0x04c: - op_illegal(); - //m_c ^= 1; - //op_lat(); + op_rec(); break; + case 0x030: + op_amc(); + break; + case 0x034: + //op_illegal(); + op_amc(); // mirror? + break; + + case 0x230: + op_smc(); + break; + case 0x234: + //op_illegal(); + op_smc(); // mirror? + break; + + + + @@ -637,15 +663,11 @@ op_lay(); - 118 /* ok */ op_lmiiy(); break; case 0x020: case 0x021: case 0x022: case 0x023: op_lbm(); break; - case 0x030: - op_amc(); break; case 0x03c: op_lta(); break; case 0x040: /* ok */ op_lxa(); break; - case 0x04b: - op_rec(); break; case 0x04f: op_sec(); break; case 0x050: @@ -751,8 +773,6 @@ op_lay(); - 118 /* ok */ op_rotr(); break; case 0x225: /* ok */ op_rotl(); break; - case 0x230: - op_smc(); break; case 0x23c: op_lat(); break; diff --git a/src/emu/cpu/hmcs40/hmcs40op.inc b/src/emu/cpu/hmcs40/hmcs40op.inc index 15c6d309755..74c8b5a1efa 100644 --- a/src/emu/cpu/hmcs40/hmcs40op.inc +++ b/src/emu/cpu/hmcs40/hmcs40op.inc @@ -662,13 +662,13 @@ void hmcs40_cpu_device::op_p() if (o & 0x100) { // B3 B2 B1 B0 A0 A1 A2 A3 - m_a = BITSWAP8((UINT8)o,7,6,5,4,0,1,2,3) & 0xf; + m_a = BITSWAP8(o,7,6,5,4,0,1,2,3) & 0xf; m_b = o >> 4 & 0xf; } if (o & 0x200) { // R20 R21 R22 R23 R30 R31 R32 R33 - o = BITSWAP8((UINT8)o,0,1,2,3,4,5,6,7); + o = BITSWAP8(o,0,1,2,3,4,5,6,7); write_r(2, o & 0xf); write_r(3, o >> 4 & 0xf); } From 474849d17006b667024764047fb8f354549ff55a Mon Sep 17 00:00:00 2001 From: "Alex W. Jackson" Date: Tue, 17 Mar 2015 22:04:32 -0400 Subject: [PATCH 066/201] a7800.c: Address map corrections and cleanups [Mike Saarna, Alex Jackson] --- src/mess/drivers/a7800.c | 49 +++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/mess/drivers/a7800.c b/src/mess/drivers/a7800.c index 8352d1ab71f..cffcd9c747b 100644 --- a/src/mess/drivers/a7800.c +++ b/src/mess/drivers/a7800.c @@ -117,10 +117,10 @@ public: m_maria(*this, "maria"), m_io_joysticks(*this, "joysticks"), m_io_buttons(*this, "buttons"), - m_io_vblank(*this, "vblank"), m_io_console_buttons(*this, "console_buttons"), m_cart(*this, "cartslot"), - m_screen(*this, "screen") { } + m_screen(*this, "screen"), + m_bios(*this, "maincpu") { } int m_lines; int m_ispal; @@ -132,8 +132,6 @@ public: int m_p2_one_button; int m_bios_enabled; - UINT8 *m_bios; - DECLARE_READ8_MEMBER(bios_or_cart_r); DECLARE_WRITE8_MEMBER(ram0_w); DECLARE_READ8_MEMBER(tia_r); @@ -158,10 +156,10 @@ protected: required_device m_maria; required_ioport m_io_joysticks; required_ioport m_io_buttons; - required_ioport m_io_vblank; required_ioport m_io_console_buttons; required_device m_cart; required_device m_screen; + required_region_ptr m_bios; }; @@ -282,18 +280,17 @@ READ8_MEMBER(a7800_state::bios_or_cart_r) static ADDRESS_MAP_START( a7800_mem, AS_PROGRAM, 8, a7800_state ) AM_RANGE(0x0000, 0x001f) AM_MIRROR(0x300) AM_READWRITE(tia_r, tia_w) AM_RANGE(0x0020, 0x003f) AM_MIRROR(0x300) AM_DEVREADWRITE("maria", atari_maria_device, read, write) - AM_RANGE(0x0040, 0x00ff) AM_RAMBANK("ram0") // RAM (6116 block 0) - AM_RANGE(0x0140, 0x01ff) AM_RAMBANK("ram1") // RAM (6116 block 1) + AM_RANGE(0x0040, 0x00ff) AM_RAMBANK("zpmirror") // mirror of 0x2040-0x20ff, for zero page + AM_RANGE(0x0140, 0x01ff) AM_RAMBANK("spmirror") // mirror of 0x2140-0x21ff, for stack page AM_RANGE(0x0280, 0x02ff) AM_DEVREADWRITE("riot", riot6532_device, read, write) - AM_RANGE(0x0480, 0x04ff) AM_MIRROR(0x100) AM_RAMBANK("riot_ram") - AM_RANGE(0x1800, 0x27ff) AM_RAMBANK("main_ram") - - AM_RANGE(0x2040, 0x20ff) AM_RAMBANK("ram0") // mirror (6116 block 0) - AM_RANGE(0x2140, 0x21ff) AM_RAMBANK("ram1") // mirror (6116 block 1) - - AM_RANGE(0x2800, 0x2fff) AM_RAMBANK("mirror") // these should mirror "main_ram" (according to docs) - AM_RANGE(0x3000, 0x37ff) AM_RAMBANK("mirror") // but system have issues in such case... - AM_RANGE(0x3800, 0x3fff) AM_RAMBANK("mirror") + AM_RANGE(0x0480, 0x04ff) AM_RAM AM_SHARE("riot_ram") AM_MIRROR(0x100) + AM_RANGE(0x1800, 0x1fff) AM_RAM AM_SHARE("6116_1") + AM_RANGE(0x2000, 0x27ff) AM_RAM AM_SHARE("6116_2") AM_MIRROR(0x0800) + // According to the official Software Guide, the RAM at 0x2000 is + // repeatedly mirrored up to 0x3fff, but this is evidently incorrect + // because the High Score Cartridge maps ROM at 0x3000-0x3fff + // Hardware tests show that only the mirror at 0x2800-0x2fff actually + // exists, and only on some hardware (MARIA? motherboard?) revisions AM_RANGE(0x4000, 0xffff) AM_DEVWRITE("cartslot", a78_cart_slot_device, write_40xx) AM_RANGE(0x4000, 0xbfff) AM_DEVREAD("cartslot", a78_cart_slot_device, read_40xx) AM_RANGE(0xc000, 0xffff) AM_READ(bios_or_cart_r) // here also the BIOS can be accessed @@ -322,10 +319,6 @@ static INPUT_PORTS_START( a7800 ) PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_BIT(0xF0, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_START("vblank") - PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen") - PORT_START("console_buttons") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Reset") PORT_CODE(KEYCODE_R) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Select") PORT_CODE(KEYCODE_S) @@ -1306,7 +1299,6 @@ PALETTE_INIT_MEMBER(a7800_state,a7800p) void a7800_state::machine_start() { - m_bios = machine().root_device().memregion("maincpu")->base() + 0xc000; save_item(NAME(m_p1_one_button)); save_item(NAME(m_p2_one_button)); save_item(NAME(m_bios_enabled)); @@ -1314,6 +1306,11 @@ void a7800_state::machine_start() save_item(NAME(m_ctrl_reg)); save_item(NAME(m_maria_flag)); + // set up RAM mirrors + UINT8 *ram = reinterpret_cast(memshare("6116_2")->ptr()); + membank("zpmirror")->set_base(ram + 0x0040); + membank("spmirror")->set_base(ram + 0x0140); + // install additional handlers, if needed if (m_cart->exists()) { @@ -1420,16 +1417,16 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START( a7800 ) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) + ROM_REGION(0x4000, "maincpu", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS( 0, "a7800", "Atari 7800" ) - ROMX_LOAD("7800.u7", 0xf000, 0x1000, CRC(5d13730c) SHA1(d9d134bb6b36907c615a594cc7688f7bfcef5b43), ROM_BIOS(1)) + ROMX_LOAD("7800.u7", 0x3000, 0x1000, CRC(5d13730c) SHA1(d9d134bb6b36907c615a594cc7688f7bfcef5b43), ROM_BIOS(1)) ROM_SYSTEM_BIOS( 1, "a7800pr", "Atari 7800 (prototype with Asteroids)" ) - ROMX_LOAD("c300558-001a.u7", 0xc000, 0x4000, CRC(a0e10edf) SHA1(14584b1eafe9721804782d4b1ac3a4a7313e455f), ROM_BIOS(2)) + ROMX_LOAD("c300558-001a.u7", 0x0000, 0x4000, CRC(a0e10edf) SHA1(14584b1eafe9721804782d4b1ac3a4a7313e455f), ROM_BIOS(2)) ROM_END ROM_START( a7800p ) - ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) - ROM_LOAD("7800pal.rom", 0xc000, 0x4000, CRC(d5b61170) SHA1(5a140136a16d1d83e4ff32a19409ca376a8df874)) + ROM_REGION(0x4000, "maincpu", ROMREGION_ERASEFF) + ROM_LOAD("7800pal.rom", 0x0000, 0x4000, CRC(d5b61170) SHA1(5a140136a16d1d83e4ff32a19409ca376a8df874)) ROM_END From bb94e7d86ddda3d6ddcb442deeccb63a8ab23470 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Wed, 18 Mar 2015 11:51:15 +0000 Subject: [PATCH 067/201] new clones Adventure Quiz Capcom World 2 (Japan 920611, B-Board 91634B-2) [Bonky] --- src/mame/drivers/cps1.c | 38 ++++++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 1 + src/mame/video/cps1.c | 1 + 3 files changed, 40 insertions(+) diff --git a/src/mame/drivers/cps1.c b/src/mame/drivers/cps1.c index 7aa5a3d18c5..4b9fecc0e5f 100644 --- a/src/mame/drivers/cps1.c +++ b/src/mame/drivers/cps1.c @@ -9352,6 +9352,43 @@ ROM_START( cworld2ja ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_END +/* B-Board 91634B-2 - all roms have 91634B on the labels */ +ROM_START( cworld2jb ) + ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "q5 - 23_91634b.8f", 0x00000, 0x80000, CRC(709f577f) SHA1(3e0615d01f22eb1bf75cbd26dc80ca5a6d08120e) ) + ROM_LOAD16_WORD_SWAP( "q5 - 22_91634b.7f", 0x80000, 0x80000, CRC(93248458) SHA1(9dcdc6838f52efc9a0a6333fd0d734946db12dbd) ) + + ROM_REGION( 0x200000, "gfx", 0 ) + ROMX_LOAD( "q5 - 01_91634b.3a", 0x000000, 0x80000, CRC(09d0e7ce) SHA1(ea502b975986222acce82ce8396348af72e1df72) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "q5 - 02_91634b.4a", 0x000002, 0x80000, CRC(22e4ce9a) SHA1(9e49aec8e1d6d15a68da63e69765b82fd53a9562) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "q5 - 03_91634b.5a", 0x000004, 0x80000, CRC(f7b3aed6) SHA1(bdfb4d5988307b07ad878ac9129954d14da8769b) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "q5 - 04_91634b.6a", 0x000006, 0x80000, CRC(520c6c88) SHA1(19ba8ca3d75aae71cdf471e6307e86a5df8a2851) , ROM_GROUPWORD | ROM_SKIP(6) ) + + ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "q5 - 09_91634b.12a", 0x00000, 0x08000, CRC(e14dc524) SHA1(0020a9002572002458fbfe45e8a959cb90de3f03) ) + ROM_CONTINUE( 0x10000, 0x08000 ) + + ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ + ROM_LOAD( "q5 - 18_91634b.11c", 0x00000, 0x20000, CRC(d10c1b68) SHA1(2423241f3340d8ab1b6bf9514ca8c3bba1273873) ) + ROM_LOAD( "q5 - 19_91634b.12c", 0x20000, 0x20000, CRC(7d17e496) SHA1(a274b94ec4f042dddc239ecb9ac2e1e2375f5eb2) ) + + ROM_REGION( 0x0200, "aboardplds", 0 ) + ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) + ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) ) + ROM_LOAD( "prg1", 0x0000, 0x0117, CRC(f1129744) SHA1(a5300f301c1a08a7da768f0773fa0fe3f683b237) ) + ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) + ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) + + ROM_REGION( 0x0200, "bboardplds", 0 ) + ROM_LOAD( "q563b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) + ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) + + ROM_REGION( 0x0200, "cboardplds", 0 ) // checkme + ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) +ROM_END + /* B-Board 89624B-3 */ ROM_START( varth ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ @@ -11718,6 +11755,7 @@ GAME( 1992, sf2koryu, sf2ce, cps1_12MHz, sf2hack, cps_state, sf2hack, GAME( 1992, sf2dongb, sf2ce, cps1_12MHz, sf2, cps_state, sf2dongb, ROT0, "bootleg", "Street Fighter II': Champion Edition (Dongfang Bubai protection, bootleg)", GAME_SUPPORTS_SAVE ) // 920313 - based on World version GAME( 1992, cworld2j, 0, cps1_12MHz, cworld2j, cps_state, cps1, ROT0, "Capcom", "Adventure Quiz Capcom World 2 (Japan 920611)", GAME_SUPPORTS_SAVE ) GAME( 1992, cworld2ja, cworld2j, cps1_12MHz, cworld2j, cps_state, cps1, ROT0, "Capcom", "Adventure Quiz Capcom World 2 (Japan 920611, B-Board 90629B-3, no battery)", GAME_SUPPORTS_SAVE ) +GAME( 1992, cworld2jb, cworld2j, cps1_12MHz, cworld2j, cps_state, cps1, ROT0, "Capcom", "Adventure Quiz Capcom World 2 (Japan 920611, B-Board 91634B-2)", GAME_SUPPORTS_SAVE ) GAME( 1992, varth, 0, cps1_12MHz, varth, cps_state, cps1, ROT270, "Capcom", "Varth: Operation Thunderstorm (World 920714)", GAME_SUPPORTS_SAVE ) // "ETC" // 12MHz verified GAME( 1992, varthr1, varth, cps1_12MHz, varth, cps_state, cps1, ROT270, "Capcom", "Varth: Operation Thunderstorm (World 920612)", GAME_SUPPORTS_SAVE ) // "ETC" GAME( 1992, varthu, varth, cps1_12MHz, varth, cps_state, cps1, ROT270, "Capcom (Romstar license)", "Varth: Operation Thunderstorm (USA 920612)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index f55f0badb6b..a523b095e7a 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -3237,6 +3237,7 @@ sf2mdtb // bootleg sf2b // bootleg cworld2j // 11/06/1992 (c) 1992 (Japan) cworld2ja // 11/06/1992 (c) 1992 (Japan) +cworld2jb // 11/06/1992 (c) 1992 (Japan) varth // 14/07/1992 (c) 1992 (World) varthr1 // 12/06/1992 (c) 1992 (World) varthu // 12/06/1992 (c) 1992 (USA) diff --git a/src/mame/video/cps1.c b/src/mame/video/cps1.c index c79703f03bf..abf941d700e 100644 --- a/src/mame/video/cps1.c +++ b/src/mame/video/cps1.c @@ -1532,6 +1532,7 @@ static const struct CPS1config cps1_config_table[]= {"varthj", CPS_B_21_BT5, mapper_VA22B }, /* CPSB test has been patched out (72=0001) register is also written to, possibly leftover from development */ {"cworld2j", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, /* (ports 36, 34 probably leftover input code from another game) */ {"cworld2ja", CPS_B_21_DEF, mapper_Q522B }, // patched set, no battery, could be desuicided + {"cworld2jb", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, // actually Q563B {"wof", CPS_B_21_QS1, mapper_TK263B }, {"wofr1", CPS_B_21_DEF, mapper_TK263B }, // patched set coming from a desuicided board? {"wofa", CPS_B_21_DEF, mapper_TK263B }, // patched set coming from a desuicided board? From 0e63709997962a62f85195964910be56070261cb Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 18 Mar 2015 15:35:40 +0100 Subject: [PATCH 068/201] another small interrupt bugfix --- src/emu/cpu/hmcs40/hmcs40.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index f3b7f9a17dc..2daa1a911b4 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -459,6 +459,7 @@ void hmcs40_cpu_device::do_interrupt() { m_icount--; push_stack(); + m_ie = 0; // line 0/1 for external interrupt, let's use 2 for t/c interrupt int line = (m_iri) ? m_eint_line : 2; @@ -466,8 +467,10 @@ void hmcs40_cpu_device::do_interrupt() // vector $3f, on page 0(timer/counter), or page 1(external) // external interrupt has priority over t/c interrupt m_pc = 0x3f | (m_iri ? 0x40 : 0); - m_iri = m_irt = 0; - m_ie = 0; + if (m_iri) + m_iri = 0; + else + m_irt = 0; standard_irq_callback(line); } @@ -554,7 +557,12 @@ void hmcs40_cpu_device::execute_run() // LPU is handled 1 cycle later if ((m_prev_op & 0x3e0) == 0x340) + { + if ((m_op & 0x1c0) != 0x1c0) + logerror("%s LPU without BR/CAL at $%04X\n", tag(), m_prev_pc); + m_pc = ((m_page << 6) | (m_pc & 0x3f)) & m_pcmask; + } // check/handle interrupt, but not in the middle of a long jump if (m_ie && (m_iri || m_irt) && (m_op & 0x3e0) != 0x340) @@ -567,7 +575,7 @@ void hmcs40_cpu_device::execute_run() // fetch next opcode debugger_instruction_hook(this, m_pc); m_op = m_program->read_word(m_pc << 1) & 0x3ff; - m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param + m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param (except for XAMR?) increment_pc(); // handle opcode @@ -633,7 +641,8 @@ op_lay(); - 118 break; case 0x034: //op_illegal(); - op_amc(); // mirror? + //op_amc(); // mirror? + op_am(); break; case 0x230: @@ -641,7 +650,8 @@ op_lay(); - 118 break; case 0x234: //op_illegal(); - op_smc(); // mirror? + //op_smc(); // mirror? + op_nega(); break; From 57383a93dfce1386510888ce87f45ea2e1d73efc Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 18 Mar 2015 19:07:10 +0100 Subject: [PATCH 069/201] supdrapo.c, suprgolf.c, suprloco.c, suprridr.c: added save state support (nw) --- src/mame/drivers/supdrapo.c | 42 ++++++++------ src/mame/drivers/suprgolf.c | 107 ++++++++++++++++++++--------------- src/mame/drivers/suprloco.c | 18 +++--- src/mame/drivers/suprridr.c | 30 ++++++---- src/mame/includes/suprloco.h | 33 ++++++----- src/mame/includes/suprridr.h | 55 ++++++++++-------- src/mame/video/suprloco.c | 14 +++-- src/mame/video/suprridr.c | 37 ++++++------ 8 files changed, 190 insertions(+), 146 deletions(-) diff --git a/src/mame/drivers/supdrapo.c b/src/mame/drivers/supdrapo.c index 2166afa9c9d..84c58873ec1 100644 --- a/src/mame/drivers/supdrapo.c +++ b/src/mame/drivers/supdrapo.c @@ -27,11 +27,11 @@ - Reworked inputs to match the standard poker inputs names/layout. - Hooked the payout switch. - - Hooked a watchdog circuitery, that seems intended to reset + - Hooked a watchdog circuitry, that seems intended to reset the game and/or an external device. - Added machine start & reset. - All clocks pre defined. - - Added ay8910 interfase as a preliminary attempt to analyze the unknown + - Added ay8910 interface as a preliminary attempt to analyze the unknown port writes when these ports are set as input. - Figured out the following DIP switches: Auto Bet (No, Yes). @@ -72,18 +72,24 @@ class supdrapo_state : public driver_device public: supdrapo_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_col_line(*this, "col_line"), - m_videoram(*this, "videoram"), - m_char_bank(*this, "char_bank"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_col_line(*this, "col_line"), + m_videoram(*this, "videoram"), + m_char_bank(*this, "char_bank") { } + required_device m_maincpu; + required_device m_gfxdecode; + required_device m_palette; + required_shared_ptr m_col_line; required_shared_ptr m_videoram; required_shared_ptr m_char_bank; + UINT8 m_wdog; - DECLARE_READ8_MEMBER(sdpoker_rng_r); + + DECLARE_READ8_MEMBER(rng_r); DECLARE_WRITE8_MEMBER(wdog8000_w); DECLARE_WRITE8_MEMBER(debug8004_w); DECLARE_WRITE8_MEMBER(debug7c00_w); @@ -91,14 +97,13 @@ public: DECLARE_WRITE8_MEMBER(payout_w); DECLARE_WRITE8_MEMBER(ay8910_outputa_w); DECLARE_WRITE8_MEMBER(ay8910_outputb_w); + virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); DECLARE_PALETTE_INIT(supdrapo); - UINT32 screen_update_supdrapo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - required_device m_maincpu; - required_device m_gfxdecode; - required_device m_palette; + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); }; @@ -111,7 +116,7 @@ void supdrapo_state::video_start() } -UINT32 supdrapo_state::screen_update_supdrapo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 supdrapo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int x, y; int count; @@ -171,7 +176,7 @@ PALETTE_INIT_MEMBER(supdrapo_state, supdrapo) R/W Handlers **********************************************************************/ -READ8_MEMBER(supdrapo_state::sdpoker_rng_r) +READ8_MEMBER(supdrapo_state::rng_r) { return machine().rand(); } @@ -251,6 +256,7 @@ WRITE8_MEMBER(supdrapo_state::payout_w) void supdrapo_state::machine_start() { + save_item(NAME(m_wdog)); } @@ -282,7 +288,7 @@ static ADDRESS_MAP_START( sdpoker_mem, AS_PROGRAM, 8, supdrapo_state ) AM_RANGE(0x8005, 0x8005) AM_READ_PORT("SW1") AM_RANGE(0x8006, 0x8006) AM_READ_PORT("SW2") AM_RANGE(0x9000, 0x90ff) AM_RAM AM_SHARE("nvram") - AM_RANGE(0x9400, 0x9400) AM_READ(sdpoker_rng_r) + AM_RANGE(0x9400, 0x9400) AM_READ(rng_r) AM_RANGE(0x9800, 0x9801) AM_DEVWRITE("aysnd", ay8910_device, data_address_w) ADDRESS_MAP_END @@ -453,7 +459,7 @@ static MACHINE_CONFIG_START( supdrapo, supdrapo_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE_DRIVER(supdrapo_state, screen_update_supdrapo) + MCFG_SCREEN_UPDATE_DRIVER(supdrapo_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", supdrapo) @@ -600,6 +606,6 @@ ROM_END **********************************************************************/ /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS... */ -GAME( 1983, supdrapo, 0, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation (Stern Electronics license)", "Super Draw Poker (set 1)", 0 ) -GAME( 1983, supdrapoa, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation / Jeutel", "Super Draw Poker (set 2)", 0 ) -GAME( 1983, supdrapob, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "bootleg", "Super Draw Poker (bootleg)", 0 ) +GAME( 1983, supdrapo, 0, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation (Stern Electronics license)", "Super Draw Poker (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1983, supdrapoa, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "Valadon Automation / Jeutel", "Super Draw Poker (set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1983, supdrapob, supdrapo, supdrapo, supdrapo, driver_device, 0, ROT90, "bootleg", "Super Draw Poker (bootleg)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/suprgolf.c b/src/mame/drivers/suprgolf.c index 614faaa8052..368fe3ded91 100644 --- a/src/mame/drivers/suprgolf.c +++ b/src/mame/drivers/suprgolf.c @@ -33,14 +33,20 @@ class suprgolf_state : public driver_device public: suprgolf_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_videoram(*this, "videoram"), m_maincpu(*this, "maincpu"), m_msm(*this, "msm"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_videoram(*this, "videoram") { } + + required_device m_maincpu; + required_device m_msm; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr m_videoram; tilemap_t *m_tilemap; - required_shared_ptr m_videoram; UINT8 *m_paletteram; UINT8 *m_bg_vram; UINT16 *m_bg_fb; @@ -54,34 +60,33 @@ public: UINT8 m_palette_switch; UINT8 m_bg_vreg_test; UINT8 m_toggle; - DECLARE_READ8_MEMBER(suprgolf_videoram_r); - DECLARE_WRITE8_MEMBER(suprgolf_videoram_w); - DECLARE_READ8_MEMBER(suprgolf_bg_vram_r); - DECLARE_WRITE8_MEMBER(suprgolf_bg_vram_w); - DECLARE_WRITE8_MEMBER(suprgolf_pen_w); + + DECLARE_READ8_MEMBER(videoram_r); + DECLARE_WRITE8_MEMBER(videoram_w); + DECLARE_READ8_MEMBER(bg_vram_r); + DECLARE_WRITE8_MEMBER(bg_vram_w); + DECLARE_WRITE8_MEMBER(pen_w); DECLARE_WRITE8_MEMBER(adpcm_data_w); DECLARE_WRITE8_MEMBER(rom2_bank_select_w); - DECLARE_READ8_MEMBER(suprgolf_vregs_r); - DECLARE_WRITE8_MEMBER(suprgolf_vregs_w); + DECLARE_READ8_MEMBER(vregs_r); + DECLARE_WRITE8_MEMBER(vregs_w); DECLARE_READ8_MEMBER(rom_bank_select_r); DECLARE_WRITE8_MEMBER(rom_bank_select_w); DECLARE_READ8_MEMBER(pedal_extra_bits_r); DECLARE_READ8_MEMBER(p1_r); DECLARE_READ8_MEMBER(p2_r); - DECLARE_WRITE8_MEMBER(suprgolf_writeA); - DECLARE_WRITE8_MEMBER(suprgolf_writeB); - DECLARE_DRIVER_INIT(suprgolf); + DECLARE_WRITE8_MEMBER(writeA); + DECLARE_WRITE8_MEMBER(writeB); + DECLARE_WRITE_LINE_MEMBER(adpcm_int); + TILE_GET_INFO_MEMBER(get_tile_info); + + DECLARE_DRIVER_INIT(suprgolf); virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); - UINT32 screen_update_suprgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - DECLARE_WRITE_LINE_MEMBER(irqhandler); - DECLARE_WRITE_LINE_MEMBER(adpcm_int); - required_device m_maincpu; - required_device m_msm; - required_device m_gfxdecode; - required_device m_palette; + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); }; TILE_GET_INFO_MEMBER(suprgolf_state::get_tile_info) @@ -104,9 +109,19 @@ void suprgolf_state::video_start() m_fg_fb = auto_alloc_array(machine(), UINT16, 0x2000*0x20); m_tilemap->set_transparent_pen(15); + + save_item(NAME(m_bg_bank)); + save_item(NAME(m_vreg_bank)); + save_item(NAME(m_vreg_pen)); + save_item(NAME(m_palette_switch)); + save_item(NAME(m_bg_vreg_test)); + save_pointer(NAME(m_paletteram), 0x1000); + save_pointer(NAME(m_bg_vram), 0x2000*0x20); + save_pointer(NAME(m_bg_fb), 0x2000*0x20); + save_pointer(NAME(m_fg_fb), 0x2000*0x20); } -UINT32 suprgolf_state::screen_update_suprgolf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 suprgolf_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int x,y,count,color; bitmap.fill(m_palette->black_pen(), cliprect); @@ -150,7 +165,7 @@ UINT32 suprgolf_state::screen_update_suprgolf(screen_device &screen, bitmap_ind1 return 0; } -READ8_MEMBER(suprgolf_state::suprgolf_videoram_r) +READ8_MEMBER(suprgolf_state::videoram_r) { if (m_palette_switch) return m_paletteram[offset]; @@ -158,7 +173,7 @@ READ8_MEMBER(suprgolf_state::suprgolf_videoram_r) return m_videoram[offset]; } -WRITE8_MEMBER(suprgolf_state::suprgolf_videoram_w) +WRITE8_MEMBER(suprgolf_state::videoram_w) { if(m_palette_switch) { @@ -180,12 +195,12 @@ WRITE8_MEMBER(suprgolf_state::suprgolf_videoram_w) } } -READ8_MEMBER(suprgolf_state::suprgolf_vregs_r) +READ8_MEMBER(suprgolf_state::vregs_r) { return m_vreg_bank; } -WRITE8_MEMBER(suprgolf_state::suprgolf_vregs_w) +WRITE8_MEMBER(suprgolf_state::vregs_w) { //printf("%02x\n",data); @@ -200,12 +215,12 @@ WRITE8_MEMBER(suprgolf_state::suprgolf_vregs_w) // printf("Video regs with data %02x activated\n",data); } -READ8_MEMBER(suprgolf_state::suprgolf_bg_vram_r) +READ8_MEMBER(suprgolf_state::bg_vram_r) { return m_bg_vram[offset+m_bg_bank*0x2000]; } -WRITE8_MEMBER(suprgolf_state::suprgolf_bg_vram_w) +WRITE8_MEMBER(suprgolf_state::bg_vram_w) { UINT8 hi_nibble,lo_nibble; UINT8 hi_dirty_dot,lo_dirty_dot; // helpers @@ -254,9 +269,14 @@ void suprgolf_state::machine_start() { membank("bank1")->configure_entries(0, 16, memregion("user2")->base(), 0x4000); membank("bank2")->configure_entries(0, 64, memregion("user1")->base(), 0x4000); + + save_item(NAME(m_rom_bank)); + save_item(NAME(m_msm5205next)); + save_item(NAME(m_msm_nmi_mask)); + save_item(NAME(m_toggle)); } -WRITE8_MEMBER(suprgolf_state::suprgolf_pen_w) +WRITE8_MEMBER(suprgolf_state::pen_w) { m_vreg_pen = data; } @@ -317,9 +337,9 @@ static ADDRESS_MAP_START( suprgolf_map, AS_PROGRAM, 8, suprgolf_state ) AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") AM_RANGE(0x4000, 0x4000) AM_WRITE(rom2_bank_select_w ) AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") - AM_RANGE(0xc000, 0xdfff) AM_READWRITE(suprgolf_bg_vram_r, suprgolf_bg_vram_w ) // banked background vram - AM_RANGE(0xe000, 0xefff) AM_READWRITE(suprgolf_videoram_r, suprgolf_videoram_w ) AM_SHARE("videoram") //foreground vram + paletteram - AM_RANGE(0xf000, 0xf000) AM_WRITE(suprgolf_pen_w ) + AM_RANGE(0xc000, 0xdfff) AM_READWRITE(bg_vram_r, bg_vram_w ) // banked background vram + AM_RANGE(0xe000, 0xefff) AM_READWRITE(videoram_r, videoram_w ) AM_SHARE("videoram") //foreground vram + paletteram + AM_RANGE(0xf000, 0xf000) AM_WRITE(pen_w ) AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END @@ -416,21 +436,16 @@ static INPUT_PORTS_START( suprgolf ) PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW2:8" ) INPUT_PORTS_END -WRITE8_MEMBER(suprgolf_state::suprgolf_writeA) +WRITE8_MEMBER(suprgolf_state::writeA) { osd_printf_debug("ymwA\n"); } -WRITE8_MEMBER(suprgolf_state::suprgolf_writeB) +WRITE8_MEMBER(suprgolf_state::writeB) { osd_printf_debug("ymwA\n"); } -WRITE_LINE_MEMBER(suprgolf_state::irqhandler) -{ - //m_maincpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); -} - WRITE_LINE_MEMBER(suprgolf_state::adpcm_int) { m_msm->reset_w(0); @@ -485,8 +500,8 @@ static MACHINE_CONFIG_START( suprgolf, suprgolf_state ) MCFG_I8255_IN_PORTA_CB(IOPORT("SYSTEM")) MCFG_I8255_IN_PORTB_CB(READ8(suprgolf_state, rom_bank_select_r)) MCFG_I8255_OUT_PORTB_CB(WRITE8(suprgolf_state, rom_bank_select_w)) - MCFG_I8255_IN_PORTC_CB(READ8(suprgolf_state, suprgolf_vregs_r)) - MCFG_I8255_OUT_PORTC_CB(WRITE8(suprgolf_state, suprgolf_vregs_w)) + MCFG_I8255_IN_PORTC_CB(READ8(suprgolf_state, vregs_r)) + MCFG_I8255_OUT_PORTC_CB(WRITE8(suprgolf_state, vregs_w)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -494,7 +509,7 @@ static MACHINE_CONFIG_START( suprgolf, suprgolf_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 191) - MCFG_SCREEN_UPDATE_DRIVER(suprgolf_state, screen_update_suprgolf) + MCFG_SCREEN_UPDATE_DRIVER(suprgolf_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", suprgolf) @@ -504,11 +519,11 @@ static MACHINE_CONFIG_START( suprgolf, suprgolf_state ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ymsnd", YM2203, MASTER_CLOCK/4) /* guess */ - MCFG_YM2203_IRQ_HANDLER(WRITELINE(suprgolf_state, irqhandler)) + //MCFG_YM2203_IRQ_HANDLER(INPUTLINE("maincpu", INPUT_LINE_NMI)) MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW0")) MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW1")) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(suprgolf_state, suprgolf_writeA)) - MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(suprgolf_state, suprgolf_writeB)) + MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(suprgolf_state, writeA)) + MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(suprgolf_state, writeB)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) MCFG_SOUND_ADD("msm", MSM5205, XTAL_384kHz) /* guess */ @@ -621,5 +636,5 @@ DRIVER_INIT_MEMBER(suprgolf_state,suprgolf) ROM[0x6d72+(0x4000*3)-0x4000] = 0x20; //patch ROM check } -GAME( 1989, suprgolf, 0, suprgolf, suprgolf, suprgolf_state, suprgolf, ROT0, "Nasco", "Super Crowns Golf (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) -GAME( 1989, albatross, suprgolf, suprgolf, suprgolf, driver_device, 0, ROT0, "Nasco", "Albatross (US Prototype?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) +GAME( 1989, suprgolf, 0, suprgolf, suprgolf, suprgolf_state, suprgolf, ROT0, "Nasco", "Super Crowns Golf (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1989, albatross, suprgolf, suprgolf, suprgolf, driver_device, 0, ROT0, "Nasco", "Albatross (US Prototype?)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL| GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/suprloco.c b/src/mame/drivers/suprloco.c index 3f532300d01..67da4f20978 100644 --- a/src/mame/drivers/suprloco.c +++ b/src/mame/drivers/suprloco.c @@ -5,7 +5,7 @@ Super Locomotive driver by Zsolt Vasvari TODO: -- Bit 5 in suprloco_control_w is pulsed when loco turns "super". This is supposed +- Bit 5 in control_w is pulsed when loco turns "super". This is supposed to make red parts of sprites blink to purple, it's not clear how this is implemented in hardware, there's a hack to support it. @@ -25,7 +25,7 @@ Sega PCB 834-5137 #include "sound/sn76496.h" #include "includes/suprloco.h" -WRITE8_MEMBER(suprloco_state::suprloco_soundport_w) +WRITE8_MEMBER(suprloco_state::soundport_w) { soundlatch_byte_w(space, 0, data); m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); @@ -42,11 +42,11 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, suprloco_state ) AM_RANGE(0xd800, 0xd800) AM_READ_PORT("P2") AM_RANGE(0xe000, 0xe000) AM_READ_PORT("DSW1") AM_RANGE(0xe001, 0xe001) AM_READ_PORT("DSW2") - AM_RANGE(0xe800, 0xe800) AM_WRITE(suprloco_soundport_w) - AM_RANGE(0xe801, 0xe801) AM_READWRITE(suprloco_control_r, suprloco_control_w) - AM_RANGE(0xf000, 0xf6ff) AM_RAM_WRITE(suprloco_videoram_w) AM_SHARE("videoram") + AM_RANGE(0xe800, 0xe800) AM_WRITE(soundport_w) + AM_RANGE(0xe801, 0xe801) AM_READWRITE(control_r, control_w) + AM_RANGE(0xf000, 0xf6ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram") AM_RANGE(0xf700, 0xf7df) AM_RAM /* unused */ - AM_RANGE(0xf7e0, 0xf7ff) AM_RAM_WRITE(suprloco_scrollram_w) AM_SHARE("scrollram") + AM_RANGE(0xf7e0, 0xf7ff) AM_RAM_WRITE(scrollram_w) AM_SHARE("scrollram") AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END @@ -175,7 +175,7 @@ static MACHINE_CONFIG_START( suprloco, suprloco_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE_DRIVER(suprloco_state, screen_update_suprloco) + MCFG_SCREEN_UPDATE_DRIVER(suprloco_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", suprloco) @@ -297,5 +297,5 @@ DRIVER_INIT_MEMBER(suprloco_state,suprloco) -GAME( 1982, suprloco, 0, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive (Rev.A)", 0 ) -GAME( 1982, suprlocoo, suprloco, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive", 0 ) +GAME( 1982, suprloco, 0, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive (Rev.A)", GAME_SUPPORTS_SAVE ) +GAME( 1982, suprlocoo, suprloco, suprloco, suprloco, suprloco_state, suprloco, ROT0, "Sega", "Super Locomotive", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/suprridr.c b/src/mame/drivers/suprridr.c index 284d66c2970..98b114908b9 100644 --- a/src/mame/drivers/suprridr.c +++ b/src/mame/drivers/suprridr.c @@ -89,6 +89,12 @@ #include "sound/ay8910.h" +void suprridr_state::machine_start() +{ + save_item(NAME(m_nmi_enable)); + save_item(NAME(m_sound_data)); +} + /************************************* * * Interrupt generation @@ -164,8 +170,8 @@ WRITE8_MEMBER(suprridr_state::coin_lock_w) static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, suprridr_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM - AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(suprridr_bgram_w) AM_SHARE("bgram") - AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(suprridr_fgram_w) AM_SHARE("fgram") + AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(bgram_w) AM_SHARE("bgram") + AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(fgram_w) AM_SHARE("fgram") AM_RANGE(0x9800, 0x983f) AM_RAM AM_RANGE(0x9840, 0x987f) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x9880, 0x9bff) AM_RAM @@ -173,12 +179,12 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, suprridr_state ) AM_RANGE(0xa800, 0xa800) AM_READ_PORT("SYSTEM") AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(nmi_enable_w) AM_RANGE(0xb002, 0xb003) AM_WRITE(coin_lock_w) - AM_RANGE(0xb006, 0xb006) AM_WRITE(suprridr_flipx_w) - AM_RANGE(0xb007, 0xb007) AM_WRITE(suprridr_flipy_w) + AM_RANGE(0xb006, 0xb006) AM_WRITE(flipx_w) + AM_RANGE(0xb007, 0xb007) AM_WRITE(flipy_w) AM_RANGE(0xb800, 0xb800) AM_WRITE(sound_data_w) - AM_RANGE(0xc801, 0xc801) AM_WRITE(suprridr_fgdisable_w) - AM_RANGE(0xc802, 0xc802) AM_WRITE(suprridr_fgscrolly_w) - AM_RANGE(0xc804, 0xc804) AM_WRITE(suprridr_bgscrolly_w) + AM_RANGE(0xc801, 0xc801) AM_WRITE(fgdisable_w) + AM_RANGE(0xc802, 0xc802) AM_WRITE(fgscrolly_w) + AM_RANGE(0xc804, 0xc804) AM_WRITE(bgscrolly_w) AM_RANGE(0xc000, 0xefff) AM_ROM ADDRESS_MAP_END @@ -223,12 +229,12 @@ ADDRESS_MAP_END #define SUPRRIDR_P1_CONTROL_PORT_TAG ("CONTP1") #define SUPRRIDR_P2_CONTROL_PORT_TAG ("CONTP2") -CUSTOM_INPUT_MEMBER(suprridr_state::suprridr_control_r) +CUSTOM_INPUT_MEMBER(suprridr_state::control_r) { UINT32 ret; /* screen flip multiplexes controls */ - if (suprridr_is_screen_flipped()) + if (is_screen_flipped()) ret = ioport(SUPRRIDR_P2_CONTROL_PORT_TAG)->read(); else ret = ioport(SUPRRIDR_P1_CONTROL_PORT_TAG)->read(); @@ -239,7 +245,7 @@ CUSTOM_INPUT_MEMBER(suprridr_state::suprridr_control_r) static INPUT_PORTS_START( suprridr ) PORT_START("INPUTS") - PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, suprridr_state,suprridr_control_r, NULL) + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, suprridr_state, control_r, NULL) PORT_START("SYSTEM") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) @@ -353,7 +359,7 @@ static MACHINE_CONFIG_START( suprridr, suprridr_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE_DRIVER(suprridr_state, screen_update_suprridr) + MCFG_SCREEN_UPDATE_DRIVER(suprridr_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", suprridr) @@ -423,4 +429,4 @@ ROM_END * *************************************/ -GAME( 1983, suprridr, 0, suprridr, suprridr, driver_device, 0, ROT90, "Taito Corporation (Venture Line license)", "Super Rider", GAME_IMPERFECT_SOUND ) +GAME( 1983, suprridr, 0, suprridr, suprridr, driver_device, 0, ROT90, "Taito Corporation (Venture Line license)", "Super Rider", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/suprloco.h b/src/mame/includes/suprloco.h index 0d9963dbf92..a04d8166faa 100644 --- a/src/mame/includes/suprloco.h +++ b/src/mame/includes/suprloco.h @@ -3,33 +3,38 @@ class suprloco_state : public driver_device public: suprloco_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_spriteram(*this, "spriteram"), - m_videoram(*this, "videoram"), - m_scrollram(*this, "scrollram"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), - m_gfxdecode(*this, "gfxdecode") { } + m_gfxdecode(*this, "gfxdecode"), + m_spriteram(*this, "spriteram"), + m_videoram(*this, "videoram"), + m_scrollram(*this, "scrollram") { } + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_gfxdecode; required_shared_ptr m_spriteram; required_shared_ptr m_videoram; required_shared_ptr m_scrollram; + tilemap_t *m_bg_tilemap; int m_control; - DECLARE_WRITE8_MEMBER(suprloco_soundport_w); - DECLARE_WRITE8_MEMBER(suprloco_videoram_w); - DECLARE_WRITE8_MEMBER(suprloco_scrollram_w); - DECLARE_WRITE8_MEMBER(suprloco_control_w); - DECLARE_READ8_MEMBER(suprloco_control_r); - DECLARE_DRIVER_INIT(suprloco); + DECLARE_WRITE8_MEMBER(soundport_w); + DECLARE_WRITE8_MEMBER(videoram_w); + DECLARE_WRITE8_MEMBER(scrollram_w); + DECLARE_WRITE8_MEMBER(control_w); + DECLARE_READ8_MEMBER(control_r); + TILE_GET_INFO_MEMBER(get_tile_info); + virtual void video_start(); DECLARE_PALETTE_INIT(suprloco); - UINT32 screen_update_suprloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + DECLARE_DRIVER_INIT(suprloco); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); inline void draw_pixel(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int color,int flip); void draw_sprite(bitmap_ind16 &bitmap,const rectangle &cliprect,int spr_number); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); - required_device m_maincpu; - required_device m_audiocpu; - required_device m_gfxdecode; }; diff --git a/src/mame/includes/suprridr.h b/src/mame/includes/suprridr.h index ac5ababb02a..fe39170bee4 100644 --- a/src/mame/includes/suprridr.h +++ b/src/mame/includes/suprridr.h @@ -11,47 +11,56 @@ class suprridr_state : public driver_device public: suprridr_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_fgram(*this, "fgram"), - m_bgram(*this, "bgram"), - m_spriteram(*this, "spriteram"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_fgram(*this, "fgram"), + m_bgram(*this, "bgram"), + m_spriteram(*this, "spriteram") { } + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_gfxdecode; + required_device m_palette; + + required_shared_ptr m_fgram; + required_shared_ptr m_bgram; + required_shared_ptr m_spriteram; UINT8 m_nmi_enable; UINT8 m_sound_data; - required_shared_ptr m_fgram; - required_shared_ptr m_bgram; tilemap_t *m_fg_tilemap; tilemap_t *m_bg_tilemap; tilemap_t *m_bg_tilemap_noscroll; UINT8 m_flipx; UINT8 m_flipy; - required_shared_ptr m_spriteram; + DECLARE_WRITE8_MEMBER(nmi_enable_w); DECLARE_WRITE8_MEMBER(sound_data_w); DECLARE_WRITE8_MEMBER(sound_irq_ack_w); DECLARE_WRITE8_MEMBER(coin_lock_w); - DECLARE_WRITE8_MEMBER(suprridr_flipx_w); - DECLARE_WRITE8_MEMBER(suprridr_flipy_w); - DECLARE_WRITE8_MEMBER(suprridr_fgdisable_w); - DECLARE_WRITE8_MEMBER(suprridr_fgscrolly_w); - DECLARE_WRITE8_MEMBER(suprridr_bgscrolly_w); - DECLARE_WRITE8_MEMBER(suprridr_bgram_w); - DECLARE_WRITE8_MEMBER(suprridr_fgram_w); - DECLARE_CUSTOM_INPUT_MEMBER(suprridr_control_r); + DECLARE_WRITE8_MEMBER(flipx_w); + DECLARE_WRITE8_MEMBER(flipy_w); + DECLARE_WRITE8_MEMBER(fgdisable_w); + DECLARE_WRITE8_MEMBER(fgscrolly_w); + DECLARE_WRITE8_MEMBER(bgscrolly_w); + DECLARE_WRITE8_MEMBER(bgram_w); + DECLARE_WRITE8_MEMBER(fgram_w); DECLARE_READ8_MEMBER(sound_data_r); + + DECLARE_CUSTOM_INPUT_MEMBER(control_r); + TILE_GET_INFO_MEMBER(get_tile_info); TILE_GET_INFO_MEMBER(get_tile_info2); - virtual void video_start(); - DECLARE_PALETTE_INIT(suprridr); - UINT32 screen_update_suprridr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(main_nmi_gen); TIMER_CALLBACK_MEMBER(delayed_sound_w); - int suprridr_is_screen_flipped(); - required_device m_maincpu; - required_device m_audiocpu; - required_device m_gfxdecode; - required_device m_palette; + + virtual void machine_start(); + virtual void video_start(); + DECLARE_PALETTE_INIT(suprridr); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + int is_screen_flipped(); }; diff --git a/src/mame/video/suprloco.c b/src/mame/video/suprloco.c index 815a45b25a7..6021a01a2bc 100644 --- a/src/mame/video/suprloco.c +++ b/src/mame/video/suprloco.c @@ -1,6 +1,6 @@ /*************************************************************************** - video.c + suprloco.c Functions to emulate the video hardware of the machine. @@ -98,6 +98,8 @@ void suprloco_state::video_start() m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(suprloco_state::get_tile_info),this),TILEMAP_SCAN_ROWS,8,8,32,32); m_bg_tilemap->set_scroll_rows(32); + + save_item(NAME(m_control)); } @@ -108,13 +110,13 @@ void suprloco_state::video_start() ***************************************************************************/ -WRITE8_MEMBER(suprloco_state::suprloco_videoram_w) +WRITE8_MEMBER(suprloco_state::videoram_w) { m_videoram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset/2); } -WRITE8_MEMBER(suprloco_state::suprloco_scrollram_w) +WRITE8_MEMBER(suprloco_state::scrollram_w) { int adj = flip_screen() ? -8 : 8; @@ -122,7 +124,7 @@ WRITE8_MEMBER(suprloco_state::suprloco_scrollram_w) m_bg_tilemap->set_scrollx(offset, data - adj); } -WRITE8_MEMBER(suprloco_state::suprloco_control_w) +WRITE8_MEMBER(suprloco_state::control_w) { /* There is probably a palette select in here */ @@ -148,7 +150,7 @@ WRITE8_MEMBER(suprloco_state::suprloco_control_w) } -READ8_MEMBER(suprloco_state::suprloco_control_r) +READ8_MEMBER(suprloco_state::control_r) { return m_control; } @@ -256,7 +258,7 @@ void suprloco_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec } } -UINT32 suprloco_state::screen_update_suprloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 suprloco_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0); draw_sprites(bitmap,cliprect); diff --git a/src/mame/video/suprridr.c b/src/mame/video/suprridr.c index a3e981b6c24..adaa1f4673f 100644 --- a/src/mame/video/suprridr.c +++ b/src/mame/video/suprridr.c @@ -44,6 +44,9 @@ void suprridr_state::video_start() m_bg_tilemap_noscroll = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(suprridr_state::get_tile_info),this), TILEMAP_SCAN_ROWS, 8,8, 32,32); m_fg_tilemap->set_transparent_pen(0); + + save_item(NAME(m_flipx)); + save_item(NAME(m_flipy)); } @@ -91,39 +94,39 @@ PALETTE_INIT_MEMBER(suprridr_state, suprridr) * *************************************/ -WRITE8_MEMBER(suprridr_state::suprridr_flipx_w) +WRITE8_MEMBER(suprridr_state::flipx_w) { m_flipx = data & 1; machine().tilemap().set_flip_all((m_flipx ? TILEMAP_FLIPX : 0) | (m_flipy ? TILEMAP_FLIPY : 0)); } -WRITE8_MEMBER(suprridr_state::suprridr_flipy_w) +WRITE8_MEMBER(suprridr_state::flipy_w) { m_flipy = data & 1; machine().tilemap().set_flip_all((m_flipx ? TILEMAP_FLIPX : 0) | (m_flipy ? TILEMAP_FLIPY : 0)); } -WRITE8_MEMBER(suprridr_state::suprridr_fgdisable_w) +WRITE8_MEMBER(suprridr_state::fgdisable_w) { m_fg_tilemap->enable(~data & 1); } -WRITE8_MEMBER(suprridr_state::suprridr_fgscrolly_w) +WRITE8_MEMBER(suprridr_state::fgscrolly_w) { m_fg_tilemap->set_scrolly(0, data); } -WRITE8_MEMBER(suprridr_state::suprridr_bgscrolly_w) +WRITE8_MEMBER(suprridr_state::bgscrolly_w) { m_bg_tilemap->set_scrolly(0, data); } -int suprridr_state::suprridr_is_screen_flipped() +int suprridr_state::is_screen_flipped() { return m_flipx; /* or is it flipy? */ } @@ -136,7 +139,7 @@ int suprridr_state::suprridr_is_screen_flipped() * *************************************/ -WRITE8_MEMBER(suprridr_state::suprridr_bgram_w) +WRITE8_MEMBER(suprridr_state::bgram_w) { m_bgram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); @@ -144,7 +147,7 @@ WRITE8_MEMBER(suprridr_state::suprridr_bgram_w) } -WRITE8_MEMBER(suprridr_state::suprridr_fgram_w) +WRITE8_MEMBER(suprridr_state::fgram_w) { m_fgram[offset] = data; m_fg_tilemap->mark_tile_dirty(offset); @@ -158,11 +161,9 @@ WRITE8_MEMBER(suprridr_state::suprridr_fgram_w) * *************************************/ -UINT32 suprridr_state::screen_update_suprridr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 suprridr_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - UINT8 *spriteram = m_spriteram; rectangle subclip; - int i; const rectangle &visarea = screen.visible_area(); /* render left 4 columns with no scroll */ @@ -188,14 +189,14 @@ UINT32 suprridr_state::screen_update_suprridr(screen_device &screen, bitmap_ind1 m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); /* draw the sprites */ - for (i = 0; i < 48; i++) + for (int i = 0; i < 48; i++) { - int code = (spriteram[i*4+1] & 0x3f) | ((spriteram[i*4+2] >> 1) & 0x40); - int color = spriteram[i*4+2] & 0x7f; - int fx = spriteram[i*4+1] & 0x40; - int fy = spriteram[i*4+1] & 0x80; - int x = spriteram[i*4+3]; - int y = 240 - spriteram[i*4+0]; + int code = (m_spriteram[i*4+1] & 0x3f) | ((m_spriteram[i*4+2] >> 1) & 0x40); + int color = m_spriteram[i*4+2] & 0x7f; + int fx = m_spriteram[i*4+1] & 0x40; + int fy = m_spriteram[i*4+1] & 0x80; + int x = m_spriteram[i*4+3]; + int y = 240 - m_spriteram[i*4+0]; if (m_flipx) { From b40b3cae809fcd811800d292aa439f7f08964fbe Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 18 Mar 2015 21:51:47 +0100 Subject: [PATCH 070/201] certain: 0x045 = DAA 0x046 = DAS 0x04b = unused 0x04c = REC 0x264 = unused 0x267 = DB --- src/emu/cpu/hmcs40/hmcs40.c | 79 +++++++++++------------------------- src/emu/cpu/hmcs40/hmcs40d.c | 4 +- 2 files changed, 26 insertions(+), 57 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index 2daa1a911b4..57053375ff7 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -581,77 +581,36 @@ void hmcs40_cpu_device::execute_run() // handle opcode switch (m_op) { -/* - -op_ayy(); - -op_syy(); - -op_am(); - 34 234 4c -op_sm()???:- 234 -op_daa(); - 46 -op_das(); - 45 -op_nega(); - -op_anem(); - 324 124 -op_bnem(); - 267 024 -op_alem(); - 324 124 -op_blem(); - 267 024 -op_lay(); - 118 - - -*/ - + // unknown: lay, ayy, syy, am, anem, alem, bnem, blem, nega + case 0x118: op_lay(); // probably lay break; - - case 0x046: - op_daa(); - break; - case 0x045: - op_das(); + case 0x034: + op_am(); // probably am break; - case 0x267: - op_blem(); // bnem or blem - break; - case 0x124: - op_alem(); // alem or anem + op_illegal(); + //op_alem(); // alem or anem + //op_ayy(); break; case 0x324: - op_anem(); // " + op_illegal(); + //op_anem(); // " break; case 0x024: + op_illegal(); //op_nega(); - //op_am(); - op_illegal(); break; - case 0x04b: - op_illegal(); - //op_rec(); - break; - case 0x04c: - op_rec(); - break; - case 0x030: - op_amc(); - break; - case 0x034: - //op_illegal(); - //op_amc(); // mirror? - op_am(); - break; - case 0x230: - op_smc(); - break; case 0x234: - //op_illegal(); - //op_smc(); // mirror? - op_nega(); + op_illegal(); + //op_nega(); break; @@ -673,13 +632,21 @@ op_lay(); - 118 /* ok */ op_lmiiy(); break; case 0x020: case 0x021: case 0x022: case 0x023: op_lbm(); break; + case 0x030: +/* ok */ op_amc(); break; case 0x03c: op_lta(); break; case 0x040: /* ok */ op_lxa(); break; + case 0x045: +/* ok */ op_das(); break; + case 0x046: +/* ok */ op_daa(); break; + case 0x04c: +/* ok */ op_rec(); break; case 0x04f: - op_sec(); break; +/* ok */ op_sec(); break; case 0x050: op_lya(); break; case 0x054: @@ -783,6 +750,8 @@ op_lay(); - 118 /* ok */ op_rotr(); break; case 0x225: /* ok */ op_rotl(); break; + case 0x230: +/* ok */ op_smc(); break; case 0x23c: op_lat(); break; @@ -796,7 +765,7 @@ op_lay(); - 118 op_dy(); break; case 0x260: /* ok */ op_lab(); break; - case 0x264: + case 0x267: op_db(); break; case 0x270: case 0x271: case 0x272: case 0x273: case 0x274: case 0x275: case 0x276: case 0x277: case 0x278: case 0x279: case 0x27a: case 0x27b: case 0x27c: case 0x27d: case 0x27e: case 0x27f: diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 08aecd78110..8866d85a4ce 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -96,7 +96,7 @@ static const UINT8 hmcs40_mnemonic[0x400] = mLBM, mLBM, mLBM, mLBM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mAMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLTA, mILL, mILL, mILL, /* 0x040 */ - mLXA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mREC, mILL, mILL, mILL, mSEC, + mLXA, mILL, mILL, mILL, mILL, mDAS, mDAA, mILL, mILL, mILL, mILL, mILL, mREC, mILL, mILL, mSEC, mLYA, mILL, mILL, mILL, mIY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLBA, mILL, mILL, mILL, mIB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, @@ -142,7 +142,7 @@ static const UINT8 hmcs40_mnemonic[0x400] = /* 0x240 */ mLASPX, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mTC, mLASPY, mILL, mILL, mILL, mDY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mLAB, mILL, mILL, mILL, mDB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLAB, mILL, mILL, mILL, mILL, mILL, mILL, mDB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, /* 0x280 */ mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, From 9cf83080965f84254b762f9fe2aa34e18c1f86e9 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Wed, 18 Mar 2015 19:18:00 -0700 Subject: [PATCH 071/201] font_windows.c: don't crash if no memory for bitmap [Peter Ferrie] more graceful exit will occur when next malloc() fails, and condition might be temporary --- src/osd/modules/font/font_windows.c | 149 ++++++++++++++-------------- 1 file changed, 77 insertions(+), 72 deletions(-) diff --git a/src/osd/modules/font/font_windows.c b/src/osd/modules/font/font_windows.c index 458534f3a74..88606bde6e1 100644 --- a/src/osd/modules/font/font_windows.c +++ b/src/osd/modules/font/font_windows.c @@ -169,90 +169,95 @@ bool osd_font_windows::get_bitmap(unicode_char chnum, bitmap_argb32 &bitmap, INT // create a DIB to render to BYTE *bits; HBITMAP dib = CreateDIBSection(dummyDC, &info, DIB_RGB_COLORS, reinterpret_cast(&bits), NULL, 0); - HGDIOBJ oldbitmap = SelectObject(dummyDC, dib); - // clear the bitmap - int rowbytes = bmwidth / 8; - memset(bits, 0, rowbytes * bmheight); - - // now draw the character - WCHAR tempchar = chnum; - SetTextColor(dummyDC, RGB(0xff, 0xff, 0xff)); - SetBkColor(dummyDC, RGB(0x00, 0x00, 0x00)); - ExtTextOutW(dummyDC, 50 + abc.abcA, 50, ETO_OPAQUE, NULL, &tempchar, 1, NULL); - - // characters are expected to be full-height - rectangle actbounds; - actbounds.min_y = 50; - actbounds.max_y = 50 + metrics.tmHeight - 1; - - // determine the actual left of the character - for (actbounds.min_x = 0; actbounds.min_x < rowbytes; actbounds.min_x++) + if (dib) { - BYTE *offs = bits + actbounds.min_x; - UINT8 summary = 0; - for (int y = 0; y < bmheight; y++) - summary |= offs[y * rowbytes]; - if (summary != 0) - { - actbounds.min_x *= 8; - if (!(summary & 0x80)) actbounds.min_x++; - if (!(summary & 0xc0)) actbounds.min_x++; - if (!(summary & 0xe0)) actbounds.min_x++; - if (!(summary & 0xf0)) actbounds.min_x++; - if (!(summary & 0xf8)) actbounds.min_x++; - if (!(summary & 0xfc)) actbounds.min_x++; - if (!(summary & 0xfe)) actbounds.min_x++; - break; - } - } + HGDIOBJ oldbitmap = SelectObject(dummyDC, dib); - // determine the actual right of the character - for (actbounds.max_x = rowbytes - 1; actbounds.max_x >= 0; actbounds.max_x--) - { - BYTE *offs = bits + actbounds.max_x; - UINT8 summary = 0; - for (int y = 0; y < bmheight; y++) - summary |= offs[y * rowbytes]; - if (summary != 0) - { - actbounds.max_x *= 8; - if (summary & 0x7f) actbounds.max_x++; - if (summary & 0x3f) actbounds.max_x++; - if (summary & 0x1f) actbounds.max_x++; - if (summary & 0x0f) actbounds.max_x++; - if (summary & 0x07) actbounds.max_x++; - if (summary & 0x03) actbounds.max_x++; - if (summary & 0x01) actbounds.max_x++; - break; - } - } + // clear the bitmap + int rowbytes = bmwidth / 8; + memset(bits, 0, rowbytes * bmheight); - // allocate a new bitmap - if (actbounds.max_x >= actbounds.min_x && actbounds.max_y >= actbounds.min_y) - { - bitmap.allocate(actbounds.max_x + 1 - actbounds.min_x, actbounds.max_y + 1 - actbounds.min_y); + // now draw the character + WCHAR tempchar = chnum; + SetTextColor(dummyDC, RGB(0xff, 0xff, 0xff)); + SetBkColor(dummyDC, RGB(0x00, 0x00, 0x00)); + ExtTextOutW(dummyDC, 50 + abc.abcA, 50, ETO_OPAQUE, NULL, &tempchar, 1, NULL); - // copy the bits into it - for (int y = 0; y < bitmap.height(); y++) + // characters are expected to be full-height + rectangle actbounds; + actbounds.min_y = 50; + actbounds.max_y = 50 + metrics.tmHeight - 1; + + // determine the actual left of the character + for (actbounds.min_x = 0; actbounds.min_x < rowbytes; actbounds.min_x++) { - UINT32 *dstrow = &bitmap.pix32(y); - UINT8 *srcrow = &bits[(y + actbounds.min_y) * rowbytes]; - for (int x = 0; x < bitmap.width(); x++) + BYTE *offs = bits + actbounds.min_x; + UINT8 summary = 0; + for (int y = 0; y < bmheight; y++) + summary |= offs[y * rowbytes]; + if (summary != 0) { - int effx = x + actbounds.min_x; - dstrow[x] = ((srcrow[effx / 8] << (effx % 8)) & 0x80) ? rgb_t(0xff, 0xff, 0xff, 0xff) : rgb_t(0x00, 0xff, 0xff, 0xff); + actbounds.min_x *= 8; + if (!(summary & 0x80)) actbounds.min_x++; + if (!(summary & 0xc0)) actbounds.min_x++; + if (!(summary & 0xe0)) actbounds.min_x++; + if (!(summary & 0xf0)) actbounds.min_x++; + if (!(summary & 0xf8)) actbounds.min_x++; + if (!(summary & 0xfc)) actbounds.min_x++; + if (!(summary & 0xfe)) actbounds.min_x++; + break; } } - // set the final offset values - xoffs = actbounds.min_x - (50 + abc.abcA); - yoffs = actbounds.max_y - (50 + metrics.tmAscent); + // determine the actual right of the character + for (actbounds.max_x = rowbytes - 1; actbounds.max_x >= 0; actbounds.max_x--) + { + BYTE *offs = bits + actbounds.max_x; + UINT8 summary = 0; + for (int y = 0; y < bmheight; y++) + summary |= offs[y * rowbytes]; + if (summary != 0) + { + actbounds.max_x *= 8; + if (summary & 0x7f) actbounds.max_x++; + if (summary & 0x3f) actbounds.max_x++; + if (summary & 0x1f) actbounds.max_x++; + if (summary & 0x0f) actbounds.max_x++; + if (summary & 0x07) actbounds.max_x++; + if (summary & 0x03) actbounds.max_x++; + if (summary & 0x01) actbounds.max_x++; + break; + } + } + + // allocate a new bitmap + if (actbounds.max_x >= actbounds.min_x && actbounds.max_y >= actbounds.min_y) + { + bitmap.allocate(actbounds.max_x + 1 - actbounds.min_x, actbounds.max_y + 1 - actbounds.min_y); + + // copy the bits into it + for (int y = 0; y < bitmap.height(); y++) + { + UINT32 *dstrow = &bitmap.pix32(y); + UINT8 *srcrow = &bits[(y + actbounds.min_y) * rowbytes]; + for (int x = 0; x < bitmap.width(); x++) + { + int effx = x + actbounds.min_x; + dstrow[x] = ((srcrow[effx / 8] << (effx % 8)) & 0x80) ? rgb_t(0xff, 0xff, 0xff, 0xff) : rgb_t(0x00, 0xff, 0xff, 0xff); + } + } + + // set the final offset values + xoffs = actbounds.min_x - (50 + abc.abcA); + yoffs = actbounds.max_y - (50 + metrics.tmAscent); + } + + // de-select the font and release the DC + SelectObject(dummyDC, oldbitmap); + DeleteObject(dib); } - // de-select the font and release the DC - SelectObject(dummyDC, oldbitmap); - DeleteObject(dib); SelectObject(dummyDC, oldfont); DeleteDC(dummyDC); return bitmap.valid(); From 9ccdee61fc482894ad3ba132c6d2cfbfa0e9ddcc Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Wed, 18 Mar 2015 20:34:29 -0700 Subject: [PATCH 072/201] gradius4: avoid stack overflow when adsp21062 device is reset while inside interrupt handler [Peter Ferrie] --- src/emu/cpu/sharc/sharc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emu/cpu/sharc/sharc.c b/src/emu/cpu/sharc/sharc.c index 5139c896e37..7505535ff64 100644 --- a/src/emu/cpu/sharc/sharc.c +++ b/src/emu/cpu/sharc/sharc.c @@ -355,9 +355,7 @@ void adsp21062_device::device_start() m_lcstack[i] = 0; m_lastack[i] = 0; } - m_lstkp = 0; m_pcstk = 0; - m_pcstkp = 0; m_laddr.addr = m_laddr.code = m_laddr.loop_type = 0; m_curlcntr = 0; m_lcntr = 0; @@ -682,6 +680,8 @@ void adsp21062_device::device_reset() m_idle = 0; m_stky = 0x5400000; + m_lstkp = 0; + m_pcstkp = 0; m_interrupt_active = 0; } From 3dee27e73002894db1c1935bcc7232fa0b4a417b Mon Sep 17 00:00:00 2001 From: "Alex W. Jackson" Date: Wed, 18 Mar 2015 23:47:30 -0400 Subject: [PATCH 073/201] snes_strom.xml: remove rogue spaces in Japanese titles (nw) --- hash/snes_strom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hash/snes_strom.xml b/hash/snes_strom.xml index 5d1239ed0ba..7448b19f9e1 100644 --- a/hash/snes_strom.xml +++ b/hash/snes_strom.xml @@ -9,7 +9,7 @@ Bandai - + @@ -57,7 +57,7 @@ Bandai - + @@ -121,7 +121,7 @@ Bandai - + @@ -153,7 +153,7 @@ Bandai - + @@ -169,7 +169,7 @@ Bandai - + @@ -185,7 +185,7 @@ Bandai - + From 1477c0133e5bc6883df9cfdb35a325e9d9d13e4b Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Wed, 18 Mar 2015 22:53:45 -0700 Subject: [PATCH 074/201] queen: intercept OOB access to PIIX4 device [Peter Ferrie] --- src/mame/drivers/queen.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mame/drivers/queen.c b/src/mame/drivers/queen.c index 25329d10b2a..68d445f911a 100644 --- a/src/mame/drivers/queen.c +++ b/src/mame/drivers/queen.c @@ -151,6 +151,11 @@ static void intel82439tx_pci_w(device_t *busdevice, device_t *device, int functi static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) { + if ((function >= 4) && (function <= 7)) + { + return 0; // BIOS performs a brute-force scan for devices + } + queen_state *state = busdevice->machine().driver_data(); // osd_printf_debug("PIIX4: read %d, %02X\n", function, reg); assert(function >= 0 && function < ARRAY_LENGTH(state->m_piix4_config_reg)); From 0c58c7212c5d52b9bd94191b328177c426d39495 Mon Sep 17 00:00:00 2001 From: Lord-Nightmare Date: Thu, 19 Mar 2015 02:08:31 -0400 Subject: [PATCH 075/201] (MESS) upd1771.c - notes update, indicate what pins are inputs, outputs, or both; document the d/a power pin. document the mode pin functions and the test mode [kevtris] --- src/mess/audio/upd1771.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/mess/audio/upd1771.c b/src/mess/audio/upd1771.c index 4db60193920..bac1b853c14 100644 --- a/src/mess/audio/upd1771.c +++ b/src/mess/audio/upd1771.c @@ -108,30 +108,36 @@ 6Mhz XIN 9 20 D2 6Mhz XOUT 10 19 D1 AUDOUT 11 18 D0 - NC 12 17 GND + NC(recheck!)12 17 GND AUDOUT(inv) 13 16 VCC GND 14 15 ? tied to pin 16 (VCC) through a resistor (pullup?) Pinout based on guesses and information in "Electronic Speech Synthesis" by Geoff Bristow (ISBN 0-07-007912-9, pages 148-152), and the data on page 233 of the Nec APC technical manual at http://bitsavers.trailing-edge.com/pdf/nec/APC/819-000100-1003_APC_System_Reference_Guide_Apr83.pdf + I/O pin purpose based on testing by kevtris. [x] is unsure: - PB3 1 28 PB2 - PB4(/ALE) 2 27 PB1 - PB5(/RD) 3 26 PB0 - PB6(/WR) 4 25 D7(PA7) - PB7(/CS) 5 24 D6(PA6) - /RESET 6 23 D5(PA5) - [TEST?] 7 22 D4(PA4) - VCC 8 21 D3(PA3) - XI(CLK) 9 20 D2(PA2) - XO 10 19 D1(PA1) - D/A OUT + 11 18 D0(PA0) - [D/A VREF] 12 17 CH2 - D/A OUT - 13 16 /EXTINT - GND 14 15 CH1 tied to pin 16 (VCC) through a resistor, on APC to VCC thru a 12k resistor and thru a 10uf cap to gnd + PB3 <> 1 28 <> PB2 + PB4(/ALE) <> 2 27 <> PB1 + PB5(/RD) <> 3 26 <> PB0 + PB6(/WR) <> 4 25 <> D7(PA7) + PB7(/CS) <> 5 24 <> D6(PA6) + /RESET -> 6 23 <> D5(PA5) + [/TSTOUT?] <- 7 22 <> D4(PA4) + VCC -- 8 21 <> D3(PA3) + XI(CLK) -> 9 20 <> D2(PA2) + XO <- 10 19 <> D1(PA1) + D/A OUT + <- 11 18 <> D0(PA0) + D/A POWER -- 12 17 <- CH2 + D/A OUT - <- 13 16 <> /EXTINT and [/TSTOUT2?] (test out is related to pin 15 state) + GND -- 14 15 <- CH1 tied to pin 16 (VCC) through a resistor, on APC to VCC thru a 12k resistor and thru a 10uf cap to gnd - CH1 and CH2 are some sort of mode selects? + CH1 and CH2 are mode selects, purpose based on testing by kevtris: + CH1 CH2 + H L - 'master' mode, pb4-pb7 are i/o? /EXTINT is an input + L L - 'slave' mode where pb4-pb7 are /ale /rd /wr /cs? /EXTINT may be an output in this mode? + X H - test mode: the 512 byte 16-bit wide ROM is output sequentially on pins pa7-pa0 and pb7-pb0 for the high and low bytes of each word respectively + D/A POWER is the FET source for the D/A OUT+ and D/A OUT- push-pull dac drains; it should be tied to VCC or thereabouts In the SCV (info from plgDavid): pin 5 is tied to the !SCPU pin on the Epoch TV chip pin 29 (0x3600 writes) From 43f92ea260b61c8e22ab0e2f6eff40eacf4dc19f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 19 Mar 2015 08:40:37 +0100 Subject: [PATCH 076/201] update 3rdparty (nw) --- .../bgfx/3rdparty/ocornut-imgui/imgui.cpp | 3 + 3rdparty/bgfx/README.md | 3 +- 3rdparty/bgfx/examples/25-c99/helloworld.c | 68 ++++++++++++++++++ 3rdparty/bgfx/scripts/genie.lua | 4 +- 3rdparty/bgfx/src/bgfx_shader.sh | 37 ++++++++++ 3rdparty/bgfx/src/renderer_d3d11.cpp | 2 +- 3rdparty/bgfx/src/renderer_gl.cpp | 1 + 3rdparty/bgfx/src/vertexdecl.cpp | 16 ++--- 3rdparty/bgfx/tools/shaderc/shaderc.cpp | 66 ++++++++--------- 3rdparty/bx/scripts/toolchain.lua | 16 +++-- 3rdparty/bx/tools/bin/darwin/genie | Bin 389488 -> 389488 bytes 3rdparty/bx/tools/bin/linux/genie | Bin 372064 -> 372064 bytes 3rdparty/bx/tools/bin/windows/genie.exe | Bin 355328 -> 355328 bytes 3rdparty/genie/README.md | 2 +- 3rdparty/genie/src/actions/make/make_cpp.lua | 4 +- 3rdparty/genie/src/base/bake.lua | 8 +-- 3rdparty/genie/src/host/scripts.c | 26 +++---- 17 files changed, 183 insertions(+), 73 deletions(-) create mode 100644 3rdparty/bgfx/examples/25-c99/helloworld.c diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp index e77f3db6d30..866bec93420 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp @@ -353,6 +353,9 @@ #endif #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used +#pragma GCC diagnostic ignored "-Wunused-parameter" // warning: unused parameter ‘xxxx’ +#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" // warning: ‘xxxx’ may be used uninitialized in this function #endif //------------------------------------------------------------------------- diff --git a/3rdparty/bgfx/README.md b/3rdparty/bgfx/README.md index bd82dbb4e8e..e0fd614bb36 100644 --- a/3rdparty/bgfx/README.md +++ b/3rdparty/bgfx/README.md @@ -4,7 +4,8 @@ What is it? ----------- -Cross-platform rendering library. +Cross-platform, graphics API agnostic, "Bring Your Own Engine/Framework" style +rendering library. Supported rendering backends: diff --git a/3rdparty/bgfx/examples/25-c99/helloworld.c b/3rdparty/bgfx/examples/25-c99/helloworld.c new file mode 100644 index 00000000000..b3862ebd2a1 --- /dev/null +++ b/3rdparty/bgfx/examples/25-c99/helloworld.c @@ -0,0 +1,68 @@ +/* + * Copyright 2011-2015 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include +#include "../00-helloworld/logo.h" + +extern bool entry_process_events(uint32_t* _width, uint32_t* _height, uint32_t* _debug, uint32_t* _reset); + +uint16_t uint16_max(uint16_t _a, uint16_t _b) +{ + return _a < _b ? _b : _a; +} + +int _main_(int _argc, char** _argv) +{ + (void)_argc; + (void)_argv; + uint32_t width = 1280; + uint32_t height = 720; + uint32_t debug = BGFX_DEBUG_TEXT; + uint32_t reset = BGFX_RESET_VSYNC; + + bgfx_init(BGFX_RENDERER_TYPE_COUNT, NULL, NULL); + bgfx_reset(width, height, reset); + + // Enable debug text. + bgfx_set_debug(debug); + + bgfx_set_view_clear(0 + , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH + , 0x303030ff + , 1.0f + , 0 + ); + + while (!entry_process_events(&width, &height, &debug, &reset) ) + { + // Set view 0 default viewport. + bgfx_set_view_rect(0, 0, 0, width, height); + + // 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_submit(0, 0); + + // Use debug font to print information about this example. + bgfx_dbg_text_clear(0, false); + bgfx_dbg_text_image(uint16_max(width/2/8, 20)-20 + , uint16_max(height/2/16, 6)-6 + , 40 + , 12 + , s_logo + , 160 + ); + bgfx_dbg_text_printf(0, 1, 0x4f, "bgfx/examples/25-c99"); + bgfx_dbg_text_printf(0, 2, 0x6f, "Description: Initialization and debug text with C99 API."); + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx_frame(); + } + + // Shutdown bgfx. + bgfx_shutdown(); + + return 0; +} diff --git a/3rdparty/bgfx/scripts/genie.lua b/3rdparty/bgfx/scripts/genie.lua index 9056714240e..9f7888a2a70 100644 --- a/3rdparty/bgfx/scripts/genie.lua +++ b/3rdparty/bgfx/scripts/genie.lua @@ -84,13 +84,14 @@ function exampleProject(_name) end includedirs { - path.join(BX_DIR, "include"), + path.join(BX_DIR, "include"), path.join(BGFX_DIR, "include"), path.join(BGFX_DIR, "3rdparty"), path.join(BGFX_DIR, "examples/common"), } files { + path.join(BGFX_DIR, "examples", _name, "**.c"), path.join(BGFX_DIR, "examples", _name, "**.cpp"), path.join(BGFX_DIR, "examples", _name, "**.h"), } @@ -308,6 +309,7 @@ exampleProject("21-deferred") exampleProject("22-windows") exampleProject("23-vectordisplay") exampleProject("24-nbody") +exampleProject("25-c99") if _OPTIONS["with-shared-lib"] then group "libs" diff --git a/3rdparty/bgfx/src/bgfx_shader.sh b/3rdparty/bgfx/src/bgfx_shader.sh index e0e14cf544b..52de12e84a0 100644 --- a/3rdparty/bgfx/src/bgfx_shader.sh +++ b/3rdparty/bgfx/src/bgfx_shader.sh @@ -74,6 +74,16 @@ struct BgfxSampler3D Texture3D m_texture; }; +struct BgfxISampler3D +{ + Texture3D m_texture; +}; + +struct BgfxUSampler3D +{ + Texture3D m_texture; +}; + vec4 bgfxTexture3D(BgfxSampler3D _sampler, vec3 _coord) { return _sampler.m_texture.Sample(_sampler.m_sampler, _coord); @@ -84,6 +94,20 @@ vec4 bgfxTexture3DLod(BgfxSampler3D _sampler, vec3 _coord, float _level) return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level); } +ivec4 bgfxTexture3D(BgfxISampler3D _sampler, vec3 _coord) +{ + ivec3 size; + _sampler.m_texture.GetDimensions(size.x, size.y, size.z); + return _sampler.m_texture.Load(ivec4(_coord * size, 0) ); +} + +uvec4 bgfxTexture3D(BgfxUSampler3D _sampler, vec3 _coord) +{ + uvec3 size; + _sampler.m_texture.GetDimensions(size.x, size.y, size.z); + return _sampler.m_texture.Load(uvec4(_coord * size, 0) ); +} + struct BgfxSamplerCube { SamplerState m_sampler; @@ -121,6 +145,12 @@ vec4 bgfxTextureCubeLod(BgfxSamplerCube _sampler, vec3 _coord, float _level) uniform SamplerState _name ## Sampler : register(s[_reg]); \ uniform Texture3D _name ## Texture : register(t[_reg]); \ static BgfxSampler3D _name = { _name ## Sampler, _name ## Texture } +# define ISAMPLER3D(_name, _reg) \ + uniform Texture3D _name ## Texture : register(t[_reg]); \ + static BgfxISampler3D _name = { _name ## Texture } +# define USAMPLER3D(_name, _reg) \ + uniform Texture3D _name ## Texture : register(t[_reg]); \ + static BgfxUSampler3D _name = { _name ## Texture } # define sampler3D BgfxSampler3D # define texture3D(_sampler, _coord) bgfxTexture3D(_sampler, _coord) # define texture3DLod(_sampler, _coord, _level) bgfxTexture3DLod(_sampler, _coord, _level) @@ -247,6 +277,13 @@ vec4 mod(vec4 _a, vec4 _b) { return _a - _b * floor(_a / _b); } # define uvec3_splat(_x) uvec3(_x) # define uvec4_splat(_x) uvec4(_x) +# if BGFX_SHADER_LANGUAGE_GLSL >= 130 +# define ISAMPLER3D(_name, _reg) uniform isampler3D _name +# define USAMPLER3D(_name, _reg) uniform usampler3D _name +ivec4 texture3D(isampler3D _sampler, vec3 _coord) { return texture(_sampler, _coord); } +uvec4 texture3D(usampler3D _sampler, vec3 _coord) { return texture(_sampler, _coord); } +# endif // BGFX_SHADER_LANGUAGE_GLSL >= 130 + vec3 instMul(vec3 _vec, mat3 _mtx) { return mul(_vec, _mtx); } vec3 instMul(mat3 _mtx, vec3 _vec) { return mul(_mtx, _vec); } vec4 instMul(vec4 _vec, mat4 _mtx) { return mul(_vec, _mtx); } diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp index 93806ea9431..1ccaeffd290 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.cpp +++ b/3rdparty/bgfx/src/renderer_d3d11.cpp @@ -203,7 +203,7 @@ namespace bgfx { DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, // Unknown { DXGI_FORMAT_R1_UNORM, DXGI_FORMAT_R1_UNORM, DXGI_FORMAT_UNKNOWN }, // R1 { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_UNKNOWN }, // R8 - { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN }, // R16 + { DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_UNKNOWN }, // R16 { DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_UNKNOWN }, // R16F { DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_UNKNOWN }, // R32 { DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN }, // R32F diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp index 8285bfdea18..6d4dc557175 100644 --- a/3rdparty/bgfx/src/renderer_gl.cpp +++ b/3rdparty/bgfx/src/renderer_gl.cpp @@ -721,6 +721,7 @@ namespace bgfx "usampler3D", "isamplerCube", "usamplerCube", + NULL }; static void GL_APIENTRY stubVertexAttribDivisor(GLuint /*_index*/, GLuint /*_divisor*/) diff --git a/3rdparty/bgfx/src/vertexdecl.cpp b/3rdparty/bgfx/src/vertexdecl.cpp index c0c4edeef1d..83435fa8cf2 100644 --- a/3rdparty/bgfx/src/vertexdecl.cpp +++ b/3rdparty/bgfx/src/vertexdecl.cpp @@ -41,27 +41,21 @@ namespace bgfx static const uint8_t (*s_attribTypeSize[])[AttribType::Count][4] = { -#if BGFX_CONFIG_RENDERER_DIRECT3D9 - &s_attribTypeSizeDx9, -#elif BGFX_CONFIG_RENDERER_DIRECT3D11 || BGFX_CONFIG_RENDERER_DIRECT3D12 - &s_attribTypeSizeDx1x, -#elif BGFX_CONFIG_RENDERER_OPENGL || BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_VULKAN - &s_attribTypeSizeGl, -#else - &s_attribTypeSizeDx9, -#endif // BGFX_CONFIG_RENDERER_ + &s_attribTypeSizeDx9, // Null &s_attribTypeSizeDx9, // Direct3D9 &s_attribTypeSizeDx1x, // Direct3D11 &s_attribTypeSizeDx1x, // Direct3D12 &s_attribTypeSizeGl, // OpenGLES &s_attribTypeSizeGl, // OpenGL &s_attribTypeSizeGl, // Vulkan + &s_attribTypeSizeDx9, // Count }; - BX_STATIC_ASSERT(BX_COUNTOF(s_attribTypeSize) == bgfx::RendererType::Count); + BX_STATIC_ASSERT(BX_COUNTOF(s_attribTypeSize) == RendererType::Count+1); void initAttribTypeSizeTable(RendererType::Enum _type) { - s_attribTypeSize[0] = s_attribTypeSize[_type]; + s_attribTypeSize[0] = s_attribTypeSize[_type]; + s_attribTypeSize[RendererType::Count] = s_attribTypeSize[_type]; } void dbgPrintfVargs(const char* _format, va_list _argList) diff --git a/3rdparty/bgfx/tools/shaderc/shaderc.cpp b/3rdparty/bgfx/tools/shaderc/shaderc.cpp index 0e3a0c9c60b..a4a42af5af6 100644 --- a/3rdparty/bgfx/tools/shaderc/shaderc.cpp +++ b/3rdparty/bgfx/tools/shaderc/shaderc.cpp @@ -751,7 +751,8 @@ int main(int _argc, const char* _argv[]) bool raw = cmdLine.hasArg('\0', "raw"); - uint32_t gles = 0; + uint32_t glsl = 0; + uint32_t essl = 0; uint32_t hlsl = 2; uint32_t d3d = 11; const char* profile = cmdLine.findOption('p', "profile"); @@ -774,10 +775,14 @@ int main(int _argc, const char* _argv[]) { hlsl = 5; } + else + { + glsl = atoi(profile); + } } else { - gles = 2; + essl = 2; } const char* bin2c = NULL; @@ -811,7 +816,7 @@ int main(int _argc, const char* _argv[]) bool preprocessOnly = cmdLine.hasArg("preprocess"); const char* includeDir = cmdLine.findOption('i'); - Preprocessor preprocessor(filePath, 0 != gles, includeDir); + Preprocessor preprocessor(filePath, 0 != essl, includeDir); std::string dir; { @@ -839,43 +844,38 @@ int main(int _argc, const char* _argv[]) preprocessor.setDefaultDefine("BGFX_SHADER_TYPE_FRAGMENT"); preprocessor.setDefaultDefine("BGFX_SHADER_TYPE_VERTEX"); - bool glsl = false; + char glslDefine[128]; + bx::snprintf(glslDefine, BX_COUNTOF(glslDefine), "BGFX_SHADER_LANGUAGE_GLSL=%d", glsl); if (0 == bx::stricmp(platform, "android") ) { preprocessor.setDefine("BX_PLATFORM_ANDROID=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); - glsl = true; } else if (0 == bx::stricmp(platform, "asm.js") ) { preprocessor.setDefine("BX_PLATFORM_EMSCRIPTEN=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); - glsl = true; } else if (0 == bx::stricmp(platform, "ios") ) { preprocessor.setDefine("BX_PLATFORM_IOS=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); - glsl = true; } else if (0 == bx::stricmp(platform, "linux") ) { preprocessor.setDefine("BX_PLATFORM_LINUX=1"); - preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); - glsl = true; + preprocessor.setDefine(glslDefine); } else if (0 == bx::stricmp(platform, "nacl") ) { preprocessor.setDefine("BX_PLATFORM_NACL=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); - glsl = true; } else if (0 == bx::stricmp(platform, "osx") ) { preprocessor.setDefine("BX_PLATFORM_OSX=1"); - preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); - glsl = true; + preprocessor.setDefine(glslDefine); } else if (0 == bx::stricmp(platform, "windows") ) { @@ -1120,7 +1120,7 @@ int main(int _argc, const char* _argv[]) bx::write(writer, outputHash); } - if (glsl) + if (0 != glsl) { bx::write(writer, uint16_t(0) ); @@ -1155,7 +1155,7 @@ int main(int _argc, const char* _argv[]) } else { - if (glsl) + if (0 != glsl) { } else @@ -1269,18 +1269,17 @@ int main(int _argc, const char* _argv[]) bx::write(writer, BGFX_CHUNK_MAGIC_CSH); bx::write(writer, outputHash); - if (glsl) + if (0 != glsl) { std::string code; - if (gles) + if (essl) { bx::stringPrintf(code, "#version 310 es\n"); } else { - int32_t version = atoi(profile); - bx::stringPrintf(code, "#version %d\n", version == 0 ? 430 : version); + bx::stringPrintf(code, "#version %d\n", glsl == 0 ? 430 : glsl); } code += preprocessor.m_preprocessed; @@ -1294,7 +1293,7 @@ int main(int _argc, const char* _argv[]) compiled = true; #else - compiled = compileGLSLShader(cmdLine, gles, code, writer); + compiled = compileGLSLShader(cmdLine, essl, code, writer); #endif // 0 } else @@ -1339,15 +1338,19 @@ int main(int _argc, const char* _argv[]) } else { - if (glsl) + if (0 != glsl) { - preprocessor.writef( - "#define ivec2 vec2\n" - "#define ivec3 vec3\n" - "#define ivec4 vec4\n" - ); + if (120 == glsl + || essl) + { + preprocessor.writef( + "#define ivec2 vec2\n" + "#define ivec3 vec3\n" + "#define ivec4 vec4\n" + ); + } - if (0 == gles) + if (0 == essl) { // bgfx shadow2D/Proj behave like EXT_shadow_samplers // not as GLSL language 1.2 specs shadow2D/Proj. @@ -1645,7 +1648,7 @@ int main(int _argc, const char* _argv[]) return EXIT_FAILURE; } - if (glsl) + if (0 != glsl) { const char* profile = cmdLine.findOption('p', "profile"); if (NULL == profile) @@ -1697,16 +1700,15 @@ int main(int _argc, const char* _argv[]) bx::write(writer, outputHash); } - if (glsl) + if (0 != glsl) { std::string code; bool hasTextureLod = NULL != bx::findIdentifierMatch(input, s_ARB_shader_texture_lod /*EXT_shader_texture_lod*/); - if (0 == gles) + if (0 == essl) { bx::stringPrintf(code, "#version %s\n", profile); - int32_t version = atoi(profile); bx::stringPrintf(code , "#define bgfxShadow2D shadow2D\n" @@ -1714,7 +1716,7 @@ int main(int _argc, const char* _argv[]) ); if (hasTextureLod - && 130 > version) + && 130 > glsl) { bx::stringPrintf(code , "#extension GL_ARB_shader_texture_lod : enable\n" @@ -1767,7 +1769,7 @@ int main(int _argc, const char* _argv[]) } code += preprocessor.m_preprocessed; - compiled = compileGLSLShader(cmdLine, gles, code, writer); + compiled = compileGLSLShader(cmdLine, essl, code, writer); } else { diff --git a/3rdparty/bx/scripts/toolchain.lua b/3rdparty/bx/scripts/toolchain.lua index 5c2cf4c86e9..85f24e10746 100644 --- a/3rdparty/bx/scripts/toolchain.lua +++ b/3rdparty/bx/scripts/toolchain.lua @@ -298,12 +298,12 @@ function toolchain(_buildDir, _libDir) premake.vstudio.toolset = ("v110_xp") location (path.join(_buildDir, "projects", _ACTION .. "-xp")) end - + if ("vs2013-xp") == _OPTIONS["vs"] then premake.vstudio.toolset = ("v120_xp") location (path.join(_buildDir, "projects", _ACTION .. "-xp")) end - + elseif _ACTION == "xcode4" then if "osx" == _OPTIONS["xcode"] then @@ -414,7 +414,6 @@ function toolchain(_buildDir, _libDir) defines { "WIN32" } includedirs { path.join(bxDir, "include/compat/mingw") } buildoptions { - "-std=c++11", "-Wunused-value", "-fdata-sections", "-ffunction-sections", @@ -422,6 +421,9 @@ function toolchain(_buildDir, _libDir) "-Wunused-value", "-Wundef", } + buildoptions_cpp { + "-std=c++0x", + } linkoptions { "-Wl,--gc-sections", "-static-libgcc", @@ -486,11 +488,13 @@ function toolchain(_buildDir, _libDir) configuration { "linux-*" } buildoptions { - "-std=c++0x", "-msse2", "-Wunused-value", "-Wundef", } + buildoptions_cpp { + "-std=c++0x", + } links { "rt", "dl", @@ -845,10 +849,12 @@ function toolchain(_buildDir, _libDir) "__STDC_VERSION__=199901L", } buildoptions { - "-std=c++0x", "-Wunused-value", "-Wundef", } + buildoptions_cpp { + "-std=c++0x", + } includedirs { "/opt/vc/include", "/opt/vc/include/interface/vcos/pthreads", diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie index f9778fdef4952060466774db44a16d64d4c94a40..19f84f8eb7f43f2453c8717852cc2d1cf7fa300e 100644 GIT binary patch delta 64098 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 Kr*f?&_5KgmHaT1X delta 63771 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

    2Za_FK1>cup5-0dcoX${v)lG;a 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 delta 64322 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 diff --git a/3rdparty/bx/tools/bin/windows/genie.exe b/3rdparty/bx/tools/bin/windows/genie.exe index bec1f682f61c635d91ea248091af68ad3525ff00..3075bc286eee26cb820ba0d3f4c7d77fe2d5cac2 100644 GIT binary patch delta 41784 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

    ~Qx&+IMlCI>Dh0>84N%ce! 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 igsV2c;AyISQQqayD#TY} nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET" "\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"" "\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table." - "join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = " - "libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)" - ").gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) ==" - " \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", + "join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"" + "Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' " + "GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('" + "')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", /* actions/make/make_csharp.lua */ "local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\n local name = cfg.buildtarget.basename .. \".\"\n local dir = path.getdirectory(fname)\n if dir ~= \".\" then \nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Co" From e5980925652e161f099fce678e7d2df378c82341 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Thu, 19 Mar 2015 10:15:06 +0000 Subject: [PATCH 077/201] irq note (nw) --- src/mame/audio/hng64.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/mame/audio/hng64.c b/src/mame/audio/hng64.c index dbce6f5c885..2cc54a21ed2 100644 --- a/src/mame/audio/hng64.c +++ b/src/mame/audio/hng64.c @@ -21,11 +21,18 @@ data structures look very similar between all of them IRQ mask register on the internal interrupt controller is set to 0xd8 -so levels 0,1,2,5 are unmasked +so levels 0,1,2,5 are unmasked, vectors get set during the sound CPU init code. -returning random values / triggering random interrupts eventually results in a situation -where the CPU stops writing to the sound related addresses and starts reading / masking the -serial comms register. + level 0/1 irq (fatfurwa) starts at 0xd277 (both the same vector) + serial comms related, maybe to get commands from main CPU if not done with shared ram? + + level 2 irq (fatfurwa) 0xdd20 + simple routine increases counter in RAM, maybe hooked to one / all of the timer irqs + + level 5 irq: (fatfurwa) starts at 0xc1e1 + largest irq, does things with ports 100 / 102 / 104 / 106, 10a (not 108 directly tho) + + no other irqs (or the NMI) are valid. */ From 9e322e8b3f2b236afd0cf148e833fd719e2aa1cd Mon Sep 17 00:00:00 2001 From: mamehaze Date: Thu, 19 Mar 2015 11:28:01 +0000 Subject: [PATCH 078/201] new NOT WORKING Spider [system11] will spend more time with it later. --- src/mame/drivers/twins.c | 46 ++++++++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 1 + 2 files changed, 47 insertions(+) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index a80c9b1e685..0158cae5a38 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -306,6 +306,44 @@ static MACHINE_CONFIG_START( twinsa, twins_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static ADDRESS_MAP_START( spider_io, AS_IO, 16, twins_state ) + AM_RANGE(0x0000, 0x0003) AM_DEVWRITE8("aysnd", ay8910_device, address_data_w, 0x00ff) + AM_RANGE(0x0002, 0x0003) AM_DEVREAD8("aysnd", ay8910_device, data_r, 0x00ff) + AM_RANGE(0x0004, 0x0005) AM_READWRITE(twins_port4_r, twins_port4_w) + AM_RANGE(0x0008, 0x0009) AM_WRITE(port6_pal0_w) AM_SHARE("paletteram") + AM_RANGE(0x0010, 0x0011) AM_WRITE(porte_paloff0_w) +ADDRESS_MAP_END + + +static MACHINE_CONFIG_START( spider, twins_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", V30, 8000000) + MCFG_CPU_PROGRAM_MAP(twins_map) + MCFG_CPU_IO_MAP(spider_io) + MCFG_CPU_VBLANK_INT_DRIVER("screen", twins_state, nmi_line_pulse) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(50) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(320,256) + MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) + MCFG_SCREEN_UPDATE_DRIVER(twins_state, screen_update_twins) + MCFG_SCREEN_PALETTE("palette") + + MCFG_PALETTE_ADD("palette", 0x100) + + MCFG_VIDEO_START_OVERRIDE(twins_state,twins) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("aysnd", AY8910, 2000000) + MCFG_AY8910_PORT_A_READ_CB(IOPORT("P1")) + MCFG_AY8910_PORT_B_READ_CB(IOPORT("P2")) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_CONFIG_END + ROM_START( twins ) ROM_REGION( 0x100000, "maincpu", 0 ) @@ -337,5 +375,13 @@ ROM_START( twinsa ) ROM_LOAD16_BYTE( "hp.bin", 0x000001, 0x080000, CRC(aaf74b83) SHA1(09bd76b9fc5cb7ba6ffe1a2581ffd5633fe440b3) ) ROM_END +ROM_START( spider ) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "20.bin", 0x000001, 0x080000, CRC(25e15f11) SHA1(b728f35c817f60a294e38d66559da8977b94a1f5) ) + ROM_LOAD16_BYTE( "21.bin", 0x000000, 0x080000, CRC(ff224206) SHA1(d8d45850983542e811facc917d016841fc56a97f) ) +ROM_END + GAME( 1994, twins, 0, twins, twins, driver_device, 0, ROT0, "Electronic Devices", "Twins (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1994, twinsa, twins, twinsa, twins, driver_device, 0, ROT0, "Electronic Devices", "Twins (set 2)", GAME_SUPPORTS_SAVE ) + +GAME( 1994, spider, 0, spider, twins, driver_device, 0, ROT0, "Buena Vision", "Spider", GAME_NOT_WORKING ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index a523b095e7a..791b665c920 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -10107,6 +10107,7 @@ twinbrata // (c) 1995 ppmast93 // (c) 1993 Electronic Devices S.R.L. twins // (c) 1994 twinsa // (c) 1994 +spider mwarr pzletime From cd3892668fbdb8b32dc5ebb5a91a69d883707024 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 19 Mar 2015 19:15:18 +0100 Subject: [PATCH 079/201] note --- src/emu/cpu/hmcs40/hmcs40.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index 57053375ff7..9bffeba24f5 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -581,7 +581,18 @@ void hmcs40_cpu_device::execute_run() // handle opcode switch (m_op) { - // unknown: lay, ayy, syy, am, anem, alem, bnem, blem, nega + // unknown: + /* + lay 118 + ayy 058 + syy 258 + am 034 + anem 124/324/024/234 + alem + bnem + blem + nega 244 + */ case 0x118: op_lay(); // probably lay @@ -592,25 +603,21 @@ void hmcs40_cpu_device::execute_run() case 0x124: - op_illegal(); - //op_alem(); // alem or anem - //op_ayy(); + //op_illegal(); + op_alem(); break; case 0x324: - op_illegal(); - //op_anem(); // " + //op_illegal(); + op_anem(); break; case 0x024: - op_illegal(); - //op_nega(); + //op_illegal(); + op_bnem(); break; - - - case 0x234: - op_illegal(); - //op_nega(); + //op_illegal(); + op_blem(); break; @@ -619,6 +626,9 @@ void hmcs40_cpu_device::execute_run() + + + /* 0x000 */ case 0x000: case 0x001: case 0x002: case 0x003: From 5b4e178b8a2d9b18ed29cac0571fb02ec780ca1a Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 20 Mar 2015 00:03:06 +0100 Subject: [PATCH 080/201] fix egalaxn2 shoot button --- src/mess/drivers/hh_hmcs40.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 852da84948c..1c554cf4419 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -610,7 +610,7 @@ READ8_MEMBER(hh_hmcs40_state::egalaxn2_input_r) static INPUT_PORTS_START( egalaxn2 ) PORT_START("IN.0") // D1 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // separate directional buttons, hence 16way PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // " @@ -622,7 +622,7 @@ static INPUT_PORTS_START( egalaxn2 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY // " PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -962,6 +962,7 @@ CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, driver_device, 0, "Colec CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex", "Galaxian 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) + CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, driver_device, 0, "Parker Brothers", "Q*Bert (Parker Brothers)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1982, kingman, 0, 0, kingman, kingman, driver_device, 0, "Tomy", "Kingman", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) From 8aa05b5375a726756db572f614e890b5ad369e78 Mon Sep 17 00:00:00 2001 From: Lord-Nightmare Date: Thu, 19 Mar 2015 21:11:07 -0400 Subject: [PATCH 081/201] tms6100.c: add the tms6125 4KiB VSM pinout [Lord Nightmare, plgdavid] --- src/emu/machine/tms6100.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/emu/machine/tms6100.c b/src/emu/machine/tms6100.c index c261d1b949b..2df1cada967 100644 --- a/src/emu/machine/tms6100.c +++ b/src/emu/machine/tms6100.c @@ -28,6 +28,19 @@ VSS | 14 15 | NC +-----------------+ + TMS6125: + + +---------+ + DATA/ADD1 | 1 16 | NC + DATA/ADD2 | 2 15 | NC + DATA/ADD4 | 3 14 | NC + DATA/ADD8 | 4 13 | NC + CLK | 5 12 | VDD + NC | 6 11 | /CS + NC | 7 10 | M1 + M0 | 8 9 | VSS + +---------+ + M58819 (from radarscope schematics): +-----------------+ From 2fa8b8d6fe1267213bcb37b24a675421cbc73b3d Mon Sep 17 00:00:00 2001 From: Lord-Nightmare Date: Thu, 19 Mar 2015 21:15:27 -0400 Subject: [PATCH 082/201] tiny upd1771 comment update (n/w) --- src/mess/audio/upd1771.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mess/audio/upd1771.c b/src/mess/audio/upd1771.c index bac1b853c14..f6ec40d0143 100644 --- a/src/mess/audio/upd1771.c +++ b/src/mess/audio/upd1771.c @@ -91,7 +91,7 @@ uPD1776C: mentioned in the bristow book, implements VSRSSS speech concatenation (see US Patent 4577343 which is a patent on this VSRSSS implementation) uPD1771C-006: used in NEC APC for sound as the "MPU" - -011: used on Firefox F-4 handheld + -011: used on Firefox F-4/Astro Thunder handheld -015: unknown, known to exist from part scalper sites only. -017: used on Epoch Super Cassete Vision for sound; This audio driver HLEs that part only. From 019e37e93891adf0ed94d68ae55061b702903a1a Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Thu, 19 Mar 2015 20:01:18 -0700 Subject: [PATCH 083/201] pinball2k: correct notes, install port handlers bridge positions taken from picture in MediaGX document from Carl. --- src/mame/drivers/pinball2k.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/pinball2k.c b/src/mame/drivers/pinball2k.c index 71c16c3f2b1..6cdb658cc34 100644 --- a/src/mame/drivers/pinball2k.c +++ b/src/mame/drivers/pinball2k.c @@ -9,8 +9,8 @@ - MediaGX features should be moved out to machine/ and shared with mediagx.c once we know what these games need Hardware: - - Cyrix MediaGX processor/VGA - - Cyrix CX5520 northbridge? + - Cyrix MediaGX processor/VGA (northbridge) + - Cyrix CX5520 (southbridge) - VS9824AG SuperI/O standard PC I/O chip - 1 ISA, 2 PCI slots, 2 IDE headers - "Prism" PCI card with PLX PCI9052 PCI-to-random stuff bridge @@ -83,6 +83,10 @@ public: DECLARE_WRITE32_MEMBER(ad1847_w); DECLARE_READ8_MEMBER(io20_r); DECLARE_WRITE8_MEMBER(io20_w); + DECLARE_READ32_MEMBER(port400_r); + DECLARE_WRITE32_MEMBER(port400_w); + DECLARE_READ32_MEMBER(port800_r); + DECLARE_WRITE32_MEMBER(port800_w); DECLARE_DRIVER_INIT(pinball2k); virtual void machine_start(); virtual void machine_reset(); @@ -415,6 +419,24 @@ WRITE8_MEMBER(pinball2k_state::io20_w) } } +READ32_MEMBER(pinball2k_state::port400_r) +{ + return 0x8000; +} + +WRITE32_MEMBER(pinball2k_state::port400_w) +{ +} + +READ32_MEMBER(pinball2k_state::port800_r) +{ + return 0x80; +} + +WRITE32_MEMBER(pinball2k_state::port800_w) +{ +} + READ32_MEMBER(pinball2k_state::parallel_port_r) { UINT32 r = 0; @@ -467,6 +489,8 @@ static ADDRESS_MAP_START(mediagx_io, AS_IO, 32, pinball2k_state ) AM_IMPORT_FROM(pcat32_io_common) AM_RANGE(0x00e8, 0x00eb) AM_NOP // I/O delay port AM_RANGE(0x0378, 0x037b) AM_READWRITE(parallel_port_r, parallel_port_w) + AM_RANGE(0x0400, 0x0403) AM_READWRITE(port400_r, port400_w) + AM_RANGE(0x0800, 0x0803) AM_READWRITE(port800_r, port800_w) AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE("pcibus", pci_bus_legacy_device, read, write) ADDRESS_MAP_END From 633ab90d90ed2ae50aeddff8471eb0d8e4b42104 Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Thu, 19 Mar 2015 20:03:31 -0700 Subject: [PATCH 084/201] mediagx: implement missing opcodes but no disassembly because I don't understand it. swe1pb (at least) boots to CMOS checksum failure prompt now. I didn't trace further. --- src/emu/cpu/i386/i386.h | 7 + src/emu/cpu/i386/i386ops.h | 10 ++ src/emu/cpu/i386/pentops.inc | 268 +++++++++++++++++++++++++++++++++++ 3 files changed, 285 insertions(+) diff --git a/src/emu/cpu/i386/i386.h b/src/emu/cpu/i386/i386.h index e994a7aa006..b2bcd3c0056 100644 --- a/src/emu/cpu/i386/i386.h +++ b/src/emu/cpu/i386/i386.h @@ -962,6 +962,7 @@ struct I386_CALL_GATE void pentium_cmovg_r32_rm32(); void pentium_movnti_m16_r16(); void pentium_movnti_m32_r32(); + void i386_cyrix_special(); void i386_cyrix_unknown(); void pentium_cmpxchg8b_m64(); void pentium_movntq_m64_r64(); @@ -1004,6 +1005,12 @@ struct I386_CALL_GATE void mmx_paddw_r64_rm64(); void mmx_paddd_r64_rm64(); void mmx_emms(); + void i386_cyrix_svdc(); + void i386_cyrix_rsdc(); + void i386_cyrix_svldt(); + void i386_cyrix_rsldt(); + void i386_cyrix_svts(); + void i386_cyrix_rsts(); void mmx_movd_r64_rm32(); void mmx_movq_r64_rm64(); void mmx_movd_rm32_r64(); diff --git a/src/emu/cpu/i386/i386ops.h b/src/emu/cpu/i386/i386ops.h index 6523dafd144..c540a7d3c16 100644 --- a/src/emu/cpu/i386/i386ops.h +++ b/src/emu/cpu/i386/i386ops.h @@ -329,6 +329,10 @@ const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] = { 0x32, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_rdmsr, &i386_device::pentium_rdmsr, false}, { 0x38, OP_2BYTE|OP_PENTIUM, &i386_device::i386_decode_three_byte38, &i386_device::i386_decode_three_byte38,false}, { 0x3A, OP_2BYTE|OP_PENTIUM, &i386_device::i386_decode_three_byte3a, &i386_device::i386_decode_three_byte3a,false}, + { 0x3A, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_special, &i386_device::i386_cyrix_special, false}, + { 0x3B, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_special, &i386_device::i386_cyrix_special, false}, + { 0x3C, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_special, &i386_device::i386_cyrix_special, false}, + { 0x3D, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_special, &i386_device::i386_cyrix_special, false}, { 0x40, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovo_r16_rm16, &i386_device::pentium_cmovo_r32_rm32, false}, { 0x41, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovno_r16_rm16, &i386_device::pentium_cmovno_r32_rm32, false}, { 0x42, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_cmovb_r16_rm16, &i386_device::pentium_cmovb_r32_rm32, false}, @@ -384,6 +388,12 @@ const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] = { 0x75, OP_2BYTE|OP_MMX, &i386_device::mmx_pcmpeqw_r64_rm64, &i386_device::mmx_pcmpeqw_r64_rm64, false}, { 0x76, OP_2BYTE|OP_MMX, &i386_device::mmx_pcmpeqd_r64_rm64, &i386_device::mmx_pcmpeqd_r64_rm64, false}, { 0x77, OP_2BYTE|OP_MMX, &i386_device::mmx_emms, &i386_device::mmx_emms, false}, + { 0x78, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_svdc, &i386_device::i386_cyrix_svdc, false}, + { 0x79, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_rsdc, &i386_device::i386_cyrix_rsdc, false}, + { 0x7a, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_svldt, &i386_device::i386_cyrix_svldt, false}, + { 0x7b, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_rsldt, &i386_device::i386_cyrix_rsldt, false}, + { 0x7c, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_svts, &i386_device::i386_cyrix_svts, false}, + { 0x7d, OP_2BYTE|OP_CYRIX, &i386_device::i386_cyrix_rsts, &i386_device::i386_cyrix_rsts, false}, { 0x7e, OP_2BYTE|OP_MMX, &i386_device::mmx_movd_rm32_r64, &i386_device::mmx_movd_rm32_r64, false}, { 0x7f, OP_2BYTE|OP_MMX, &i386_device::mmx_movq_rm64_r64, &i386_device::mmx_movq_rm64_r64, false}, { 0x80, OP_2BYTE|OP_I386, &i386_device::i386_jo_rel16, &i386_device::i386_jo_rel32, false}, diff --git a/src/emu/cpu/i386/pentops.inc b/src/emu/cpu/i386/pentops.inc index 348bd71becd..c7a341d9ba7 100644 --- a/src/emu/cpu/i386/pentops.inc +++ b/src/emu/cpu/i386/pentops.inc @@ -1062,6 +1062,18 @@ void i386_device::pentium_movnti_m32_r32() // Opcode 0f c3 } } +void i386_device::i386_cyrix_special() // Opcode 0x0f 3a-3d +{ +/* +0f 3a BB0_RESET (set BB0 pointer = base) +0f 3b BB1_RESET (set BB1 pointer = base) +0f 3c CPU_WRITE (write special CPU memory-mapped register, [ebx] = eax) +0f 3d CPU_READ (read special CPU memory-mapped register, eax, = [ebx]) +*/ + + CYCLES(1); +} + void i386_device::i386_cyrix_unknown() // Opcode 0x0f 74 { logerror("Unemulated 0x0f 0x74 opcode called\n"); @@ -1970,6 +1982,262 @@ void i386_device::mmx_emms() // Opcode 0f 77 CYCLES(1); // TODO: correct cycle count } +void i386_device::i386_cyrix_svdc() // Opcode 0f 78 +{ + UINT8 modrm = FETCH(); + + if( modrm < 0xc0 ) { + UINT32 ea = GetEA(modrm,0); + int index = (modrm >> 3) & 7; + int limit; + switch (index) + { + case 0: + { + index = ES; + break; + } + + case 2: + { + index = SS; + break; + } + + case 3: + { + index = DS; + break; + } + + case 4: + { + index = FS; + break; + } + + case 5: + { + index = GS; + break; + } + + default: + { + i386_trap(6, 0, 0); + } + } + + limit = m_sreg[index].limit; + + if (m_sreg[index].flags & 0x8000) //G bit + { + limit >>= 12; + } + + WRITE16(ea + 0, limit); + WRITE32(ea + 2, m_sreg[index].base); + WRITE16(ea + 5, m_sreg[index].flags); //replace top 8 bits of base + WRITE8(ea + 7, m_sreg[index].base >> 24); + WRITE16(ea + 8, m_sreg[index].selector); + } else { + i386_trap(6, 0, 0); + } + CYCLES(1); // TODO: correct cycle count +} + +void i386_device::i386_cyrix_rsdc() // Opcode 0f 79 +{ + UINT8 modrm = FETCH(); + + if( modrm < 0xc0 ) { + UINT32 ea = GetEA(modrm,0); + int index = (modrm >> 3) & 7; + UINT16 flags; + UINT32 base; + UINT32 limit; + switch (index) + { + case 0: + { + index = ES; + break; + } + + case 2: + { + index = SS; + break; + } + + case 3: + { + index = DS; + break; + } + + case 4: + { + index = FS; + break; + } + + case 5: + { + index = GS; + break; + } + + default: + { + i386_trap(6, 0, 0); + } + } + + base = (READ32(ea + 2) & 0x00ffffff) | (READ8(ea + 7) << 24); + flags = READ16(ea + 5); + limit = READ16(ea + 0) | ((flags & 3) << 16); + + if (flags & 0x8000) //G bit + { + limit = (limit << 12) | 0xfff; + } + + m_sreg[index].selector = READ16(ea + 8); + m_sreg[index].flags = flags; + m_sreg[index].base = base; + m_sreg[index].limit = limit; + } else { + i386_trap(6, 0, 0); + } + CYCLES(1); // TODO: correct cycle count +} + +void i386_device::i386_cyrix_svldt() // Opcode 0f 7a +{ + if ( PROTECTED_MODE && !V8086_MODE ) + { + UINT8 modrm = FETCH(); + + if( !(modrm & 0xf8) ) { + UINT32 ea = GetEA(modrm,0); + UINT32 limit = m_ldtr.limit; + + if (m_ldtr.flags & 0x8000) //G bit + { + limit >>= 12; + } + + WRITE16(ea + 0, limit); + WRITE32(ea + 2, m_ldtr.base); + WRITE16(ea + 5, m_ldtr.flags); //replace top 8 bits of base + WRITE8(ea + 7, m_ldtr.base >> 24); + WRITE16(ea + 8, m_ldtr.segment); + } else { + i386_trap(6, 0, 0); + } + } else { + i386_trap(6, 0, 0); + } + CYCLES(1); // TODO: correct cycle count +} + +void i386_device::i386_cyrix_rsldt() // Opcode 0f 7b +{ + if ( PROTECTED_MODE && !V8086_MODE ) + { + if(m_CPL) + FAULT(FAULT_GP,0) + + UINT8 modrm = FETCH(); + + if( !(modrm & 0xf8) ) { + UINT32 ea = GetEA(modrm,0); + UINT16 flags = READ16(ea + 5); + UINT32 base = (READ32(ea + 2) | 0x00ffffff) | (READ8(ea + 7) << 24); + UINT32 limit = READ16(ea + 0) | ((flags & 3) << 16); + I386_SREG seg; + + if (flags & 0x8000) //G bit + { + limit = (limit << 12) | 0xfff; + } + + memset(&seg, 0, sizeof(seg)); + seg.selector = READ16(ea + 8); + i386_load_protected_mode_segment(&seg,NULL); + m_ldtr.limit = limit; + m_ldtr.base = base; + m_ldtr.flags = flags; + } else { + i386_trap(6, 0, 0); + } + } else { + i386_trap(6, 0, 0); + } + CYCLES(1); // TODO: correct cycle count +} + +void i386_device::i386_cyrix_svts() // Opcode 0f 7c +{ + if ( PROTECTED_MODE ) + { + UINT8 modrm = FETCH(); + + if( !(modrm & 0xf8) ) { + UINT32 ea = GetEA(modrm,0); + UINT32 limit = m_task.limit; + + if (m_task.flags & 0x8000) //G bit + { + limit >>= 12; + } + + WRITE16(ea + 0, limit); + WRITE32(ea + 2, m_task.base); + WRITE16(ea + 5, m_task.flags); //replace top 8 bits of base + WRITE8(ea + 7, m_task.base >> 24); + WRITE16(ea + 8, m_task.segment); + } else { + i386_trap(6, 0, 0); + } + } else { + i386_trap(6, 0, 0); + } +} + +void i386_device::i386_cyrix_rsts() // Opcode 0f 7d +{ + if ( PROTECTED_MODE ) + { + if(m_CPL) + FAULT(FAULT_GP,0) + + UINT8 modrm = FETCH(); + + if( !(modrm & 0xf8) ) { + UINT32 ea = GetEA(modrm,0); + UINT16 flags = READ16(ea + 5); + UINT32 base = (READ32(ea + 2) | 0x00ffffff) | (READ8(ea + 7) << 24); + UINT32 limit = READ16(ea + 0) | ((flags & 3) << 16); + + if (flags & 0x8000) //G bit + { + limit = (limit << 12) | 0xfff; + } + m_task.segment = READ16(ea + 8); + m_task.limit = limit; + m_task.base = base; + m_task.flags = flags; + } else { + i386_trap(6, 0, 0); + } + } else { + i386_trap(6, 0, 0); + } + CYCLES(1); // TODO: correct cycle count +} + void i386_device::mmx_movd_r64_rm32() // Opcode 0f 6e { MMXPROLOG(); From e9aaed8b864177ba58a4ec54c77bcb3bc536e331 Mon Sep 17 00:00:00 2001 From: "Alex W. Jackson" Date: Fri, 20 Mar 2015 03:06:17 -0400 Subject: [PATCH 085/201] Fix performance regression from -dummywrite addition (nw) --- src/emu/emuopts.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h index db71ccc5a7d..ece89e1d09f 100644 --- a/src/emu/emuopts.h +++ b/src/emu/emuopts.h @@ -242,7 +242,7 @@ public: const char *record() const { return value(OPTION_RECORD); } const char *mng_write() const { return value(OPTION_MNGWRITE); } const char *avi_write() const { return value(OPTION_AVIWRITE); } - const char *dummy_write() const { return value(OPTION_DUMMYWRITE); } + bool dummy_write() const { return bool_value(OPTION_DUMMYWRITE); } const char *wav_write() const { return value(OPTION_WAVWRITE); } const char *snap_name() const { return value(OPTION_SNAPNAME); } const char *snap_size() const { return value(OPTION_SNAPSIZE); } From efc8fa579e9e6e1658f35563e85729f602098cd8 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 20 Mar 2015 08:27:31 +0100 Subject: [PATCH 086/201] updated genie (nw) --- 3rdparty/genie/.editorconfig | 13 ++ 3rdparty/genie/build/gmake.darwin/genie.make | 24 +- 3rdparty/genie/build/gmake.linux/genie.make | 14 +- 3rdparty/genie/build/gmake.windows/genie.make | 14 +- 3rdparty/genie/scripts/genie.lua | 8 +- 3rdparty/genie/src/actions/make/make_cpp.lua | 8 +- .../src/actions/vstudio/vs2010_vcxproj.lua | 60 +++-- 3rdparty/genie/src/base/api.lua | 124 ++++++----- 3rdparty/genie/src/base/bake.lua | 206 +++++++++--------- 3rdparty/genie/src/host/scripts.c | 97 +++++---- 10 files changed, 311 insertions(+), 257 deletions(-) create mode 100644 3rdparty/genie/.editorconfig diff --git a/3rdparty/genie/.editorconfig b/3rdparty/genie/.editorconfig new file mode 100644 index 00000000000..e9070240b79 --- /dev/null +++ b/3rdparty/genie/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +max_line_length = 100 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false +max_line_length = 80 diff --git a/3rdparty/genie/build/gmake.darwin/genie.make b/3rdparty/genie/build/gmake.darwin/genie.make index e21a886a482..e1dbd874d32 100644 --- a/3rdparty/genie/build/gmake.darwin/genie.make +++ b/3rdparty/genie/build/gmake.darwin/genie.make @@ -18,9 +18,11 @@ endif ifeq (posix,$(SHELLTYPE)) MKDIR = $(SILENT) mkdir -p "$(1)" COPY = $(SILENT) cp -fR "$(1)" "$(2)" + RM= $(SILENT) rm -f "$(1)" else MKDIR = $(SILENT) mkdir "$(subst /,\\,$(1))" 2> nul || exit 0 COPY = $(SILENT) copy /Y "$(subst /,\\,$(1))" "$(subst /,\\,$(2))" + RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif CC = gcc @@ -43,8 +45,8 @@ ifeq ($(config),release) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -Wl,-x -mmacosx-version-min=10.4 LDDEPS += @@ -119,8 +121,8 @@ ifeq ($(config),debug) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -mmacosx-version-min=10.4 LDDEPS += @@ -195,8 +197,8 @@ ifeq ($(config),releaseuniv32) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os -arch i386 -arch ppc -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -Wl,-x -arch i386 -arch ppc -mmacosx-version-min=10.4 LDDEPS += @@ -271,8 +273,8 @@ ifeq ($(config),debuguniv32) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4 - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -mmacosx-version-min=10.4 + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4 + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g -arch i386 -arch ppc -mmacosx-version-min=10.4 ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -arch i386 -arch ppc -mmacosx-version-min=10.4 LDDEPS += @@ -341,8 +343,8 @@ endif OBJDIRS := \ $(OBJDIR) \ - $(OBJDIR)/src/host/lua-5.2.3/src \ $(OBJDIR)/src/host \ + $(OBJDIR)/src/host/lua-5.2.3/src \ RESOURCES := \ @@ -362,9 +364,7 @@ $(TARGETDIR): $(OBJDIRS): @echo Creating $(OBJDIR) - -$(call MKDIR,$(OBJDIR)) - -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) - -$(call MKDIR,$(OBJDIR)/src/host) + -$(call MKDIR,$@) clean: @echo Cleaning genie diff --git a/3rdparty/genie/build/gmake.linux/genie.make b/3rdparty/genie/build/gmake.linux/genie.make index 56611f15140..ee290792707 100644 --- a/3rdparty/genie/build/gmake.linux/genie.make +++ b/3rdparty/genie/build/gmake.linux/genie.make @@ -18,9 +18,11 @@ endif ifeq (posix,$(SHELLTYPE)) MKDIR = $(SILENT) mkdir -p "$(1)" COPY = $(SILENT) cp -fR "$(1)" "$(2)" + RM= $(SILENT) rm -f "$(1)" else MKDIR = $(SILENT) mkdir "$(subst /,\\,$(1))" 2> nul || exit 0 COPY = $(SILENT) copy /Y "$(subst /,\\,$(1))" "$(subst /,\\,$(2))" + RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif CC = gcc @@ -43,8 +45,8 @@ ifeq ($(config),release) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -s -rdynamic LDDEPS += @@ -119,8 +121,8 @@ ifeq ($(config),debug) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -rdynamic LDDEPS += @@ -210,9 +212,7 @@ $(TARGETDIR): $(OBJDIRS): @echo Creating $(OBJDIR) - -$(call MKDIR,$(OBJDIR)) - -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) - -$(call MKDIR,$(OBJDIR)/src/host) + -$(call MKDIR,$@) clean: @echo Cleaning genie diff --git a/3rdparty/genie/build/gmake.windows/genie.make b/3rdparty/genie/build/gmake.windows/genie.make index bf5f8b0dff0..73f6d7218a3 100644 --- a/3rdparty/genie/build/gmake.windows/genie.make +++ b/3rdparty/genie/build/gmake.windows/genie.make @@ -18,9 +18,11 @@ endif ifeq (posix,$(SHELLTYPE)) MKDIR = $(SILENT) mkdir -p "$(1)" COPY = $(SILENT) cp -fR "$(1)" "$(2)" + RM= $(SILENT) rm -f "$(1)" else MKDIR = $(SILENT) mkdir "$(subst /,\\,$(1))" 2> nul || exit 0 COPY = $(SILENT) copy /Y "$(subst /,\\,$(1))" "$(subst /,\\,$(2))" + RM = $(SILENT) del /F "$(subst /,\\,$(1))" 2> nul || exit 0 endif CC = gcc @@ -43,8 +45,8 @@ ifeq ($(config),release) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -Os ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. -s LDDEPS += @@ -119,8 +121,8 @@ ifeq ($(config),debug) INCLUDES += -I../../src/host/lua-5.2.3/src ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES) ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g - ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) - ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) + ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g + ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH) -Wall -Wextra -g ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES) ALL_LDFLAGS += $(LDFLAGS) -L. LDDEPS += @@ -210,9 +212,7 @@ $(TARGETDIR): $(OBJDIRS): @echo Creating $(OBJDIR) - -$(call MKDIR,$(OBJDIR)) - -$(call MKDIR,$(OBJDIR)/src/host) - -$(call MKDIR,$(OBJDIR)/src/host/lua-5.2.3/src) + -$(call MKDIR,$@) clean: @echo Cleaning genie diff --git a/3rdparty/genie/scripts/genie.lua b/3rdparty/genie/scripts/genie.lua index 468aa5359ce..fbf273030b9 100644 --- a/3rdparty/genie/scripts/genie.lua +++ b/3rdparty/genie/scripts/genie.lua @@ -8,7 +8,7 @@ -- worry about the /scripts argument and all that. -- premake.make.override = { "TARGET" } - + solution "genie" configurations { "Release", @@ -33,15 +33,15 @@ "../**.lua", "../src/**.h", "../src/**.c", - "../src/host/scripts.c" + "../src/host/scripts.c", } - excludes { + removefiles { "../src/premake.lua", "../src/host/lua-5.2.3/src/lua.c", "../src/host/lua-5.2.3/src/luac.c", "../src/host/lua-5.2.3/**.lua", - "../src/host/lua-5.2.3/etc/*.c" + "../src/host/lua-5.2.3/etc/*.c", } configuration "Debug" diff --git a/3rdparty/genie/src/actions/make/make_cpp.lua b/3rdparty/genie/src/actions/make/make_cpp.lua index 9243b0cccd7..cff6ddebe86 100644 --- a/3rdparty/genie/src/actions/make/make_cpp.lua +++ b/3rdparty/genie/src/actions/make/make_cpp.lua @@ -89,6 +89,7 @@ if (not prj.options.ArchiveSplit) then _p('\t$(SILENT) $(LINKCMD) $(OBJECTS)') else + _p('\t$(call RM,$(TARGET))') _p('\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))') _p('\t$(SILENT) $(LINKCMD_NDX)') end @@ -112,10 +113,7 @@ if (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, "SkipCreatingMessage")) then _p('\t@echo Creating $(OBJDIR)') end - _p('\t-$(call MKDIR,$(OBJDIR))') - for dir, _ in pairs(objdirs) do - _p('\t-$(call MKDIR,$(OBJDIR)/%s)', dir) - end + _p('\t-$(call MKDIR,$@)') _p('') -- Mac OS X specific targets @@ -194,9 +192,11 @@ _p('ifeq (posix,$(SHELLTYPE))') _p(' MKDIR = $(SILENT) mkdir -p "$(1)"') _p(' COPY = $(SILENT) cp -fR "$(1)" "$(2)"') + _p(' RM = $(SILENT) rm -f "$(1)"') _p('else') _p(' MKDIR = $(SILENT) mkdir "$(subst /,\\\\,$(1))" 2> nul || exit 0') _p(' COPY = $(SILENT) copy /Y "$(subst /,\\\\,$(1))" "$(subst /,\\\\,$(2))"') + _p(' RM = $(SILENT) del /F "$(subst /,\\\\,$(1))" 2> nul || exit 0') _p('endif') _p('') diff --git a/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua b/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua index 62e66924bcc..c5ee17d841c 100644 --- a/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua +++ b/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua @@ -262,20 +262,20 @@ local function compile_language(cfg) if cfg.options.ForceCPP then - _p(3,'CompileAsCpp') + _p(3,'CompileAsCpp') else if cfg.language == "C" then _p(3,'CompileAsC') end end end - + local function forcedinclude_files(indent,cfg) if #cfg.forcedincludes > 0 then _p(indent,'%s' ,premake.esc(path.translate(table.concat(cfg.forcedincludes, ";"), '\\'))) end - end + end local function vs10_clcompile(cfg) _p(2,'') @@ -343,7 +343,7 @@ end compile_language(cfg) - + forcedinclude_files(3,cfg); _p(2,'') end @@ -484,6 +484,15 @@ + function exists(table, fine) + for _, value in ipairs(table) do + if value == find then return true end + end + + return false + end + + -- -- Retrieve a list of files for a particular build group, one of -- "ClInclude", "ClCompile", "ResourceCompile", and "None". @@ -505,7 +514,9 @@ if path.iscppfile(file.name) then table.insert(sortedfiles.ClCompile, file) elseif path.iscppheader(file.name) then - table.insert(sortedfiles.ClInclude, file) + if not exists(prj.removefiles, file) then + table.insert(sortedfiles.ClInclude, file) + end elseif path.isresourcefile(file.name) then table.insert(sortedfiles.ResourceCompile, file) else @@ -594,13 +605,36 @@ end end - -- Per configuration excludes - for _, vsconfig in ipairs(configs) do - local cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform) - for _, exclude in ipairs(cfg.excludes) do + -- Global exclude + local excluded = false + for _, exclude in ipairs(prj.excludes) do + if exclude == file.name then + for _, vsconfig in ipairs(configs) do + local cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform) + _p(3, 'true' + , premake.esc(vsconfig.name) + ) + end + excluded = true + break + end + end - if exclude == file.name then - _p(3, 'true', premake.esc(vsconfig.name)) + if not excluded then + -- Per configuration excludes + for _, vsconfig in ipairs(configs) do + local cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform) + for _, exclude in ipairs(cfg.excludes) do + + if exclude == file.name then + _p(3, 'true' + , premake.esc(vsconfig.name) + ) + end end end end @@ -739,7 +773,7 @@ io.eol = "\r\n" _p('') _p('') - + _p(1,'') @@ -777,4 +811,4 @@ _p(1,'') _p('') - end \ No newline at end of file + end diff --git a/3rdparty/genie/src/base/api.lua b/3rdparty/genie/src/base/api.lua index 86665e4f928..9a3a26d0c43 100644 --- a/3rdparty/genie/src/base/api.lua +++ b/3rdparty/genie/src/base/api.lua @@ -17,7 +17,7 @@ kind = "string", scope = "config", }, - + basedir = { kind = "path", @@ -47,19 +47,19 @@ kind = "list", scope = "config", }, - + buildoptions_cpp = { kind = "list", scope = "config", }, - + buildoptions_objc = { kind = "list", scope = "config", }, - + configurations = { kind = "list", @@ -109,6 +109,12 @@ scope = "config", }, + removefiles = + { + kind = "filelist", + scope = "config", + }, + flags = { kind = "list", @@ -189,7 +195,7 @@ } }, - forcedincludes = + forcedincludes = { kind = "absolutefilelist", scope = "config", @@ -305,7 +311,7 @@ kind = "list", scope = "config", }, - + messageskip = { @@ -335,31 +341,31 @@ { kind = "string", scope = "config", - }, + }, msgcompile = { kind = "string", scope = "config", - }, + }, msgcompile_objc = { kind = "string", scope = "config", - }, - + }, + msgresource = { kind = "string", scope = "config", - }, + }, msglinking = { kind = "string", scope = "config", - }, + }, objdir = { @@ -536,7 +542,7 @@ premake.check_paths = false - + -- -- Check to see if a value exists in a list of values, using a -- case-insensitive match. If the value does exist, the canonical @@ -640,7 +646,7 @@ if value then add(value, 5) end - + return obj[fieldname] end @@ -664,7 +670,7 @@ if value:find("*") then local arr = matchfunc(value); if (premake.check_paths) and (#arr == 0) then - error("Can't find matching files for pattern :" .. value) + error("Can't find matching files for pattern :" .. value) end makeabsolute(arr, depth + 1) else @@ -770,7 +776,7 @@ end end - -- find the container for the value + -- find the container for the value local container, err = premake.getobject(scope) if (not container) then error(err, 3) @@ -804,10 +810,10 @@ end -- list value types get a remove() call too - if info.kind == "list" or - info.kind == "dirlist" or + if info.kind == "list" or + info.kind == "dirlist" or info.kind == "filelist" or - info.kind == "absolutefilelist" + info.kind == "absolutefilelist" then _G["remove"..name] = function(value) premake.remove(name, value) @@ -895,7 +901,7 @@ -- the path to create groups from (i.e. "Examples/Simple") -- @param sln -- the solution to add the groups to --- @returns +-- @returns -- the group object for the deepest folder -- @@ -960,7 +966,7 @@ prj.basedir = os.getcwd() prj.uuid = os.uuid(prj.name) prj.blocks = { } - prj.usage = isUsage + prj.usage = isUsage prj.group = group return prj; @@ -985,46 +991,46 @@ error("no active solution", 2) end - -- if this is a new project, or the project in that slot doesn't have a usage, create it - if((not sln.projects[name]) or - ((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then - premake.CurrentContainer = createproject(name, sln, true) - else - premake.CurrentContainer = iff(sln.projects[name].usage, - sln.projects[name], sln.projects[name].usageProj) - end - - -- add an empty, global configuration to the project - configuration { } - - return premake.CurrentContainer - end - - function project(name) - if (not name) then - --Only return non-usage projects - if(type(premake.CurrentContainer) ~= "project") then return nil end - if(premake.CurrentContainer.usage) then return nil end - return premake.CurrentContainer + -- if this is a new project, or the project in that slot doesn't have a usage, create it + if((not sln.projects[name]) or + ((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then + premake.CurrentContainer = createproject(name, sln, true) + else + premake.CurrentContainer = iff(sln.projects[name].usage, + sln.projects[name], sln.projects[name].usageProj) end - -- identify the parent solution - local sln - if (type(premake.CurrentContainer) == "project") then - sln = premake.CurrentContainer.solution - else - sln = premake.CurrentContainer - end - if (type(sln) ~= "solution") then - error("no active solution", 2) - end + -- add an empty, global configuration to the project + configuration { } - -- if this is a new project, or the old project is a usage project, create it - if((not sln.projects[name]) or sln.projects[name].usage) then - premake.CurrentContainer = createproject(name, sln) - else - premake.CurrentContainer = sln.projects[name]; - end + return premake.CurrentContainer + end + + function project(name) + if (not name) then + --Only return non-usage projects + if(type(premake.CurrentContainer) ~= "project") then return nil end + if(premake.CurrentContainer.usage) then return nil end + return premake.CurrentContainer + end + + -- identify the parent solution + local sln + if (type(premake.CurrentContainer) == "project") then + sln = premake.CurrentContainer.solution + else + sln = premake.CurrentContainer + end + if (type(sln) ~= "solution") then + error("no active solution", 2) + end + + -- if this is a new project, or the old project is a usage project, create it + if((not sln.projects[name]) or sln.projects[name].usage) then + premake.CurrentContainer = createproject(name, sln) + else + premake.CurrentContainer = sln.projects[name]; + end -- add an empty, global configuration to the project configuration { } @@ -1055,7 +1061,7 @@ function group(name) - if not name then + if not name then return premake.CurrentGroup end premake.CurrentGroup = name diff --git a/3rdparty/genie/src/base/bake.lua b/3rdparty/genie/src/base/bake.lua index c946700012d..62737fa4d19 100644 --- a/3rdparty/genie/src/base/bake.lua +++ b/3rdparty/genie/src/base/bake.lua @@ -2,8 +2,8 @@ -- base/bake.lua -- -- Takes all the configuration information provided by the project scripts --- and stored in the solution->project->block hierarchy and flattens it all --- down into one object per configuration. These objects are cached with the +-- and stored in the solution->project->block hierarchy and flattens it all +-- down into one object per configuration. These objects are cached with the -- project, and can be retrieved by calling the getconfig() or eachconfig(). -- -- Copyright (c) 2008-2011 Jason Perkins and the Premake project @@ -15,7 +15,7 @@ -- do not copy these fields into the configurations - local nocopy = + local nocopy = { blocks = true, keywords = true, @@ -25,11 +25,11 @@ -- do not cascade these fields from projects to configurations - local nocascade = + local nocascade = { makesettings = true, } - + -- leave these paths as absolute, rather than converting to project relative local keeprelative = @@ -47,7 +47,7 @@ function premake.getactiveterms() local terms = { _action = _ACTION:lower(), os = os.get() } - + -- add option keys or values for key, value in pairs(_OPTIONS) do if value ~= "" then @@ -56,15 +56,15 @@ table.insert(terms, key:lower()) end end - + return terms end - - + + -- -- Test a single configuration block keyword against a list of terms. -- The terms are a mix of key/value pairs. The keyword is tested against --- the values; on a match, the corresponding key is returned. This +-- the values; on a match, the corresponding key is returned. This -- enables testing for required values in iskeywordsmatch(), below. -- @@ -73,7 +73,7 @@ if keyword:startswith("not ") then return not premake.iskeywordmatch(keyword:sub(5), terms) end - + for _, pattern in ipairs(keyword:explode(" or ")) do for termkey, term in pairs(terms) do if term:match(pattern) == term then @@ -82,9 +82,9 @@ end end end - - - + + + -- -- Checks a set of configuration block keywords against a list of terms. -- The required flag is used by the file configurations: only blocks @@ -104,7 +104,7 @@ hasrequired = true end end - + if terms.required and not hasrequired then return false else @@ -125,15 +125,15 @@ local function adjustpaths(location, obj) function adjustpathlist(list) for i, p in ipairs(list) do - list[i] = path.getrelative(location, p) + list[i] = path.getrelative(location, p) end end - + for name, value in pairs(obj) do local field = premake.fields[name] if field and value and not keeprelative[name] then if field.kind == "path" then - obj[name] = path.getrelative(location, value) + obj[name] = path.getrelative(location, value) elseif field.kind == "dirlist" or field.kind == "filelist" then adjustpathlist(value) elseif field.kind == "keypath" then @@ -144,8 +144,8 @@ end end end - - + + -- -- Merge all of the fields from one object into another. String values are overwritten, @@ -176,21 +176,21 @@ local function removevalues(tbl, removes) for i=#tbl,1,-1 do - for _, pattern in ipairs(removes) do - if pattern == tbl[i] then - table.remove(tbl, i) - break - end - end - end + for _, pattern in ipairs(removes) do + if pattern == tbl[i] then + table.remove(tbl, i) + break + end + end + end end - + local function mergeobject(dest, src) -- if there's nothing to add, quick out - if not src then - return + if not src then + return end - + for fieldname, value in pairs(src) do if not nocopy[fieldname] then -- fields that are included in the API are merged... @@ -207,7 +207,7 @@ else dest[fieldname] = value end - + -- ...everything else is just copied as-is else dest[fieldname] = value @@ -215,8 +215,8 @@ end end end - - + + -- -- Merges the settings from a solution's or project's list of configuration blocks, @@ -245,33 +245,33 @@ if pltname ~= "Native" then key = key .. pltname end - + -- add the configuration and platform to the block filter terms terms.config = (cfgname or ""):lower() terms.platform = pltname:lower() - + -- build the configuration base by merging the solution and project level settings local cfg = {} mergeobject(cfg, basis[key]) adjustpaths(obj.location, cfg) mergeobject(cfg, obj) - + -- add `kind` to the filter terms - if (cfg.kind) then + if (cfg.kind) then terms['kind']=cfg.kind:lower() end - + -- now add in any blocks that match the filter terms for _, blk in ipairs(obj.blocks) do if (premake.iskeywordsmatch(blk.keywords, terms))then mergeobject(cfg, blk) - if (cfg.kind and not cfg.terms.kind) then + if (cfg.kind and not cfg.terms.kind) then cfg.terms['kind'] = cfg.kind:lower() terms['kind'] = cfg.kind:lower() end end end - + -- package it all up and add it to the result set cfg.name = cfgname cfg.platform = pltname @@ -280,9 +280,9 @@ end dest[key] = cfg end - - - + + + -- -- Collapse a solution or project object down to a canonical set of configuration settings, -- keyed by configuration block/platform pairs, and taking into account the current @@ -300,15 +300,15 @@ local function collapse(obj, basis) local result = {} basis = basis or {} - + -- find the solution, which contains the configuration and platform lists local sln = obj.solution or obj - -- build a set of configuration filter terms; only those configuration blocks + -- build a set of configuration filter terms; only those configuration blocks -- with a matching set of keywords will be included in the merged results local terms = premake.getactiveterms() - -- build a project-level configuration. + -- build a project-level configuration. merge(result, obj, basis, terms)--this adjusts terms -- now build configurations for each build config/platform pair @@ -322,7 +322,7 @@ end end end - + return result end @@ -339,12 +339,12 @@ local function builduniquedirs() local num_variations = 4 - + -- Start by listing out each possible object directory for each configuration. -- Keep a count of how many times each path gets used across the session. local cfg_dirs = {} local hit_counts = {} - + for sln in premake.solution.each() do for _, prj in ipairs(sln.projects) do for _, cfg in pairs(prj.__configs) do @@ -355,7 +355,7 @@ dirs[3] = path.join(dirs[2], cfg.name) dirs[4] = path.join(dirs[3], cfg.project.name) cfg_dirs[cfg] = dirs - + -- configurations other than the root should bias toward a more -- description path, including the platform or config name local start = iif(cfg.name, 2, 1) @@ -367,7 +367,7 @@ end end end - + -- Now assign an object directory to each configuration, skipping those -- that are in use somewhere else in the session for sln in premake.solution.each() do @@ -383,10 +383,10 @@ cfg.objectsdir = path.getrelative(cfg.location, dir) end end - end - + end + end - + -- @@ -410,24 +410,24 @@ end end - end + end end - + local function getCfgKind(cfg) if(cfg.kind) then return cfg.kind; end - + if(cfg.project.__configs[""] and cfg.project.__configs[""].kind) then return cfg.project.__configs[""].kind; end - + return nil end - + local function getprojrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage) if(not cfg) then return end - + local foundUsePrjs = {}; for _, useName in ipairs(cfg[searchField]) do local testName = useName:lower(); @@ -443,7 +443,7 @@ end end end - + --Must connect to a usage project. if(theUseProj) then foundList[testName] = true; @@ -458,7 +458,7 @@ end end end - + for _, usePrj in ipairs(foundUsePrjs) do --Links can only recurse through static libraries. if((searchField ~= "links") or @@ -468,7 +468,7 @@ end end end - + -- -- This function will recursively get all projects that the given configuration has in its "uses" -- field. The return values are a list of tables. Each table in that list contains the following: @@ -486,27 +486,27 @@ local dstArray = {}; local foundList = {}; foundList[cfg.project.name:lower()] = true; - + --First, follow the uses recursively. getprojrec(dstArray, foundList, cfg, cfgname, "uses", false); - + --Next, go through all of the usage projects and recursively get their links. --But only if they're not already there. Get the links as linkage-only. local linkArray = {}; for prjName, prjEntry in pairs(dstArray) do - getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname, + getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname, "links", true); end - + --Copy from linkArray into dstArray. for prjName, prjEntry in pairs(linkArray) do dstArray[prjName] = prjEntry; end - + return dstArray; end - - + + local function isnameofproj(cfg, strName) local sln = cfg.project.solution; local strTest = strName:lower(); @@ -515,18 +515,18 @@ return true; end end - + return false; end - - + + -- -- Copies the field from dstCfg to srcCfg. -- local function copydependentfield(srcCfg, dstCfg, strSrcField) local srcField = premake.fields[strSrcField]; local strDstField = strSrcField; - + if type(srcCfg[strSrcField]) == "table" then --handle paths. if (srcField.kind == "dirlist" or srcField.kind == "filelist") and @@ -560,8 +560,8 @@ end end end - - + + -- -- This function will take the list of project entries and apply their usage project data -- to the given configuration. It will copy compiling information for the projects that are @@ -569,15 +569,15 @@ -- the source project is not a static library. It won't copy linking information -- if the project is in this solution; instead it will add that project to the configuration's -- links field, expecting that Premake will handle the rest. - -- + -- local function copyusagedata(cfg, cfgname, linkToProjs) local myPrj = cfg.project; local bIsStaticLib = (getCfgKind(cfg) == "StaticLib"); - + for prjName, prjEntry in pairs(linkToProjs) do local srcPrj = prjEntry.usageProj; local srcCfg = srcPrj.__configs[cfgname]; - + for name, field in pairs(premake.fields) do if(srcCfg[name]) then if(field.usagecopy) then @@ -594,7 +594,7 @@ end end end - + if((not bIsStaticLib) and prjEntry.proj) then table.insert(cfg.links, prjEntry.proj.name); end @@ -605,9 +605,9 @@ -- -- Main function, controls the process of flattening the configurations. -- - + function premake.bake.buildconfigs() - + -- convert project path fields to be relative to project location for sln in premake.solution.each() do for _, prj in ipairs(sln.projects) do @@ -619,9 +619,9 @@ end sln.location = sln.location or sln.basedir end - + -- collapse configuration blocks, so that there is only one block per build - -- configuration/platform pair, filtered to the current operating environment + -- configuration/platform pair, filtered to the current operating environment for sln in premake.solution.each() do local basis = collapse(sln) for _, prj in ipairs(sln.projects) do @@ -630,8 +630,8 @@ bake.postprocess(prj, cfg) end end - end - + end + -- This loop finds the projects that a configuration is connected to -- via its "uses" field. It will then copy any usage project information from that -- usage project to the configuration in question. @@ -644,7 +644,7 @@ end end end - end + end -- Remove all usage projects. for sln in premake.solution.each() do @@ -654,20 +654,20 @@ table.insert(removeList, 1, index); --Add in reverse order. end end - + for _, index in ipairs(removeList) do table.remove(sln.projects, index); end end - + -- assign unique object directories to each configuration builduniquedirs() - + -- walk it again and build the targets and unique directories buildtargets(cfg) end - + -- -- Post-process a project configuration, applying path fix-ups and other adjustments @@ -683,10 +683,10 @@ cfg.project = prj cfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true) cfg.longname = premake.getconfigname(cfg.name, cfg.platform) - + -- set the project location, if not already set cfg.location = cfg.location or cfg.basedir - + -- figure out the target system local platform = premake.platforms[cfg.platform] if platform.iscrosscompiler then @@ -694,28 +694,28 @@ else cfg.system = os.get() end - + -- adjust the kind as required by the target system if cfg.kind == "SharedLib" and platform.nosharedlibs then cfg.kind = "StaticLib" end - + -- remove excluded files from the file list local files = { } for _, fname in ipairs(cfg.files) do - local excluded = false - for _, exclude in ipairs(cfg.excludes) do - excluded = (fname == exclude) - if (excluded) then break end + local removed = false + for _, removefname in ipairs(cfg.removefiles) do + removed = (fname == removefname) + if (removed) then break end end - - if (not excluded) then + + if (not removed) then table.insert(files, fname) end end cfg.files = files - -- fixup the data + -- fixup the data for name, field in pairs(premake.fields) do -- re-key flag fields for faster lookups if field.isflags then diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c index 8ea8b985668..c08c2b2dc3a 100644 --- a/3rdparty/genie/src/host/scripts.c +++ b/3rdparty/genie/src/host/scripts.c @@ -64,38 +64,38 @@ const char* builtin_scripts[] = { "premake.config = { }\nlocal config = premake.config\nfunction premake.config.isdebugbuild(cfg)\nif cfg.flags.Optimize or cfg.flags.OptimizeSize or cfg.flags.OptimizeSpeed then\nreturn false\nend\nif not cfg.flags.Symbols then\nreturn false\nend\nreturn true\nend\nfunction premake.config.isincrementallink(cfg)\nif cfg.kind == \"StaticLib\" \nor config.isoptimizedbuild(cfg.flags)\nor cfg.flags.NoIncrementalLink then\nreturn false\nend\nreturn true\nend\nfunction premake.config.isoptimizedbuild(flags)\nreturn flags.Optimize or flags.OptimizeSize or flags.OptimizeSpeed\nend\n", /* base/bake.lua */ - "premake.bake = { }\nlocal bake = premake.bake\nlocal nocopy = \n{\nblocks = true,\nkeywords = true,\nprojects = true,\n__configs = true,\n}\nlocal nocascade = \n{\nmakesettings = true,\n}\nlocal keeprelative =\n{\nbasedir = true,\nlocation = true,\n}\nfunction premake.getactiveterms()\nlocal terms = { _action = _ACTION:lower(), os = os.get() }\nfor key, value in pairs(_OPTIONS) do\nif value ~= \"\" then\ntable.insert(terms, value:lower())\nelse\ntable.insert(terms, key:lower())\nend\nend\nreturn terms\nend\nfunction premake.iskeywordmatch(keyword, terms)\nif keyword:startswith(\"not \") then\nreturn not premake.iskeywordmatch(keyword:sub(5), terms)\nend\nfor _, pattern in ipairs(keyword:explode(\" or \")) do\nfor termkey, term in pairs(terms) do\nif term:match(pattern) == term then\nreturn termkey\nend\nend\nend\nend\nfunction premake.iskeywordsmatch(keywords, terms)\nlocal hasrequired = false\nfor _, keyword in ipairs(keywords) do\nlocal matched = premake.iskeywordmatch(keyword, terms)\nif not matched t" - "hen\nreturn false\nend\nif matched == \"required\" then\nhasrequired = true\nend\nend\nif terms.required and not hasrequired then\nreturn false\nelse\nreturn true\nend\nend\nlocal function adjustpaths(location, obj)\nfunction adjustpathlist(list)\nfor i, p in ipairs(list) do\nlist[i] = path.getrelative(location, p) \nend\nend\nfor name, value in pairs(obj) do\nlocal field = premake.fields[name]\nif field and value and not keeprelative[name] then\nif field.kind == \"path\" then\nobj[name] = path.getrelative(location, value) \nelseif field.kind == \"dirlist\" or field.kind == \"filelist\" then\nadjustpathlist(value)\nelseif field.kind == \"keypath\" then\nfor k,v in pairs(value) do\nadjustpathlist(v)\nend\nend\nend\nend\nend\nlocal function mergefield(kind, dest, src)\nlocal tbl = dest or { }\nif kind == \"keyvalue\" or kind == \"keypath\" then\nfor key, value in pairs(src) do\ntbl[key] = mergefield(\"list\", tbl[key], value)\nend\nelse\nfor _, item in ipairs(src) do\nif not tbl[item] then\ntable.insert(tbl, ite" - "m)\ntbl[item] = item\nend\nend\nend\nreturn tbl\nend\nlocal function removevalues(tbl, removes)\nfor i=#tbl,1,-1 do\n for _, pattern in ipairs(removes) do\n if pattern == tbl[i] then\n table.remove(tbl, i)\n break\n end\n end\n end\nend\nlocal function mergeobject(dest, src)\nif not src then \nreturn \nend\nfor fieldname, value in pairs(src) do\nif not nocopy[fieldname] then\nlocal field = premake.fields[fieldname]\nif field then\nif type(value) == \"table\" then\ndest[fieldname] = mergefield(field.kind, dest[fieldname], value)\nif src.removes then\nremoves = src.removes[fieldname]\nif removes then\nremovevalues(dest[fieldname], removes)\nend\nend\nelse\ndest[fieldname] = value\nend\nelse\ndest[fieldname] = value\nend\nend\nend\nend\nlocal function merge(dest, obj, basis, terms, cfgname, pltname)\nlocal key = cfgname or \"\"\npltname = pltname or \"Native\"\nif pltname ~= \"Native\" then\nkey = key .. pltname\nend" - "\nterms.config = (cfgname or \"\"):lower()\nterms.platform = pltname:lower()\nlocal cfg = {}\nmergeobject(cfg, basis[key])\nadjustpaths(obj.location, cfg)\nmergeobject(cfg, obj)\nif (cfg.kind) then \nterms['kind']=cfg.kind:lower()\nend\nfor _, blk in ipairs(obj.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, terms))then\nmergeobject(cfg, blk)\nif (cfg.kind and not cfg.terms.kind) then \ncfg.terms['kind'] = cfg.kind:lower()\nterms['kind'] = cfg.kind:lower()\nend\nend\nend\ncfg.name = cfgname\ncfg.platform = pltname\nfor k,v in pairs(terms) do\ncfg.terms[k] =v\nend\ndest[key] = cfg\nend\nlocal function collapse(obj, basis)\nlocal result = {}\nbasis = basis or {}\nlocal sln = obj.solution or obj\nlocal terms = premake.getactiveterms()\nmerge(result, obj, basis, terms)--this adjusts terms\nfor _, cfgname in ipairs(sln.configurations) do\nlocal terms_local = {}\nfor k,v in pairs(terms)do terms_local[k]=v end\nmerge(result, obj, basis, terms_local, cfgname, \"Native\")--terms cam also be adjusted here\nf" - "or _, pltname in ipairs(sln.platforms or {}) do\nif pltname ~= \"Native\" then\nmerge(result, obj, basis,terms_local, cfgname, pltname)--terms also here\nend\nend\nend\nreturn result\nend\nlocal function builduniquedirs()\nlocal num_variations = 4\nlocal cfg_dirs = {}\nlocal hit_counts = {}\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dirs = { }\ndirs[1] = path.getabsolute(path.join(cfg.location, cfg.objdir or cfg.project.objdir or \"obj\"))\ndirs[2] = path.join(dirs[1], iif(cfg.platform == \"Native\", \"\", cfg.platform))\ndirs[3] = path.join(dirs[2], cfg.name)\ndirs[4] = path.join(dirs[3], cfg.project.name)\ncfg_dirs[cfg] = dirs\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, num_variations do\nlocal d = dirs[v]\nhit_counts[d] = (hit_counts[d] or 0) + 1\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dir\nlocal start = iif(cfg.name, " - "2, 1)\nfor v = start, iif(cfg.flags.SingleOutputDir,num_variations-1,num_variations) do\ndir = cfg_dirs[cfg][v]\nif hit_counts[dir] == 1 then break end\nend\ncfg.objectsdir = path.getrelative(cfg.location, dir)\nend\nend\nend\nend\nlocal function buildtargets()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\ncfg.buildtarget = premake.gettarget(cfg, \"build\", pathstyle, namestyle, cfg.system)\ncfg.linktarget = premake.gettarget(cfg, \"link\", pathstyle, namestyle, cfg.system)\nif pathstyle == \"windows\" then\ncfg.objectsdir = path.translate(cfg.objectsdir, \"\\\\\")\nend\nend\nend\nend\nend\n local function getCfgKind(cfg)\n if(cfg.kind) then\n return cfg.kind;\n end\n \n if(cfg.project.__configs[\"\"] and cfg.project.__configs[\"\"].kind) then\n return cfg.project.__configs[\"\"].kind;\n end\n \n return nil\n end\n \n local function get" - "projrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage)\n if(not cfg) then return end\n \n local foundUsePrjs = {};\n for _, useName in ipairs(cfg[searchField]) do\n local testName = useName:lower();\n if((not foundList[testName])) then\n local theProj = nil;\n local theUseProj = nil;\n for _, prj in ipairs(cfg.project.solution.projects) do\n if (prj.name:lower() == testName) then\n if(prj.usage) then\n theUseProj = prj;\n else\n theProj = prj;\n end\n end\n end\n \n --Must connect to a usage project.\n if(theUseProj) then\n foundList[testName] = true;\n local prjEntry = {\n name = testName,\n proj = theProj,\n usageProj = theUseProj,\n bLinkageOnly = bLinkage,\n };\n dstArray[testName] = prjEntry;\n table.insert(foundUsePrjs, theUseProj);\n end\n end\n end\n \n for _, usePrj in ipairs(foundUsePrjs) do\n --Links can only recurse through static libraries.\n if((searchField ~= \"links\") or\n (getCfgKind(usePrj.__configs[cfgname]) == \"StaticLib\")) then\n getprojr" - "ec(dstArray, foundList, usePrj.__configs[cfgname],\n cfgname, searchField, bLinkage);\n end\n end\n end\n \n --\n -- This function will recursively get all projects that the given configuration has in its \"uses\"\n -- field. The return values are a list of tables. Each table in that list contains the following:\n --name = The lowercase name of the project.\n --proj = The project. Can be nil if it is usage-only.\n --usageProj = The usage project. Can't be nil, as using a project that has no\n -- usage project is not put into the list.\n --bLinkageOnly = If this is true, then only the linkage information should be copied.\n -- The recursion will only look at the \"uses\" field on *usage* projects.\n -- This function will also add projects to the list that are mentioned in the \"links\"\n -- field of usage projects. These will only copy linker information, but they will recurse.\n -- through other \"links\" fields.\n --\n local function getprojectsconnections(cfg, cfgname)\n local dstArray = " - "{};\n local foundList = {};\n foundList[cfg.project.name:lower()] = true;\n \n --First, follow the uses recursively.\n getprojrec(dstArray, foundList, cfg, cfgname, \"uses\", false);\n \n --Next, go through all of the usage projects and recursively get their links.\n --But only if they're not already there. Get the links as linkage-only.\n local linkArray = {};\n for prjName, prjEntry in pairs(dstArray) do\n getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname, \n \"links\", true);\n end\n \n --Copy from linkArray into dstArray.\n for prjName, prjEntry in pairs(linkArray) do\n dstArray[prjName] = prjEntry;\n end\n \n return dstArray;\n end\n \n \n local function isnameofproj(cfg, strName)\n local sln = cfg.project.solution;\n local strTest = strName:lower();\n for prjIx, prj in ipairs(sln.projects) do\n if (prj.name:lower() == strTest) then\n return true;\n end\n end\n \n return false;\n end\n --\n -- Copies the field from dstCfg to srcCfg.\n --\n" - " local function copydependentfield(srcCfg, dstCfg, strSrcField)\n local srcField = premake.fields[strSrcField];\n local strDstField = strSrcField;\n \n if type(srcCfg[strSrcField]) == \"table\" then\n --handle paths.\n if (srcField.kind == \"dirlist\" or srcField.kind == \"filelist\") and\n (not keeprelative[strSrcField]) then\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField],\n path.rebase(p, srcCfg.project.location, dstCfg.project.location))\n end\n else\n if(strSrcField == \"links\") then\n for i,p in ipairs(srcCfg[strSrcField]) do\n if(not isnameofproj(dstCfg, p)) then\n table.insert(dstCfg[strDstField], p)\n else\n printf(\"Failed to copy '%s' from proj '%s'.\",\n p, srcCfg.project.name);\n end\n end\n else\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField], p)\n end\n end\n end\n else\n if(srcField.kind == \"path\" and (not keeprelative[strSrcField])) then\n dstCfg[strDstField] = path.rebase(srcCfg[strSrcField],\n pr" - "j.location, dstCfg.project.location);\n else\n dstCfg[strDstField] = srcCfg[strSrcField];\n end\n end\n end\n \n --\n -- This function will take the list of project entries and apply their usage project data\n -- to the given configuration. It will copy compiling information for the projects that are\n -- not listed as linkage-only. It will copy the linking information for projects only if\n -- the source project is not a static library. It won't copy linking information\n -- if the project is in this solution; instead it will add that project to the configuration's\n -- links field, expecting that Premake will handle the rest.\n --\n local function copyusagedata(cfg, cfgname, linkToProjs)\n local myPrj = cfg.project;\n local bIsStaticLib = (getCfgKind(cfg) == \"StaticLib\");\n \n for prjName, prjEntry in pairs(linkToProjs) do\n local srcPrj = prjEntry.usageProj;\n local srcCfg = srcPrj.__configs[cfgname];\n \n for name, field in pairs(premake.fields) do\n if(srcCfg[name]) then\n if(fi" - "eld.usagecopy) then\n if(not prjEntry.bLinkageOnly) then\n copydependentfield(srcCfg, cfg, name)\n end\n elseif(field.linkagecopy) then\n --Copy the linkage data if we're building a non-static thing\n --and this is a pure usage project. If it's not pure-usage, then\n --we will simply put the project's name in the links field later.\n if((not bIsStaticLib) and (not prjEntry.proj)) then\n copydependentfield(srcCfg, cfg, name)\n end\n end\n end\n end\n \n if((not bIsStaticLib) and prjEntry.proj) then\n table.insert(cfg.links, prjEntry.proj.name);\n end\n end\n end\nfunction premake.bake.buildconfigs()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nprj.location = prj.location or sln.location or prj.basedir\nadjustpaths(prj.location, prj)\nfor _, blk in ipairs(prj.blocks) do\nadjustpaths(prj.location, blk)\nend\nend\nsln.location = sln.location or sln.basedir\nend\nfor sln in premake.solution.each() do\nlocal basis = collapse(sln)\nfor _, prj in ipairs(sln.projects" - ") do\nprj.__configs = collapse(prj, basis)\nfor _, cfg in pairs(prj.__configs) do\nbake.postprocess(prj, cfg)\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs(sln.projects) do\nif(not prj.usage) then\nfor cfgname, cfg in pairs(prj.__configs) do\nlocal usesPrjs = getprojectsconnections(cfg, cfgname);\ncopyusagedata(cfg, cfgname, usesPrjs)\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nlocal removeList = {};\nfor index, prj in ipairs(sln.projects) do\nif(prj.usage) then\ntable.insert(removeList, 1, index); --Add in reverse order.\nend\nend\nfor _, index in ipairs(removeList) do\ntable.remove(sln.projects, index);\nend\nend\nbuilduniquedirs()\nbuildtargets(cfg)\nend\nfunction premake.bake.postprocess(prj, cfg)\ncfg.project = prj\ncfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true)\ncfg.longname = premake.getconfigname(cfg.name, cfg.platform)\ncfg.location = cfg.location or cfg.basedir\nlocal platform = premake.platforms[cfg.platform]\nif platform.iscr" - "osscompiler then\ncfg.system = cfg.platform\nelse\ncfg.system = os.get()\nend\nif cfg.kind == \"SharedLib\" and platform.nosharedlibs then\ncfg.kind = \"StaticLib\"\nend\nlocal files = { }\nfor _, fname in ipairs(cfg.files) do\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (fname == exclude)\nif (excluded) then break end\nend\nif (not excluded) then\ntable.insert(files, fname)\nend\nend\ncfg.files = files\nfor name, field in pairs(premake.fields) do\nif field.isflags then\nlocal values = cfg[name]\nfor _, flag in ipairs(values) do values[flag] = true end\nend\nend\ncfg.__fileconfigs = { }\nfor _, fname in ipairs(cfg.files) do\ncfg.terms.required = fname:lower()\nlocal fcfg = {}\nfor _, blk in ipairs(cfg.project.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, cfg.terms)) then\nmergeobject(fcfg, blk)\nend\nend\nfcfg.name = fname\ncfg.__fileconfigs[fname] = fcfg\ntable.insert(cfg.__fileconfigs, fcfg)\nend\nend\n", + "premake.bake = { }\nlocal bake = premake.bake\nlocal nocopy =\n{\nblocks = true,\nkeywords = true,\nprojects = true,\n__configs = true,\n}\nlocal nocascade =\n{\nmakesettings = true,\n}\nlocal keeprelative =\n{\nbasedir = true,\nlocation = true,\n}\nfunction premake.getactiveterms()\nlocal terms = { _action = _ACTION:lower(), os = os.get() }\nfor key, value in pairs(_OPTIONS) do\nif value ~= \"\" then\ntable.insert(terms, value:lower())\nelse\ntable.insert(terms, key:lower())\nend\nend\nreturn terms\nend\nfunction premake.iskeywordmatch(keyword, terms)\nif keyword:startswith(\"not \") then\nreturn not premake.iskeywordmatch(keyword:sub(5), terms)\nend\nfor _, pattern in ipairs(keyword:explode(\" or \")) do\nfor termkey, term in pairs(terms) do\nif term:match(pattern) == term then\nreturn termkey\nend\nend\nend\nend\nfunction premake.iskeywordsmatch(keywords, terms)\nlocal hasrequired = false\nfor _, keyword in ipairs(keywords) do\nlocal matched = premake.iskeywordmatch(keyword, terms)\nif not matched the" + "n\nreturn false\nend\nif matched == \"required\" then\nhasrequired = true\nend\nend\nif terms.required and not hasrequired then\nreturn false\nelse\nreturn true\nend\nend\nlocal function adjustpaths(location, obj)\nfunction adjustpathlist(list)\nfor i, p in ipairs(list) do\nlist[i] = path.getrelative(location, p)\nend\nend\nfor name, value in pairs(obj) do\nlocal field = premake.fields[name]\nif field and value and not keeprelative[name] then\nif field.kind == \"path\" then\nobj[name] = path.getrelative(location, value)\nelseif field.kind == \"dirlist\" or field.kind == \"filelist\" then\nadjustpathlist(value)\nelseif field.kind == \"keypath\" then\nfor k,v in pairs(value) do\nadjustpathlist(v)\nend\nend\nend\nend\nend\nlocal function mergefield(kind, dest, src)\nlocal tbl = dest or { }\nif kind == \"keyvalue\" or kind == \"keypath\" then\nfor key, value in pairs(src) do\ntbl[key] = mergefield(\"list\", tbl[key], value)\nend\nelse\nfor _, item in ipairs(src) do\nif not tbl[item] then\ntable.insert(tbl, item)\n" + "tbl[item] = item\nend\nend\nend\nreturn tbl\nend\nlocal function removevalues(tbl, removes)\nfor i=#tbl,1,-1 do\nfor _, pattern in ipairs(removes) do\nif pattern == tbl[i] then\ntable.remove(tbl, i)\nbreak\nend\nend\nend\nend\nlocal function mergeobject(dest, src)\nif not src then\nreturn\nend\nfor fieldname, value in pairs(src) do\nif not nocopy[fieldname] then\nlocal field = premake.fields[fieldname]\nif field then\nif type(value) == \"table\" then\ndest[fieldname] = mergefield(field.kind, dest[fieldname], value)\nif src.removes then\nremoves = src.removes[fieldname]\nif removes then\nremovevalues(dest[fieldname], removes)\nend\nend\nelse\ndest[fieldname] = value\nend\nelse\ndest[fieldname] = value\nend\nend\nend\nend\nlocal function merge(dest, obj, basis, terms, cfgname, pltname)\nlocal key = cfgname or \"\"\npltname = pltname or \"Native\"\nif pltname ~= \"Native\" then\nkey = key .. pltname\nend\nterms.config = (cfgname or \"\"):lower()\nterms.platform = pltname:lower()\nlocal cfg = {}\nmergeobject(cfg, " + "basis[key])\nadjustpaths(obj.location, cfg)\nmergeobject(cfg, obj)\nif (cfg.kind) then\nterms['kind']=cfg.kind:lower()\nend\nfor _, blk in ipairs(obj.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, terms))then\nmergeobject(cfg, blk)\nif (cfg.kind and not cfg.terms.kind) then\ncfg.terms['kind'] = cfg.kind:lower()\nterms['kind'] = cfg.kind:lower()\nend\nend\nend\ncfg.name = cfgname\ncfg.platform = pltname\nfor k,v in pairs(terms) do\ncfg.terms[k] =v\nend\ndest[key] = cfg\nend\nlocal function collapse(obj, basis)\nlocal result = {}\nbasis = basis or {}\nlocal sln = obj.solution or obj\nlocal terms = premake.getactiveterms()\nmerge(result, obj, basis, terms)--this adjusts terms\nfor _, cfgname in ipairs(sln.configurations) do\nlocal terms_local = {}\nfor k,v in pairs(terms)do terms_local[k]=v end\nmerge(result, obj, basis, terms_local, cfgname, \"Native\")--terms cam also be adjusted here\nfor _, pltname in ipairs(sln.platforms or {}) do\nif pltname ~= \"Native\" then\nmerge(result, obj, basis,terms_lo" + "cal, cfgname, pltname)--terms also here\nend\nend\nend\nreturn result\nend\nlocal function builduniquedirs()\nlocal num_variations = 4\nlocal cfg_dirs = {}\nlocal hit_counts = {}\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dirs = { }\ndirs[1] = path.getabsolute(path.join(cfg.location, cfg.objdir or cfg.project.objdir or \"obj\"))\ndirs[2] = path.join(dirs[1], iif(cfg.platform == \"Native\", \"\", cfg.platform))\ndirs[3] = path.join(dirs[2], cfg.name)\ndirs[4] = path.join(dirs[3], cfg.project.name)\ncfg_dirs[cfg] = dirs\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, num_variations do\nlocal d = dirs[v]\nhit_counts[d] = (hit_counts[d] or 0) + 1\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dir\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, iif(cfg.flags.SingleOutputDir,num_variations-1,num_variations) do\ndir = cfg_dirs[cfg][v]\n" + "if hit_counts[dir] == 1 then break end\nend\ncfg.objectsdir = path.getrelative(cfg.location, dir)\nend\nend\nend\nend\nlocal function buildtargets()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\ncfg.buildtarget = premake.gettarget(cfg, \"build\", pathstyle, namestyle, cfg.system)\ncfg.linktarget = premake.gettarget(cfg, \"link\", pathstyle, namestyle, cfg.system)\nif pathstyle == \"windows\" then\ncfg.objectsdir = path.translate(cfg.objectsdir, \"\\\\\")\nend\nend\nend\nend\nend\n local function getCfgKind(cfg)\n if(cfg.kind) then\n return cfg.kind;\n end\n if(cfg.project.__configs[\"\"] and cfg.project.__configs[\"\"].kind) then\n return cfg.project.__configs[\"\"].kind;\n end\n return nil\n end\n local function getprojrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage)\n if(not cfg) then return end\n local foundUsePrjs = {};" + "\n for _, useName in ipairs(cfg[searchField]) do\n local testName = useName:lower();\n if((not foundList[testName])) then\n local theProj = nil;\n local theUseProj = nil;\n for _, prj in ipairs(cfg.project.solution.projects) do\n if (prj.name:lower() == testName) then\n if(prj.usage) then\n theUseProj = prj;\n else\n theProj = prj;\n end\n end\n end\n --Must connect to a usage project.\n if(theUseProj) then\n foundList[testName] = true;\n local prjEntry = {\n name = testName,\n proj = theProj,\n usageProj = theUseProj,\n bLinkageOnly = bLinkage,\n };\n dstArray[testName] = prjEntry;\n table.insert(foundUsePrjs, theUseProj);\n end\n end\n end\n for _, usePrj in ipairs(foundUsePrjs) do\n --Links can only recurse through static libraries.\n if((searchField ~= \"links\") or\n (getCfgKind(usePrj.__configs[cfgname]) == \"StaticLib\")) then\n getprojrec(dstArray, foundList, usePrj.__configs[cfgname],\n cfgname, searchField, bLinkage);\n end\n end\n end\n --\n -- This function wi" + "ll recursively get all projects that the given configuration has in its \"uses\"\n -- field. The return values are a list of tables. Each table in that list contains the following:\n --name = The lowercase name of the project.\n --proj = The project. Can be nil if it is usage-only.\n --usageProj = The usage project. Can't be nil, as using a project that has no\n -- usage project is not put into the list.\n --bLinkageOnly = If this is true, then only the linkage information should be copied.\n -- The recursion will only look at the \"uses\" field on *usage* projects.\n -- This function will also add projects to the list that are mentioned in the \"links\"\n -- field of usage projects. These will only copy linker information, but they will recurse.\n -- through other \"links\" fields.\n --\n local function getprojectsconnections(cfg, cfgname)\n local dstArray = {};\n local foundList = {};\n foundList[cfg.project.name:lower()] = true;\n --First, follow the uses recursively.\n getprojrec(dstArray," + " foundList, cfg, cfgname, \"uses\", false);\n --Next, go through all of the usage projects and recursively get their links.\n --But only if they're not already there. Get the links as linkage-only.\n local linkArray = {};\n for prjName, prjEntry in pairs(dstArray) do\n getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname,\n \"links\", true);\n end\n --Copy from linkArray into dstArray.\n for prjName, prjEntry in pairs(linkArray) do\n dstArray[prjName] = prjEntry;\n end\n return dstArray;\n end\n local function isnameofproj(cfg, strName)\n local sln = cfg.project.solution;\n local strTest = strName:lower();\n for prjIx, prj in ipairs(sln.projects) do\n if (prj.name:lower() == strTest) then\n return true;\n end\n end\n return false;\n end\n --\n -- Copies the field from dstCfg to srcCfg.\n --\n local function copydependentfield(srcCfg, dstCfg, strSrcField)\n local srcField = premake.fields[strSrcField];\n local strDstField = strSrcField;\n if type(srcCfg[s" + "trSrcField]) == \"table\" then\n --handle paths.\n if (srcField.kind == \"dirlist\" or srcField.kind == \"filelist\") and\n (not keeprelative[strSrcField]) then\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField],\n path.rebase(p, srcCfg.project.location, dstCfg.project.location))\n end\n else\n if(strSrcField == \"links\") then\n for i,p in ipairs(srcCfg[strSrcField]) do\n if(not isnameofproj(dstCfg, p)) then\n table.insert(dstCfg[strDstField], p)\n else\n printf(\"Failed to copy '%s' from proj '%s'.\",\n p, srcCfg.project.name);\n end\n end\n else\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField], p)\n end\n end\n end\n else\n if(srcField.kind == \"path\" and (not keeprelative[strSrcField])) then\n dstCfg[strDstField] = path.rebase(srcCfg[strSrcField],\n prj.location, dstCfg.project.location);\n else\n dstCfg[strDstField] = srcCfg[strSrcField];\n end\n end\n end\n --\n -- This function will take the list of project entr" + "ies and apply their usage project data\n -- to the given configuration. It will copy compiling information for the projects that are\n -- not listed as linkage-only. It will copy the linking information for projects only if\n -- the source project is not a static library. It won't copy linking information\n -- if the project is in this solution; instead it will add that project to the configuration's\n -- links field, expecting that Premake will handle the rest.\n --\n local function copyusagedata(cfg, cfgname, linkToProjs)\n local myPrj = cfg.project;\n local bIsStaticLib = (getCfgKind(cfg) == \"StaticLib\");\n for prjName, prjEntry in pairs(linkToProjs) do\n local srcPrj = prjEntry.usageProj;\n local srcCfg = srcPrj.__configs[cfgname];\n for name, field in pairs(premake.fields) do\n if(srcCfg[name]) then\n if(field.usagecopy) then\n if(not prjEntry.bLinkageOnly) then\n copydependentfield(srcCfg, cfg, name)\n end\n elseif(field.linkagecopy) then\n --Copy the linkage data if we're building " + "a non-static thing\n --and this is a pure usage project. If it's not pure-usage, then\n --we will simply put the project's name in the links field later.\n if((not bIsStaticLib) and (not prjEntry.proj)) then\n copydependentfield(srcCfg, cfg, name)\n end\n end\n end\n end\n if((not bIsStaticLib) and prjEntry.proj) then\n table.insert(cfg.links, prjEntry.proj.name);\n end\n end\n end\nfunction premake.bake.buildconfigs()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nprj.location = prj.location or sln.location or prj.basedir\nadjustpaths(prj.location, prj)\nfor _, blk in ipairs(prj.blocks) do\nadjustpaths(prj.location, blk)\nend\nend\nsln.location = sln.location or sln.basedir\nend\nfor sln in premake.solution.each() do\nlocal basis = collapse(sln)\nfor _, prj in ipairs(sln.projects) do\nprj.__configs = collapse(prj, basis)\nfor _, cfg in pairs(prj.__configs) do\nbake.postprocess(prj, cfg)\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs" + "(sln.projects) do\nif(not prj.usage) then\nfor cfgname, cfg in pairs(prj.__configs) do\nlocal usesPrjs = getprojectsconnections(cfg, cfgname);\ncopyusagedata(cfg, cfgname, usesPrjs)\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nlocal removeList = {};\nfor index, prj in ipairs(sln.projects) do\nif(prj.usage) then\ntable.insert(removeList, 1, index); --Add in reverse order.\nend\nend\nfor _, index in ipairs(removeList) do\ntable.remove(sln.projects, index);\nend\nend\nbuilduniquedirs()\nbuildtargets(cfg)\nend\nfunction premake.bake.postprocess(prj, cfg)\ncfg.project = prj\ncfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true)\ncfg.longname = premake.getconfigname(cfg.name, cfg.platform)\ncfg.location = cfg.location or cfg.basedir\nlocal platform = premake.platforms[cfg.platform]\nif platform.iscrosscompiler then\ncfg.system = cfg.platform\nelse\ncfg.system = os.get()\nend\nif cfg.kind == \"SharedLib\" and platform.nosharedlibs then\ncfg.kind = \"StaticLib\"\nend\nlocal files = { }" + "\nfor _, fname in ipairs(cfg.files) do\nlocal removed = false\nfor _, removefname in ipairs(cfg.removefiles) do\nremoved = (fname == removefname)\nif (removed) then break end\nend\nif (not removed) then\ntable.insert(files, fname)\nend\nend\ncfg.files = files\nfor name, field in pairs(premake.fields) do\nif field.isflags then\nlocal values = cfg[name]\nfor _, flag in ipairs(values) do values[flag] = true end\nend\nend\ncfg.__fileconfigs = { }\nfor _, fname in ipairs(cfg.files) do\ncfg.terms.required = fname:lower()\nlocal fcfg = {}\nfor _, blk in ipairs(cfg.project.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, cfg.terms)) then\nmergeobject(fcfg, blk)\nend\nend\nfcfg.name = fname\ncfg.__fileconfigs[fname] = fcfg\ntable.insert(cfg.__fileconfigs, fcfg)\nend\nend\n", /* base/api.lua */ "premake.fields =\n{\narchivesplit_size =\n{\nkind = \"string\",\nscope = \"config\",\n},\nbasedir =\n{\nkind = \"path\",\nscope = \"container\",\n},\nbuildaction =\n{\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"Compile\",\n\"Copy\",\n\"Embed\",\n\"None\"\n}\n},\nbuildoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nbuildoptions_c =\n{\nkind = \"list\",\nscope = \"config\",\n},\nbuildoptions_cpp =\n{\nkind = \"list\",\nscope = \"config\",\n},\nbuildoptions_objc =\n{\nkind = \"list\",\nscope = \"config\",\n},\nconfigurations =\n{\nkind = \"list\",\nscope = \"solution\",\n},\ndebugargs =\n{\nkind = \"list\",\nscope = \"config\",\n},\ndebugdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\ndebugenvs =\n{\nkind = \"list\",\nscope = \"config\",\n},\ndefines =\n{\nkind = \"list\",\nscope = \"config\",\n},\ndeploymentoptions =\n{\nkind = \"list\",\nscope = \"config\",\nusagecopy = true,\n},\nexcludes =\n{\nkind = \"filelist\",\nscope = \"config\",\n},\nfiles =\n{\nkind = \"filelist" - "\",\nscope = \"config\",\n},\nflags =\n{\nkind = \"list\",\nscope = \"config\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_flags = {\nATL = 1,\nDebugEnvsDontMerge = 1,\nDebugEnvsInherit = 1,\nEnableMinimalRebuild = 1,\nEnableSSE = 1,\nEnableSSE2 = 1,\nExtraWarnings = 1,\nFatalWarnings = 1,\nFloatFast = 1,\nFloatStrict = 1,\nManaged = 1,\nMFC = 1,\nNativeWChar = 1,\nNo64BitChecks = 1,\nNoEditAndContinue = 1,\nNoExceptions = 1,\nNoFramePointer = 1,\nNoImportLib = 1,\nNoIncrementalLink = 1,\nNoManifest = 1,\nNoMultiProcessorCompilation = 1,\nNoNativeWChar = 1,\nNoPCH = 1,\nNoRTTI = 1,\nSingleOutputDir = 1,\nOptimize = 1,\nOptimizeSize = 1,\nOptimizeSpeed = 1,\nSEH = 1,\nStaticATL = 1,\nStaticRuntime = 1,\nSymbols = 1,\nUnicode = 1,\nUnsafe = 1,\nUnsignedChar = 1,\nWinMain = 1,\n}\nlocal englishToAmericanSpelling =\n{\noptimise = 'optimize',\noptimisesize = 'optimizesize',\noptimisespeed = 'optimizespeed',\n}\nlocal lowervalue = value:lower()\nlowervalue = englishToAmericanSpell" - "ing[lowervalue] or lowervalue\nfor v, _ in pairs(allowed_flags) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid flag\"\nend,\n},\nframework =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"1.0\",\n\"1.1\",\n\"2.0\",\n\"3.0\",\n\"3.5\",\n\"4.0\",\n\"4.5\",\n}\n},\nforcedincludes = \n{\nkind = \"absolutefilelist\",\nscope = \"config\",\n},\nimagepath =\n{\nkind = \"path\",\nscope = \"config\",\n},\nimageoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nimplibdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\nimplibextension =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibname =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\nincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n},\nkind =\n{\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"ConsoleApp\",\n\"WindowedApp\",\n\"Static" - "Lib\",\n\"SharedLib\"\n}\n},\nlanguage =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"C\",\n\"C++\",\n\"C#\"\n}\n},\nlibdirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\nlinkagecopy = true,\n},\nlinkoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nlinks =\n{\nkind = \"list\",\nscope = \"config\",\nallowed = function(value)\nif value:find('/', nil, true) then\nvalue = path.getabsolute(value)\nend\nreturn value\nend,\nlinkagecopy = true,\n},\nlocation =\n{\nkind = \"path\",\nscope = \"container\",\n},\nmakesettings =\n{\nkind = \"list\",\nscope = \"config\",\n},\nmessageskip =\n{\nkind = \"list\",\nscope = \"solution\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_messages = {\nSkipCreatingMessage = 1,\nSkipBuildingMessage = 1,\nSkipCleaningMessage = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_messages) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid message to skip\"\nend,\n},\nmsgarchiving " - "=\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile_objc =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgresource =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsglinking =\n{\nkind = \"string\",\nscope = \"config\",\n},\nobjdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\noptions =\n{\nkind = \"list\",\nscope = \"container\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_options = {\nForceCPP = 1,\nArchiveSplit = 1\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_options) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid option\"\nend,\n},\npchheader =\n{\nkind = \"string\",\nscope = \"config\",\n},\npchsource =\n{\nkind = \"path\",\nscope = \"config\",\n},\nplatforms =\n{\nkind = \"list\",\nscope = \"solution\",\nallowed = table.keys(premake.platforms),\n},\npostbuildcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprebuildcomma" - "nds =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprelinkcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresdefines =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nresoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nstartproject =\n{\nkind = \"string\",\nscope = \"solution\",\n},\ntargetdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\ntargetsubdir =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetextension =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetname =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntrimpaths =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nuuid =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = function(value)\nlocal ok = true\nif (#value ~= 36) then ok = false end\nfor i=1,36 do\nlocal ch = value:sub(i,i)\nif (not ch:find(\"[" - "ABCDEFabcdef0123456789-]\")) then ok = false end\nend\nif (value:sub(9,9) ~= \"-\") then ok = false end\nif (value:sub(14,14) ~= \"-\") then ok = false end\nif (value:sub(19,19) ~= \"-\") then ok = false end\nif (value:sub(24,24) ~= \"-\") then ok = false end\nif (not ok) then\nreturn nil, \"invalid UUID\"\nend\nreturn value:upper()\nend\n},\nuses =\n{\nkind = \"list\",\nscope = \"config\",\n},\nvpaths =\n{\nkind = \"keypath\",\nscope = \"container\",\n},\n}\npremake.check_paths = false\nfunction premake.checkvalue(value, allowed)\nif (allowed) then\nif (type(allowed) == \"function\") then\nreturn allowed(value)\nelse\nfor _,v in ipairs(allowed) do\nif (value:lower() == v:lower()) then\nreturn v\nend\nend\nreturn nil, \"invalid value '\" .. value .. \"'\"\nend\nelse\nreturn value\nend\nend\nfunction premake.getobject(t)\nlocal container\nif (t == \"container\" or t == \"solution\") then\ncontainer = premake.CurrentContainer\nelse\ncontainer = premake.CurrentConfiguration\nend\nif t == \"solution\" then\nif " - "type(container) == \"project\" then\ncontainer = container.solution\nend\nif type(container) ~= \"solution\" then\ncontainer = nil\nend\nend\nlocal msg\nif (not container) then\nif (t == \"container\") then\nmsg = \"no active solution or project\"\nelseif (t == \"solution\") then\nmsg = \"no active solution\"\nelse\nmsg = \"no active solution, project, or configuration\"\nend\nend\nreturn container, msg\nend\nfunction premake.setarray(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\nlocal function add(value, depth)\nif type(value) == \"table\" then\nfor _,v in ipairs(value) do\nadd(v, depth + 1)\nend\nelse\nvalue, err = premake.checkvalue(value, allowed)\nif not value then\nerror(err, depth)\nend\ntable.insert(obj[fieldname], value)\nend\nend\nif value then\nadd(value, 5)\nend\nreturn obj[fieldname]\nend\nlocal function domatchedarray(ctype, fieldname, value, matchfunc)\nlocal result = { }\nfunction makeabsolute(value, depth)\nif (type(value) == \"table\") then\nfor _, item in ipairs(val" - "ue) do\nmakeabsolute(item, depth + 1)\nend\nelseif type(value) == \"string\" then\nif value:find(\"*\") then\nlocal arr = matchfunc(value);\nif (premake.check_paths) and (#arr == 0) then\nerror(\"Can't find matching files for pattern :\" .. value)\nend\nmakeabsolute(arr, depth + 1)\nelse\ntable.insert(result, path.getabsolute(value))\nend\nelse\nerror(\"Invalid value in list: expected string, got \" .. type(value), depth)\nend\nend\nmakeabsolute(value, 3)\nreturn premake.setarray(ctype, fieldname, result)\nend\nfunction premake.setdirarray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchdirs)\nend\nfunction premake.setfilearray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchfiles)\nend\nfunction premake.setkeyvalue(ctype, fieldname, values)\nlocal container, err = premake.getobject(ctype)\nif not container then\nerror(err, 4)\nend\nif not container[fieldname] then\ncontainer[fieldname] = {}\nend\nif type(values) ~= \"table\" then\nerror(\"inval" - "id value; table expected\", 4)\nend\nlocal field = container[fieldname]\nfor key,value in pairs(values) do\nif not field[key] then\nfield[key] = {}\nend\ntable.insertflat(field[key], value)\nend\nreturn field\nend\nfunction premake.setstring(ctype, fieldname, value, allowed)\nlocal container, err = premake.getobject(ctype)\nif (not container) then\nerror(err, 4)\nend\nif (value) then\nvalue, err = premake.checkvalue(value, allowed)\nif (not value) then\nerror(err, 4)\nend\ncontainer[fieldname] = value\nend\nreturn container[fieldname]\nend\nfunction premake.remove(fieldname, value)\nlocal cfg = premake.CurrentConfiguration\ncfg.removes = cfg.removes or {}\ncfg.removes[fieldname] = premake.setarray(cfg.removes, fieldname, value)\nend\nlocal function accessor(name, value)\nlocal kind = premake.fields[name].kind\nlocal scope = premake.fields[name].scope\nlocal allowed = premake.fields[name].allowed\nif (kind == \"string\" or kind == \"path\") and value then\nif type(value) ~= \"string\" then\nerror(\"string " - "value expected\", 3)\nend\nend\nlocal container, err = premake.getobject(scope)\nif (not container) then\nerror(err, 3)\nend\nif kind == \"string\" then\nreturn premake.setstring(scope, name, value, allowed)\nelseif kind == \"path\" then\nif value then value = path.getabsolute(value) end\nreturn premake.setstring(scope, name, value)\nelseif kind == \"list\" then\nreturn premake.setarray(container, name, value, allowed)\nelseif kind == \"dirlist\" then\nreturn premake.setdirarray(container, name, value)\nelseif kind == \"filelist\" or kind == \"absolutefilelist\" then\nreturn premake.setfilearray(container, name, value)\nelseif kind == \"keyvalue\" or kind == \"keypath\" then\nreturn premake.setkeyvalue(scope, name, value)\nend\nend\nfor name, info in pairs(premake.fields) do\n_G[name] = function(value)\nreturn accessor(name, value)\nend\nif info.kind == \"list\" or \n info.kind == \"dirlist\" or \n info.kind == \"filelist\" or\n info.kind == \"absolutefilelist\" \nthen\n_G[\"remove\"..name] = function(va" - "lue)\npremake.remove(name, value)\nend\nend\nend\nfunction configuration(terms)\nif not terms then\nreturn premake.CurrentConfiguration\nend\nlocal container, err = premake.getobject(\"container\")\nif (not container) then\nerror(err, 2)\nend\nlocal cfg = { }\ncfg.terms = table.flatten({terms})\ntable.insert(container.blocks, cfg)\npremake.CurrentConfiguration = cfg\ncfg.keywords = { }\nfor _, word in ipairs(cfg.terms) do\ntable.insert(cfg.keywords, path.wildcards(word):lower())\nend\nfor name, field in pairs(premake.fields) do\nif (field.kind ~= \"string\" and field.kind ~= \"path\") then\ncfg[name] = { }\nend\nend\nreturn cfg\nend\nlocal function creategroup(name, sln, parent, inpath)\nlocal group = {}\nsetmetatable(group, {\n__type = \"group\"\n})\ntable.insert(sln.groups, group)\nsln.groups[inpath] = group\ngroup.solution = sln\ngroup.name = name\ngroup.uuid = os.uuid(group.name)\ngroup.parent = parent\nreturn group\nend\nlocal function creategroupsfrompath(inpath, sln)\nif inpath == nil then return nil en" - "d\ninpath = path.translate(inpath, \"/\")\nlocal groups = string.explode(inpath, \"/\")\nlocal curpath = \"\"\nlocal lastgroup = nil\nfor i, v in ipairs(groups) do\ncurpath = curpath .. \"/\" .. v:lower()\nlocal group = sln.groups[curpath]\nif group == nil then\ngroup = creategroup(v, sln, lastgroup, curpath)\nend\nlastgroup = group\nend\nreturn lastgroup\nend\nlocal function createproject(name, sln, isUsage)\nlocal prj = {}\nsetmetatable(prj, {\n__type = \"project\",\n})\ntable.insert(sln.projects, prj)\nif(isUsage) then\nif(sln.projects[name]) then\nsln.projects[name].usageProj = prj;\nelse\nsln.projects[name] = prj\nend\nelse\nif(sln.projects[name]) then\nprj.usageProj = sln.projects[name];\nend\nsln.projects[name] = prj\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nprj.solution = sln\nprj.name = name\nprj.basedir = os.getcwd()\nprj.uuid = os.uuid(prj.name)\nprj.blocks = { }\nprj.usage = isUsage\nprj.group = group\nreturn prj;\nend\n" - "function usage(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(not premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\n -- if this is a new project, or the project in that slot doesn't have a usage, create it\n if((not sln.projects[name]) or\n ((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then\n premake.CurrentContainer = createproject(name, sln, true)\n else\n premake.CurrentContainer = iff(sln.projects[name].usage,\n sln.projects[name], sln.projects[name].usageProj)\n end\n -- add an empty, global configuration to the project\n configuration { }\n return premake.CurrentContainer\n end\n function project(name)\n if (not name) then\n --Only return non-usa" - "ge projects\n if(type(premake.CurrentContainer) ~= \"project\") then return nil end\n if(premake.CurrentContainer.usage) then return nil end\n return premake.CurrentContainer\nend\n -- identify the parent solution\n local sln\n if (type(premake.CurrentContainer) == \"project\") then\n sln = premake.CurrentContainer.solution\n else\n sln = premake.CurrentContainer\n end\n if (type(sln) ~= \"solution\") then\n error(\"no active solution\", 2)\n end\n -- if this is a new project, or the old project is a usage project, create it\n if((not sln.projects[name]) or sln.projects[name].usage) then\n premake.CurrentContainer = createproject(name, sln)\n else\n premake.CurrentContainer = sln.projects[name];\n end\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction solution(name)\nif not name then\nif type(premake.CurrentContainer) == \"project\" then\nreturn premake.CurrentContainer.solution\nelse\nreturn premake.CurrentContainer\nend\nend\npremake.CurrentContainer = premake.solution.get(" - "name)\nif (not premake.CurrentContainer) then\npremake.CurrentContainer = premake.solution.new(name)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction group(name)\nif not name then \nreturn premake.CurrentGroup\nend\npremake.CurrentGroup = name\nreturn premake.CurrentGroup\nend\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\n", + "\",\nscope = \"config\",\n},\nremovefiles =\n{\nkind = \"filelist\",\nscope = \"config\",\n},\nflags =\n{\nkind = \"list\",\nscope = \"config\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_flags = {\nATL = 1,\nDebugEnvsDontMerge = 1,\nDebugEnvsInherit = 1,\nEnableMinimalRebuild = 1,\nEnableSSE = 1,\nEnableSSE2 = 1,\nExtraWarnings = 1,\nFatalWarnings = 1,\nFloatFast = 1,\nFloatStrict = 1,\nManaged = 1,\nMFC = 1,\nNativeWChar = 1,\nNo64BitChecks = 1,\nNoEditAndContinue = 1,\nNoExceptions = 1,\nNoFramePointer = 1,\nNoImportLib = 1,\nNoIncrementalLink = 1,\nNoManifest = 1,\nNoMultiProcessorCompilation = 1,\nNoNativeWChar = 1,\nNoPCH = 1,\nNoRTTI = 1,\nSingleOutputDir = 1,\nOptimize = 1,\nOptimizeSize = 1,\nOptimizeSpeed = 1,\nSEH = 1,\nStaticATL = 1,\nStaticRuntime = 1,\nSymbols = 1,\nUnicode = 1,\nUnsafe = 1,\nUnsignedChar = 1,\nWinMain = 1,\n}\nlocal englishToAmericanSpelling =\n{\noptimise = 'optimize',\noptimisesize = 'optimizesize',\noptimisespeed = 'optimizespeed',\n}\nloc" + "al lowervalue = value:lower()\nlowervalue = englishToAmericanSpelling[lowervalue] or lowervalue\nfor v, _ in pairs(allowed_flags) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid flag\"\nend,\n},\nframework =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"1.0\",\n\"1.1\",\n\"2.0\",\n\"3.0\",\n\"3.5\",\n\"4.0\",\n\"4.5\",\n}\n},\nforcedincludes =\n{\nkind = \"absolutefilelist\",\nscope = \"config\",\n},\nimagepath =\n{\nkind = \"path\",\nscope = \"config\",\n},\nimageoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nimplibdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\nimplibextension =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibname =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\nimplibsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\nincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\nusagecopy = true,\n},\nkind =\n{\nkind = \"string\",\nscope = \"co" + "nfig\",\nallowed = {\n\"ConsoleApp\",\n\"WindowedApp\",\n\"StaticLib\",\n\"SharedLib\"\n}\n},\nlanguage =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = {\n\"C\",\n\"C++\",\n\"C#\"\n}\n},\nlibdirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\nlinkagecopy = true,\n},\nlinkoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nlinks =\n{\nkind = \"list\",\nscope = \"config\",\nallowed = function(value)\nif value:find('/', nil, true) then\nvalue = path.getabsolute(value)\nend\nreturn value\nend,\nlinkagecopy = true,\n},\nlocation =\n{\nkind = \"path\",\nscope = \"container\",\n},\nmakesettings =\n{\nkind = \"list\",\nscope = \"config\",\n},\nmessageskip =\n{\nkind = \"list\",\nscope = \"solution\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_messages = {\nSkipCreatingMessage = 1,\nSkipBuildingMessage = 1,\nSkipCleaningMessage = 1,\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_messages) do\nif v:lower() == lowervalue then\nreturn v\nend\nend" + "\nreturn nil, \"invalid message to skip\"\nend,\n},\nmsgarchiving =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgcompile_objc =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsgresource =\n{\nkind = \"string\",\nscope = \"config\",\n},\nmsglinking =\n{\nkind = \"string\",\nscope = \"config\",\n},\nobjdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\noptions =\n{\nkind = \"list\",\nscope = \"container\",\nisflags = true,\nusagecopy = true,\nallowed = function(value)\nlocal allowed_options = {\nForceCPP = 1,\nArchiveSplit = 1\n}\nlocal lowervalue = value:lower()\nfor v, _ in pairs(allowed_options) do\nif v:lower() == lowervalue then\nreturn v\nend\nend\nreturn nil, \"invalid option\"\nend,\n},\npchheader =\n{\nkind = \"string\",\nscope = \"config\",\n},\npchsource =\n{\nkind = \"path\",\nscope = \"config\",\n},\nplatforms =\n{\nkind = \"list\",\nscope = \"solution\",\nallowed = table.keys(premake.platforms),\n},\npostbuildcomman" + "ds =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprebuildcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nprelinkcommands =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresdefines =\n{\nkind = \"list\",\nscope = \"config\",\n},\nresincludedirs =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nresoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nstartproject =\n{\nkind = \"string\",\nscope = \"solution\",\n},\ntargetdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\ntargetsubdir =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetextension =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetname =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetprefix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntargetsuffix =\n{\nkind = \"string\",\nscope = \"config\",\n},\ntrimpaths =\n{\nkind = \"dirlist\",\nscope = \"config\",\n},\nuuid =\n{\nkind = \"string\",\nscope = \"container\",\nallowed = function(value)\nlocal ok = true\nif (#value ~= 36) then ok = false " + "end\nfor i=1,36 do\nlocal ch = value:sub(i,i)\nif (not ch:find(\"[ABCDEFabcdef0123456789-]\")) then ok = false end\nend\nif (value:sub(9,9) ~= \"-\") then ok = false end\nif (value:sub(14,14) ~= \"-\") then ok = false end\nif (value:sub(19,19) ~= \"-\") then ok = false end\nif (value:sub(24,24) ~= \"-\") then ok = false end\nif (not ok) then\nreturn nil, \"invalid UUID\"\nend\nreturn value:upper()\nend\n},\nuses =\n{\nkind = \"list\",\nscope = \"config\",\n},\nvpaths =\n{\nkind = \"keypath\",\nscope = \"container\",\n},\n}\npremake.check_paths = false\nfunction premake.checkvalue(value, allowed)\nif (allowed) then\nif (type(allowed) == \"function\") then\nreturn allowed(value)\nelse\nfor _,v in ipairs(allowed) do\nif (value:lower() == v:lower()) then\nreturn v\nend\nend\nreturn nil, \"invalid value '\" .. value .. \"'\"\nend\nelse\nreturn value\nend\nend\nfunction premake.getobject(t)\nlocal container\nif (t == \"container\" or t == \"solution\") then\ncontainer = premake.CurrentContainer\nelse\ncontainer =" + " premake.CurrentConfiguration\nend\nif t == \"solution\" then\nif type(container) == \"project\" then\ncontainer = container.solution\nend\nif type(container) ~= \"solution\" then\ncontainer = nil\nend\nend\nlocal msg\nif (not container) then\nif (t == \"container\") then\nmsg = \"no active solution or project\"\nelseif (t == \"solution\") then\nmsg = \"no active solution\"\nelse\nmsg = \"no active solution, project, or configuration\"\nend\nend\nreturn container, msg\nend\nfunction premake.setarray(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\nlocal function add(value, depth)\nif type(value) == \"table\" then\nfor _,v in ipairs(value) do\nadd(v, depth + 1)\nend\nelse\nvalue, err = premake.checkvalue(value, allowed)\nif not value then\nerror(err, depth)\nend\ntable.insert(obj[fieldname], value)\nend\nend\nif value then\nadd(value, 5)\nend\nreturn obj[fieldname]\nend\nlocal function domatchedarray(ctype, fieldname, value, matchfunc)\nlocal result = { }\nfunction makeabsolute(value, dep" + "th)\nif (type(value) == \"table\") then\nfor _, item in ipairs(value) do\nmakeabsolute(item, depth + 1)\nend\nelseif type(value) == \"string\" then\nif value:find(\"*\") then\nlocal arr = matchfunc(value);\nif (premake.check_paths) and (#arr == 0) then\nerror(\"Can't find matching files for pattern :\" .. value)\nend\nmakeabsolute(arr, depth + 1)\nelse\ntable.insert(result, path.getabsolute(value))\nend\nelse\nerror(\"Invalid value in list: expected string, got \" .. type(value), depth)\nend\nend\nmakeabsolute(value, 3)\nreturn premake.setarray(ctype, fieldname, result)\nend\nfunction premake.setdirarray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchdirs)\nend\nfunction premake.setfilearray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchfiles)\nend\nfunction premake.setkeyvalue(ctype, fieldname, values)\nlocal container, err = premake.getobject(ctype)\nif not container then\nerror(err, 4)\nend\nif not container[fieldname] then\ncontainer[fiel" + "dname] = {}\nend\nif type(values) ~= \"table\" then\nerror(\"invalid value; table expected\", 4)\nend\nlocal field = container[fieldname]\nfor key,value in pairs(values) do\nif not field[key] then\nfield[key] = {}\nend\ntable.insertflat(field[key], value)\nend\nreturn field\nend\nfunction premake.setstring(ctype, fieldname, value, allowed)\nlocal container, err = premake.getobject(ctype)\nif (not container) then\nerror(err, 4)\nend\nif (value) then\nvalue, err = premake.checkvalue(value, allowed)\nif (not value) then\nerror(err, 4)\nend\ncontainer[fieldname] = value\nend\nreturn container[fieldname]\nend\nfunction premake.remove(fieldname, value)\nlocal cfg = premake.CurrentConfiguration\ncfg.removes = cfg.removes or {}\ncfg.removes[fieldname] = premake.setarray(cfg.removes, fieldname, value)\nend\nlocal function accessor(name, value)\nlocal kind = premake.fields[name].kind\nlocal scope = premake.fields[name].scope\nlocal allowed = premake.fields[name].allowed\nif (kind == \"string\" or kind == \"path\") " + "and value then\nif type(value) ~= \"string\" then\nerror(\"string value expected\", 3)\nend\nend\nlocal container, err = premake.getobject(scope)\nif (not container) then\nerror(err, 3)\nend\nif kind == \"string\" then\nreturn premake.setstring(scope, name, value, allowed)\nelseif kind == \"path\" then\nif value then value = path.getabsolute(value) end\nreturn premake.setstring(scope, name, value)\nelseif kind == \"list\" then\nreturn premake.setarray(container, name, value, allowed)\nelseif kind == \"dirlist\" then\nreturn premake.setdirarray(container, name, value)\nelseif kind == \"filelist\" or kind == \"absolutefilelist\" then\nreturn premake.setfilearray(container, name, value)\nelseif kind == \"keyvalue\" or kind == \"keypath\" then\nreturn premake.setkeyvalue(scope, name, value)\nend\nend\nfor name, info in pairs(premake.fields) do\n_G[name] = function(value)\nreturn accessor(name, value)\nend\nif info.kind == \"list\" or\n info.kind == \"dirlist\" or\n info.kind == \"filelist\" or\n info.kind ==" + " \"absolutefilelist\"\nthen\n_G[\"remove\"..name] = function(value)\npremake.remove(name, value)\nend\nend\nend\nfunction configuration(terms)\nif not terms then\nreturn premake.CurrentConfiguration\nend\nlocal container, err = premake.getobject(\"container\")\nif (not container) then\nerror(err, 2)\nend\nlocal cfg = { }\ncfg.terms = table.flatten({terms})\ntable.insert(container.blocks, cfg)\npremake.CurrentConfiguration = cfg\ncfg.keywords = { }\nfor _, word in ipairs(cfg.terms) do\ntable.insert(cfg.keywords, path.wildcards(word):lower())\nend\nfor name, field in pairs(premake.fields) do\nif (field.kind ~= \"string\" and field.kind ~= \"path\") then\ncfg[name] = { }\nend\nend\nreturn cfg\nend\nlocal function creategroup(name, sln, parent, inpath)\nlocal group = {}\nsetmetatable(group, {\n__type = \"group\"\n})\ntable.insert(sln.groups, group)\nsln.groups[inpath] = group\ngroup.solution = sln\ngroup.name = name\ngroup.uuid = os.uuid(group.name)\ngroup.parent = parent\nreturn group\nend\nlocal function createg" + "roupsfrompath(inpath, sln)\nif inpath == nil then return nil end\ninpath = path.translate(inpath, \"/\")\nlocal groups = string.explode(inpath, \"/\")\nlocal curpath = \"\"\nlocal lastgroup = nil\nfor i, v in ipairs(groups) do\ncurpath = curpath .. \"/\" .. v:lower()\nlocal group = sln.groups[curpath]\nif group == nil then\ngroup = creategroup(v, sln, lastgroup, curpath)\nend\nlastgroup = group\nend\nreturn lastgroup\nend\nlocal function createproject(name, sln, isUsage)\nlocal prj = {}\nsetmetatable(prj, {\n__type = \"project\",\n})\ntable.insert(sln.projects, prj)\nif(isUsage) then\nif(sln.projects[name]) then\nsln.projects[name].usageProj = prj;\nelse\nsln.projects[name] = prj\nend\nelse\nif(sln.projects[name]) then\nprj.usageProj = sln.projects[name];\nend\nsln.projects[name] = prj\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nprj.solution = sln\nprj.name = name\nprj.basedir = os.getcwd()\nprj.uuid = os.uuid(prj.name)\nprj.blocks = { }\nprj.us" + "age = isUsage\nprj.group = group\nreturn prj;\nend\nfunction usage(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(not premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or\n((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then\npremake.CurrentContainer = createproject(name, sln, true)\nelse\npremake.CurrentContainer = iff(sln.projects[name].usage,\nsln.projects[name], sln.projects[name].usageProj)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction project(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(premake.CurrentContainer.usage) then return nil end" + "\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or sln.projects[name].usage) then\npremake.CurrentContainer = createproject(name, sln)\nelse\npremake.CurrentContainer = sln.projects[name];\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction solution(name)\nif not name then\nif type(premake.CurrentContainer) == \"project\" then\nreturn premake.CurrentContainer.solution\nelse\nreturn premake.CurrentContainer\nend\nend\npremake.CurrentContainer = premake.solution.get(name)\nif (not premake.CurrentContainer) then\npremake.CurrentContainer = premake.solution.new(name)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction group(name)\nif not name then\nreturn premake.CurrentGroup\nend\npremake.CurrentGroup = name\nreturn premake.Curren" + "tGroup\nend\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\n", /* base/cmdline.lua */ "newoption \n{\ntrigger = \"cc\",\nvalue = \"VALUE\",\ndescription = \"Choose a C/C++ compiler set\",\nallowed = {\n{ \"gcc\", \"GNU GCC (gcc/g++)\" },\n{ \"ow\", \"OpenWatcom\" },\n}\n}\nnewoption\n{\ntrigger = \"dotnet\",\nvalue = \"VALUE\",\ndescription = \"Choose a .NET compiler set\",\nallowed = {\n{ \"msnet\", \"Microsoft .NET (csc)\" },\n{ \"mono\", \"Novell Mono (mcs)\" },\n{ \"pnet\", \"Portable.NET (cscc)\" },\n}\n}\nnewoption\n{\ntrigger = \"file\",\nvalue = \"FILE\",\ndescription = \"Read FILE as a Premake script; default is 'premake4.lua'\"\n}\nnewoption\n{\ntrigger = \"help\",\ndescription = \"Display this information\"\n}\nnewoption\n{\ntrigger = \"os\",\nvalue = \"VALUE\",\ndescription = \"Generate files for a different operating system\",\nallowed = {\n{ \"bsd\", \"OpenBSD, NetBSD, or FreeBSD\" },\n{ \"linux\", \"Linux\" },\n{ \"macosx\", \"Apple Mac OS X\" },\n{ \"windows\", \"Microsoft Windows\" },\n}\n}\nnewoption\n{" @@ -180,16 +180,16 @@ const char* builtin_scripts[] = { /* actions/make/make_cpp.lua */ "premake.make.cpp = { }\npremake.make.override = { }\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\npremake.gmake_cpp_header(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nlocal objdirs = {}\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in pairs(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('al" - "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then \nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\n_p('\\t$(SILENT) $(LINKCMD_NDX)'" - ")\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(OBJDIR)')\nend\n_p('\\t-$(call MKDIR,$(OBJDIR))')\nfor dir, _ in pairs(objdirs) do\n_p('\\t-$(call MKDIR,$(OBJDIR)/%s)', dir)\nend\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /," - "\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))'" - ")\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET" - "\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"" - "\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table." - "join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"" - "Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' " - "GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('" - "')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", + "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then \nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t$(call RM,$(TARGET))')\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\n_" + "p('\\t$(SILENT) $(LINKCMD_NDX)')\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(OBJDIR)')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n" + "_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COP" + "Y = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM= $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory)" + ")\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_" + "p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS " + " += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif c" + "fg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbrea" + "k\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.i" + "scfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", /* actions/make/make_csharp.lua */ "local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\n local name = cfg.buildtarget.basename .. \".\"\n local dir = path.getdirectory(fname)\n if dir ~= \".\" then \nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Co" @@ -263,15 +263,16 @@ const char* builtin_scripts[] = { "seFileName>'\n, path.getbasename(cfg.buildtarget.name))\nend\nif cfg.flags.NoFramePointer then\n_p(3,'true')\nend\ncompile_language(cfg)\nforcedinclude_files(3,cfg);\n_p(2,'')\nend\nlocal function event_hooks(cfg)\nif #cfg.postbuildcommands> 0 then\n _p(2,'')\n_p(3,'%s',premake.esc(table.implode(cfg.postbuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'')\nend\nif #cfg.prebuildcommands> 0 then\n _p(2,'')\n_p(3,'%s',premake.esc(table.implode(cfg.prebuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'')\nend\nif #cfg.prelinkcommands> 0 then\n _p(2,'')\n_p(3,'%s',premake.esc(table.implode(cfg.prelinkcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'')\nend\nend\nlocal function additional_options(indent,cfg)\nif #cfg.linkoptions > 0 then\n_p(indent,'%s %%(AdditionalOptions)',\ntable" ".concat(premake.esc(cfg.linkoptions), \" \"))\nend\nend\nlocal function link_target_machine(index,cfg)\nlocal platforms = {x32 = 'MachineX86', x64 = 'MachineX64'}\nif platforms[cfg.platform] then\n_p(index,'%s', platforms[cfg.platform])\nend\nend\nlocal function item_def_lib(cfg)\n -- The Xbox360 project files are stored in another place in the project file.\nif cfg.kind == 'StaticLib' and cfg.platform ~= \"Xbox360\" then\n_p(1,'')\n_p(2,'$(OutDir)%s',cfg.buildtarget.name)\nadditional_options(2,cfg)\nlink_target_machine(2,cfg)\n_p(1,'')\nend\nend\nlocal function import_lib(cfg)\nif cfg.kind == \"SharedLib\" then\nlocal implibname = cfg.linktarget.fullpath\n_p(3,'%s',iif(cfg.flags.NoImportLib, cfg.objectsdir .. \"\\\\\" .. path.getname(implibname), implibname))\nend\nend\nfunction vc2010.link(cfg)\n_p(2,'')\n_p(3,'%s', iif(cfg.kind == \"ConsoleApp\", \"Console\", \"Windows\"))\n_p" "(3,'%s', tostring(cfg.flags.Symbols ~= nil))\nif premake.config.isoptimizedbuild(cfg.flags) then\n_p(3,'true')\n_p(3,'true')\nend\nif cfg.kind ~= 'StaticLib' then\nvc2010.additionalDependencies(cfg)\n_p(3,'$(OutDir)%s', cfg.buildtarget.name)\nif #cfg.libdirs > 0 then\n_p(3,'%s;%%(AdditionalLibraryDirectories)',\npremake.esc(path.translate(table.concat(cfg.libdirs, ';'), '\\\\')))\nend\nif vc2010.config_type(cfg) == 'Application' and not cfg.flags.WinMain and not cfg.flags.Managed then\nif cfg.flags.Unicode then\n_p(3,'wmainCRTStartup')\nelse\n_p(3,'mainCRTStartup')\nend\nend\nimport_lib(cfg)\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile then\n_p(3,'%s', deffil" - "e)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nend\n_p(2,'')\nend\nfunction vc2010.additionalDependencies(cfg)\nlocal links = premake.getlinks(cfg, \"system\", \"fullpath\")\nif #links > 0 then\n_p(3,'%s;%%(AdditionalDependencies)',\ntable.concat(links, \";\"))\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,''\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nevent_hooks(cfg)\n_p(1,'')\nend\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {},\nClInclude = {},\nNone = {},\nResourceCompile = {},\n AppxManifest = {}\n}\nlocal foundAppxManifest = false\nfo" - "r file in premake.project.eachfile(prj) do\nif path.iscppfile(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\ntable.insert(sortedfiles.ClInclude, file)\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelse\n local ext = path.getextension(file.name):lower()\n if ext == \".appxmanifest\" then\nfoundAppxManifest = true\n table.insert(sortedfiles.AppxManifest, file)\n else\n table.insert(sortedfiles.None, file)\n end\nend\nend\nif vstudio.toolset == \"v120_wp81\" and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \".appxmanifest\"\nfcfg.vpath = premake.project.getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(pr" - "j)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\n vc2010.simplefilesgroup(prj, \"AppxManifest\")\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'')\nfor _, file in ipairs(files) do\n if subtype then\n _p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n _p(3,'%s', subtype)\n _p(2,'', section)\n else\n _p(2,'<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\n end\nend\n_p(1,'')\nend\nend\nfunction vc2010.compilerfilesgroup(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in i" - "pairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '', translatedpath)\n_p(3, '$(IntDir)%s.obj'\n, premake.esc(path.translate(path.trimdots(path.removeext(file.name))))\n)\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'Create', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend\nend\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nfor _, exclude in ipairs(cfg.excludes) do\nif ex" - "clude == file.name then\n_p(3, 'true', premake.esc(vsconfig.name))\nend\nend\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('', t)\nend\nfunction premake.vs2010_vcxproj(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'')\n_p(1,'')\n_p(1,'')\nimport_props(prj)\n_p(1,'')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.projectReferences(prj)\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p('')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\n_p(1,'')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'', path.translate(deppath, \"\\\\\"))\n_p(3,'{%s}', dep.uuid)\nif vstudio.toolset == \"v120_wp81\" then\n_p(3,'false')\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.debugdir(cfg)\nif cfg.debugdir then\n_p(' %s', path.translate(cfg.debugdir, '\\\\'))\n_p(' WindowsLocalDebugger')\nend\nif cfg.debugargs then\n_p(' %s', table.concat(cfg.debugargs, \" \"))\nend\nend\nfunction vc2010.debugenvs(cfg)\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2,'%s%s',table.concat(cfg.debugenvs, \"\\n\")\n,iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)','')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2,'false')\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' ', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\nvc2010.debugenvs(cfg)\n_p(' ')\n" - "end\n_p('')\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('')\n_p('')\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p(2,'' .. prj.name .. '')\n_p(2,'Unknown')\n_p(2,'EmptyLogo.png')\n_p(1,'')\n_p(1,'')\n_p(2,'6.3.1')\n_p(2,'6.3.1')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(3,'')\n_p(3,'')\n_p(2,'')\n_p(1,'')\n_p('')\nend", + "e)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nend\n_p(2,'')\nend\nfunction vc2010.additionalDependencies(cfg)\nlocal links = premake.getlinks(cfg, \"system\", \"fullpath\")\nif #links > 0 then\n_p(3,'%s;%%(AdditionalDependencies)',\ntable.concat(links, \";\"))\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,''\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nevent_hooks(cfg)\n_p(1,'')\nend\nend\nfunction exists(table, fine)\nfor _, value in ipairs(table) do\nif value == find then return true end\nend\nreturn false\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {}," + "\nClInclude = {},\nNone = {},\nResourceCompile = {},\n AppxManifest = {}\n}\nlocal foundAppxManifest = false\nfor file in premake.project.eachfile(prj) do\nif path.iscppfile(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\nif not exists(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelse\n local ext = path.getextension(file.name):lower()\n if ext == \".appxmanifest\" then\nfoundAppxManifest = true\n table.insert(sortedfiles.AppxManifest, file)\n else\n table.insert(sortedfiles.None, file)\n end\nend\nend\nif vstudio.toolset == \"v120_wp81\" and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \".appxmanifest\"\nfcfg.vpath = premake.project." + "getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\n vc2010.simplefilesgroup(prj, \"AppxManifest\")\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'')\nfor _, file in ipairs(files) do\n if subtype then\n _p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n _p(3,'%s', subtype)\n _p(2,'', section)\n else\n _p(2,'<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\n end\nend\n_p(1,'')\nend\nend\nfunction vc2010.compilerfilesgroup(" + "prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '', translatedpath)\n_p(3, '$(IntDir)%s.obj'\n, premake.esc(path.translate(path.trimdots(path.removeext(file.name))))\n)\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'Create', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend" + "\nend\nlocal excluded = false\nfor _, exclude in ipairs(prj.excludes) do\nif exclude == file.name then\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\n_p(3, 'true'\n, premake.esc(vsconfig.name)\n)\nend\nexcluded = true\nbreak\nend\nend\nif not excluded then\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nfor _, exclude in ipairs(cfg.excludes) do\nif exclude == file.name then\n_p(3, 'true'\n, premake.esc(vsconfig.name)\n)\nend\nend\nend\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('', t)\nend\nfunction premake.vs2010_vcxproj(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'')\n_p(1,'')\n_p(1,'')\nimport_props(prj)\n_p(1,'')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.projectReferences(prj)\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p('')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.g" + "etdependencies(prj)\nif #deps > 0 then\n_p(1,'')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'', path.translate(deppath, \"\\\\\"))\n_p(3,'{%s}', dep.uuid)\nif vstudio.toolset == \"v120_wp81\" then\n_p(3,'false')\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.debugdir(cfg)\nif cfg.debugdir then\n_p(' %s', path.translate(cfg.debugdir, '\\\\'))\n_p(' WindowsLocalDebugger')\nend\nif cfg.debugargs then\n_p(' %s', table.concat(cfg.debugargs, \" \"))\nend\nend\nfunction vc2010.debugenvs(cfg)\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2,'%s%s',table.concat(cfg.debugenvs, " + "\"\\n\")\n,iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)','')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2,'false')\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' ', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\nvc2010.debugenvs(cfg)\n_p(' ')\nend\n_p('')\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('')\n_p('')\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p(2,'' .. prj.name .. '')\n_p(2,'Unknown')\n_p(2,'EmptyLogo.png')\n_p(1,'')\n_p(1,'')\n_p(2,'6.3.1')\n_p(2,'6.3.1')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(3,'')\n_p(3,'')\n_p(2,'')\n_p(1,'')\n_p('')\nend\n", /* actions/vstudio/vs2010_vcxproj_filters.lua */ "local vc2010 = premake.vstudio.vc2010\nlocal project = premake.project\nfunction vc2010.filteridgroup(prj)\nlocal filters = { }\nlocal filterfound = false\nfor file in project.eachfile(prj) do\nlocal folders = string.explode(file.vpath, \"/\", true)\nlocal path = \"\"\nfor i = 1, #folders - 1 do\nif not filterfound then\nfilterfound = true\n_p(1,'')\nend\npath = path .. folders[i]\nif not filters[path] then\nfilters[path] = true\n_p(2, '', path)\n_p(3, '{%s}', os.uuid())\n_p(2, '')\nend\npath = path .. \"\\\\\"\nend\nend\nif filterfound then\n_p(1,'')\nend\nend\nfunction vc2010.filefiltergroup(prj, section)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'')\nfor _, file in ipairs(files) do\nlocal filter\nif file.name ~= file.vpath then\nfilter = path.getdirectory(file.vpath)\nelse\nfilter = path.getdirectory(file.name)\nend\nif filter ~= \".\" then\n_p(2,'<%s Include=\\\"%s\\\">', " From 47d6c80bd91d16c06627ef3dc668dbcccd8d4648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 08:47:16 +0100 Subject: [PATCH 087/201] added missing initialization in video_manager (nw) --- src/emu/video.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/emu/video.c b/src/emu/video.c index 13d2989704c..7ec113b42d5 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -106,7 +106,8 @@ video_manager::video_manager(running_machine &machine) m_avi_file(NULL), m_avi_frame_period(attotime::zero), m_avi_next_frame_time(attotime::zero), - m_avi_frame(0) + m_avi_frame(0), + m_dummy_recording(false) { // request a callback upon exiting machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(video_manager::exit), this)); From 88ce8a68443861a17ce3fe2dc9e89a059b064174 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 18:45:42 +1100 Subject: [PATCH 088/201] Hook up AY on unkch hardware for sound and DSW1/DSW2 [Vas Crabb] Document more DIP switches [Bad A. Billy, Vas Crabb] --- src/mame/drivers/goldstar.c | 298 +++++++++++++++++++++-------------- src/mame/includes/goldstar.h | 5 +- 2 files changed, 180 insertions(+), 123 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 96aae293067..4f23aaf2a39 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -933,14 +933,6 @@ static ADDRESS_MAP_START( wcat3_map, AS_PROGRAM, 8, goldstar_state ) ADDRESS_MAP_END -/* -READ8_MEMBER(unkch_state::unk_r) -{ - return 0xff; -} -*/ - - /* newer / more capable hw */ static ADDRESS_MAP_START( unkch_map, AS_PROGRAM, 8, unkch_state ) AM_RANGE(0x0000, 0x9fff) AM_ROM @@ -967,6 +959,23 @@ static ADDRESS_MAP_START( unkch_map, AS_PROGRAM, 8, unkch_state ) AM_RANGE(0xfe00, 0xffff) AM_RAM ADDRESS_MAP_END + +WRITE8_MEMBER(unkch_state::coincount_w) +{ +/* + 7654 3210 + ---- -x-- Credit counter (1 pulse/10 credits) + ---- x--- Key In counter + xxxx --xx Unknown + +*/ + coin_counter_w(machine(), 0, data & 0x04); /* Credit counter */ + coin_counter_w(machine(), 1, data & 0x08); /* Key In counter */ + + if (data & 0xf3) + popmessage("coin counters: %02x", data); +} + WRITE8_MEMBER(unkch_state::unkcm_0x02_w) { //popmessage("unkcm_0x02_w %02x", data); @@ -982,31 +991,21 @@ WRITE8_MEMBER(unkch_state::unkcm_0x03_w) } -WRITE8_MEMBER(unkch_state::unkcm_0x11_w) -{ - //popmessage("unkcm_0x11_w %02x", data); -} - -WRITE8_MEMBER(unkch_state::unkcm_0x12_w) -{ -// popmessage("unkcm_0x12_w %02x", data); -} - - static ADDRESS_MAP_START( unkch_portmap, AS_IO, 8, unkch_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x01, 0x01) AM_WRITE(coincount_w) AM_RANGE(0x02, 0x02) AM_WRITE(unkcm_0x02_w) AM_RANGE(0x03, 0x03) AM_WRITE(unkcm_0x03_w) - AM_RANGE(0x11, 0x11) AM_WRITE(unkcm_0x11_w) - AM_RANGE(0x12, 0x12) AM_WRITE(unkcm_0x12_w) AM_RANGE(0x08, 0x08) AM_READ_PORT("IN0") AM_RANGE(0x09, 0x09) AM_READ_PORT("IN1") AM_RANGE(0x0a, 0x0a) AM_READ_PORT("DSW4") AM_RANGE(0x0b, 0x0b) AM_READ_PORT("DSW3") - AM_RANGE(0x10, 0x10) AM_READ_PORT("DSW2") - /* Where is DSW1? It's possible the games are buggy and use the value read from DSW3 for DSW1 as well. */ + + AM_RANGE(0x10, 0x10) AM_DEVREAD("aysnd", ay8910_device, data_r) + AM_RANGE(0x11, 0x11) AM_DEVWRITE("aysnd", ay8910_device, data_w) + AM_RANGE(0x12, 0x12) AM_DEVWRITE("aysnd", ay8910_device, address_w) ADDRESS_MAP_END @@ -4730,15 +4729,13 @@ static INPUT_PORTS_START( unkch_controls ) PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) /* Trips "call attendant" state if activated while credited - something to do with hopper out? */ PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -4750,47 +4747,71 @@ INPUT_PORTS_END static INPUT_PORTS_START( unkch ) PORT_INCLUDE( unkch_controls ) - /* Is there a DSW1? - Like many of the other games on this hardware, there is an + /* Like many of the other games on this hardware, there is an input & dip test screen that you can stumble in to. Also a picture viewer option. Can't figure out exactly how to make it repeatable... */ - PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW2:1,2") /* OK */ + PORT_START("DSW1") + PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ PORT_DIPSETTING( 0x03, "Easy" ) PORT_DIPSETTING( 0x02, "Mid 1" ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) - PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW2:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x04, "Ticket" ) PORT_DIPSETTING( 0x00, "Gettoni" ) - PORT_DIPNAME( 0x08, 0x08, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:4") /* OK */ - PORT_DIPSETTING( 0x08, "83% / 88%" ) - PORT_DIPSETTING( 0x00, "71% / 76%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x03) /* Easy */ - PORT_DIPSETTING( 0x00, "68% / 73%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x02) /* Mid 1 */ - PORT_DIPSETTING( 0x00, "65% / 70%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x01) /* Mid 2 */ - PORT_DIPSETTING( 0x00, "62% / 67%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x00) /* Hard */ - PORT_DIPNAME( 0x10, 0x10, "Reel Speed / Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ - PORT_DIPSETTING( 0x10, "Low / 64" ) - PORT_DIPSETTING( 0x00, "High / 40 (20)" ) /* shows 20 in settings screen but limits to 40 in gameplay */ - PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW2:6,7") /* OK */ + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ + PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) + PORT_DIPSETTING( 0x00, DEF_STR( High ) ) + PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK */ PORT_DIPSETTING( 0x60, DEF_STR( No ) ) PORT_DIPSETTING( 0x20, "5%" ) PORT_DIPSETTING( 0x00, "10%" ) PORT_DIPSETTING( 0x40, "20%" ) - PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW2:8") /* OK */ + PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW1:8") /* OK */ PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_START("DSW2") + PORT_DIPNAME( 0x0f, 0x0f, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:1,2,3,4") /* OK - all other values are 83% / 88% */ + PORT_DIPSETTING( 0x00, "50% / 55%" ) + PORT_DIPSETTING( 0x01, "53% / 58%" ) + PORT_DIPSETTING( 0x02, "56% / 61%" ) + PORT_DIPSETTING( 0x03, "59% / 64%" ) + PORT_DIPSETTING( 0x04, "62% / 67%" ) + PORT_DIPSETTING( 0x05, "65% / 70%" ) + PORT_DIPSETTING( 0x06, "68% / 73%" ) + PORT_DIPSETTING( 0x07, "71% / 76%" ) + PORT_DIPSETTING( 0x08, "74% / 79%" ) + PORT_DIPSETTING( 0x09, "77% / 82%" ) + PORT_DIPSETTING( 0x0a, "80% / 85%" ) + PORT_DIPSETTING( 0x0f, "83% / 88%" ) + PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ + PORT_DIPSETTING( 0x10, "64" ) + PORT_DIPSETTING( 0x00, "40 (20)" ) /* shows 20 in settings screen but limits to 40 in gameplay */ + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("DSW3") - PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) PORT_DIPSETTING( 0x02, "1 Coin/20 Credits" ) PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" ) - PORT_DIPNAME( 0x04, 0x04, "Gettoni/Ticket" ) PORT_DIPLOCATION("DSW3:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Gettoni/Ticket" ) PORT_DIPLOCATION("DSW3:3") /* OK */ PORT_DIPSETTING( 0x04, "20/200" ) PORT_DIPSETTING( 0x00, "10/100" ) - PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ + PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/25 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*5 */ PORT_DIPSETTING( 0x08, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*10 */ PORT_DIPSETTING( 0x10, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*20 */ @@ -4807,10 +4828,10 @@ static INPUT_PORTS_START( unkch ) PORT_DIPSETTING( 0x08, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ PORT_DIPSETTING( 0x10, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ PORT_DIPSETTING( 0x18, "1 Coin/2,500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*50 */ - PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") @@ -4827,13 +4848,13 @@ static INPUT_PORTS_START( unkch ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, "Super Jackpot Half" ) PORT_DIPLOCATION("DSW4:4") /* OK */ + PORT_DIPNAME( 0x08, 0x08, "Super Jackpot Half" ) PORT_DIPLOCATION("DSW4:4") /* OK */ PORT_DIPSETTING( 0x08, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x60, 0x60, "Red Game Credit" ) PORT_DIPLOCATION("DSW4:6,7") /* OK */ + PORT_DIPNAME( 0x60, 0x60, "Red Game Credit" ) PORT_DIPLOCATION("DSW4:6,7") /* OK */ PORT_DIPSETTING( 0x40, "0" ) PORT_DIPSETTING( 0x20, "1" ) PORT_DIPSETTING( 0x00, "10" ) @@ -4846,30 +4867,49 @@ INPUT_PORTS_END static INPUT_PORTS_START( unkch3 ) PORT_INCLUDE( unkch_controls ) - /* Is there a DSW1? - Like many of the other games on this hardware, there is an - input & dip test screen that you can stumble in to. Also a picture viewer option. Can't figure - out exactly how to make it repeatable... */ - - PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW2:1,2") /* OK */ + PORT_START("DSW1") + PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ PORT_DIPSETTING( 0x03, "Easy" ) PORT_DIPSETTING( 0x02, "Mid 1" ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) - PORT_DIPNAME( 0x04, 0x04, "Punti Unit" ) PORT_DIPLOCATION("DSW2:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Punti Unit" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x00, "500" ) PORT_DIPSETTING( 0x04, "1000" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ + PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) + PORT_DIPSETTING( 0x00, DEF_STR( High ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW2:5") /* OK */ - PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) /* manual start at max bet */ - PORT_DIPSETTING( 0x00, DEF_STR( High ) ) /* auto start at max bet */ - PORT_DIPNAME( 0x20, 0x20, "Bet Maximum" ) PORT_DIPLOCATION("DSW2:6") /* OK */ - PORT_DIPSETTING( 0x00, "10" ) PORT_CONDITION("DSW2",0x10,EQUALS,0x10) - PORT_DIPSETTING( 0x20, "64" ) PORT_CONDITION("DSW2",0x10,EQUALS,0x10) - PORT_DIPSETTING( 0x00, "10 (5)" ) PORT_CONDITION("DSW2",0x10,EQUALS,0x00) /* shows 5 in settings screen but limits at 10 in gameplay */ - PORT_DIPSETTING( 0x20, "40 (20)" ) PORT_CONDITION("DSW2",0x10,EQUALS,0x00) /* shows 20 in settings screen but limits at 40 in gameplay */ + PORT_DIPNAME( 0x30, 0x30, "Bet Maximum" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ + PORT_DIPSETTING( 0x00, "10 (5)" ) /* shows 5 in settings screen but limits at 10 in gameplay */ + PORT_DIPSETTING( 0x10, "20 (10)" ) /* shows 10 in settings screen but limits at 20 in gameplay */ + PORT_DIPSETTING( 0x20, "40 (20)" ) /* shows 20 in settings screen but limits at 40 in gameplay */ + PORT_DIPSETTING( 0x30, "64" ) PORT_DIPNAME( 0x40, 0x40, "Bet Minimum" ) PORT_DIPLOCATION("DSW2:7") /* shows in settings screen but has no effect */ PORT_DIPSETTING( 0x00, "8" ) PORT_DIPSETTING( 0x40, "16" ) @@ -4880,6 +4920,7 @@ static INPUT_PORTS_START( unkch3 ) PORT_START("DSW3") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -4915,15 +4956,15 @@ static INPUT_PORTS_START( unkch3 ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Test Mode" ) PORT_DIPLOCATION("DSW4:5") /* OK */ + PORT_DIPSETTING( 0x10, "Disable" ) + PORT_DIPSETTING( 0x00, "Enable" ) /* hold 'Settings' on reset to access */ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -4935,39 +4976,63 @@ static INPUT_PORTS_START( unkch4 ) PORT_MODIFY("IN0") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(2) PORT_NAME("Coin C") - /* Is there a DSW1? - Like many of the other games on this hardware, there is an + /* Like many of the other games on this hardware, there is an input & dip test screen that you can stumble in to. Also a picture viewer option. Can't figure out exactly how to make it repeatable... */ - PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW2:1,2") /* OK */ + PORT_START("DSW1") + PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ PORT_DIPSETTING( 0x03, "Easy" ) PORT_DIPSETTING( 0x02, "Mid 1" ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) - PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW2:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x04, "Ticket" ) PORT_DIPSETTING( 0x00, "Gettoni" ) - PORT_DIPNAME( 0x08, 0x08, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:4") /* OK */ - PORT_DIPSETTING( 0x08, "83% / 88%" ) - PORT_DIPSETTING( 0x00, "71% / 76%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x03) /* Easy */ - PORT_DIPSETTING( 0x00, "68% / 73%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x02) /* Mid 1 */ - PORT_DIPSETTING( 0x00, "65% / 70%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x01) /* Mid 2 */ - PORT_DIPSETTING( 0x00, "62% / 67%" ) PORT_CONDITION("DSW2",0x03,EQUALS,0x00) /* Hard */ - PORT_DIPNAME( 0x10, 0x10, "Reel Speed / Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ - PORT_DIPSETTING( 0x10, "Low / 64" ) - PORT_DIPSETTING( 0x00, "High / 32" ) - PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW2:6,7") /* OK */ + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ + PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) + PORT_DIPSETTING( 0x00, DEF_STR( High ) ) + PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK */ PORT_DIPSETTING( 0x60, DEF_STR( No ) ) PORT_DIPSETTING( 0x20, "5%" ) PORT_DIPSETTING( 0x00, "10%" ) PORT_DIPSETTING( 0x40, "20%" ) - PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW2:8") /* OK */ + PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW1:8") /* OK */ PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_START("DSW2") + PORT_DIPNAME( 0x0f, 0x0f, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:1,2,3,4") /* OK - all other values are 83% / 88% */ + PORT_DIPSETTING( 0x00, "50% / 55%" ) + PORT_DIPSETTING( 0x01, "53% / 58%" ) + PORT_DIPSETTING( 0x02, "56% / 61%" ) + PORT_DIPSETTING( 0x03, "59% / 64%" ) + PORT_DIPSETTING( 0x04, "62% / 67%" ) + PORT_DIPSETTING( 0x05, "65% / 70%" ) + PORT_DIPSETTING( 0x06, "68% / 73%" ) + PORT_DIPSETTING( 0x07, "71% / 76%" ) + PORT_DIPSETTING( 0x08, "74% / 79%" ) + PORT_DIPSETTING( 0x09, "77% / 82%" ) + PORT_DIPSETTING( 0x0a, "80% / 85%" ) + PORT_DIPSETTING( 0x0f, "83% / 88%" ) + PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ + PORT_DIPSETTING( 0x00, "32" ) + PORT_DIPSETTING( 0x10, "64" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("DSW3") - PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_8C ) ) PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) PORT_DIPSETTING( 0x02, "1 Coin/20 Credits" ) @@ -4975,7 +5040,7 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ + PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*5 */ PORT_DIPSETTING( 0x08, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ PORT_DIPSETTING( 0x10, "1 Coin/160 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*20 */ @@ -4992,7 +5057,7 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x08, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ PORT_DIPSETTING( 0x10, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ PORT_DIPSETTING( 0x18, "1 Coin/2,500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*50 */ - PORT_DIPNAME( 0x20, 0x20, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x20, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*5 */ PORT_DIPSETTING( 0x20, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ PORT_DIPSETTING( 0x00, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*5 */ @@ -5001,7 +5066,7 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x20, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*10 */ PORT_DIPSETTING( 0x00, "1 Coin/250 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*5 */ PORT_DIPSETTING( 0x20, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ PORT_DIPSETTING( 0x40, "1 Coin/160 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*20 */ PORT_DIPSETTING( 0x00, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*10 */ @@ -5034,8 +5099,8 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -5852,7 +5917,7 @@ static INPUT_PORTS_START( crazybon ) PORT_INCLUDE( cmv4_coins ) PORT_MODIFY("IN1") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Unused coin switch */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Unused coin switch */ PORT_INCLUDE( cmv4_service ) @@ -5860,7 +5925,7 @@ static INPUT_PORTS_START( crazybon ) PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2") + PORT_DIPNAME( 0x02, 0x00, "Hopper Out Switch" ) PORT_DIPLOCATION("DSW1:2") /* not checked */ PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x04, 0x00, "Coin Out Rate" ) PORT_DIPLOCATION("DSW1:3") /* OK */ @@ -5891,13 +5956,12 @@ static INPUT_PORTS_START( crazybon ) PORT_DIPSETTING( 0x05, "80%" ) PORT_DIPSETTING( 0x06, "85%" ) PORT_DIPSETTING( 0x07, "90%" ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, "Mode" ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPNAME( 0x18, 0x18, "Hopper Limit" ) PORT_DIPLOCATION("DSW2:4,5") /* not checked */ + PORT_DIPSETTING( 0x18, "300" ) + PORT_DIPSETTING( 0x08, "500" ) + PORT_DIPSETTING( 0x10, "1000" ) + PORT_DIPSETTING( 0x00, "Unlimited" ) + PORT_DIPNAME( 0x20, 0x00, "Mode" ) PORT_DIPLOCATION("DSW2:6") /* OK */ PORT_DIPSETTING( 0x00, "Game" ) PORT_DIPSETTING( 0x20, "Stealth" ) PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") @@ -5930,9 +5994,9 @@ static INPUT_PORTS_START( crazybon ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:7") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPNAME( 0x08, 0x08, "Lock Into Stealth Mode" ) PORT_DIPLOCATION("DSW3:8") /* OK */ PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) /* prevents switching to game mode with start/bet buttons */ PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("DSW4") @@ -5954,10 +6018,10 @@ static INPUT_PORTS_START( crazybon ) PORT_DIPNAME( 0x20, 0x20, "Bonus Min Bet" ) PORT_DIPLOCATION("DSW4:6") /* OK */ PORT_DIPSETTING( 0x20, "16" ) PORT_DIPSETTING( 0x00, "32" ) - PORT_DIPNAME( 0x40, 0x40, "C.M. Reel Speed" ) PORT_DIPLOCATION("DSW4:7") /* OK */ + PORT_DIPNAME( 0x40, 0x40, "Reel Speed" ) PORT_DIPLOCATION("DSW4:7") /* OK */ PORT_DIPSETTING( 0x40, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") + PORT_DIPNAME( 0x80, 0x80, "Hopper Out By Coin A" ) PORT_DIPLOCATION("DSW4:8") /* not working */ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -5970,18 +6034,17 @@ static INPUT_PORTS_START( crazybon ) PORT_DIPSETTING( 0x04, "5,000" ) PORT_DIPSETTING( 0x02, "10,000" ) PORT_DIPSETTING( 0x00, "20,000" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x18, 0x18, "Condition For 3 Fruit Bonus" ) PORT_DIPLOCATION("DSW5:4,5") /* OK */ + PORT_DIPSETTING( 0x18, "5-<-7" ) /* not sure about the "<" ??? */ + PORT_DIPSETTING( 0x10, "5-9-5" ) + PORT_DIPSETTING( 0x08, "5-6-3" ) + PORT_DIPSETTING( 0x00, "5-3-2" ) PORT_DIPNAME( 0x60, 0x60, "Game Min Bet" ) PORT_DIPLOCATION("DSW5:6,7") /* OK */ PORT_DIPSETTING( 0x60, "1" ) PORT_DIPSETTING( 0x40, "8" ) PORT_DIPSETTING( 0x20, "16" ) PORT_DIPSETTING( 0x00, "32" ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW5:8") + PORT_DIPNAME( 0x80, 0x80, "Card Shuffle Animation" ) PORT_DIPLOCATION("DSW5:8") /* OK */ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -7615,13 +7678,10 @@ static MACHINE_CONFIG_START( unkch, unkch_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - -// MCFG_SOUND_ADD("aysnd", AY8910, AY_CLOCK) -// -// -// MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW4")) -// MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW3")) -// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + MCFG_SOUND_ADD("aysnd", AY8910, AY_CLOCK) + MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW1")) + MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW2")) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END @@ -13008,10 +13068,10 @@ GAME( 2003, carb2003, nfb96, amcoe2, nfb96bl, driver_device, 0, GAME( 2003, nfm, 0, nfm, nfb96bl, driver_device, 0, ROT0, "Ming-Yang Electronic", "New Fruit Machine (Ming-Yang Electronic)", GAME_NOT_WORKING ) // vFB02-07A "Copyright By Ms. Liu Orchis 2003/03/06" // these have 'cherry 1994' in the program roms, but also "Super Cherry / New Cherry Gold '99" probably hacks of a 1994 version of Cherry Bonus / Cherry Master (Super Cherry Master?) -GAME( 1999, unkch1, 0, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1999, unkch2, unkch1, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "Super Cherry Gold (bootleg of Super Cherry Master)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1999, unkch3, unkch1, unkch, unkch3, unkch_state, unkch3, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) // cards have been hacked to look like barrels, girl removed? -GAME( 1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, ROT0, "bootleg", "Grand Cherry Master (bootleg of Super Cherry Master)", GAME_NOT_WORKING|GAME_NO_SOUND ) // by 'Toy System' Hungary +GAME( 1999, unkch1, 0, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", GAME_NOT_WORKING ) +GAME( 1999, unkch2, unkch1, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "Super Cherry Gold (bootleg of Super Cherry Master)", GAME_NOT_WORKING ) +GAME( 1999, unkch3, unkch1, unkch, unkch3, unkch_state, unkch3, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2)", GAME_NOT_WORKING ) // cards have been hacked to look like barrels, girl removed? +GAME( 1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, ROT0, "bootleg", "Grand Cherry Master (bootleg of Super Cherry Master)", GAME_NOT_WORKING ) // by 'Toy System' Hungary /* Stealth sets. diff --git a/src/mame/includes/goldstar.h b/src/mame/includes/goldstar.h index 80b806493d5..35bfac34c37 100644 --- a/src/mame/includes/goldstar.h +++ b/src/mame/includes/goldstar.h @@ -254,12 +254,9 @@ public: { } - DECLARE_READ8_MEMBER(unk_r); - + DECLARE_WRITE8_MEMBER(coincount_w); DECLARE_WRITE8_MEMBER(unkcm_0x02_w); DECLARE_WRITE8_MEMBER(unkcm_0x03_w); - DECLARE_WRITE8_MEMBER(unkcm_0x11_w); - DECLARE_WRITE8_MEMBER(unkcm_0x12_w); DECLARE_WRITE8_MEMBER(reel1_attrram_w); DECLARE_WRITE8_MEMBER(reel2_attrram_w); From bf586d0bcce5303c37c59ac9d0436fc2116b7f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 10:56:51 +0100 Subject: [PATCH 089/201] small windows.mak cleanup (nw) --- src/osd/windows/windows.mak | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/osd/windows/windows.mak b/src/osd/windows/windows.mak index 197577e21e7..53d8be9518a 100644 --- a/src/osd/windows/windows.mak +++ b/src/osd/windows/windows.mak @@ -237,11 +237,9 @@ endif # explicitly set the entry point for UNICODE builds LDFLAGS += /ENTRY:wmainCRTStartup -ifdef MSVC_BUILD ifdef DEBUG LDFLAGS += /NODEFAULTLIB:LIBCMT endif -endif # add some VC++-specific defines DEFS += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DXML_STATIC -DWIN32 @@ -254,7 +252,7 @@ msvcclean: $(RM) *.lib $(RM) *.exp -endif +endif # MSVC_BUILD #------------------------------------------------- From 3b0d9821fb6ae67c5d619d8f7fcd01a1bbfa494a Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 20:36:52 +1100 Subject: [PATCH 090/201] Hook up and document lamps for unkch1 --- src/mame/drivers/goldstar.c | 18 ++++++++++++------ src/mame/includes/goldstar.h | 1 - 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 4f23aaf2a39..069a81acd9f 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -209,6 +209,17 @@ WRITE8_MEMBER(goldstar_state::p1_lamps_w) ---x ---- info info small small/end --x- ---- start start deal start start start -x-- ---- hold + x--- ---- + + 7654 3210 unkch1 + ---- ---x bet-a/stop 2 + ---- --x- start/stop all + ---- -x-- info/small/stop 3 + ---- x--- big + ---x ---- bet-b/d-up + --x- ---- take/stop 1 + -x-- ---- + x--- ---- always on all cm/cmaster use the same scheme tonypok uses lamps to indicate current button functions rather than active buttons @@ -976,11 +987,6 @@ WRITE8_MEMBER(unkch_state::coincount_w) popmessage("coin counters: %02x", data); } -WRITE8_MEMBER(unkch_state::unkcm_0x02_w) -{ - //popmessage("unkcm_0x02_w %02x", data); -} - WRITE8_MEMBER(unkch_state::unkcm_0x03_w) { //popmessage("unkcm_0x03_w %02x", data); @@ -995,7 +1001,7 @@ static ADDRESS_MAP_START( unkch_portmap, AS_IO, 8, unkch_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x01, 0x01) AM_WRITE(coincount_w) - AM_RANGE(0x02, 0x02) AM_WRITE(unkcm_0x02_w) + AM_RANGE(0x02, 0x02) AM_WRITE(p1_lamps_w) AM_RANGE(0x03, 0x03) AM_WRITE(unkcm_0x03_w) AM_RANGE(0x08, 0x08) AM_READ_PORT("IN0") diff --git a/src/mame/includes/goldstar.h b/src/mame/includes/goldstar.h index 35bfac34c37..f3fa27a0593 100644 --- a/src/mame/includes/goldstar.h +++ b/src/mame/includes/goldstar.h @@ -255,7 +255,6 @@ public: } DECLARE_WRITE8_MEMBER(coincount_w); - DECLARE_WRITE8_MEMBER(unkcm_0x02_w); DECLARE_WRITE8_MEMBER(unkcm_0x03_w); DECLARE_WRITE8_MEMBER(reel1_attrram_w); From d214223b1889a7af010692aeb77ab10b536f42d4 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 21:18:30 +1100 Subject: [PATCH 091/201] Lamps and clickable artwork for unkch sets --- src/mame/drivers/goldstar.c | 10 +- src/mame/layout/unkch.lay | 180 ++++++++++++++++++++++++++++++++++++ src/mame/mame.mak | 3 +- 3 files changed, 188 insertions(+), 5 deletions(-) create mode 100644 src/mame/layout/unkch.lay diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 069a81acd9f..da301b41aca 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -172,6 +172,7 @@ #include "roypok96.lh" #include "skill98.lh" #include "tonypok.lh" +#include "unkch.lh" WRITE8_MEMBER(goldstar_state::protection_w) @@ -225,6 +226,7 @@ WRITE8_MEMBER(goldstar_state::p1_lamps_w) tonypok uses lamps to indicate current button functions rather than active buttons skill98 is like schery97 but doesn't activate bit 0 for stop nfb96, roypok96 and nc96 sets are like schery97 but they don't activate bit 2 for select + all unkch use the same scheme, these sets use crude PWM to dim lamps which requires better lamp simulation */ output_set_lamp_value(0, (data >> 0) & 1); output_set_lamp_value(1, (data >> 1) & 1); @@ -13074,10 +13076,10 @@ GAME( 2003, carb2003, nfb96, amcoe2, nfb96bl, driver_device, 0, GAME( 2003, nfm, 0, nfm, nfb96bl, driver_device, 0, ROT0, "Ming-Yang Electronic", "New Fruit Machine (Ming-Yang Electronic)", GAME_NOT_WORKING ) // vFB02-07A "Copyright By Ms. Liu Orchis 2003/03/06" // these have 'cherry 1994' in the program roms, but also "Super Cherry / New Cherry Gold '99" probably hacks of a 1994 version of Cherry Bonus / Cherry Master (Super Cherry Master?) -GAME( 1999, unkch1, 0, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", GAME_NOT_WORKING ) -GAME( 1999, unkch2, unkch1, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "Super Cherry Gold (bootleg of Super Cherry Master)", GAME_NOT_WORKING ) -GAME( 1999, unkch3, unkch1, unkch, unkch3, unkch_state, unkch3, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2)", GAME_NOT_WORKING ) // cards have been hacked to look like barrels, girl removed? -GAME( 1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, ROT0, "bootleg", "Grand Cherry Master (bootleg of Super Cherry Master)", GAME_NOT_WORKING ) // by 'Toy System' Hungary +GAMEL(1999, unkch1, 0, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", GAME_NOT_WORKING, layout_unkch ) +GAMEL(1999, unkch2, unkch1, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "Super Cherry Gold (bootleg of Super Cherry Master)", GAME_NOT_WORKING, layout_unkch ) +GAMEL(1999, unkch3, unkch1, unkch, unkch3, unkch_state, unkch3, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2)", GAME_NOT_WORKING, layout_unkch ) // cards have been hacked to look like barrels, girl removed? +GAMEL(1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, ROT0, "bootleg", "Grand Cherry Master (bootleg of Super Cherry Master)", GAME_NOT_WORKING, layout_unkch ) // by 'Toy System' Hungary /* Stealth sets. diff --git a/src/mame/layout/unkch.lay b/src/mame/layout/unkch.lay new file mode 100644 index 00000000000..600db78a390 --- /dev/null +++ b/src/mame/layout/unkch.lay @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 79420ebb9da..910f4c5bb41 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -2688,7 +2688,8 @@ $(DRIVERS)/goldstar.o: $(LAYOUT)/goldstar.lh \ $(LAYOUT)/pokonl97.lh \ $(LAYOUT)/roypok96.lh \ $(LAYOUT)/skill98.lh \ - $(LAYOUT)/tonypok.lh + $(LAYOUT)/tonypok.lh \ + $(LAYOUT)/unkch.lh $(DRIVERS)/grchamp.o: $(LAYOUT)/grchamp.lh From 2849b81c5dea11960c65f5c5fe2a1abf75dc5686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 11:36:49 +0100 Subject: [PATCH 092/201] removed unnecessary assert.h includes (nw) including global one for Visual Studio --- src/lib/formats/ap2_dsk.c | 1 - src/lib/formats/ap_dsk35.c | 1 - src/lib/formats/basicdsk.c | 1 - src/lib/formats/cassimg.c | 1 - src/lib/formats/coco_dsk.c | 1 - src/lib/formats/flopimg.c | 1 - src/lib/formats/ti99_dsk.c | 1 - src/lib/formats/z80ne_dsk.c | 1 - src/lib/util/flac.c | 1 - src/lib/util/opresolv.c | 3 ++- src/mess/tools/castool/main.c | 1 - src/mess/tools/floptool/main.c | 1 - src/mess/tools/imgtool/imgterrs.c | 2 +- src/osd/windows/winprefix.h | 1 - 14 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/lib/formats/ap2_dsk.c b/src/lib/formats/ap2_dsk.c index c62033eb2ff..668a44c113a 100644 --- a/src/lib/formats/ap2_dsk.c +++ b/src/lib/formats/ap2_dsk.c @@ -8,7 +8,6 @@ #include #include -#include #include "ap2_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/ap_dsk35.c b/src/lib/formats/ap_dsk35.c index 8eee2ee0dab..86d8e19656d 100644 --- a/src/lib/formats/ap_dsk35.c +++ b/src/lib/formats/ap_dsk35.c @@ -97,7 +97,6 @@ *********************************************************************/ #include -#include #include "emu.h" #include "ap_dsk35.h" diff --git a/src/lib/formats/basicdsk.c b/src/lib/formats/basicdsk.c index 6b6b11ee4d1..d20a29cc7b0 100644 --- a/src/lib/formats/basicdsk.c +++ b/src/lib/formats/basicdsk.c @@ -8,7 +8,6 @@ #include #include -#include #include "basicdsk.h" diff --git a/src/lib/formats/cassimg.c b/src/lib/formats/cassimg.c index 20ccbc99407..bb527ce91f5 100644 --- a/src/lib/formats/cassimg.c +++ b/src/lib/formats/cassimg.c @@ -6,7 +6,6 @@ *********************************************************************/ -#include #include #include "imageutl.h" diff --git a/src/lib/formats/coco_dsk.c b/src/lib/formats/coco_dsk.c index b3f2b306c43..d583813823a 100644 --- a/src/lib/formats/coco_dsk.c +++ b/src/lib/formats/coco_dsk.c @@ -7,7 +7,6 @@ *********************************************************************/ #include -#include #include #include "formats/coco_dsk.h" diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c index 2f3260366ce..dacd76d5b8b 100644 --- a/src/lib/formats/flopimg.c +++ b/src/lib/formats/flopimg.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include "emu.h" diff --git a/src/lib/formats/ti99_dsk.c b/src/lib/formats/ti99_dsk.c index a2abbd2902f..b1c473fef3e 100644 --- a/src/lib/formats/ti99_dsk.c +++ b/src/lib/formats/ti99_dsk.c @@ -43,7 +43,6 @@ #include "emu.h" #include -#include #include #include "imageutl.h" diff --git a/src/lib/formats/z80ne_dsk.c b/src/lib/formats/z80ne_dsk.c index 6394e177f4f..be521761f64 100644 --- a/src/lib/formats/z80ne_dsk.c +++ b/src/lib/formats/z80ne_dsk.c @@ -6,7 +6,6 @@ *********************************************************************/ -#include #include "z80ne_dsk.h" #include "basicdsk.h" #include "imageutl.h" diff --git a/src/lib/util/flac.c b/src/lib/util/flac.c index 09e396c944e..bfaa519cf53 100644 --- a/src/lib/util/flac.c +++ b/src/lib/util/flac.c @@ -9,7 +9,6 @@ ***************************************************************************/ #include "flac.h" -#include #include diff --git a/src/lib/util/opresolv.c b/src/lib/util/opresolv.c index 4d093a955da..d275e47d03b 100644 --- a/src/lib/util/opresolv.c +++ b/src/lib/util/opresolv.c @@ -6,7 +6,6 @@ ****************************************************************************/ -#include #include #include #include @@ -15,6 +14,8 @@ #include "corestr.h" #include "opresolv.h" +#include + enum resolution_entry_state { RESOLUTION_ENTRY_STATE_UNSPECIFIED, diff --git a/src/mess/tools/castool/main.c b/src/mess/tools/castool/main.c index 22564dcdf78..e41542980b8 100644 --- a/src/mess/tools/castool/main.c +++ b/src/mess/tools/castool/main.c @@ -15,7 +15,6 @@ #include #include #include -#include #include "corestr.h" diff --git a/src/mess/tools/floptool/main.c b/src/mess/tools/floptool/main.c index 4575e1609cb..3d823d99a58 100644 --- a/src/mess/tools/floptool/main.c +++ b/src/mess/tools/floptool/main.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include "corestr.h" diff --git a/src/mess/tools/imgtool/imgterrs.c b/src/mess/tools/imgtool/imgterrs.c index 58a2d944179..dac8b9d0572 100644 --- a/src/mess/tools/imgtool/imgterrs.c +++ b/src/mess/tools/imgtool/imgterrs.c @@ -6,9 +6,9 @@ ***************************************************************************/ -#include #include "imgterrs.h" #include "osdcomm.h" +#include static const char *const msgs[] = { diff --git a/src/osd/windows/winprefix.h b/src/osd/windows/winprefix.h index 53f03e46a1f..e506403e7b5 100644 --- a/src/osd/windows/winprefix.h +++ b/src/osd/windows/winprefix.h @@ -11,7 +11,6 @@ #endif #ifdef _MSC_VER -#include #include #if _MSC_VER < 1900 // < VS2015 #define snprintf _snprintf From 9f29fc0916ea0e39150572194fb99b0d45f77a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 11:39:41 +0100 Subject: [PATCH 093/201] removed a few more unnecessary assert.h includes (nw) --- src/lib/formats/wavfile.c | 1 - src/mess/tools/imgtool/imgtool.h | 1 - src/mess/tools/imgtool/library.h | 1 - 3 files changed, 3 deletions(-) diff --git a/src/lib/formats/wavfile.c b/src/lib/formats/wavfile.c index e332110fbff..c02f9634119 100644 --- a/src/lib/formats/wavfile.c +++ b/src/lib/formats/wavfile.c @@ -7,7 +7,6 @@ *********************************************************************/ #include -#include #include "wavfile.h" #include "cassimg.h" diff --git a/src/mess/tools/imgtool/imgtool.h b/src/mess/tools/imgtool/imgtool.h index 459712fbed5..43d1ffe1017 100644 --- a/src/mess/tools/imgtool/imgtool.h +++ b/src/mess/tools/imgtool/imgtool.h @@ -11,7 +11,6 @@ #include #include -#include #include "corestr.h" #include "formats/flopimg.h" diff --git a/src/mess/tools/imgtool/library.h b/src/mess/tools/imgtool/library.h index dde2d57ed18..ff9113c748d 100644 --- a/src/mess/tools/imgtool/library.h +++ b/src/mess/tools/imgtool/library.h @@ -16,7 +16,6 @@ #define LIBRARY_H #include -#include #include "corestr.h" #include "opresolv.h" From c61c31ee062f3df7881f938372a7a8a4993acdce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 12:19:40 +0100 Subject: [PATCH 094/201] moved assert replacement inside emucore.h so it is actually used / removed assert.h include from some headers and added it to lots of source --- src/emu/emucore.h | 28 +++++++++++++++------------- src/emu/sound/wavwrite.c | 2 +- src/lib/formats/ami_dsk.c | 2 ++ src/lib/formats/ap2_dsk.c | 1 + src/lib/formats/atari_dsk.c | 2 ++ src/lib/formats/atarist_dsk.c | 2 ++ src/lib/formats/basicdsk.c | 1 + src/lib/formats/cassimg.c | 1 + src/lib/formats/coco_dsk.c | 1 + src/lib/formats/cqm_dsk.c | 1 + src/lib/formats/csw_cas.c | 1 + src/lib/formats/fdi_dsk.c | 1 + src/lib/formats/hect_dsk.c | 2 ++ src/lib/formats/kc_cas.c | 2 ++ src/lib/formats/msx_dsk.c | 2 ++ src/lib/formats/nes_dsk.c | 1 + src/lib/formats/pc98_dsk.c | 1 + src/lib/formats/pc_dsk.c | 1 + src/lib/formats/sorc_dsk.c | 1 + src/lib/formats/svi_dsk.c | 1 + src/lib/formats/thom_dsk.c | 1 + src/lib/formats/trs_dsk.c | 1 + src/lib/formats/vt_dsk.c | 1 + src/lib/formats/vtech1_dsk.c | 2 ++ src/lib/formats/z80ne_dsk.c | 2 ++ src/lib/util/avhuff.c | 2 ++ src/lib/util/aviio.c | 1 + src/lib/util/bitmap.c | 2 ++ src/lib/util/bitmap.h | 1 - src/lib/util/cdrom.c | 2 ++ src/lib/util/chd.c | 2 ++ src/lib/util/chdcd.c | 1 + src/lib/util/chdcodec.c | 2 ++ src/lib/util/coretmpl.h | 1 - src/lib/util/cstrpool.c | 2 ++ src/lib/util/flac.c | 2 ++ src/lib/util/harddisk.c | 2 ++ src/lib/util/huffman.c | 1 + src/lib/util/opresolv.c | 3 +-- src/lib/util/palette.c | 2 ++ src/lib/util/png.c | 1 + src/mess/tools/floptool/main.c | 1 + src/mess/tools/imgtool/iflopimg.c | 2 +- src/mess/tools/imgtool/imgterrs.c | 2 +- src/mess/tools/imgtool/imgtool.h | 1 + src/mess/tools/imgtool/library.c | 1 + src/tools/chdman.c | 2 ++ src/tools/ldresample.c | 1 + src/tools/ldverify.c | 1 + src/tools/pngcmp.c | 1 + src/tools/regrep.c | 1 + 51 files changed, 81 insertions(+), 20 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 23f8808a739..a9ca5b35ef9 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -31,6 +31,21 @@ #include #include +// standard assertion macros +#undef assert +#undef assert_always + +#ifdef MAME_DEBUG_FAST +#define assert(x) ((void)0) +#define assert_always(x, msg) ((void)0) +#elif MAME_DEBUG +#define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) +#else +#define assert(x) do { } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) +#endif + // core system includes #include "osdcomm.h" #include "astring.h" @@ -214,19 +229,6 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define FUNC_NULL NULL, "(null)" -// standard assertion macros -#undef assert -#undef assert_always - -#ifdef MAME_DEBUG -#define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) -#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) -#else -#define assert(x) do { } while (0) -#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) -#endif - - // macros to convert radians to degrees and degrees to radians #define RADIAN_TO_DEGREE(x) ((180.0 / M_PI) * (x)) #define DEGREE_TO_RADIAN(x) ((M_PI / 180.0) * (x)) diff --git a/src/emu/sound/wavwrite.c b/src/emu/sound/wavwrite.c index 36cae72ded5..4e4a5677c51 100644 --- a/src/emu/sound/wavwrite.c +++ b/src/emu/sound/wavwrite.c @@ -1,4 +1,4 @@ -#include "coretmpl.h" +#include "emu.h" #include "sound/wavwrite.h" struct wav_file diff --git a/src/lib/formats/ami_dsk.c b/src/lib/formats/ami_dsk.c index 230310c4995..a222208d46d 100644 --- a/src/lib/formats/ami_dsk.c +++ b/src/lib/formats/ami_dsk.c @@ -8,6 +8,8 @@ *********************************************************************/ +#include + #include "formats/ami_dsk.h" adf_format::adf_format() : floppy_image_format_t() diff --git a/src/lib/formats/ap2_dsk.c b/src/lib/formats/ap2_dsk.c index 668a44c113a..c62033eb2ff 100644 --- a/src/lib/formats/ap2_dsk.c +++ b/src/lib/formats/ap2_dsk.c @@ -8,6 +8,7 @@ #include #include +#include #include "ap2_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/atari_dsk.c b/src/lib/formats/atari_dsk.c index 3e721adc0ff..cbfbcc3d21f 100644 --- a/src/lib/formats/atari_dsk.c +++ b/src/lib/formats/atari_dsk.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "formats/atari_dsk.h" static FLOPPY_IDENTIFY( atari_dsk_identify ) diff --git a/src/lib/formats/atarist_dsk.c b/src/lib/formats/atarist_dsk.c index 7901ba2a55d..aa0761465bf 100644 --- a/src/lib/formats/atarist_dsk.c +++ b/src/lib/formats/atarist_dsk.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "formats/atarist_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/basicdsk.c b/src/lib/formats/basicdsk.c index d20a29cc7b0..6b6b11ee4d1 100644 --- a/src/lib/formats/basicdsk.c +++ b/src/lib/formats/basicdsk.c @@ -8,6 +8,7 @@ #include #include +#include #include "basicdsk.h" diff --git a/src/lib/formats/cassimg.c b/src/lib/formats/cassimg.c index bb527ce91f5..7de195315ef 100644 --- a/src/lib/formats/cassimg.c +++ b/src/lib/formats/cassimg.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "imageutl.h" #include "cassimg.h" diff --git a/src/lib/formats/coco_dsk.c b/src/lib/formats/coco_dsk.c index d583813823a..00b785d3e8b 100644 --- a/src/lib/formats/coco_dsk.c +++ b/src/lib/formats/coco_dsk.c @@ -8,6 +8,7 @@ #include #include +#include #include "formats/coco_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/cqm_dsk.c b/src/lib/formats/cqm_dsk.c index ca8ae98039b..0061af8c869 100644 --- a/src/lib/formats/cqm_dsk.c +++ b/src/lib/formats/cqm_dsk.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "flopimg.h" #define CQM_HEADER_SIZE 133 diff --git a/src/lib/formats/csw_cas.c b/src/lib/formats/csw_cas.c index 39ceb594e8f..e6b51b78c1e 100644 --- a/src/lib/formats/csw_cas.c +++ b/src/lib/formats/csw_cas.c @@ -23,6 +23,7 @@ Offset Value Type Description #include #include +#include #include "uef_cas.h" #include "csw_cas.h" diff --git a/src/lib/formats/fdi_dsk.c b/src/lib/formats/fdi_dsk.c index 9bf9019f5d3..9d556f66e9a 100644 --- a/src/lib/formats/fdi_dsk.c +++ b/src/lib/formats/fdi_dsk.c @@ -14,6 +14,7 @@ */ +#include #include "imageutl.h" #include "flopimg.h" diff --git a/src/lib/formats/hect_dsk.c b/src/lib/formats/hect_dsk.c index d3644afd536..50e112f0774 100644 --- a/src/lib/formats/hect_dsk.c +++ b/src/lib/formats/hect_dsk.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "formats/hect_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/kc_cas.c b/src/lib/formats/kc_cas.c index 9198a98c4d5..7791afd2e7a 100644 --- a/src/lib/formats/kc_cas.c +++ b/src/lib/formats/kc_cas.c @@ -13,6 +13,8 @@ ********************************************************************/ +#include + #include "kc_cas.h" #define SMPLO -32768 diff --git a/src/lib/formats/msx_dsk.c b/src/lib/formats/msx_dsk.c index df1a318ab6e..11817d8ab32 100644 --- a/src/lib/formats/msx_dsk.c +++ b/src/lib/formats/msx_dsk.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "formats/msx_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/nes_dsk.c b/src/lib/formats/nes_dsk.c index 99878833f27..ce62b4fba0e 100644 --- a/src/lib/formats/nes_dsk.c +++ b/src/lib/formats/nes_dsk.c @@ -8,6 +8,7 @@ #include +#include #include "formats/nes_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/pc98_dsk.c b/src/lib/formats/pc98_dsk.c index df527f92cc4..6ef28d01eeb 100644 --- a/src/lib/formats/pc98_dsk.c +++ b/src/lib/formats/pc98_dsk.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "formats/pc98_dsk.h" diff --git a/src/lib/formats/pc_dsk.c b/src/lib/formats/pc_dsk.c index 45a076cc91c..152dffed15a 100644 --- a/src/lib/formats/pc_dsk.c +++ b/src/lib/formats/pc_dsk.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "formats/pc_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/sorc_dsk.c b/src/lib/formats/sorc_dsk.c index e7939456139..3c7aee10c33 100644 --- a/src/lib/formats/sorc_dsk.c +++ b/src/lib/formats/sorc_dsk.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "sorc_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/svi_dsk.c b/src/lib/formats/svi_dsk.c index e94b2e2f94d..23dbb9a17e2 100644 --- a/src/lib/formats/svi_dsk.c +++ b/src/lib/formats/svi_dsk.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "svi_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/thom_dsk.c b/src/lib/formats/thom_dsk.c index b3cf47234a2..4f7230f2421 100644 --- a/src/lib/formats/thom_dsk.c +++ b/src/lib/formats/thom_dsk.c @@ -9,6 +9,7 @@ *********************************************************************/ #include +#include #include "thom_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/trs_dsk.c b/src/lib/formats/trs_dsk.c index 36c5a271622..ebe6090bcdc 100644 --- a/src/lib/formats/trs_dsk.c +++ b/src/lib/formats/trs_dsk.c @@ -1,4 +1,5 @@ #include +#include #include "trs_dsk.h" #include "basicdsk.h" #include "coco_dsk.h" diff --git a/src/lib/formats/vt_dsk.c b/src/lib/formats/vt_dsk.c index c4d1fdf91d8..0021b66eaa4 100644 --- a/src/lib/formats/vt_dsk.c +++ b/src/lib/formats/vt_dsk.c @@ -8,6 +8,7 @@ #include #include +#include #include "formats/vt_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/vtech1_dsk.c b/src/lib/formats/vtech1_dsk.c index 4ee02c89104..d7194224ebd 100644 --- a/src/lib/formats/vtech1_dsk.c +++ b/src/lib/formats/vtech1_dsk.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "formats/vtech1_dsk.h" static FLOPPY_IDENTIFY( vtech1_dsk_identify ) diff --git a/src/lib/formats/z80ne_dsk.c b/src/lib/formats/z80ne_dsk.c index be521761f64..967fecd27f5 100644 --- a/src/lib/formats/z80ne_dsk.c +++ b/src/lib/formats/z80ne_dsk.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "z80ne_dsk.h" #include "basicdsk.h" #include "imageutl.h" diff --git a/src/lib/util/avhuff.c b/src/lib/util/avhuff.c index d2642b99b35..6684c6d7ae9 100644 --- a/src/lib/util/avhuff.c +++ b/src/lib/util/avhuff.c @@ -58,6 +58,8 @@ ***************************************************************************/ +#include + #include "avhuff.h" #include "huffman.h" #include "chd.h" diff --git a/src/lib/util/aviio.c b/src/lib/util/aviio.c index 7dd2e3bb9c1..0d0403809f8 100644 --- a/src/lib/util/aviio.c +++ b/src/lib/util/aviio.c @@ -9,6 +9,7 @@ ***************************************************************************/ #include +#include #include "aviio.h" diff --git a/src/lib/util/bitmap.c b/src/lib/util/bitmap.c index 4d1f8502f50..a6e7b02f957 100644 --- a/src/lib/util/bitmap.c +++ b/src/lib/util/bitmap.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "bitmap.h" #include diff --git a/src/lib/util/bitmap.h b/src/lib/util/bitmap.h index a82ec7eebfe..91d693124e1 100644 --- a/src/lib/util/bitmap.h +++ b/src/lib/util/bitmap.h @@ -15,7 +15,6 @@ #include "osdcore.h" #include "palette.h" -#include //************************************************************************** diff --git a/src/lib/util/cdrom.c b/src/lib/util/cdrom.c index 15c10a44452..90024420555 100644 --- a/src/lib/util/cdrom.c +++ b/src/lib/util/cdrom.c @@ -16,6 +16,8 @@ ***************************************************************************/ +#include + #include "cdrom.h" #include diff --git a/src/lib/util/chd.c b/src/lib/util/chd.c index 43539103d33..c00daf7b7cf 100644 --- a/src/lib/util/chd.c +++ b/src/lib/util/chd.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "chd.h" #include "avhuff.h" #include "hashing.h" diff --git a/src/lib/util/chdcd.c b/src/lib/util/chdcd.c index 8690cc65ffa..0e6077dd70f 100644 --- a/src/lib/util/chdcd.c +++ b/src/lib/util/chdcd.c @@ -10,6 +10,7 @@ #include #include +#include #include "osdcore.h" #include "chd.h" #include "chdcd.h" diff --git a/src/lib/util/chdcodec.c b/src/lib/util/chdcodec.c index e1a001e2ebd..3bf1d6dfd63 100644 --- a/src/lib/util/chdcodec.c +++ b/src/lib/util/chdcodec.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "chd.h" #include "hashing.h" #include "avhuff.h" diff --git a/src/lib/util/coretmpl.h b/src/lib/util/coretmpl.h index e1dd388511b..93c71f0c84b 100644 --- a/src/lib/util/coretmpl.h +++ b/src/lib/util/coretmpl.h @@ -13,7 +13,6 @@ #ifndef __CORETMPL_H__ #define __CORETMPL_H__ -#include #include "osdcore.h" #include "corealloc.h" diff --git a/src/lib/util/cstrpool.c b/src/lib/util/cstrpool.c index 874e5192ea0..ea5c637e4d4 100644 --- a/src/lib/util/cstrpool.c +++ b/src/lib/util/cstrpool.c @@ -6,6 +6,8 @@ ***************************************************************************/ +#include + #include "cstrpool.h" diff --git a/src/lib/util/flac.c b/src/lib/util/flac.c index bfaa519cf53..d2f576e637e 100644 --- a/src/lib/util/flac.c +++ b/src/lib/util/flac.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "flac.h" #include diff --git a/src/lib/util/harddisk.c b/src/lib/util/harddisk.c index 87967d41f1b..46d8f5bab9a 100644 --- a/src/lib/util/harddisk.c +++ b/src/lib/util/harddisk.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "harddisk.h" #include diff --git a/src/lib/util/huffman.c b/src/lib/util/huffman.c index eee176e13ba..2da37df8194 100644 --- a/src/lib/util/huffman.c +++ b/src/lib/util/huffman.c @@ -97,6 +97,7 @@ ***************************************************************************/ #include +#include #include "coretmpl.h" #include "huffman.h" diff --git a/src/lib/util/opresolv.c b/src/lib/util/opresolv.c index d275e47d03b..b7870842b08 100644 --- a/src/lib/util/opresolv.c +++ b/src/lib/util/opresolv.c @@ -9,13 +9,12 @@ #include #include #include +#include #include "pool.h" #include "corestr.h" #include "opresolv.h" -#include - enum resolution_entry_state { RESOLUTION_ENTRY_STATE_UNSPECIFIED, diff --git a/src/lib/util/palette.c b/src/lib/util/palette.c index 6b3847f61da..4be66ee9f7b 100644 --- a/src/lib/util/palette.c +++ b/src/lib/util/palette.c @@ -8,6 +8,8 @@ ******************************************************************************/ +#include + #include "palette.h" #include #include diff --git a/src/lib/util/png.c b/src/lib/util/png.c index b88af8df44b..076b1b02965 100644 --- a/src/lib/util/png.c +++ b/src/lib/util/png.c @@ -10,6 +10,7 @@ #include #include +#include #include #include "png.h" diff --git a/src/mess/tools/floptool/main.c b/src/mess/tools/floptool/main.c index 3d823d99a58..2cb36f3a873 100644 --- a/src/mess/tools/floptool/main.c +++ b/src/mess/tools/floptool/main.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "corestr.h" diff --git a/src/mess/tools/imgtool/iflopimg.c b/src/mess/tools/imgtool/iflopimg.c index 26a91ccf749..765245cb8ff 100644 --- a/src/mess/tools/imgtool/iflopimg.c +++ b/src/mess/tools/imgtool/iflopimg.c @@ -6,8 +6,8 @@ *********************************************************************/ -#include "formats/flopimg.h" #include "imgtool.h" +#include "formats/flopimg.h" #include "library.h" #include "iflopimg.h" diff --git a/src/mess/tools/imgtool/imgterrs.c b/src/mess/tools/imgtool/imgterrs.c index dac8b9d0572..696aafdfa1a 100644 --- a/src/mess/tools/imgtool/imgterrs.c +++ b/src/mess/tools/imgtool/imgterrs.c @@ -6,9 +6,9 @@ ***************************************************************************/ +#include "imgtool.h" #include "imgterrs.h" #include "osdcomm.h" -#include static const char *const msgs[] = { diff --git a/src/mess/tools/imgtool/imgtool.h b/src/mess/tools/imgtool/imgtool.h index 43d1ffe1017..459712fbed5 100644 --- a/src/mess/tools/imgtool/imgtool.h +++ b/src/mess/tools/imgtool/imgtool.h @@ -11,6 +11,7 @@ #include #include +#include #include "corestr.h" #include "formats/flopimg.h" diff --git a/src/mess/tools/imgtool/library.c b/src/mess/tools/imgtool/library.c index fd15243edfe..b17d837aa02 100644 --- a/src/mess/tools/imgtool/library.c +++ b/src/mess/tools/imgtool/library.c @@ -9,6 +9,7 @@ #include +#include "imgtool.h" #include "library.h" #include "pool.h" diff --git a/src/tools/chdman.c b/src/tools/chdman.c index 9384566eb54..87e22bd2dbf 100644 --- a/src/tools/chdman.c +++ b/src/tools/chdman.c @@ -6,6 +6,8 @@ ****************************************************************************/ +#include + #include "osdcore.h" #include "corefile.h" #include "chdcd.h" diff --git a/src/tools/ldresample.c b/src/tools/ldresample.c index e027f88ec9a..7851814e0aa 100644 --- a/src/tools/ldresample.c +++ b/src/tools/ldresample.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "bitmap.h" #include "chd.h" #include "avhuff.h" diff --git a/src/tools/ldverify.c b/src/tools/ldverify.c index b57f987e145..2d8ff1365d2 100644 --- a/src/tools/ldverify.c +++ b/src/tools/ldverify.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "coretmpl.h" #include "aviio.h" #include "avhuff.h" diff --git a/src/tools/pngcmp.c b/src/tools/pngcmp.c index f5f1da4a2c5..31753a49be1 100644 --- a/src/tools/pngcmp.c +++ b/src/tools/pngcmp.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "osdcore.h" #include "png.h" diff --git a/src/tools/regrep.c b/src/tools/regrep.c index 114d5fa467b..c720ee1354e 100644 --- a/src/tools/regrep.c +++ b/src/tools/regrep.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "osdcore.h" #include "png.h" From 1957bc420de7967fc14d2fd1da4f28955530a6be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 12:32:57 +0100 Subject: [PATCH 095/201] removed last assert.h occurance in a header (nw) --- src/lib/util/delegate.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/util/delegate.h b/src/lib/util/delegate.h index 8cfd1c7485c..3b413456709 100644 --- a/src/lib/util/delegate.h +++ b/src/lib/util/delegate.h @@ -79,7 +79,6 @@ #define __DELEGATE_H__ // standard C++ includes -#include #include #include From d716c757cb3f22e660d540e910abe48bf0cf707f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 12:37:24 +0100 Subject: [PATCH 096/201] removed now obsolete modification for FASTDEBUG=1 (nw) --- src/emu/schedule.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/emu/schedule.c b/src/emu/schedule.c index 74dfa661469..d0d28af80e4 100644 --- a/src/emu/schedule.c +++ b/src/emu/schedule.c @@ -451,9 +451,7 @@ void device_scheduler::timeslice() attoseconds_t delta = target.attoseconds - exec->m_localtime.attoseconds; if (delta < 0 && target.seconds > exec->m_localtime.seconds) delta += ATTOSECONDS_PER_SECOND; -#ifndef MAME_DEBUG_FAST assert(delta == (target - exec->m_localtime).as_attoseconds()); -#endif // if we have enough for at least 1 cycle, do the math if (delta >= exec->m_attoseconds_per_cycle) From e6773cf5df43f72abc9ec2c145920a30a3ac32fb Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 22:54:56 +1100 Subject: [PATCH 097/201] Couple more unkch DIP switches --- src/mame/drivers/goldstar.c | 194 +++++++++++++++++++----------------- 1 file changed, 102 insertions(+), 92 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index da301b41aca..e7674fbc7b9 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -117,6 +117,16 @@ Nominated for the *WORST* hacked gambling game EVER! + * unkch sets + + unkch4 always crashes if you insert coins while already credited. unkch1 and + unkch2 show the same behaviour only if you enable the Super Jackpot feature with + DSW2-6/7. + + unkch3 has a handy input test mode. To access it, first enable it with DSW4-5, + then hold the Settings button (9) during boot. + + * Crazy Bonus (crazybon): Appears to be from a bootleg conversion set for Poker Master (pokrmast). There @@ -127,7 +137,7 @@ This is a stealth set that hides behind a fake Windows ME desktop if DSW2-6 is off. Push Start followed by Bet five time to access the game. It will return to the desktop after the game is over. Colours currently appear to be bad on - the desktop screen. + the desktop screen. DSW3-8 disables the button sequence for accessing the game. Judging from the contents of the graphics ROMs and the Stats screens, there's a poker game buried in there, but there's apparently no way to access it. @@ -2019,8 +2029,8 @@ static INPUT_PORTS_START( chryangl ) PORT_DIPSETTING( 0x10, "C-Type" ) PORT_DIPSETTING( 0x00, "D-Type" ) PORT_DIPNAME( 0x20, 0x20, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW4:6") - PORT_DIPSETTING( 0x20, "16 Bet" ) - PORT_DIPSETTING( 0x00, "8 Bet" ) + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPSETTING( 0x20, "16" ) PORT_DIPNAME( 0x40, 0x40, "Reel Speed" ) PORT_DIPLOCATION("DSW4:7") PORT_DIPSETTING( 0x40, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) @@ -4760,31 +4770,31 @@ static INPUT_PORTS_START( unkch ) out exactly how to make it repeatable... */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ PORT_DIPSETTING( 0x03, "Easy" ) PORT_DIPSETTING( 0x02, "Mid 1" ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) - PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x04, "Ticket" ) PORT_DIPSETTING( 0x00, "Gettoni" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ + PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) - PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK */ + PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK */ PORT_DIPSETTING( 0x60, DEF_STR( No ) ) PORT_DIPSETTING( 0x20, "5%" ) PORT_DIPSETTING( 0x00, "10%" ) PORT_DIPSETTING( 0x40, "20%" ) - PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW1:8") /* OK */ + PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW1:8") /* OK */ PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_START("DSW2") - PORT_DIPNAME( 0x0f, 0x0f, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:1,2,3,4") /* OK - all other values are 83% / 88% */ + PORT_DIPNAME( 0x0f, 0x0f, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:1,2,3,4") /* OK - all other values are 83% / 88% */ PORT_DIPSETTING( 0x00, "50% / 55%" ) PORT_DIPSETTING( 0x01, "53% / 58%" ) PORT_DIPSETTING( 0x02, "56% / 61%" ) @@ -4797,29 +4807,29 @@ static INPUT_PORTS_START( unkch ) PORT_DIPSETTING( 0x09, "77% / 82%" ) PORT_DIPSETTING( 0x0a, "80% / 85%" ) PORT_DIPSETTING( 0x0f, "83% / 88%" ) - PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ + PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ PORT_DIPSETTING( 0x10, "64" ) PORT_DIPSETTING( 0x00, "40 (20)" ) /* shows 20 in settings screen but limits to 40 in gameplay */ - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPNAME( 0x40, 0x40, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW2:7") /* OK */ + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPSETTING( 0x40, "16" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) PORT_DIPSETTING( 0x02, "1 Coin/20 Credits" ) PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" ) - PORT_DIPNAME( 0x04, 0x04, "Gettoni/Ticket" ) PORT_DIPLOCATION("DSW3:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Gettoni/Ticket" ) PORT_DIPLOCATION("DSW3:3") /* OK */ PORT_DIPSETTING( 0x04, "20/200" ) PORT_DIPSETTING( 0x00, "10/100" ) - PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ + PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/25 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*5 */ PORT_DIPSETTING( 0x08, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*10 */ PORT_DIPSETTING( 0x10, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*20 */ @@ -4836,146 +4846,146 @@ static INPUT_PORTS_START( unkch ) PORT_DIPSETTING( 0x08, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ PORT_DIPSETTING( 0x10, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ PORT_DIPSETTING( 0x18, "1 Coin/2,500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*50 */ - PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW4") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, "Super Jackpot Half" ) PORT_DIPLOCATION("DSW4:4") /* OK */ + PORT_DIPNAME( 0x08, 0x08, "Super Jackpot Half" ) PORT_DIPLOCATION("DSW4:4") /* OK */ PORT_DIPSETTING( 0x08, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x60, 0x60, "Red Game Credit" ) PORT_DIPLOCATION("DSW4:6,7") /* OK */ + PORT_DIPNAME( 0x60, 0x60, "Red Game Credit" ) PORT_DIPLOCATION("DSW4:6,7") /* OK */ PORT_DIPSETTING( 0x40, "0" ) PORT_DIPSETTING( 0x20, "1" ) PORT_DIPSETTING( 0x00, "10" ) PORT_DIPSETTING( 0x60, "20" ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Cherry/Bell Bonus" ) PORT_DIPLOCATION("DSW4:8") /* OK */ + PORT_DIPSETTING( 0x80, "x6 / x3" ) + PORT_DIPSETTING( 0x00, "x9 / x5" ) INPUT_PORTS_END static INPUT_PORTS_START( unkch3 ) PORT_INCLUDE( unkch_controls ) PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ PORT_DIPSETTING( 0x03, "Easy" ) PORT_DIPSETTING( 0x02, "Mid 1" ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) - PORT_DIPNAME( 0x04, 0x04, "Punti Unit" ) PORT_DIPLOCATION("DSW1:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Punti Unit" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x00, "500" ) PORT_DIPSETTING( 0x04, "1000" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ + PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2") + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, "Bet Maximum" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ + PORT_DIPNAME( 0x30, 0x30, "Bet Maximum" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ PORT_DIPSETTING( 0x00, "10 (5)" ) /* shows 5 in settings screen but limits at 10 in gameplay */ PORT_DIPSETTING( 0x10, "20 (10)" ) /* shows 10 in settings screen but limits at 20 in gameplay */ PORT_DIPSETTING( 0x20, "40 (20)" ) /* shows 20 in settings screen but limits at 40 in gameplay */ PORT_DIPSETTING( 0x30, "64" ) - PORT_DIPNAME( 0x40, 0x40, "Bet Minimum" ) PORT_DIPLOCATION("DSW2:7") /* shows in settings screen but has no effect */ + PORT_DIPNAME( 0x40, 0x40, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW2:7") /* OK - called 'Bet Minimum' in settings screen */ PORT_DIPSETTING( 0x00, "8" ) PORT_DIPSETTING( 0x40, "16" ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown) ) PORT_DIPLOCATION("DSW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:2") + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:5") + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW4") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Test Mode" ) PORT_DIPLOCATION("DSW4:5") /* OK */ + PORT_DIPNAME( 0x10, 0x10, "Test Mode" ) PORT_DIPLOCATION("DSW4:5") /* OK */ PORT_DIPSETTING( 0x10, "Disable" ) PORT_DIPSETTING( 0x00, "Enable" ) /* hold 'Settings' on reset to access */ - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:6") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Cherry/Bell Bonus" ) PORT_DIPLOCATION("DSW4:8") /* OK */ + PORT_DIPSETTING( 0x80, "x6 / x3" ) + PORT_DIPSETTING( 0x00, "x9 / x5" ) INPUT_PORTS_END static INPUT_PORTS_START( unkch4 ) @@ -4989,31 +4999,31 @@ static INPUT_PORTS_START( unkch4 ) out exactly how to make it repeatable... */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Game Level" ) PORT_DIPLOCATION("DSW1:1,2") /* OK */ PORT_DIPSETTING( 0x03, "Easy" ) PORT_DIPSETTING( 0x02, "Mid 1" ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) - PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ + PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x04, "Ticket" ) PORT_DIPSETTING( 0x00, "Gettoni" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ + PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) - PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK */ + PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK - shows in test mode but always seems to be enabled in gameplay */ PORT_DIPSETTING( 0x60, DEF_STR( No ) ) PORT_DIPSETTING( 0x20, "5%" ) PORT_DIPSETTING( 0x00, "10%" ) PORT_DIPSETTING( 0x40, "20%" ) - PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW1:8") /* OK */ + PORT_DIPNAME( 0x80, 0x80, "Bet Step On 8" ) PORT_DIPLOCATION("DSW1:8") /* OK */ PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_START("DSW2") - PORT_DIPNAME( 0x0f, 0x0f, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:1,2,3,4") /* OK - all other values are 83% / 88% */ + PORT_DIPNAME( 0x0f, 0x0f, "Main/Bonus Game Rate" ) PORT_DIPLOCATION("DSW2:1,2,3,4") /* OK - all other values are 83% / 88% */ PORT_DIPSETTING( 0x00, "50% / 55%" ) PORT_DIPSETTING( 0x01, "53% / 58%" ) PORT_DIPSETTING( 0x02, "56% / 61%" ) @@ -5026,29 +5036,29 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x09, "77% / 82%" ) PORT_DIPSETTING( 0x0a, "80% / 85%" ) PORT_DIPSETTING( 0x0f, "83% / 88%" ) - PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ + PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ PORT_DIPSETTING( 0x00, "32" ) PORT_DIPSETTING( 0x10, "64" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPNAME( 0x40, 0x40, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW2:7") /* OK */ + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPSETTING( 0x40, "16" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_8C ) ) PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) PORT_DIPSETTING( 0x02, "1 Coin/20 Credits" ) PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ + PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*5 */ PORT_DIPSETTING( 0x08, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ PORT_DIPSETTING( 0x10, "1 Coin/160 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*20 */ @@ -5065,7 +5075,7 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x08, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ PORT_DIPSETTING( 0x10, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ PORT_DIPSETTING( 0x18, "1 Coin/2,500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*50 */ - PORT_DIPNAME( 0x20, 0x20, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x20, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*5 */ PORT_DIPSETTING( 0x20, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ PORT_DIPSETTING( 0x00, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*5 */ @@ -5074,7 +5084,7 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x20, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*10 */ PORT_DIPSETTING( 0x00, "1 Coin/250 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*5 */ PORT_DIPSETTING( 0x20, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ PORT_DIPSETTING( 0x40, "1 Coin/160 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*20 */ PORT_DIPSETTING( 0x00, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*10 */ @@ -5083,35 +5093,35 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x40, "1 Coin/400 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*20 */ PORT_DIPSETTING( 0x00, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ PORT_DIPSETTING( 0x40, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW4") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:6") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Cherry/Bell Bonus" ) PORT_DIPLOCATION("DSW4:8") /* OK */ + PORT_DIPSETTING( 0x80, "x6 / x3" ) + PORT_DIPSETTING( 0x00, "x9 / x5" ) INPUT_PORTS_END From 10385fe13023e611ed2f4c96e61f1859f0ebc85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 13:06:57 +0100 Subject: [PATCH 098/201] fixed several missing assert.h includes (nw) --- src/build/makedep.c | 1 + src/build/makemak.c | 1 + src/lib/formats/a26_cas.c | 1 + src/lib/formats/ace_tap.c | 3 +++ src/lib/formats/adam_cas.c | 2 ++ src/lib/formats/apf_apt.c | 2 ++ src/lib/formats/atom_tap.c | 2 ++ src/lib/formats/cbm_tap.c | 2 ++ src/lib/formats/cgen_cas.c | 2 ++ src/lib/formats/fc100_cas.c | 2 ++ src/lib/formats/fm7_cas.c | 2 ++ src/lib/formats/fmsx_cas.c | 2 ++ src/lib/formats/gtp_cas.c | 2 ++ src/lib/formats/hect_tap.c | 2 ++ src/lib/formats/ioprocs.c | 1 + src/lib/formats/kim1_cas.c | 2 ++ src/lib/formats/lviv_lvt.c | 2 ++ src/lib/formats/mbee_cas.c | 2 ++ src/lib/formats/mz_cas.c | 1 + src/lib/formats/orao_cas.c | 2 ++ src/lib/formats/oric_tap.c | 2 ++ src/lib/formats/p6001_cas.c | 2 ++ src/lib/formats/phc25_cas.c | 2 ++ src/lib/formats/pmd_cas.c | 2 ++ src/lib/formats/primoptp.c | 2 ++ src/lib/formats/rk_cas.c | 2 ++ src/lib/formats/sc3000_bit.c | 2 ++ src/lib/formats/sol_cas.c | 2 ++ src/lib/formats/sorc_cas.c | 2 ++ src/lib/formats/sord_cas.c | 1 + src/lib/formats/spc1000_cas.c | 2 ++ src/lib/formats/svi_cas.c | 2 ++ src/lib/formats/thom_cas.c | 1 + src/lib/formats/trs_cas.c | 2 ++ src/lib/formats/tvc_cas.c | 2 ++ src/lib/formats/tzx_cas.c | 2 ++ src/lib/formats/uef_cas.c | 1 + src/lib/formats/vg5k_cas.c | 2 ++ src/lib/formats/vt_cas.c | 2 ++ src/lib/formats/wavfile.c | 1 + src/lib/formats/x07_cas.c | 2 ++ src/lib/formats/x1_tap.c | 2 ++ src/lib/formats/zx81_p.c | 2 ++ src/lib/util/corefile.c | 2 ++ src/lib/util/delegate.c | 2 ++ src/lib/util/options.c | 1 + src/lib/util/tagmap.c | 2 ++ src/lib/util/xmlfile.c | 2 ++ src/lib/util/zippath.c | 1 + src/mess/tools/castool/main.c | 1 + src/mess/tools/imgtool/modules.c | 1 + src/tools/nltool.c | 1 + src/tools/split.c | 1 + src/tools/src2html.c | 1 + 54 files changed, 93 insertions(+) diff --git a/src/build/makedep.c b/src/build/makedep.c index 8e135871d09..09ca9a75b49 100644 --- a/src/build/makedep.c +++ b/src/build/makedep.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "osdcore.h" #include "astring.h" #include "corefile.h" diff --git a/src/build/makemak.c b/src/build/makemak.c index 9f83357cac4..dfbd36cfef3 100644 --- a/src/build/makemak.c +++ b/src/build/makemak.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "osdcore.h" #include "astring.h" #include "corefile.h" diff --git a/src/lib/formats/a26_cas.c b/src/lib/formats/a26_cas.c index 5d557626912..7ee425fd1af 100644 --- a/src/lib/formats/a26_cas.c +++ b/src/lib/formats/a26_cas.c @@ -4,6 +4,7 @@ Atari 2600 SuperCharger support */ +#include #include "formats/a26_cas.h" diff --git a/src/lib/formats/ace_tap.c b/src/lib/formats/ace_tap.c index b57dcb03cd7..8d6d4694b05 100644 --- a/src/lib/formats/ace_tap.c +++ b/src/lib/formats/ace_tap.c @@ -7,6 +7,9 @@ For more information see: - http://www.jupiter-ace.co.uk/doc_AceTapeFormat.html ********************************************************************/ + +#include + #include "ace_tap.h" diff --git a/src/lib/formats/adam_cas.c b/src/lib/formats/adam_cas.c index 1e8e328b517..83f873c5f00 100644 --- a/src/lib/formats/adam_cas.c +++ b/src/lib/formats/adam_cas.c @@ -1,4 +1,6 @@ +#include + #include "cassimg.h" #include "adam_cas.h" diff --git a/src/lib/formats/apf_apt.c b/src/lib/formats/apf_apt.c index 58582ef5dc8..b609a109ef6 100644 --- a/src/lib/formats/apf_apt.c +++ b/src/lib/formats/apf_apt.c @@ -34,6 +34,8 @@ e. A checksum byte (8-bit addition) ********************************************************************/ +#include + #include "formats/apf_apt.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/atom_tap.c b/src/lib/formats/atom_tap.c index a5a76a8733e..99335fa4230 100644 --- a/src/lib/formats/atom_tap.c +++ b/src/lib/formats/atom_tap.c @@ -38,6 +38,8 @@ */ +#include + #include "atom_tap.h" #include "uef_cas.h" /*************************************************************************** diff --git a/src/lib/formats/cbm_tap.c b/src/lib/formats/cbm_tap.c index a78b03df117..f02b4ac1968 100644 --- a/src/lib/formats/cbm_tap.c +++ b/src/lib/formats/cbm_tap.c @@ -92,6 +92,8 @@ Unfortunately, I have no such a .tap file to test, so my implementation below could be not working. FP ] */ +#include + #include "cbm_tap.h" diff --git a/src/lib/formats/cgen_cas.c b/src/lib/formats/cgen_cas.c index 242e833ceb2..5d29f7e2b61 100644 --- a/src/lib/formats/cgen_cas.c +++ b/src/lib/formats/cgen_cas.c @@ -7,6 +7,8 @@ Current state: Not working. Only the sync signal and 0x66 byte get ********************************************************************/ +#include + #include "formats/cgen_cas.h" #define TAPE_HEADER "Colour Genie - Virtual Tape File" diff --git a/src/lib/formats/fc100_cas.c b/src/lib/formats/fc100_cas.c index 64deef962a0..415d3fb01db 100644 --- a/src/lib/formats/fc100_cas.c +++ b/src/lib/formats/fc100_cas.c @@ -10,6 +10,8 @@ it's all a guess. ********************************************************************/ +#include + #include "fc100_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/fm7_cas.c b/src/lib/formats/fm7_cas.c index 32ec7390459..48b0239f738 100644 --- a/src/lib/formats/fm7_cas.c +++ b/src/lib/formats/fm7_cas.c @@ -2,6 +2,8 @@ * Fujitsu FM-7 series cassette handling */ +#include + #include "fm7_cas.h" #define WAVE_HIGH 0x5a9e diff --git a/src/lib/formats/fmsx_cas.c b/src/lib/formats/fmsx_cas.c index 082be3cda3f..54b64ae4d01 100644 --- a/src/lib/formats/fmsx_cas.c +++ b/src/lib/formats/fmsx_cas.c @@ -1,3 +1,5 @@ +#include + #include "formats/fmsx_cas.h" diff --git a/src/lib/formats/gtp_cas.c b/src/lib/formats/gtp_cas.c index 47baa0aba7e..0fe391e9767 100644 --- a/src/lib/formats/gtp_cas.c +++ b/src/lib/formats/gtp_cas.c @@ -4,6 +4,8 @@ Miodrag Milanovic */ +#include + #include "gtp_cas.h" diff --git a/src/lib/formats/hect_tap.c b/src/lib/formats/hect_tap.c index ad67de93ecc..745cf2a0038 100644 --- a/src/lib/formats/hect_tap.c +++ b/src/lib/formats/hect_tap.c @@ -12,6 +12,8 @@ You can find some *.K7 file on serveral server in France Updated 3/1/10 : use real value for timing. ********************************************************************/ +#include + #include "hect_tap.h" diff --git a/src/lib/formats/ioprocs.c b/src/lib/formats/ioprocs.c index 3c47414ae00..b1771bf3774 100644 --- a/src/lib/formats/ioprocs.c +++ b/src/lib/formats/ioprocs.c @@ -1,5 +1,6 @@ #include #include +#include #include "osdcore.h" #include "ioprocs.h" #include "corefile.h" diff --git a/src/lib/formats/kim1_cas.c b/src/lib/formats/kim1_cas.c index c3e048e6acc..b8433c0eea0 100644 --- a/src/lib/formats/kim1_cas.c +++ b/src/lib/formats/kim1_cas.c @@ -1,3 +1,5 @@ +#include + #include "kim1_cas.h" #define SMPLO -32768 diff --git a/src/lib/formats/lviv_lvt.c b/src/lib/formats/lviv_lvt.c index 62de1d63981..87a56a6e2c2 100644 --- a/src/lib/formats/lviv_lvt.c +++ b/src/lib/formats/lviv_lvt.c @@ -1,4 +1,6 @@ /* .LVT tape images */ +#include + #include "lviv_lvt.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/mbee_cas.c b/src/lib/formats/mbee_cas.c index 592ae38e627..fe0a2ffbc24 100644 --- a/src/lib/formats/mbee_cas.c +++ b/src/lib/formats/mbee_cas.c @@ -56,6 +56,8 @@ TAP - has an ID header of TAP_DGOS_BEE or MBEE, null terminated. ********************************************************************/ +#include + #include "mbee_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/mz_cas.c b/src/lib/formats/mz_cas.c index d7897ddf56f..56662f6c760 100644 --- a/src/lib/formats/mz_cas.c +++ b/src/lib/formats/mz_cas.c @@ -1,4 +1,5 @@ #include +#include #include "mz_cas.h" #ifndef VERBOSE diff --git a/src/lib/formats/orao_cas.c b/src/lib/formats/orao_cas.c index 78080b19f1b..c771b234dda 100644 --- a/src/lib/formats/orao_cas.c +++ b/src/lib/formats/orao_cas.c @@ -3,6 +3,8 @@ Tape support for Orao TAP format */ +#include + #include "orao_cas.h" diff --git a/src/lib/formats/oric_tap.c b/src/lib/formats/oric_tap.c index ac6e6c0f72a..123552eea7a 100644 --- a/src/lib/formats/oric_tap.c +++ b/src/lib/formats/oric_tap.c @@ -1,3 +1,5 @@ +#include + #include "oric_tap.h" #define ORIC_WAV_DEBUG 0 diff --git a/src/lib/formats/p6001_cas.c b/src/lib/formats/p6001_cas.c index 78e5e929963..debe3f3b261 100644 --- a/src/lib/formats/p6001_cas.c +++ b/src/lib/formats/p6001_cas.c @@ -2,6 +2,8 @@ * NEC PC-6001 cassette format handling */ +#include + #include "p6001_cas.h" #define WAVE_HIGH 0x5a9e diff --git a/src/lib/formats/phc25_cas.c b/src/lib/formats/phc25_cas.c index a0d807a335c..1253bd98a3a 100644 --- a/src/lib/formats/phc25_cas.c +++ b/src/lib/formats/phc25_cas.c @@ -29,6 +29,8 @@ enough to make it work. ********************************************************************/ +#include + #include "phc25_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/pmd_cas.c b/src/lib/formats/pmd_cas.c index eefb8fc9622..ba5baee1a65 100644 --- a/src/lib/formats/pmd_cas.c +++ b/src/lib/formats/pmd_cas.c @@ -10,6 +10,8 @@ ********************************************************************/ +#include + #include "pmd_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/primoptp.c b/src/lib/formats/primoptp.c index ad8606617d9..6373d43fd4f 100644 --- a/src/lib/formats/primoptp.c +++ b/src/lib/formats/primoptp.c @@ -1,6 +1,8 @@ /* .PTP Microkey Primo tape images */ +#include + #include "primoptp.h" diff --git a/src/lib/formats/rk_cas.c b/src/lib/formats/rk_cas.c index 2a20a8499ab..150b17c8f3b 100644 --- a/src/lib/formats/rk_cas.c +++ b/src/lib/formats/rk_cas.c @@ -3,6 +3,8 @@ Tape support for RK format */ +#include + #include "rk_cas.h" diff --git a/src/lib/formats/sc3000_bit.c b/src/lib/formats/sc3000_bit.c index 4afe91371f9..f38f5a8d8c6 100644 --- a/src/lib/formats/sc3000_bit.c +++ b/src/lib/formats/sc3000_bit.c @@ -6,6 +6,8 @@ *********************************************************************/ +#include + #include "sc3000_bit.h" /*************************************************************************** diff --git a/src/lib/formats/sol_cas.c b/src/lib/formats/sol_cas.c index e5dc79cd21a..26f1bdccf00 100644 --- a/src/lib/formats/sol_cas.c +++ b/src/lib/formats/sol_cas.c @@ -34,6 +34,8 @@ SVT - The full explanation may be found on the Solace web site, ********************************************************************/ +#include + #include "sol_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/sorc_cas.c b/src/lib/formats/sorc_cas.c index 99e9d46f7d9..6983dd0ba74 100644 --- a/src/lib/formats/sorc_cas.c +++ b/src/lib/formats/sorc_cas.c @@ -25,6 +25,8 @@ header and leader bytes. ********************************************************************/ +#include + #include "sorc_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/sord_cas.c b/src/lib/formats/sord_cas.c index cab593d66e8..a2834931a2a 100644 --- a/src/lib/formats/sord_cas.c +++ b/src/lib/formats/sord_cas.c @@ -7,6 +7,7 @@ **************************************************************************/ #include +#include #include "sord_cas.h" #define SORDM5_WAVESAMPLES_HEADER 1 diff --git a/src/lib/formats/spc1000_cas.c b/src/lib/formats/spc1000_cas.c index b02c287d02b..b05844b6ee7 100644 --- a/src/lib/formats/spc1000_cas.c +++ b/src/lib/formats/spc1000_cas.c @@ -21,6 +21,8 @@ IPL: This seems a quickload format containing RAM dump, not a real tape ********************************************************************/ +#include + #include "spc1000_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/svi_cas.c b/src/lib/formats/svi_cas.c index edb015382ba..6b693b4d461 100644 --- a/src/lib/formats/svi_cas.c +++ b/src/lib/formats/svi_cas.c @@ -1,3 +1,5 @@ +#include + #include "svi_cas.h" #define CAS_PERIOD_0 (37) diff --git a/src/lib/formats/thom_cas.c b/src/lib/formats/thom_cas.c index e48f217ead6..36fb6e4de51 100644 --- a/src/lib/formats/thom_cas.c +++ b/src/lib/formats/thom_cas.c @@ -7,6 +7,7 @@ **********************************************************************/ #include +#include #include "pool.h" #include "cassimg.h" diff --git a/src/lib/formats/trs_cas.c b/src/lib/formats/trs_cas.c index 6956e488d4c..6e143200bc9 100644 --- a/src/lib/formats/trs_cas.c +++ b/src/lib/formats/trs_cas.c @@ -4,6 +4,8 @@ Support for TRS80 .cas cassette images ********************************************************************/ +#include + #include "formats/trs_cas.h" #define SILENCE 0 diff --git a/src/lib/formats/tvc_cas.c b/src/lib/formats/tvc_cas.c index a24b1ed79b1..a33fba687b9 100644 --- a/src/lib/formats/tvc_cas.c +++ b/src/lib/formats/tvc_cas.c @@ -8,6 +8,8 @@ ********************************************************************/ +#include + #include "tvc_cas.h" #define TVC64_BIT0_FREQ 1812 diff --git a/src/lib/formats/tzx_cas.c b/src/lib/formats/tzx_cas.c index c7950138a09..71ad4c747f5 100644 --- a/src/lib/formats/tzx_cas.c +++ b/src/lib/formats/tzx_cas.c @@ -38,6 +38,8 @@ We are currently using the numbers from the TZX specification... */ +#include + #include "tzx_cas.h" diff --git a/src/lib/formats/uef_cas.c b/src/lib/formats/uef_cas.c index 60a4ade6775..6a5c8668c8e 100644 --- a/src/lib/formats/uef_cas.c +++ b/src/lib/formats/uef_cas.c @@ -12,6 +12,7 @@ Not nice, but it works... #include #include +#include #include #include "uef_cas.h" diff --git a/src/lib/formats/vg5k_cas.c b/src/lib/formats/vg5k_cas.c index 78e63cabb0b..ef648707fd8 100644 --- a/src/lib/formats/vg5k_cas.c +++ b/src/lib/formats/vg5k_cas.c @@ -5,6 +5,8 @@ Support for VG-5000 .k7 cassette images ********************************************************************/ +#include + #include "vg5k_cas.h" diff --git a/src/lib/formats/vt_cas.c b/src/lib/formats/vt_cas.c index 4040b00d7aa..734954a2ab6 100644 --- a/src/lib/formats/vt_cas.c +++ b/src/lib/formats/vt_cas.c @@ -1,3 +1,5 @@ +#include + #include "formats/vt_cas.h" /********************************************************************* diff --git a/src/lib/formats/wavfile.c b/src/lib/formats/wavfile.c index c02f9634119..e332110fbff 100644 --- a/src/lib/formats/wavfile.c +++ b/src/lib/formats/wavfile.c @@ -7,6 +7,7 @@ *********************************************************************/ #include +#include #include "wavfile.h" #include "cassimg.h" diff --git a/src/lib/formats/x07_cas.c b/src/lib/formats/x07_cas.c index fb581f6a44c..54f46acd488 100644 --- a/src/lib/formats/x07_cas.c +++ b/src/lib/formats/x07_cas.c @@ -6,6 +6,8 @@ ********************************************************************/ +#include + #include "x07_cas.h" #define WAVEENTRY_LOW -32768 diff --git a/src/lib/formats/x1_tap.c b/src/lib/formats/x1_tap.c index 3d42c41dad4..880037c8f3a 100644 --- a/src/lib/formats/x1_tap.c +++ b/src/lib/formats/x1_tap.c @@ -19,6 +19,8 @@ * */ +#include + #include "x1_tap.h" #define WAVE_HIGH 0x5a9e diff --git a/src/lib/formats/zx81_p.c b/src/lib/formats/zx81_p.c index bfb871c3c51..e2e1e33f035 100644 --- a/src/lib/formats/zx81_p.c +++ b/src/lib/formats/zx81_p.c @@ -29,6 +29,8 @@ medium transfer rate is approx. 307 bps (38 bytes/sec) for files that contain *****************************************************************************/ +#include + #include "zx81_p.h" diff --git a/src/lib/util/corefile.c b/src/lib/util/corefile.c index 977024b5143..abba0a6b5b9 100644 --- a/src/lib/util/corefile.c +++ b/src/lib/util/corefile.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "corefile.h" #include "unicode.h" #include diff --git a/src/lib/util/delegate.c b/src/lib/util/delegate.c index ad66cc09168..6c688f72985 100644 --- a/src/lib/util/delegate.c +++ b/src/lib/util/delegate.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "osdcomm.h" #include "delegate.h" diff --git a/src/lib/util/options.c b/src/lib/util/options.c index 96315678471..ba580c9ee3a 100644 --- a/src/lib/util/options.c +++ b/src/lib/util/options.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "options.h" #include "astring.h" diff --git a/src/lib/util/tagmap.c b/src/lib/util/tagmap.c index c3f1ad304db..c8247899dcc 100644 --- a/src/lib/util/tagmap.c +++ b/src/lib/util/tagmap.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "tagmap.h" #ifdef MAME_DEBUG diff --git a/src/lib/util/xmlfile.c b/src/lib/util/xmlfile.c index 2c8d78cdcdb..e03893134f9 100644 --- a/src/lib/util/xmlfile.c +++ b/src/lib/util/xmlfile.c @@ -8,6 +8,8 @@ ***************************************************************************/ +#include + #include "xmlfile.h" #include #include diff --git a/src/lib/util/zippath.c b/src/lib/util/zippath.c index d0f5931658d..e5e563cdbde 100644 --- a/src/lib/util/zippath.c +++ b/src/lib/util/zippath.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "zippath.h" #include "unzip.h" #include "corestr.h" diff --git a/src/mess/tools/castool/main.c b/src/mess/tools/castool/main.c index e41542980b8..22564dcdf78 100644 --- a/src/mess/tools/castool/main.c +++ b/src/mess/tools/castool/main.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "corestr.h" diff --git a/src/mess/tools/imgtool/modules.c b/src/mess/tools/imgtool/modules.c index 192a0176528..eec6c564025 100644 --- a/src/mess/tools/imgtool/modules.c +++ b/src/mess/tools/imgtool/modules.c @@ -6,6 +6,7 @@ ***************************************************************************/ +#include "imgtool.h" #include "modules.h" #ifndef MODULES_RECURSIVE diff --git a/src/tools/nltool.c b/src/tools/nltool.c index 22d4cf6bd8d..92b4960be4d 100644 --- a/src/tools/nltool.c +++ b/src/tools/nltool.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "astring.h" #include "corefile.h" #include "corestr.h" diff --git a/src/tools/split.c b/src/tools/split.c index 2144f11b9c2..02e546fce14 100644 --- a/src/tools/split.c +++ b/src/tools/split.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "astring.h" #include "corefile.h" #include "corestr.h" diff --git a/src/tools/src2html.c b/src/tools/src2html.c index dbbc3512c9e..5ebe31ee71f 100644 --- a/src/tools/src2html.c +++ b/src/tools/src2html.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "osdcore.h" #include "astring.h" #include "corefile.h" From 0c7e07d96bcb501309fcedea4390beb972e7f2d7 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 23:06:56 +1100 Subject: [PATCH 099/201] Fix build - come on guys, there's no way this could've possibly worked for anyone --- src/emu/emucore.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index a9ca5b35ef9..b0010ef34ad 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -35,10 +35,10 @@ #undef assert #undef assert_always -#ifdef MAME_DEBUG_FAST -#define assert(x) ((void)0) -#define assert_always(x, msg) ((void)0) -#elif MAME_DEBUG +#if defined(MAME_DEBUG_FAST) +#define assert(x) do { } while (0) +#define assert_always(x, msg) do { } while (0) +#elif defined(MAME_DEBUG) #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) #else From bff99e6130d303d667f2e16345c5fef6daa7c4da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 13:15:46 +0100 Subject: [PATCH 100/201] disabled assert replacement for now since it doesn't compile anymore (nw) emu_fatalerror is unknown to code in the includes / also assert_always() does nothing in non-DEBUG builds --- src/emu/emucore.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index b0010ef34ad..84bf56633f4 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -31,6 +31,11 @@ #include #include +// TODO: make the assert replacement and especially assert_always work again +#include +#define assert_always(x, msg) assert(x) + +/* // standard assertion macros #undef assert #undef assert_always @@ -45,6 +50,7 @@ #define assert(x) do { } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) #endif +*/ // core system includes #include "osdcomm.h" From 5ffe5ce5513a51e7be74a0af90556bc2fa1aab5a Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 23:45:12 +1100 Subject: [PATCH 101/201] there is no way something called assert_always should ever be compiled out - people should be able to depend on side effects of something with 'always' in the name --- src/emu/emucore.h | 67 +++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 84bf56633f4..cb2de93caee 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -31,18 +31,44 @@ #include #include -// TODO: make the assert replacement and especially assert_always work again -#include -#define assert_always(x, msg) assert(x) +// needed for OSD macros +#include "osdcomm.h" + + + +//************************************************************************** +// EXCEPTION CLASSES +//************************************************************************** + +// emu_exception is the base class for all emu-related exceptions +class emu_exception : public std::exception { }; + + +// emu_fatalerror is a generic fatal exception that provides an error string +class emu_fatalerror : public emu_exception +{ +public: + emu_fatalerror(const char *format, ...) ATTR_PRINTF(2,3); + emu_fatalerror(const char *format, va_list ap); + emu_fatalerror(int _exitcode, const char *format, ...) ATTR_PRINTF(3,4); + emu_fatalerror(int _exitcode, const char *format, va_list ap); + + const char *string() const { return text; } + int exitcode() const { return code; } + +private: + char text[1024]; + int code; +}; + -/* // standard assertion macros #undef assert #undef assert_always #if defined(MAME_DEBUG_FAST) #define assert(x) do { } while (0) -#define assert_always(x, msg) do { } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) #elif defined(MAME_DEBUG) #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) @@ -50,10 +76,10 @@ #define assert(x) do { } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) #endif -*/ + + // core system includes -#include "osdcomm.h" #include "astring.h" #include "emualloc.h" #include "corestr.h" @@ -283,33 +309,6 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } -//************************************************************************** -// EXCEPTION CLASSES -//************************************************************************** - -// emu_exception is the base class for all emu-related exceptions -class emu_exception : public std::exception { }; - - -// emu_fatalerror is a generic fatal exception that provides an error string -class emu_fatalerror : public emu_exception -{ -public: - emu_fatalerror(const char *format, ...) ATTR_PRINTF(2,3); - emu_fatalerror(const char *format, va_list ap); - emu_fatalerror(int _exitcode, const char *format, ...) ATTR_PRINTF(3,4); - emu_fatalerror(int _exitcode, const char *format, va_list ap); - - const char *string() const { return text; } - int exitcode() const { return code; } - -private: - char text[1024]; - int code; -}; - - - //************************************************************************** // CASTING TEMPLATES //************************************************************************** From 4282a7c9f201b957b34f2142746b939e02ead0a9 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 23:48:11 +1100 Subject: [PATCH 102/201] If you're planning to redefine something, you should #include the definition you plan to walk over --- src/emu/emucore.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index cb2de93caee..0f89ae59f50 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -15,6 +15,7 @@ #define __EMUCORE_H__ // standard C includes +#include // make sure this is included before we try redefining assert #include #include #include From ca94bb7905e486fc68369893531db858645d38e7 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 20 Mar 2015 23:56:45 +1100 Subject: [PATCH 103/201] Changing FASTDEBUG to be assert-free is too big a change to push through without public discussion --- src/emu/emucore.h | 5 +---- src/emu/schedule.c | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 0f89ae59f50..950209f6f33 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -67,10 +67,7 @@ private: #undef assert #undef assert_always -#if defined(MAME_DEBUG_FAST) -#define assert(x) do { } while (0) -#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) -#elif defined(MAME_DEBUG) +#ifdef MAME_DEBUG #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) #else diff --git a/src/emu/schedule.c b/src/emu/schedule.c index d0d28af80e4..74dfa661469 100644 --- a/src/emu/schedule.c +++ b/src/emu/schedule.c @@ -451,7 +451,9 @@ void device_scheduler::timeslice() attoseconds_t delta = target.attoseconds - exec->m_localtime.attoseconds; if (delta < 0 && target.seconds > exec->m_localtime.seconds) delta += ATTOSECONDS_PER_SECOND; +#ifndef MAME_DEBUG_FAST assert(delta == (target - exec->m_localtime).as_attoseconds()); +#endif // if we have enough for at least 1 cycle, do the math if (delta >= exec->m_attoseconds_per_cycle) From 0bdcbac42ead7354ed80d383462092e6f31e09ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 14:09:50 +0100 Subject: [PATCH 104/201] cleaned up emu.h usage in src/lib/formats (nw) --- src/lib/formats/a5105_dsk.c | 3 ++- src/lib/formats/abc800_dsk.c | 3 ++- src/lib/formats/adam_dsk.c | 3 ++- src/lib/formats/ap_dsk35.c | 1 + src/lib/formats/apollo_dsk.c | 3 ++- src/lib/formats/applix_dsk.c | 3 ++- src/lib/formats/asst128_dsk.c | 3 ++- src/lib/formats/bw12_dsk.c | 3 ++- src/lib/formats/bw2_dsk.c | 3 ++- src/lib/formats/cbm_crt.c | 3 +++ src/lib/formats/cbm_crt.h | 1 - src/lib/formats/ccvf_dsk.c | 3 ++- src/lib/formats/coco_cas.c | 2 +- src/lib/formats/comx35_dsk.c | 3 ++- src/lib/formats/concept_dsk.c | 3 ++- src/lib/formats/coupedsk.c | 3 ++- src/lib/formats/cpis_dsk.c | 2 +- src/lib/formats/d64_dsk.c | 2 +- src/lib/formats/d67_dsk.c | 2 +- src/lib/formats/d71_dsk.c | 2 +- src/lib/formats/d80_dsk.c | 2 +- src/lib/formats/d81_dsk.c | 3 ++- src/lib/formats/d82_dsk.c | 2 +- src/lib/formats/d88_dsk.c | 3 ++- src/lib/formats/dcp_dsk.c | 3 ++- src/lib/formats/dfi_dsk.c | 2 +- src/lib/formats/dim_dsk.c | 2 +- src/lib/formats/dip_dsk.c | 3 ++- src/lib/formats/dmk_dsk.c | 3 ++- src/lib/formats/dmv_dsk.c | 3 ++- src/lib/formats/dsk_dsk.c | 2 +- src/lib/formats/ep64_dsk.c | 3 ++- src/lib/formats/esq16_dsk.c | 3 ++- src/lib/formats/esq8_dsk.c | 3 ++- src/lib/formats/excali64_dsk.c | 3 ++- src/lib/formats/fdd_dsk.c | 3 ++- src/lib/formats/flex_dsk.c | 2 +- src/lib/formats/flopimg.c | 1 + src/lib/formats/fmtowns_dsk.c | 3 ++- src/lib/formats/g64_dsk.c | 2 +- src/lib/formats/hxcmfm_dsk.c | 3 ++- src/lib/formats/imd_dsk.c | 2 +- src/lib/formats/ipf_dsk.c | 2 +- src/lib/formats/iq151_dsk.c | 3 ++- src/lib/formats/itt3030_dsk.c | 3 ++- src/lib/formats/kaypro_dsk.c | 3 ++- src/lib/formats/kc85_dsk.c | 3 ++- src/lib/formats/m20_dsk.c | 2 +- src/lib/formats/m5_dsk.c | 3 ++- src/lib/formats/mfi_dsk.c | 3 ++- src/lib/formats/mm_dsk.c | 3 ++- src/lib/formats/nanos_dsk.c | 3 ++- src/lib/formats/naslite_dsk.c | 3 ++- src/lib/formats/nfd_dsk.c | 3 ++- src/lib/formats/oric_dsk.c | 2 +- src/lib/formats/pasti_dsk.c | 2 +- src/lib/formats/pc98fdi_dsk.c | 2 +- src/lib/formats/pyldin_dsk.c | 2 +- src/lib/formats/ql_dsk.c | 3 ++- src/lib/formats/rx50_dsk.c | 3 ++- src/lib/formats/sf7000_dsk.c | 3 ++- src/lib/formats/smx_dsk.c | 3 ++- src/lib/formats/st_dsk.c | 3 ++- src/lib/formats/tandy2k_dsk.c | 3 ++- src/lib/formats/td0_dsk.c | 2 +- src/lib/formats/ti99_dsk.c | 3 ++- src/lib/formats/tiki100_dsk.c | 3 ++- src/lib/formats/trd_dsk.c | 3 ++- src/lib/formats/tvc_dsk.c | 3 ++- src/lib/formats/upd765_dsk.c | 2 +- src/lib/formats/victor9k_dsk.c | 2 +- src/lib/formats/wd177x_dsk.c | 2 +- src/lib/formats/xdf_dsk.c | 3 ++- 73 files changed, 120 insertions(+), 70 deletions(-) diff --git a/src/lib/formats/a5105_dsk.c b/src/lib/formats/a5105_dsk.c index 61586f93851..33d7f15e1fd 100644 --- a/src/lib/formats/a5105_dsk.c +++ b/src/lib/formats/a5105_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/a5105_dsk.h" a5105_format::a5105_format() : upd765_format(formats) diff --git a/src/lib/formats/abc800_dsk.c b/src/lib/formats/abc800_dsk.c index b1d0db2c640..5686d502382 100644 --- a/src/lib/formats/abc800_dsk.c +++ b/src/lib/formats/abc800_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/abc800_dsk.h" abc800_format::abc800_format() : wd177x_format(formats) diff --git a/src/lib/formats/adam_dsk.c b/src/lib/formats/adam_dsk.c index 1b966a3395b..e78e94a4763 100644 --- a/src/lib/formats/adam_dsk.c +++ b/src/lib/formats/adam_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/adam_dsk.h" adam_format::adam_format() : wd177x_format(formats) diff --git a/src/lib/formats/ap_dsk35.c b/src/lib/formats/ap_dsk35.c index 86d8e19656d..8eee2ee0dab 100644 --- a/src/lib/formats/ap_dsk35.c +++ b/src/lib/formats/ap_dsk35.c @@ -97,6 +97,7 @@ *********************************************************************/ #include +#include #include "emu.h" #include "ap_dsk35.h" diff --git a/src/lib/formats/apollo_dsk.c b/src/lib/formats/apollo_dsk.c index eec6e24beb2..2770122a5c9 100644 --- a/src/lib/formats/apollo_dsk.c +++ b/src/lib/formats/apollo_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/apollo_dsk.h" apollo_format::apollo_format() : upd765_format(formats) diff --git a/src/lib/formats/applix_dsk.c b/src/lib/formats/applix_dsk.c index c90b93a5203..726f11daed9 100644 --- a/src/lib/formats/applix_dsk.c +++ b/src/lib/formats/applix_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/applix_dsk.h" applix_format::applix_format() : wd177x_format(formats) diff --git a/src/lib/formats/asst128_dsk.c b/src/lib/formats/asst128_dsk.c index feffad34c08..fe64cc725ee 100644 --- a/src/lib/formats/asst128_dsk.c +++ b/src/lib/formats/asst128_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/asst128_dsk.h" asst128_format::asst128_format() : upd765_format(formats) diff --git a/src/lib/formats/bw12_dsk.c b/src/lib/formats/bw12_dsk.c index e497225bc08..06c8be72347 100644 --- a/src/lib/formats/bw12_dsk.c +++ b/src/lib/formats/bw12_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/bw12_dsk.h" bw12_format::bw12_format() : upd765_format(formats) diff --git a/src/lib/formats/bw2_dsk.c b/src/lib/formats/bw2_dsk.c index e5f66b5fe05..3dc46e9b225 100644 --- a/src/lib/formats/bw2_dsk.c +++ b/src/lib/formats/bw2_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/bw2_dsk.h" bw2_format::bw2_format() : upd765_format(formats) diff --git a/src/lib/formats/cbm_crt.c b/src/lib/formats/cbm_crt.c index 6ce4cc992d8..6e771fc8b0f 100644 --- a/src/lib/formats/cbm_crt.c +++ b/src/lib/formats/cbm_crt.c @@ -39,6 +39,9 @@ *********************************************************************/ +#include "emu.h" // offs_t, fatalerror +#include "astring.h" +#include "corefile.h" #include "cbm_crt.h" diff --git a/src/lib/formats/cbm_crt.h b/src/lib/formats/cbm_crt.h index bfb8732442c..8049ddacff7 100644 --- a/src/lib/formats/cbm_crt.h +++ b/src/lib/formats/cbm_crt.h @@ -13,7 +13,6 @@ #ifndef __CBM_CRT__ #define __CBM_CRT__ -#include "emu.h" #include "formats/imageutl.h" diff --git a/src/lib/formats/ccvf_dsk.c b/src/lib/formats/ccvf_dsk.c index d8dc0117bd3..30894e32d72 100644 --- a/src/lib/formats/ccvf_dsk.c +++ b/src/lib/formats/ccvf_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // offs_t +#include "astring.h" #include "formats/ccvf_dsk.h" ccvf_format::ccvf_format() diff --git a/src/lib/formats/coco_cas.c b/src/lib/formats/coco_cas.c index 880549c96ce..efc660943e3 100644 --- a/src/lib/formats/coco_cas.c +++ b/src/lib/formats/coco_cas.c @@ -31,7 +31,7 @@ **************************************************************************/ -#include "emu.h" +#include "emu.h" // PAIR #include "coco_cas.h" #define COCO_WAVESAMPLES_HEADER (1.0) diff --git a/src/lib/formats/comx35_dsk.c b/src/lib/formats/comx35_dsk.c index 860cc13b74d..aa8603f3c1c 100644 --- a/src/lib/formats/comx35_dsk.c +++ b/src/lib/formats/comx35_dsk.c @@ -36,7 +36,8 @@ */ -#include "emu.h" +#include + #include "formats/comx35_dsk.h" comx35_format::comx35_format() : wd177x_format(formats) diff --git a/src/lib/formats/concept_dsk.c b/src/lib/formats/concept_dsk.c index 3c742248043..c23a3c35675 100644 --- a/src/lib/formats/concept_dsk.c +++ b/src/lib/formats/concept_dsk.c @@ -10,7 +10,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "flopimg.h" #include "formats/concept_dsk.h" diff --git a/src/lib/formats/coupedsk.c b/src/lib/formats/coupedsk.c index 30ddcd394a8..e57d01abadf 100644 --- a/src/lib/formats/coupedsk.c +++ b/src/lib/formats/coupedsk.c @@ -6,7 +6,8 @@ **************************************************************************/ -#include "emu.h" +#include + #include "formats/coupedsk.h" #include "flopimg.h" diff --git a/src/lib/formats/cpis_dsk.c b/src/lib/formats/cpis_dsk.c index 9ad24d1d236..ff550a06af3 100644 --- a/src/lib/formats/cpis_dsk.c +++ b/src/lib/formats/cpis_dsk.c @@ -7,8 +7,8 @@ *********************************************************************/ #include +#include -#include "emu.h" #include "formats/cpis_dsk.h" #include "formats/basicdsk.h" diff --git a/src/lib/formats/d64_dsk.c b/src/lib/formats/d64_dsk.c index 9c0fa259363..39f4d94ae14 100644 --- a/src/lib/formats/d64_dsk.c +++ b/src/lib/formats/d64_dsk.c @@ -10,7 +10,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // offs_t, emu_fatalerror, fatalerror #include "formats/d64_dsk.h" d64_format::d64_format() diff --git a/src/lib/formats/d67_dsk.c b/src/lib/formats/d67_dsk.c index 39ce16131de..82adcbb3487 100644 --- a/src/lib/formats/d67_dsk.c +++ b/src/lib/formats/d67_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // offs_t #include "formats/d67_dsk.h" d67_format::d67_format() : d64_format(file_formats) diff --git a/src/lib/formats/d71_dsk.c b/src/lib/formats/d71_dsk.c index f7925526fda..3ec66697a22 100644 --- a/src/lib/formats/d71_dsk.c +++ b/src/lib/formats/d71_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // offs_t #include "formats/d71_dsk.h" d71_format::d71_format() : d64_format(formats) diff --git a/src/lib/formats/d80_dsk.c b/src/lib/formats/d80_dsk.c index 55a6f0d8ade..1f9c05f2f59 100644 --- a/src/lib/formats/d80_dsk.c +++ b/src/lib/formats/d80_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // offs_t #include "formats/d80_dsk.h" d80_format::d80_format() : d64_format(file_formats) diff --git a/src/lib/formats/d81_dsk.c b/src/lib/formats/d81_dsk.c index 4c04ef51293..714b9c3cd9e 100644 --- a/src/lib/formats/d81_dsk.c +++ b/src/lib/formats/d81_dsk.c @@ -73,7 +73,8 @@ PER SECTOR ORGANIZATION: */ -#include "emu.h" +#include + #include "formats/d81_dsk.h" d81_format::d81_format() : wd177x_format(formats) diff --git a/src/lib/formats/d82_dsk.c b/src/lib/formats/d82_dsk.c index 4d89f5e1313..33ffb4977c9 100644 --- a/src/lib/formats/d82_dsk.c +++ b/src/lib/formats/d82_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // offs_t #include "formats/d82_dsk.h" d82_format::d82_format() : d80_format(file_formats) diff --git a/src/lib/formats/d88_dsk.c b/src/lib/formats/d88_dsk.c index 0d41d49db5e..0a8f84e7b13 100644 --- a/src/lib/formats/d88_dsk.c +++ b/src/lib/formats/d88_dsk.c @@ -27,7 +27,8 @@ * */ -#include "emu.h" + #include + #include "flopimg.h" #include "imageutl.h" diff --git a/src/lib/formats/dcp_dsk.c b/src/lib/formats/dcp_dsk.c index bdcc2966036..dc05f4a4b44 100644 --- a/src/lib/formats/dcp_dsk.c +++ b/src/lib/formats/dcp_dsk.c @@ -20,7 +20,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "dcp_dsk.h" dcp_format::dcp_format() diff --git a/src/lib/formats/dfi_dsk.c b/src/lib/formats/dfi_dsk.c index 28a774c906e..2d5f83300db 100644 --- a/src/lib/formats/dfi_dsk.c +++ b/src/lib/formats/dfi_dsk.c @@ -11,7 +11,7 @@ * Correctly note exact index timing. */ -#include "emu.h" + #include "emu.h" // fatalerror #include "dfi_dsk.h" #include #define NUMBER_OF_MULTIREADS 3 diff --git a/src/lib/formats/dim_dsk.c b/src/lib/formats/dim_dsk.c index 8287647483e..27d3e4e4ec5 100644 --- a/src/lib/formats/dim_dsk.c +++ b/src/lib/formats/dim_dsk.c @@ -7,8 +7,8 @@ *********************************************************************/ #include +#include -#include "emu.h" #include "dim_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/dip_dsk.c b/src/lib/formats/dip_dsk.c index 85f142df8fa..ae320e4cb7e 100644 --- a/src/lib/formats/dip_dsk.c +++ b/src/lib/formats/dip_dsk.c @@ -14,7 +14,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "dip_dsk.h" dip_format::dip_format() diff --git a/src/lib/formats/dmk_dsk.c b/src/lib/formats/dmk_dsk.c index 2af453d66fa..1c87d268b48 100644 --- a/src/lib/formats/dmk_dsk.c +++ b/src/lib/formats/dmk_dsk.c @@ -13,7 +13,8 @@ TODO: *********************************************************************/ -#include "emu.h" +#include + #include "dmk_dsk.h" diff --git a/src/lib/formats/dmv_dsk.c b/src/lib/formats/dmv_dsk.c index 2dabe9ff05e..02469ed74d4 100644 --- a/src/lib/formats/dmv_dsk.c +++ b/src/lib/formats/dmv_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/dmv_dsk.h" dmv_format::dmv_format() : upd765_format(formats) diff --git a/src/lib/formats/dsk_dsk.c b/src/lib/formats/dsk_dsk.c index 93ae590e846..3d874f129d6 100644 --- a/src/lib/formats/dsk_dsk.c +++ b/src/lib/formats/dsk_dsk.c @@ -7,8 +7,8 @@ *********************************************************************/ #include +#include -#include "emu.h" #include "imageutl.h" #include "flopimg.h" diff --git a/src/lib/formats/ep64_dsk.c b/src/lib/formats/ep64_dsk.c index ee63ee20ab9..80981bf698e 100644 --- a/src/lib/formats/ep64_dsk.c +++ b/src/lib/formats/ep64_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/ep64_dsk.h" ep64_format::ep64_format() : wd177x_format(formats) diff --git a/src/lib/formats/esq16_dsk.c b/src/lib/formats/esq16_dsk.c index 4b370cfe0bd..01b1120e677 100644 --- a/src/lib/formats/esq16_dsk.c +++ b/src/lib/formats/esq16_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "flopimg.h" #include "formats/esq16_dsk.h" diff --git a/src/lib/formats/esq8_dsk.c b/src/lib/formats/esq8_dsk.c index 8af0bc46a84..763c303d20a 100644 --- a/src/lib/formats/esq8_dsk.c +++ b/src/lib/formats/esq8_dsk.c @@ -10,7 +10,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "flopimg.h" #include "formats/esq8_dsk.h" diff --git a/src/lib/formats/excali64_dsk.c b/src/lib/formats/excali64_dsk.c index 5de86815099..cff39939171 100644 --- a/src/lib/formats/excali64_dsk.c +++ b/src/lib/formats/excali64_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/excali64_dsk.h" excali64_format::excali64_format() : wd177x_format(formats) diff --git a/src/lib/formats/fdd_dsk.c b/src/lib/formats/fdd_dsk.c index e9d76a99973..10d9958ca59 100644 --- a/src/lib/formats/fdd_dsk.c +++ b/src/lib/formats/fdd_dsk.c @@ -31,7 +31,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "fdd_dsk.h" fdd_format::fdd_format() diff --git a/src/lib/formats/flex_dsk.c b/src/lib/formats/flex_dsk.c index 975cf246ecf..34aa965643d 100644 --- a/src/lib/formats/flex_dsk.c +++ b/src/lib/formats/flex_dsk.c @@ -4,7 +4,7 @@ * Created on: 24/06/2014 */ -#include "emu.h" + #include "emu.h" // logerror #include "flex_dsk.h" flex_format::flex_format() diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c index dacd76d5b8b..1b460638374 100644 --- a/src/lib/formats/flopimg.c +++ b/src/lib/formats/flopimg.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "emu.h" #include "osdcore.h" diff --git a/src/lib/formats/fmtowns_dsk.c b/src/lib/formats/fmtowns_dsk.c index 71db43650ba..83bfd2fbd51 100644 --- a/src/lib/formats/fmtowns_dsk.c +++ b/src/lib/formats/fmtowns_dsk.c @@ -6,7 +6,8 @@ * Created on: 23/03/2014 */ -#include "emu.h" + #include + #include "formats/fmtowns_dsk.h" fmtowns_format::fmtowns_format() : wd177x_format(formats) diff --git a/src/lib/formats/g64_dsk.c b/src/lib/formats/g64_dsk.c index 5beba1ca35f..fec6b6e9c3d 100644 --- a/src/lib/formats/g64_dsk.c +++ b/src/lib/formats/g64_dsk.c @@ -10,7 +10,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // emu_fatalerror, offs_t #include "formats/g64_dsk.h" #define G64_FORMAT_HEADER "GCR-1541" diff --git a/src/lib/formats/hxcmfm_dsk.c b/src/lib/formats/hxcmfm_dsk.c index 967f05539a3..0203f8f7e26 100644 --- a/src/lib/formats/hxcmfm_dsk.c +++ b/src/lib/formats/hxcmfm_dsk.c @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#include "emu.h" + +#include #include "hxcmfm_dsk.h" diff --git a/src/lib/formats/imd_dsk.c b/src/lib/formats/imd_dsk.c index ef5478f638f..631e4f2e45d 100644 --- a/src/lib/formats/imd_dsk.c +++ b/src/lib/formats/imd_dsk.c @@ -7,7 +7,7 @@ *********************************************************************/ #include -#include "emu.h" +#include #include "flopimg.h" struct imddsk_tag diff --git a/src/lib/formats/ipf_dsk.c b/src/lib/formats/ipf_dsk.c index 7e1704f9b55..3cbd46dcb5a 100644 --- a/src/lib/formats/ipf_dsk.c +++ b/src/lib/formats/ipf_dsk.c @@ -1,4 +1,4 @@ -#include "emu.h" +#include #include "ipf_dsk.h" const floppy_format_type FLOPPY_IPF_FORMAT = &floppy_image_format_creator; diff --git a/src/lib/formats/iq151_dsk.c b/src/lib/formats/iq151_dsk.c index f0df2c19555..dcffad85751 100644 --- a/src/lib/formats/iq151_dsk.c +++ b/src/lib/formats/iq151_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/iq151_dsk.h" iq151_format::iq151_format() : upd765_format(formats) diff --git a/src/lib/formats/itt3030_dsk.c b/src/lib/formats/itt3030_dsk.c index 7e0a5709897..7fed1bf3505 100644 --- a/src/lib/formats/itt3030_dsk.c +++ b/src/lib/formats/itt3030_dsk.c @@ -10,7 +10,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/itt3030_dsk.h" itt3030_format::itt3030_format() : wd177x_format(formats) diff --git a/src/lib/formats/kaypro_dsk.c b/src/lib/formats/kaypro_dsk.c index 3781bb3de0a..e9924ce11c9 100644 --- a/src/lib/formats/kaypro_dsk.c +++ b/src/lib/formats/kaypro_dsk.c @@ -16,7 +16,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/kaypro_dsk.h" kayproii_format::kayproii_format() : upd765_format(formats) diff --git a/src/lib/formats/kc85_dsk.c b/src/lib/formats/kc85_dsk.c index 0787ef5e82e..84111ff1171 100644 --- a/src/lib/formats/kc85_dsk.c +++ b/src/lib/formats/kc85_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/kc85_dsk.h" kc85_format::kc85_format() : upd765_format(formats) diff --git a/src/lib/formats/m20_dsk.c b/src/lib/formats/m20_dsk.c index 0371f595d63..cf440908c9f 100644 --- a/src/lib/formats/m20_dsk.c +++ b/src/lib/formats/m20_dsk.c @@ -13,8 +13,8 @@ *********************************************************************/ #include +#include -#include "emu.h" #include "m20_dsk.h" #include "basicdsk.h" diff --git a/src/lib/formats/m5_dsk.c b/src/lib/formats/m5_dsk.c index fc8f9f98d43..9652eedbb72 100644 --- a/src/lib/formats/m5_dsk.c +++ b/src/lib/formats/m5_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/m5_dsk.h" m5_format::m5_format() : upd765_format(formats) diff --git a/src/lib/formats/mfi_dsk.c b/src/lib/formats/mfi_dsk.c index 13a23abe94b..2bd4b326501 100644 --- a/src/lib/formats/mfi_dsk.c +++ b/src/lib/formats/mfi_dsk.c @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert -#include "emu.h" +#include + #include "mfi_dsk.h" #include diff --git a/src/lib/formats/mm_dsk.c b/src/lib/formats/mm_dsk.c index 53939295378..0634c0e3ede 100644 --- a/src/lib/formats/mm_dsk.c +++ b/src/lib/formats/mm_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/mm_dsk.h" mm1_format::mm1_format() : upd765_format(formats) diff --git a/src/lib/formats/nanos_dsk.c b/src/lib/formats/nanos_dsk.c index fd8478b5b45..1536d0677c8 100644 --- a/src/lib/formats/nanos_dsk.c +++ b/src/lib/formats/nanos_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/nanos_dsk.h" nanos_format::nanos_format() : upd765_format(formats) diff --git a/src/lib/formats/naslite_dsk.c b/src/lib/formats/naslite_dsk.c index da043358b16..342407a7c95 100644 --- a/src/lib/formats/naslite_dsk.c +++ b/src/lib/formats/naslite_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/naslite_dsk.h" naslite_format::naslite_format() : upd765_format(formats) diff --git a/src/lib/formats/nfd_dsk.c b/src/lib/formats/nfd_dsk.c index ea886e9dd3a..083d59417b2 100644 --- a/src/lib/formats/nfd_dsk.c +++ b/src/lib/formats/nfd_dsk.c @@ -77,7 +77,8 @@ *********************************************************************/ -#include "emu.h" + #include + #include "nfd_dsk.h" nfd_format::nfd_format() diff --git a/src/lib/formats/oric_dsk.c b/src/lib/formats/oric_dsk.c index aaef1928f0a..340fb507c2d 100644 --- a/src/lib/formats/oric_dsk.c +++ b/src/lib/formats/oric_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // logerror #include "formats/oric_dsk.h" oric_dsk_format::oric_dsk_format() diff --git a/src/lib/formats/pasti_dsk.c b/src/lib/formats/pasti_dsk.c index e78f816b8df..c39954490b8 100644 --- a/src/lib/formats/pasti_dsk.c +++ b/src/lib/formats/pasti_dsk.c @@ -1,4 +1,4 @@ -#include "emu.h" +#include "emu.h" // logerror #include "pasti_dsk.h" // Pasti format supported using the documentation at diff --git a/src/lib/formats/pc98fdi_dsk.c b/src/lib/formats/pc98fdi_dsk.c index 81aeaf7a42b..83433606400 100644 --- a/src/lib/formats/pc98fdi_dsk.c +++ b/src/lib/formats/pc98fdi_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include #include "pc98fdi_dsk.h" pc98fdi_format::pc98fdi_format() diff --git a/src/lib/formats/pyldin_dsk.c b/src/lib/formats/pyldin_dsk.c index 07d75f58724..de43ab1947b 100644 --- a/src/lib/formats/pyldin_dsk.c +++ b/src/lib/formats/pyldin_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include #include "formats/pyldin_dsk.h" pyldin_format::pyldin_format() : upd765_format(formats) diff --git a/src/lib/formats/ql_dsk.c b/src/lib/formats/ql_dsk.c index 5351a92c83f..b3ceb233218 100644 --- a/src/lib/formats/ql_dsk.c +++ b/src/lib/formats/ql_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/ql_dsk.h" ql_format::ql_format() : wd177x_format(formats) diff --git a/src/lib/formats/rx50_dsk.c b/src/lib/formats/rx50_dsk.c index 4ece096fba6..429f22eafec 100644 --- a/src/lib/formats/rx50_dsk.c +++ b/src/lib/formats/rx50_dsk.c @@ -27,7 +27,8 @@ FORMAT A: /F:160 on DOS; turn MEDIACHK ON ************************************************************************/ -#include "emu.h" +#include + #include "flopimg.h" #include "formats/rx50_dsk.h" diff --git a/src/lib/formats/sf7000_dsk.c b/src/lib/formats/sf7000_dsk.c index e15a42e7b41..31d0c37ab15 100644 --- a/src/lib/formats/sf7000_dsk.c +++ b/src/lib/formats/sf7000_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/sf7000_dsk.h" sf7000_format::sf7000_format() : upd765_format(formats) diff --git a/src/lib/formats/smx_dsk.c b/src/lib/formats/smx_dsk.c index 4729f65f8bb..9158a586c13 100644 --- a/src/lib/formats/smx_dsk.c +++ b/src/lib/formats/smx_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/smx_dsk.h" smx_format::smx_format() : wd177x_format(formats) diff --git a/src/lib/formats/st_dsk.c b/src/lib/formats/st_dsk.c index 72787b58a19..a30165993ea 100644 --- a/src/lib/formats/st_dsk.c +++ b/src/lib/formats/st_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/st_dsk.h" st_format::st_format() diff --git a/src/lib/formats/tandy2k_dsk.c b/src/lib/formats/tandy2k_dsk.c index cc15e75b17b..e08865c9493 100644 --- a/src/lib/formats/tandy2k_dsk.c +++ b/src/lib/formats/tandy2k_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/tandy2k_dsk.h" tandy2k_format::tandy2k_format() : upd765_format(formats) diff --git a/src/lib/formats/td0_dsk.c b/src/lib/formats/td0_dsk.c index cc5a72993a5..a9a7ed702a1 100644 --- a/src/lib/formats/td0_dsk.c +++ b/src/lib/formats/td0_dsk.c @@ -13,7 +13,7 @@ */ #include -#include "emu.h" +#include #include "flopimg.h" #define BUFSZ 512 // new input buffer diff --git a/src/lib/formats/ti99_dsk.c b/src/lib/formats/ti99_dsk.c index b1c473fef3e..d18ef3c4192 100644 --- a/src/lib/formats/ti99_dsk.c +++ b/src/lib/formats/ti99_dsk.c @@ -41,10 +41,11 @@ * ********************************************************************/ -#include "emu.h" #include #include +#include +#include "emu.h" // logerror #include "imageutl.h" #include "ti99_dsk.h" diff --git a/src/lib/formats/tiki100_dsk.c b/src/lib/formats/tiki100_dsk.c index 4704f6e9911..1a05af7a5af 100644 --- a/src/lib/formats/tiki100_dsk.c +++ b/src/lib/formats/tiki100_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/tiki100_dsk.h" tiki100_format::tiki100_format() : wd177x_format(formats) diff --git a/src/lib/formats/trd_dsk.c b/src/lib/formats/trd_dsk.c index 6ee08e6a2c0..7cacd98fb4a 100644 --- a/src/lib/formats/trd_dsk.c +++ b/src/lib/formats/trd_dsk.c @@ -6,7 +6,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/trd_dsk.h" trd_format::trd_format() : wd177x_format(formats) diff --git a/src/lib/formats/tvc_dsk.c b/src/lib/formats/tvc_dsk.c index fdbe28365b5..8a2254cb7cc 100644 --- a/src/lib/formats/tvc_dsk.c +++ b/src/lib/formats/tvc_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/tvc_dsk.h" tvc_format::tvc_format() : wd177x_format(formats) diff --git a/src/lib/formats/upd765_dsk.c b/src/lib/formats/upd765_dsk.c index 5966e1de1a3..b26da4c2d98 100644 --- a/src/lib/formats/upd765_dsk.c +++ b/src/lib/formats/upd765_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // emu_fatalerror #include "formats/upd765_dsk.h" upd765_format::upd765_format(const format *_formats) diff --git a/src/lib/formats/victor9k_dsk.c b/src/lib/formats/victor9k_dsk.c index 694ac3dbf80..08328fd2619 100644 --- a/src/lib/formats/victor9k_dsk.c +++ b/src/lib/formats/victor9k_dsk.c @@ -97,7 +97,7 @@ zone. */ -#include "emu.h" +#include "emu.h" // logerror, BIT, emu_fatalerror #include "formats/victor9k_dsk.h" victor9k_format::victor9k_format() diff --git a/src/lib/formats/wd177x_dsk.c b/src/lib/formats/wd177x_dsk.c index 57223fecc2f..8ced951fd51 100644 --- a/src/lib/formats/wd177x_dsk.c +++ b/src/lib/formats/wd177x_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" +#include "emu.h" // emu_fatalerror #include "formats/wd177x_dsk.h" wd177x_format::wd177x_format(const format *_formats) diff --git a/src/lib/formats/xdf_dsk.c b/src/lib/formats/xdf_dsk.c index 6b81877b701..c77d685d9be 100644 --- a/src/lib/formats/xdf_dsk.c +++ b/src/lib/formats/xdf_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" +#include + #include "formats/xdf_dsk.h" xdf_format::xdf_format() : upd765_format(formats) From d5b0f5c30e66cb9ed9fd27183a3b838e2e9256ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 14:10:06 +0100 Subject: [PATCH 105/201] Revert "Changing FASTDEBUG to be assert-free is too big a change to push through without public discussion" This reverts commit ca94bb7905e486fc68369893531db858645d38e7. --- src/emu/emucore.h | 5 ++++- src/emu/schedule.c | 2 -- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 950209f6f33..0f89ae59f50 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -67,7 +67,10 @@ private: #undef assert #undef assert_always -#ifdef MAME_DEBUG +#if defined(MAME_DEBUG_FAST) +#define assert(x) do { } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) +#elif defined(MAME_DEBUG) #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) #else diff --git a/src/emu/schedule.c b/src/emu/schedule.c index 74dfa661469..d0d28af80e4 100644 --- a/src/emu/schedule.c +++ b/src/emu/schedule.c @@ -451,9 +451,7 @@ void device_scheduler::timeslice() attoseconds_t delta = target.attoseconds - exec->m_localtime.attoseconds; if (delta < 0 && target.seconds > exec->m_localtime.seconds) delta += ATTOSECONDS_PER_SECOND; -#ifndef MAME_DEBUG_FAST assert(delta == (target - exec->m_localtime).as_attoseconds()); -#endif // if we have enough for at least 1 cycle, do the math if (delta >= exec->m_attoseconds_per_cycle) From 29406b799db80521d33a93d5a58c05f2974821d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 14:10:24 +0100 Subject: [PATCH 106/201] Revert "there is no way something called assert_always should ever be compiled out - people should be able to depend on side effects of something with 'always' in the name" This reverts commit 5ffe5ce5513a51e7be74a0af90556bc2fa1aab5a. --- src/emu/emucore.h | 67 ++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 0f89ae59f50..238c0d284bd 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -32,44 +32,18 @@ #include #include -// needed for OSD macros -#include "osdcomm.h" - - - -//************************************************************************** -// EXCEPTION CLASSES -//************************************************************************** - -// emu_exception is the base class for all emu-related exceptions -class emu_exception : public std::exception { }; - - -// emu_fatalerror is a generic fatal exception that provides an error string -class emu_fatalerror : public emu_exception -{ -public: - emu_fatalerror(const char *format, ...) ATTR_PRINTF(2,3); - emu_fatalerror(const char *format, va_list ap); - emu_fatalerror(int _exitcode, const char *format, ...) ATTR_PRINTF(3,4); - emu_fatalerror(int _exitcode, const char *format, va_list ap); - - const char *string() const { return text; } - int exitcode() const { return code; } - -private: - char text[1024]; - int code; -}; - +// TODO: make the assert replacement and especially assert_always work again +#include +#define assert_always(x, msg) assert(x) +/* // standard assertion macros #undef assert #undef assert_always #if defined(MAME_DEBUG_FAST) #define assert(x) do { } while (0) -#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) +#define assert_always(x, msg) do { } while (0) #elif defined(MAME_DEBUG) #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) @@ -77,10 +51,10 @@ private: #define assert(x) do { } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) #endif - - +*/ // core system includes +#include "osdcomm.h" #include "astring.h" #include "emualloc.h" #include "corestr.h" @@ -310,6 +284,33 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } +//************************************************************************** +// EXCEPTION CLASSES +//************************************************************************** + +// emu_exception is the base class for all emu-related exceptions +class emu_exception : public std::exception { }; + + +// emu_fatalerror is a generic fatal exception that provides an error string +class emu_fatalerror : public emu_exception +{ +public: + emu_fatalerror(const char *format, ...) ATTR_PRINTF(2,3); + emu_fatalerror(const char *format, va_list ap); + emu_fatalerror(int _exitcode, const char *format, ...) ATTR_PRINTF(3,4); + emu_fatalerror(int _exitcode, const char *format, va_list ap); + + const char *string() const { return text; } + int exitcode() const { return code; } + +private: + char text[1024]; + int code; +}; + + + //************************************************************************** // CASTING TEMPLATES //************************************************************************** From 902976c47bd7725abce55a69f82cdeb224dd81cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 14:10:58 +0100 Subject: [PATCH 107/201] Revert "If you're planning to redefine something, you should #include the definition you plan to walk over" This reverts commit 4282a7c9f201b957b34f2142746b939e02ead0a9. --- src/emu/emucore.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 238c0d284bd..84bf56633f4 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -15,7 +15,6 @@ #define __EMUCORE_H__ // standard C includes -#include // make sure this is included before we try redefining assert #include #include #include From 165e3c2adea9fe4d67f7dd5cdc500a1a05684224 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 21 Mar 2015 00:18:58 +1100 Subject: [PATCH 108/201] FASTDEBUG should be a 'sub-option' of DEBUG --- makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/makefile b/makefile index 741ad490856..679925826b8 100644 --- a/makefile +++ b/makefile @@ -474,6 +474,9 @@ endif # define MAME_DEBUG if we are a debugging build ifdef DEBUG DEFS += -DMAME_DEBUG +ifdef FASTDEBUG +DEFS += -DMAME_DEBUG_FAST +endif else DEFS += -DNDEBUG endif @@ -498,10 +501,6 @@ ifneq ($(BUILD_JPEGLIB),1) DEFS += -DUSE_SYSTEM_JPEGLIB endif -ifdef FASTDEBUG -DEFS += -DMAME_DEBUG_FAST -endif - # To support casting in Lua 5.3 DEFS += -DLUA_COMPAT_APIINTCASTS From 6308e9f2e0f9fbd69c59db3a2957a48c7adac7e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 15:34:47 +0100 Subject: [PATCH 109/201] moved assert replacement back to old location (nw) also included the change from Vas to always include assert.h to protect against later rogue includes after redefinition --- src/emu/emucore.h | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 84bf56633f4..c08ea7444b7 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -15,6 +15,7 @@ #define __EMUCORE_H__ // standard C includes +#include #include #include #include @@ -31,27 +32,6 @@ #include #include -// TODO: make the assert replacement and especially assert_always work again -#include -#define assert_always(x, msg) assert(x) - -/* -// standard assertion macros -#undef assert -#undef assert_always - -#if defined(MAME_DEBUG_FAST) -#define assert(x) do { } while (0) -#define assert_always(x, msg) do { } while (0) -#elif defined(MAME_DEBUG) -#define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) -#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) -#else -#define assert(x) do { } while (0) -#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) -#endif -*/ - // core system includes #include "osdcomm.h" #include "astring.h" @@ -235,6 +215,22 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define FUNC_NULL NULL, "(null)" +// standard assertion macros +#undef assert +#undef assert_always + +#if defined(MAME_DEBUG_FAST) +#define assert(x) do { } while (0) +#define assert_always(x, msg) do { } while (0) +#elif defined(MAME_DEBUG) +#define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) +#else +#define assert(x) do { } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) +#endif + + // macros to convert radians to degrees and degrees to radians #define RADIAN_TO_DEGREE(x) ((180.0 / M_PI) * (x)) #define DEGREE_TO_RADIAN(x) ((M_PI / 180.0) * (x)) From b41949161bf8fff02a08579488b188d42a74a1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 15:42:27 +0100 Subject: [PATCH 110/201] assert_always is basically fatalerror() - so it should always bail out (nw) --- src/emu/emucore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index c08ea7444b7..899ee9fa670 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -221,7 +221,7 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #if defined(MAME_DEBUG_FAST) #define assert(x) do { } while (0) -#define assert_always(x, msg) do { } while (0) +#define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) #elif defined(MAME_DEBUG) #define assert(x) do { if (!(x)) throw emu_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0) #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0) From de1e50b3541797ed3eda4d1b0dba9f99ae3d9ec6 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 21 Mar 2015 03:30:34 +1100 Subject: [PATCH 111/201] Figure out a couple more unkch DIP switches, document what unkch sets are trying to do in the code that's patched out --- src/mame/drivers/goldstar.c | 64 +++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index e7674fbc7b9..9cb49d0527e 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -4807,12 +4807,14 @@ static INPUT_PORTS_START( unkch ) PORT_DIPSETTING( 0x09, "77% / 82%" ) PORT_DIPSETTING( 0x0a, "80% / 85%" ) PORT_DIPSETTING( 0x0f, "83% / 88%" ) - PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ - PORT_DIPSETTING( 0x10, "64" ) - PORT_DIPSETTING( 0x00, "40 (20)" ) /* shows 20 in settings screen but limits to 40 in gameplay */ - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x30, 0x30, "Max Bet" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ + PORT_DIPSETTING( 0x00, "10 (5)" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x80) /* shows 5 in settings screen but limits at 10 in gameplay */ + PORT_DIPSETTING( 0x10, "20 (10)" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x80) /* shows 10 in settings screen but limits at 20 in gameplay */ + PORT_DIPSETTING( 0x20, "40 (20)" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x80) /* shows 20 in settings screen but limits at 40 in gameplay */ + PORT_DIPSETTING( 0x00, "5" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x00) + PORT_DIPSETTING( 0x10, "10" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x00) + PORT_DIPSETTING( 0x20, "20" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x00) + PORT_DIPSETTING( 0x30, "64" ) /* always individual irrespective of DSW3-8 */ PORT_DIPNAME( 0x40, 0x40, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW2:7") /* OK */ PORT_DIPSETTING( 0x00, "8" ) PORT_DIPSETTING( 0x40, "16" ) @@ -4852,9 +4854,9 @@ static INPUT_PORTS_START( unkch ) PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Max Bet Type" ) PORT_DIPLOCATION("DSW3:8") /* OK */ + PORT_DIPSETTING( 0x80, "Total" ) /* Max Bet applies to total of BET-A and BET-B unless set to 64 */ + PORT_DIPSETTING( 0x00, "Individual" ) /* Max Bet applies individually to each of BET-A and BET-B */ PORT_START("DSW4") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") @@ -4923,11 +4925,14 @@ static INPUT_PORTS_START( unkch3 ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, "Bet Maximum" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ - PORT_DIPSETTING( 0x00, "10 (5)" ) /* shows 5 in settings screen but limits at 10 in gameplay */ - PORT_DIPSETTING( 0x10, "20 (10)" ) /* shows 10 in settings screen but limits at 20 in gameplay */ - PORT_DIPSETTING( 0x20, "40 (20)" ) /* shows 20 in settings screen but limits at 40 in gameplay */ - PORT_DIPSETTING( 0x30, "64" ) + PORT_DIPNAME( 0x30, 0x30, "Max Bet" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ + PORT_DIPSETTING( 0x00, "10 (5)" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x80) /* shows 5 in settings screen but limits at 10 in gameplay */ + PORT_DIPSETTING( 0x10, "20 (10)" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x80) /* shows 10 in settings screen but limits at 20 in gameplay */ + PORT_DIPSETTING( 0x20, "40 (20)" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x80) /* shows 20 in settings screen but limits at 40 in gameplay */ + PORT_DIPSETTING( 0x00, "5" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x00) + PORT_DIPSETTING( 0x10, "10" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x00) + PORT_DIPSETTING( 0x20, "20" ) PORT_CONDITION("DSW3",0x80,EQUALS,0x00) + PORT_DIPSETTING( 0x30, "64" ) /* always individual irrespective of DSW3-8 */ PORT_DIPNAME( 0x40, 0x40, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW2:7") /* OK - called 'Bet Minimum' in settings screen */ PORT_DIPSETTING( 0x00, "8" ) PORT_DIPSETTING( 0x40, "16" ) @@ -4957,9 +4962,9 @@ static INPUT_PORTS_START( unkch3 ) PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Max Bet Type" ) PORT_DIPLOCATION("DSW3:8") /* OK */ + PORT_DIPSETTING( 0x80, "Total" ) /* Max Bet applies to total of BET-A and BET-B unless set to 64 */ + PORT_DIPSETTING( 0x00, "Individual" ) /* Max Bet applies individually to each of BET-A and BET-B */ PORT_START("DSW4") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1") @@ -5013,7 +5018,7 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) - PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* OK - shows in test mode but always seems to be enabled in gameplay */ + PORT_DIPNAME( 0x60, 0x60, "Super Jackpot" ) PORT_DIPLOCATION("DSW1:6,7") /* shows in test mode but always seems to be enabled in gameplay */ PORT_DIPSETTING( 0x60, DEF_STR( No ) ) PORT_DIPSETTING( 0x20, "5%" ) PORT_DIPSETTING( 0x00, "10%" ) @@ -5036,12 +5041,11 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x09, "77% / 82%" ) PORT_DIPSETTING( 0x0a, "80% / 85%" ) PORT_DIPSETTING( 0x0f, "83% / 88%" ) - PORT_DIPNAME( 0x10, 0x10, "Max Bet" ) PORT_DIPLOCATION("DSW2:5") /* OK */ - PORT_DIPSETTING( 0x00, "32" ) - PORT_DIPSETTING( 0x10, "64" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x30, 0x30, "Max Bet" ) PORT_DIPLOCATION("DSW2:5,6") /* OK */ + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPSETTING( 0x10, "16" ) + PORT_DIPSETTING( 0x20, "32" ) + PORT_DIPSETTING( 0x30, "64" ) PORT_DIPNAME( 0x40, 0x40, "Min. Bet For Bonus Play" ) PORT_DIPLOCATION("DSW2:7") /* OK */ PORT_DIPSETTING( 0x00, "8" ) PORT_DIPSETTING( 0x40, "16" ) @@ -12849,6 +12853,10 @@ DRIVER_INIT_MEMBER(cb3_state, cherrys) /* todo: remove these patches! */ DRIVER_INIT_MEMBER(unkch_state, unkch1) { + // game stores $02 at ($D75C) and expects it to change + // missing interrupt? before enabling interrupts so could only be NMI + // peripheral with RAM access? + // something other than RAM there? UINT8 *ROM = memregion("maincpu")->base(); ROM[0x9d52] = 0x00; ROM[0x9d53] = 0x00; @@ -12856,6 +12864,10 @@ DRIVER_INIT_MEMBER(unkch_state, unkch1) DRIVER_INIT_MEMBER(unkch_state, unkch3) { + // game stores $04 at ($D77F) and expects it to change + // missing interrupt? before enabling interrupts so could only be NMI + // peripheral with RAM access? + // something other than RAM there? UINT8 *ROM = memregion("maincpu")->base(); ROM[0x9b86] = 0x00; ROM[0x9b87] = 0x00; @@ -12863,6 +12875,10 @@ DRIVER_INIT_MEMBER(unkch_state, unkch3) DRIVER_INIT_MEMBER(unkch_state, unkch4) { + // game stores $02 at ($D75C) and expects it to change + // missing interrupt? before enabling interrupts so could only be NMI + // peripheral with RAM access? + // something other than RAM there? UINT8 *ROM = memregion("maincpu")->base(); ROM[0x9a6e] = 0x00; ROM[0x9a6f] = 0x00; From a32245c8dcff6b42ddf7f03a611605b21baa0b4e Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 20 Mar 2015 18:02:19 +0100 Subject: [PATCH 112/201] Added the manufacturers of explorer and kosmokil [PaTrYcK] Confirmed here: http://www.tilt.it/deb/ --- src/mame/drivers/astinvad.c | 2 +- src/mame/drivers/galaxian.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/astinvad.c b/src/mame/drivers/astinvad.c index cc1f21bd5f4..60f1528b176 100644 --- a/src/mame/drivers/astinvad.c +++ b/src/mame/drivers/astinvad.c @@ -817,7 +817,7 @@ DRIVER_INIT_MEMBER(astinvad_state,spcking2) GAME( 1979, kamikaze, 0, kamikaze, kamikaze, astinvad_state, kamikaze, ROT270, "Leijac Corporation", "Kamikaze", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1980, astinvad, kamikaze, kamikaze, astinvad, astinvad_state, kamikaze, ROT270, "Leijac Corporation (Stern Electronics license)", "Astro Invader", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 19??, kosmokil, kamikaze, kamikaze, kamikaze, astinvad_state, kamikaze, ROT270, "bootleg", "Kosmo Killer", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // says >BEM< Mi Italy but it looks hacked in, dif revision of game tho. +GAME( 19??, kosmokil, kamikaze, kamikaze, kamikaze, astinvad_state, kamikaze, ROT270, "bootleg (BEM)", "Kosmo Killer", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // says >BEM< Mi Italy but it looks hacked in, dif revision of game tho. GAME( 1979, spcking2, 0, spcking2, spcking2, astinvad_state, spcking2, ROT270, "Konami", "Space King 2", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1980, spaceint, 0, spaceint, spaceint, driver_device, 0, ROT90, "Shoei", "Space Intruder", GAME_IMPERFECT_SOUND | GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) GAME( 1980, spaceintj,spaceint, spaceint, spaceintj, driver_device, 0, ROT90, "Shoei", "Space Intruder (Japan)", GAME_IMPERFECT_SOUND | GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/galaxian.c b/src/mame/drivers/galaxian.c index f847b6cce86..da85af50ecb 100644 --- a/src/mame/drivers/galaxian.c +++ b/src/mame/drivers/galaxian.c @@ -10915,7 +10915,7 @@ GAME( 1981, scramble, 0, scramble, scramble, galaxian_state, scram GAME( 1981, scrambles, scramble, scramble, scramble, galaxian_state, scramble, ROT90, "Konami (Stern Electronics license)", "Scramble (Stern Electronics set 1)", GAME_SUPPORTS_SAVE ) GAME( 1981, scrambles2, scramble, scramble, scramble, galaxian_state, scramble, ROT90, "Konami (Stern Electronics license)", "Scramble (Stern Electronics set 2)", GAME_SUPPORTS_SAVE ) GAME( 1981, strfbomb, scramble, scramble, strfbomb, galaxian_state, scramble, ROT90, "bootleg (Omni)", "Strafe Bomb (bootleg of Scramble)", GAME_SUPPORTS_SAVE ) -GAME( 1981, explorer, scramble, explorer, explorer, galaxian_state, explorer, ROT90, "bootleg", "Explorer (bootleg of Scramble)", GAME_SUPPORTS_SAVE ) +GAME( 1981, explorer, scramble, explorer, explorer, galaxian_state, explorer, ROT90, "bootleg (Sidam)", "Explorer (bootleg of Scramble)", GAME_SUPPORTS_SAVE ) GAME( 1981, scramblebf, scramble, scramble, scramble, galaxian_state, scramble, ROT90, "bootleg (Karateko)", "Scramble (Karateko, French bootleg)", GAME_SUPPORTS_SAVE ) GAME( 1981, scrambp, scramble, scramble, scramble, galaxian_state, scramble, ROT90, "bootleg (Billport S.A.)", "Impacto (Billport S.A., Spanish bootleg of Scramble)", GAME_SUPPORTS_SAVE ) // similar to the Karateko set above GAME( 1981, scrampt, scramble, scramble, scramble, galaxian_state, scramble, ROT90, "bootleg (Petaco S.A.)", "Scramble (Petaco S.A., Spanish bootleg)", GAME_SUPPORTS_SAVE ) // ^^ From f066c0aaa90345212e01d3837ec39cc57471e0cf Mon Sep 17 00:00:00 2001 From: Peter Ferrie Date: Fri, 20 Mar 2015 10:43:10 -0700 Subject: [PATCH 113/201] pinball2k: update notes (nw) --- src/mame/drivers/pinball2k.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mame/drivers/pinball2k.c b/src/mame/drivers/pinball2k.c index 6cdb658cc34..e523a0fa44f 100644 --- a/src/mame/drivers/pinball2k.c +++ b/src/mame/drivers/pinball2k.c @@ -5,7 +5,6 @@ TODO: - Everything! - - BIOS hangs waiting for port 0400h to return 0x80. If you make that happy it jumps off into the weeds. - MediaGX features should be moved out to machine/ and shared with mediagx.c once we know what these games need Hardware: From 151070e970abd344e8d8da215bc4f865e2b2b110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 19:08:03 +0100 Subject: [PATCH 114/201] replaced off_st usage in src/lib/formats with UINT32 to reduce libemu dependencies (nw) --- src/lib/formats/cbm_crt.c | 6 +++--- src/lib/formats/ccvf_dsk.c | 4 ++-- src/lib/formats/d64_dsk.c | 4 ++-- src/lib/formats/d64_dsk.h | 2 +- src/lib/formats/d67_dsk.c | 3 ++- src/lib/formats/d71_dsk.c | 3 ++- src/lib/formats/d80_dsk.c | 3 ++- src/lib/formats/d82_dsk.c | 3 ++- src/lib/formats/g64_dsk.c | 12 ++++++------ src/lib/formats/victor9k_dsk.c | 2 +- src/lib/formats/victor9k_dsk.h | 2 +- 11 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/lib/formats/cbm_crt.c b/src/lib/formats/cbm_crt.c index 6e771fc8b0f..abfd85ed5c1 100644 --- a/src/lib/formats/cbm_crt.c +++ b/src/lib/formats/cbm_crt.c @@ -39,7 +39,7 @@ *********************************************************************/ -#include "emu.h" // offs_t, fatalerror +#include "emu.h" // fatalerror #include "astring.h" #include "corefile.h" #include "cbm_crt.h" @@ -205,8 +205,8 @@ bool cbm_crt_read_header(core_file* file, size_t *roml_size, size_t *romh_size, bool cbm_crt_read_data(core_file* file, UINT8 *roml, UINT8 *romh) { - offs_t roml_offset = 0; - offs_t romh_offset = 0; + UINT32 roml_offset = 0; + UINT32 romh_offset = 0; core_fseek(file, CRT_HEADER_LENGTH, SEEK_SET); diff --git a/src/lib/formats/ccvf_dsk.c b/src/lib/formats/ccvf_dsk.c index 30894e32d72..dfb43565d88 100644 --- a/src/lib/formats/ccvf_dsk.c +++ b/src/lib/formats/ccvf_dsk.c @@ -8,7 +8,7 @@ *********************************************************************/ -#include "emu.h" // offs_t +#include "emu.h" // BIT #include "astring.h" #include "formats/ccvf_dsk.h" @@ -99,7 +99,7 @@ bool ccvf_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) int start = 0, end = 0; astring line; - offs_t byteoffs = 0; + UINT32 byteoffs = 0; char hex[3] = {0}; do { diff --git a/src/lib/formats/d64_dsk.c b/src/lib/formats/d64_dsk.c index 39f4d94ae14..172918a3051 100644 --- a/src/lib/formats/d64_dsk.c +++ b/src/lib/formats/d64_dsk.c @@ -10,7 +10,7 @@ *********************************************************************/ -#include "emu.h" // offs_t, emu_fatalerror, fatalerror +#include "emu.h" // emu_fatalerror, fatalerror #include "formats/d64_dsk.h" d64_format::d64_format() @@ -167,7 +167,7 @@ floppy_image_format_t::desc_e* d64_format::get_sector_desc(const format &f, int return desc; } -void d64_format::build_sector_description(const format &f, UINT8 *sectdata, offs_t sect_offs, offs_t error_offs, desc_s *sectors, int sector_count) const +void d64_format::build_sector_description(const format &f, UINT8 *sectdata, UINT32 sect_offs, UINT32 error_offs, desc_s *sectors, int sector_count) const { for (int i = 0; i < sector_count; i++) { sectors[i].data = sectdata + sect_offs; diff --git a/src/lib/formats/d64_dsk.h b/src/lib/formats/d64_dsk.h index 34be1d8fd16..af462753348 100644 --- a/src/lib/formats/d64_dsk.h +++ b/src/lib/formats/d64_dsk.h @@ -64,7 +64,7 @@ protected: virtual int get_disk_id_offset(const format &f); void get_disk_id(const format &f, io_generic *io, UINT8 &id1, UINT8 &id2); virtual floppy_image_format_t::desc_e* get_sector_desc(const format &f, int ¤t_size, int sector_count, UINT8 id1, UINT8 id2, int gap_2); - void build_sector_description(const format &f, UINT8 *sectdata, offs_t sect_offs, offs_t error_offs, desc_s *sectors, int sector_count) const; + void build_sector_description(const format &f, UINT8 *sectdata, UINT32 sect_offs, UINT32 error_offs, desc_s *sectors, int sector_count) const; static const format file_formats[]; diff --git a/src/lib/formats/d67_dsk.c b/src/lib/formats/d67_dsk.c index 82adcbb3487..b512e55b694 100644 --- a/src/lib/formats/d67_dsk.c +++ b/src/lib/formats/d67_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" // offs_t +#include + #include "formats/d67_dsk.h" d67_format::d67_format() : d64_format(file_formats) diff --git a/src/lib/formats/d71_dsk.c b/src/lib/formats/d71_dsk.c index 3ec66697a22..af1186948c6 100644 --- a/src/lib/formats/d71_dsk.c +++ b/src/lib/formats/d71_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" // offs_t +#include + #include "formats/d71_dsk.h" d71_format::d71_format() : d64_format(formats) diff --git a/src/lib/formats/d80_dsk.c b/src/lib/formats/d80_dsk.c index 1f9c05f2f59..fbabbf1749e 100644 --- a/src/lib/formats/d80_dsk.c +++ b/src/lib/formats/d80_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" // offs_t +#include + #include "formats/d80_dsk.h" d80_format::d80_format() : d64_format(file_formats) diff --git a/src/lib/formats/d82_dsk.c b/src/lib/formats/d82_dsk.c index 33ffb4977c9..dfcff3a1f27 100644 --- a/src/lib/formats/d82_dsk.c +++ b/src/lib/formats/d82_dsk.c @@ -8,7 +8,8 @@ *********************************************************************/ -#include "emu.h" // offs_t +#include + #include "formats/d82_dsk.h" d82_format::d82_format() : d80_format(file_formats) diff --git a/src/lib/formats/g64_dsk.c b/src/lib/formats/g64_dsk.c index fec6b6e9c3d..a2500b473cd 100644 --- a/src/lib/formats/g64_dsk.c +++ b/src/lib/formats/g64_dsk.c @@ -10,7 +10,7 @@ *********************************************************************/ -#include "emu.h" // emu_fatalerror, offs_t +#include "emu.h" // emu_fatalerror #include "formats/g64_dsk.h" #define G64_FORMAT_HEADER "GCR-1541" @@ -53,7 +53,7 @@ bool g64_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) for (int track = 0; track < track_count; track++) { - offs_t track_offset = pick_integer_le(img, TRACK_OFFSET + (track * 4), 4); + UINT32 track_offset = pick_integer_le(img, TRACK_OFFSET + (track * 4), 4); if (!track_offset) continue; @@ -61,7 +61,7 @@ bool g64_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) if (track_offset > size) throw emu_fatalerror("g64_format: Track %u offset %06x out of bounds", track, track_offset); - offs_t speed_zone = pick_integer_le(img, SPEED_ZONE + (track * 4), 4); + UINT32 speed_zone = pick_integer_le(img, SPEED_ZONE + (track * 4), 4); if (speed_zone > 3) throw emu_fatalerror("g64_format: Unsupported variable speed zones on track %d", track); @@ -102,9 +102,9 @@ bool g64_format::save(io_generic *io, floppy_image *image) dynamic_buffer trackbuf(TRACK_LENGTH-2); for (int track = 0; track < 84; track++) { - offs_t tpos = TRACK_OFFSET + track * 4; - offs_t spos = SPEED_ZONE + track * 4; - offs_t dpos = TRACK_DATA + tracks_written * TRACK_LENGTH; + UINT32 tpos = TRACK_OFFSET + track * 4; + UINT32 spos = SPEED_ZONE + track * 4; + UINT32 dpos = TRACK_DATA + tracks_written * TRACK_LENGTH; io_generic_write_filler(io, 0x00, tpos, 4); io_generic_write_filler(io, 0x00, spos, 4); diff --git a/src/lib/formats/victor9k_dsk.c b/src/lib/formats/victor9k_dsk.c index 08328fd2619..020c4af46b3 100644 --- a/src/lib/formats/victor9k_dsk.c +++ b/src/lib/formats/victor9k_dsk.c @@ -237,7 +237,7 @@ floppy_image_format_t::desc_e* victor9k_format::get_sector_desc(const format &f, return desc; } -void victor9k_format::build_sector_description(const format &f, UINT8 *sectdata, offs_t sect_offs, desc_s *sectors, int sector_count) const +void victor9k_format::build_sector_description(const format &f, UINT8 *sectdata, UINT32 sect_offs, desc_s *sectors, int sector_count) const { for (int i = 0; i < sector_count; i++) { sectors[i].data = sectdata + sect_offs; diff --git a/src/lib/formats/victor9k_dsk.h b/src/lib/formats/victor9k_dsk.h index c1d00052a62..22f43fa7e3b 100644 --- a/src/lib/formats/victor9k_dsk.h +++ b/src/lib/formats/victor9k_dsk.h @@ -35,7 +35,7 @@ public: virtual int identify(io_generic *io, UINT32 form_factor); void log_boot_sector(UINT8 *data); floppy_image_format_t::desc_e* get_sector_desc(const format &f, int ¤t_size, int sector_count); - void build_sector_description(const format &f, UINT8 *sectdata, offs_t sect_offs, desc_s *sectors, int sector_count) const; + void build_sector_description(const format &f, UINT8 *sectdata, UINT32 sect_offs, desc_s *sectors, int sector_count) const; virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool supports_save() const; From bd4730b756a3270216ed4d48cb40a4f1eea6a843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Fri, 20 Mar 2015 19:13:26 +0100 Subject: [PATCH 115/201] more emu.h cleanups in src/lib/formats (nw) --- src/lib/formats/ap_dsk35.c | 2 +- src/lib/formats/apridisk.c | 2 +- src/lib/formats/cpis_dsk.c | 1 - src/lib/formats/d88_dsk.c | 1 - src/lib/formats/dfi_dsk.c | 2 +- src/lib/formats/dim_dsk.c | 3 +-- src/lib/formats/dsk_dsk.c | 1 - src/lib/formats/flopimg.c | 2 +- src/lib/formats/imd_dsk.c | 4 ++-- src/lib/formats/m20_dsk.c | 1 - 10 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/lib/formats/ap_dsk35.c b/src/lib/formats/ap_dsk35.c index 8eee2ee0dab..f218c996abd 100644 --- a/src/lib/formats/ap_dsk35.c +++ b/src/lib/formats/ap_dsk35.c @@ -99,7 +99,7 @@ #include #include -#include "emu.h" +#include "emu.h" // logerror #include "ap_dsk35.h" struct apple35_tag diff --git a/src/lib/formats/apridisk.c b/src/lib/formats/apridisk.c index 016d41e6210..0416add4405 100644 --- a/src/lib/formats/apridisk.c +++ b/src/lib/formats/apridisk.c @@ -4,7 +4,7 @@ ***************************************************************************/ -#include "emu.h" +#include "emu.h" // fatalerror #include "apridisk.h" #include "imageutl.h" #include "coretmpl.h" diff --git a/src/lib/formats/cpis_dsk.c b/src/lib/formats/cpis_dsk.c index ff550a06af3..d5a763acfb6 100644 --- a/src/lib/formats/cpis_dsk.c +++ b/src/lib/formats/cpis_dsk.c @@ -106,7 +106,6 @@ LEGACY_FLOPPY_OPTIONS_END *********************************************************************/ -#include "emu.h" #include "formats/cpis_dsk.h" cpis_format::cpis_format() : upd765_format(formats) diff --git a/src/lib/formats/d88_dsk.c b/src/lib/formats/d88_dsk.c index 0a8f84e7b13..abb2eac3079 100644 --- a/src/lib/formats/d88_dsk.c +++ b/src/lib/formats/d88_dsk.c @@ -391,7 +391,6 @@ FLOPPY_CONSTRUCT(d88_dsk_construct) *********************************************************************/ -#include "emu.h" #include "d88_dsk.h" d88_format::d88_format() diff --git a/src/lib/formats/dfi_dsk.c b/src/lib/formats/dfi_dsk.c index 2d5f83300db..d6790f76943 100644 --- a/src/lib/formats/dfi_dsk.c +++ b/src/lib/formats/dfi_dsk.c @@ -11,7 +11,7 @@ * Correctly note exact index timing. */ - #include "emu.h" // fatalerror +#include "emu.h" // fatalerror #include "dfi_dsk.h" #include #define NUMBER_OF_MULTIREADS 3 diff --git a/src/lib/formats/dim_dsk.c b/src/lib/formats/dim_dsk.c index 27d3e4e4ec5..b78bec1ba31 100644 --- a/src/lib/formats/dim_dsk.c +++ b/src/lib/formats/dim_dsk.c @@ -105,13 +105,12 @@ FLOPPY_CONSTRUCT(dim_dsk_construct) // copyright-holders:Olivier Galibert /********************************************************************* - formats/dim_dsk.h + formats/dim_dsk.c DIM disk images *********************************************************************/ -#include "emu.h" #include "dim_dsk.h" dim_format::dim_format() diff --git a/src/lib/formats/dsk_dsk.c b/src/lib/formats/dsk_dsk.c index 3d874f129d6..6129ff72b77 100644 --- a/src/lib/formats/dsk_dsk.c +++ b/src/lib/formats/dsk_dsk.c @@ -264,7 +264,6 @@ FLOPPY_CONSTRUCT( dsk_dsk_construct ) return FLOPPY_ERROR_SUCCESS; } -#include "emu.h" #include "dsk_dsk.h" #define DSK_FORMAT_HEADER "MV - CPC" diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c index 1b460638374..5b9e5f7ee03 100644 --- a/src/lib/formats/flopimg.c +++ b/src/lib/formats/flopimg.c @@ -13,7 +13,7 @@ #include #include -#include "emu.h" +#include "emu.h" // emu_fatalerror #include "osdcore.h" #include "ioprocs.h" #include "flopimg.h" diff --git a/src/lib/formats/imd_dsk.c b/src/lib/formats/imd_dsk.c index 631e4f2e45d..78f073fef1d 100644 --- a/src/lib/formats/imd_dsk.c +++ b/src/lib/formats/imd_dsk.c @@ -279,13 +279,13 @@ FLOPPY_CONSTRUCT( imd_dsk_construct ) // copyright-holders:Olivier Galibert /********************************************************************* - formats/imd_dsk.h + formats/imd_dsk.c IMD disk images *********************************************************************/ -#include "emu.h" +#include "emu.h" // emu_fatalerror #include "imd_dsk.h" imd_format::imd_format() diff --git a/src/lib/formats/m20_dsk.c b/src/lib/formats/m20_dsk.c index cf440908c9f..abd2cf1b2cb 100644 --- a/src/lib/formats/m20_dsk.c +++ b/src/lib/formats/m20_dsk.c @@ -180,7 +180,6 @@ LEGACY_FLOPPY_OPTIONS_END *********************************************************************/ -#include "emu.h" #include "formats/m20_dsk.h" m20_format::m20_format() From d7d2628d60c700526b6bcf25b0034874391bdd55 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 20 Mar 2015 19:26:03 +0100 Subject: [PATCH 116/201] suna16.c: added save state support (nw) --- src/mame/drivers/suna16.c | 66 +++++++++++++++++++++----------------- src/mame/includes/suna16.h | 59 +++++++++++++++++++++------------- src/mame/video/suna16.c | 13 ++++---- 3 files changed, 80 insertions(+), 58 deletions(-) diff --git a/src/mame/drivers/suna16.c b/src/mame/drivers/suna16.c index df926653c97..2677c793f41 100644 --- a/src/mame/drivers/suna16.c +++ b/src/mame/drivers/suna16.c @@ -25,7 +25,6 @@ Year + Game By Board Hardware #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" -#include "sound/dac.h" #include "sound/2151intf.h" #include "sound/ay8910.h" #include "sound/3526intf.h" @@ -39,7 +38,7 @@ Year + Game By Board Hardware ***************************************************************************/ -WRITE16_MEMBER(suna16_state::suna16_soundlatch_w) +WRITE16_MEMBER(suna16_state::soundlatch_w) { if (ACCESSING_BITS_0_7) { @@ -92,11 +91,11 @@ WRITE16_MEMBER(suna16_state::bestbest_coin_w) static ADDRESS_MAP_START( bssoccer_map, AS_PROGRAM, 16, suna16_state ) AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM AM_RANGE(0x200000, 0x203fff) AM_RAM // RAM - AM_RANGE(0x400000, 0x4001ff) AM_READWRITE(suna16_paletteram16_r, suna16_paletteram16_w) // Banked Palette + AM_RANGE(0x400000, 0x4001ff) AM_READWRITE(paletteram_r, paletteram_w) // Banked Palette AM_RANGE(0x400200, 0x400fff) AM_RAM // AM_RANGE(0x600000, 0x61ffff) AM_RAM AM_SHARE("spriteram") // Sprites - AM_RANGE(0xa00000, 0xa00001) AM_READ_PORT("P1") AM_WRITE(suna16_soundlatch_w) // To Sound CPU - AM_RANGE(0xa00002, 0xa00003) AM_READ_PORT("P2") AM_WRITE(suna16_flipscreen_w) // Flip Screen + AM_RANGE(0xa00000, 0xa00001) AM_READ_PORT("P1") AM_WRITE(soundlatch_w) // To Sound CPU + AM_RANGE(0xa00002, 0xa00003) AM_READ_PORT("P2") AM_WRITE(flipscreen_w) // Flip Screen AM_RANGE(0xa00004, 0xa00005) AM_READ_PORT("P3") AM_WRITE(bssoccer_leds_w) // Leds AM_RANGE(0xa00006, 0xa00007) AM_READ_PORT("P4") AM_WRITENOP // ? IRQ 1 Ack AM_RANGE(0xa00008, 0xa00009) AM_READ_PORT("DSW1") AM_WRITENOP // ? IRQ 2 Ack @@ -148,12 +147,12 @@ WRITE8_MEMBER(suna16_state::uballoon_prot_w) static ADDRESS_MAP_START( uballoon_map, AS_PROGRAM, 16, suna16_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x800000, 0x803fff) AM_RAM // RAM - AM_RANGE(0x200000, 0x2001ff) AM_READWRITE(suna16_paletteram16_r, suna16_paletteram16_w) // Banked Palette + AM_RANGE(0x200000, 0x2001ff) AM_READWRITE(paletteram_r, paletteram_w) // Banked Palette AM_RANGE(0x200200, 0x200fff) AM_RAM // AM_RANGE(0x400000, 0x41ffff) AM_MIRROR(0x1e0000) AM_RAM AM_SHARE("spriteram") // Sprites - AM_RANGE(0x600000, 0x600001) AM_READ_PORT("P1") AM_WRITE(suna16_soundlatch_w) // To Sound CPU + AM_RANGE(0x600000, 0x600001) AM_READ_PORT("P1") AM_WRITE(soundlatch_w) // To Sound CPU AM_RANGE(0x600002, 0x600003) AM_READ_PORT("P2") - AM_RANGE(0x600004, 0x600005) AM_READ_PORT("DSW1") AM_WRITE(suna16_flipscreen_w) // Flip Screen + AM_RANGE(0x600004, 0x600005) AM_READ_PORT("DSW1") AM_WRITE(flipscreen_w) // Flip Screen AM_RANGE(0x600006, 0x600007) AM_READ_PORT("DSW2") AM_RANGE(0x600008, 0x600009) AM_WRITE(uballoon_leds_w) // Leds AM_RANGE(0x60000c, 0x60000d) AM_WRITENOP // ? IRQ 1 Ack @@ -168,11 +167,11 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( sunaq_map, AS_PROGRAM, 16, suna16_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM - AM_RANGE(0x500000, 0x500001) AM_READ_PORT("P1") AM_WRITE(suna16_soundlatch_w) // To Sound CPU - AM_RANGE(0x500002, 0x500003) AM_READ_PORT("P2") AM_WRITE(suna16_flipscreen_w) // Flip Screen + AM_RANGE(0x500000, 0x500001) AM_READ_PORT("P1") AM_WRITE(soundlatch_w) // To Sound CPU + AM_RANGE(0x500002, 0x500003) AM_READ_PORT("P2") AM_WRITE(flipscreen_w) // Flip Screen AM_RANGE(0x500004, 0x500005) AM_READ_PORT("DSW1") AM_RANGE(0x500006, 0x500007) AM_READ_PORT("DSW2") // (unused?) - AM_RANGE(0x540000, 0x5401ff) AM_READWRITE(suna16_paletteram16_r, suna16_paletteram16_w) + AM_RANGE(0x540000, 0x5401ff) AM_READWRITE(paletteram_r, paletteram_w) AM_RANGE(0x540200, 0x540fff) AM_RAM // RAM AM_RANGE(0x580000, 0x583fff) AM_RAM // RAM AM_RANGE(0x5c0000, 0x5dffff) AM_RAM AM_SHARE("spriteram") // Sprites @@ -202,18 +201,23 @@ WRITE8_MEMBER(suna16_state::bestbest_prot_w) static ADDRESS_MAP_START( bestbest_map, AS_PROGRAM, 16, suna16_state ) AM_RANGE( 0x000000, 0x03ffff ) AM_ROM AM_MIRROR(0xc0000) // ROM AM_RANGE( 0x200000, 0x2fffff ) AM_ROM AM_REGION("user1", 0) // ROM - AM_RANGE( 0x500000, 0x500001 ) AM_READ_PORT("P1") AM_WRITE(suna16_soundlatch_w) // To Sound CPU + AM_RANGE( 0x500000, 0x500001 ) AM_READ_PORT("P1") AM_WRITE(soundlatch_w) // To Sound CPU AM_RANGE( 0x500002, 0x500003 ) AM_READ_PORT("P2") AM_WRITE(bestbest_flipscreen_w) // P2 + Coins, Flip Screen AM_RANGE( 0x500004, 0x500005 ) AM_READ_PORT("DSW") AM_WRITE(bestbest_coin_w) // Coin Counter AM_RANGE( 0x500008, 0x500009 ) AM_WRITE8(bestbest_prot_w, 0x00ff) // Protection AM_RANGE( 0x500018, 0x500019 ) AM_READ8(bestbest_prot_r, 0x00ff) // " - AM_RANGE( 0x540000, 0x540fff ) AM_READWRITE(suna16_paletteram16_r, suna16_paletteram16_w ) // Banked(?) Palette + AM_RANGE( 0x540000, 0x540fff ) AM_READWRITE(paletteram_r, paletteram_w ) // Banked(?) Palette AM_RANGE( 0x541000, 0x54ffff ) AM_RAM // AM_RANGE( 0x580000, 0x58ffff ) AM_RAM // RAM AM_RANGE( 0x5c0000, 0x5dffff ) AM_RAM AM_SHARE("spriteram") // Sprites (Chip 1) AM_RANGE( 0x5e0000, 0x5fffff ) AM_RAM AM_SHARE("spriteram2") // Sprites (Chip 2) ADDRESS_MAP_END +MACHINE_START_MEMBER(suna16_state,bestbest) +{ + save_item(NAME(m_prot)); +} + /*************************************************************************** @@ -330,11 +334,11 @@ ADDRESS_MAP_END /* 2 DACs per CPU - 4 bits per sample */ -WRITE8_MEMBER(suna16_state::bssoccer_DAC1_w) +WRITE8_MEMBER(suna16_state::DAC1_w) { m_dac1->write_unsigned8( (data & 0xf) * 0x11 ); } -WRITE8_MEMBER(suna16_state::bssoccer_DAC2_w) +WRITE8_MEMBER(suna16_state::DAC2_w) { m_dac2->write_unsigned8( (data & 0xf) * 0x11 ); } @@ -350,8 +354,8 @@ WRITE8_MEMBER(suna16_state::bssoccer_DAC4_w) static ADDRESS_MAP_START( bssoccer_pcm_1_io_map, AS_IO, 8, suna16_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ(soundlatch2_byte_r) // From The Sound Z80 - AM_RANGE(0x00, 0x00) AM_WRITE(bssoccer_DAC1_w) // 2 x DAC - AM_RANGE(0x01, 0x01) AM_WRITE(bssoccer_DAC2_w) // 2 x DAC + AM_RANGE(0x00, 0x00) AM_WRITE(DAC1_w) // 2 x DAC + AM_RANGE(0x01, 0x01) AM_WRITE(DAC2_w) // 2 x DAC AM_RANGE(0x03, 0x03) AM_WRITE(bssoccer_pcm_1_bankswitch_w) // Rom Bank ADDRESS_MAP_END @@ -387,14 +391,16 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( uballoon_pcm_1_io_map, AS_IO, 8, suna16_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ(soundlatch2_byte_r) // From The Sound Z80 - AM_RANGE(0x00, 0x00) AM_WRITE(bssoccer_DAC1_w) // 2 x DAC - AM_RANGE(0x01, 0x01) AM_WRITE(bssoccer_DAC2_w) // 2 x DAC + AM_RANGE(0x00, 0x00) AM_WRITE(DAC1_w) // 2 x DAC + AM_RANGE(0x01, 0x01) AM_WRITE(DAC2_w) // 2 x DAC AM_RANGE(0x03, 0x03) AM_WRITE(uballoon_pcm_1_bankswitch_w) // Rom Bank ADDRESS_MAP_END MACHINE_START_MEMBER(suna16_state,uballoon) { membank("bank1")->configure_entries(0, 2, memregion("pcm1")->base() + 0x400, 0x10000); + + save_item(NAME(m_prot)); } MACHINE_RESET_MEMBER(suna16_state,uballoon) @@ -415,8 +421,8 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( bestbest_pcm_1_iomap, AS_IO, 8, suna16_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ (soundlatch2_byte_r ) // From The Sound Z80 - AM_RANGE(0x00, 0x00) AM_MIRROR(0x02) AM_WRITE(bssoccer_DAC1_w) // 2 x DAC - AM_RANGE(0x01, 0x01) AM_MIRROR(0x02) AM_WRITE(bssoccer_DAC2_w) // 2 x DAC + AM_RANGE(0x00, 0x00) AM_MIRROR(0x02) AM_WRITE(DAC1_w) // 2 x DAC + AM_RANGE(0x01, 0x01) AM_MIRROR(0x02) AM_WRITE(DAC2_w) // 2 x DAC ADDRESS_MAP_END /*************************************************************************** @@ -830,7 +836,7 @@ static MACHINE_CONFIG_START( bssoccer, suna16_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE_DRIVER(suna16_state, screen_update_suna16) + MCFG_SCREEN_UPDATE_DRIVER(suna16_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", suna16) @@ -890,7 +896,7 @@ static MACHINE_CONFIG_START( uballoon, suna16_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE_DRIVER(suna16_state, screen_update_suna16) + MCFG_SCREEN_UPDATE_DRIVER(suna16_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", suna16) @@ -939,7 +945,7 @@ static MACHINE_CONFIG_START( sunaq, suna16_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE_DRIVER(suna16_state, screen_update_suna16) + MCFG_SCREEN_UPDATE_DRIVER(suna16_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", suna16) @@ -986,6 +992,8 @@ static MACHINE_CONFIG_START( bestbest, suna16_state ) /* 2nd PCM Z80 missing */ MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + + MCFG_MACHINE_START_OVERRIDE(suna16_state, bestbest) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1357,8 +1365,8 @@ ROM_END ***************************************************************************/ -GAME( 1994, bestbest, 0, bestbest, bestbest, driver_device, 0, ROT0, "SunA", "Best Of Best", 0 ) -GAME( 1994, sunaq, 0, sunaq, sunaq, driver_device, 0, ROT0, "SunA", "SunA Quiz 6000 Academy (940620-6)", 0 ) // Date/Version on-screen is 940620-6, but in the program rom it's 1994,6,30 K.H.T V6.00 -GAME( 1996, bssoccer, 0, bssoccer, bssoccer, driver_device, 0, ROT0, "SunA (Unico license)", "Back Street Soccer (KRB-0031 PCB)", 0 ) -GAME( 1996, bssoccera, bssoccer, bssoccer, bssoccer, driver_device, 0, ROT0, "SunA (Unico license)", "Back Street Soccer (KRB-0032A PCB)", 0 ) -GAME( 1996, uballoon, 0, uballoon, uballoon, driver_device, 0, ROT0, "SunA (Unico license)", "Ultra Balloon", 0 ) +GAME( 1994, bestbest, 0, bestbest, bestbest, driver_device, 0, ROT0, "SunA", "Best Of Best", GAME_SUPPORTS_SAVE ) +GAME( 1994, sunaq, 0, sunaq, sunaq, driver_device, 0, ROT0, "SunA", "SunA Quiz 6000 Academy (940620-6)", GAME_SUPPORTS_SAVE ) // Date/Version on-screen is 940620-6, but in the program rom it's 1994,6,30 K.H.T V6.00 +GAME( 1996, bssoccer, 0, bssoccer, bssoccer, driver_device, 0, ROT0, "SunA (Unico license)", "Back Street Soccer (KRB-0031 PCB)", GAME_SUPPORTS_SAVE ) +GAME( 1996, bssoccera, bssoccer, bssoccer, bssoccer, driver_device, 0, ROT0, "SunA (Unico license)", "Back Street Soccer (KRB-0032A PCB)", GAME_SUPPORTS_SAVE ) +GAME( 1996, uballoon, 0, uballoon, uballoon, driver_device, 0, ROT0, "SunA (Unico license)", "Ultra Balloon", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/suna16.h b/src/mame/includes/suna16.h index b7136d46524..6ccfc4f4045 100644 --- a/src/mame/includes/suna16.h +++ b/src/mame/includes/suna16.h @@ -6,20 +6,18 @@ public: suna16_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this,"maincpu"), - m_spriteram(*this, "spriteram"), - m_spriteram2(*this, "spriteram2"), m_dac1(*this, "dac1"), m_dac2(*this, "dac2"), m_dac3(*this, "dac3"), m_dac4(*this, "dac4"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_spriteram(*this, "spriteram"), + m_spriteram2(*this, "spriteram2") { } required_device m_maincpu; - required_shared_ptr m_spriteram; - optional_shared_ptr m_spriteram2; required_device m_dac1; required_device m_dac2; optional_device m_dac3; @@ -27,37 +25,52 @@ public: required_device m_gfxdecode; required_device m_screen; required_device m_palette; - UINT8 m_prot; + + required_shared_ptr m_spriteram; + optional_shared_ptr m_spriteram2; + UINT16 *m_paletteram; int m_color_bank; + UINT8 m_prot; - DECLARE_WRITE16_MEMBER(suna16_soundlatch_w); - DECLARE_WRITE16_MEMBER(bssoccer_leds_w); - DECLARE_WRITE16_MEMBER(uballoon_leds_w); - DECLARE_READ8_MEMBER(uballoon_prot_r); - DECLARE_WRITE8_MEMBER(uballoon_prot_w); + // common + DECLARE_WRITE16_MEMBER(soundlatch_w); + DECLARE_READ16_MEMBER(paletteram_r); + DECLARE_WRITE16_MEMBER(paletteram_w); + DECLARE_WRITE16_MEMBER(flipscreen_w); + DECLARE_WRITE8_MEMBER(DAC1_w); + DECLARE_WRITE8_MEMBER(DAC2_w); + + // bestbest specific + DECLARE_WRITE16_MEMBER(bestbest_flipscreen_w); DECLARE_WRITE16_MEMBER(bestbest_coin_w); DECLARE_READ8_MEMBER(bestbest_prot_r); DECLARE_WRITE8_MEMBER(bestbest_prot_w); + DECLARE_WRITE8_MEMBER(bestbest_ay8910_port_a_w); + + // bssoccer specific + DECLARE_WRITE16_MEMBER(bssoccer_leds_w); DECLARE_WRITE8_MEMBER(bssoccer_pcm_1_bankswitch_w); DECLARE_WRITE8_MEMBER(bssoccer_pcm_2_bankswitch_w); - DECLARE_WRITE8_MEMBER(uballoon_pcm_1_bankswitch_w); - DECLARE_WRITE16_MEMBER(suna16_flipscreen_w); - DECLARE_WRITE16_MEMBER(bestbest_flipscreen_w); - DECLARE_READ16_MEMBER(suna16_paletteram16_r); - DECLARE_WRITE16_MEMBER(suna16_paletteram16_w); - DECLARE_MACHINE_START(bssoccer); - DECLARE_WRITE8_MEMBER(bssoccer_DAC1_w); - DECLARE_WRITE8_MEMBER(bssoccer_DAC2_w); DECLARE_WRITE8_MEMBER(bssoccer_DAC3_w); DECLARE_WRITE8_MEMBER(bssoccer_DAC4_w); - DECLARE_WRITE8_MEMBER(bestbest_ay8910_port_a_w); + + // uballoon specific + DECLARE_WRITE16_MEMBER(uballoon_leds_w); + DECLARE_WRITE8_MEMBER(uballoon_pcm_1_bankswitch_w); + DECLARE_READ8_MEMBER(uballoon_prot_r); + DECLARE_WRITE8_MEMBER(uballoon_prot_w); + + TIMER_DEVICE_CALLBACK_MEMBER(bssoccer_interrupt); + DECLARE_DRIVER_INIT(uballoon); virtual void video_start(); - DECLARE_MACHINE_RESET(uballoon); + DECLARE_MACHINE_START(bestbest); + DECLARE_MACHINE_START(bssoccer); DECLARE_MACHINE_START(uballoon); - UINT32 screen_update_suna16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + DECLARE_MACHINE_RESET(uballoon); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_bestbest(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_DEVICE_CALLBACK_MEMBER(bssoccer_interrupt); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 *sprites, int gfx); }; diff --git a/src/mame/video/suna16.c b/src/mame/video/suna16.c index b9d36b13a94..e58ce304103 100644 --- a/src/mame/video/suna16.c +++ b/src/mame/video/suna16.c @@ -60,7 +60,7 @@ #include "emu.h" #include "includes/suna16.h" -WRITE16_MEMBER(suna16_state::suna16_flipscreen_w) +WRITE16_MEMBER(suna16_state::flipscreen_w) { if (ACCESSING_BITS_0_7) { @@ -92,14 +92,16 @@ WRITE16_MEMBER(suna16_state::bestbest_flipscreen_w) void suna16_state::video_start() { m_paletteram = auto_alloc_array(machine(), UINT16, m_palette->entries()); + + save_item(NAME(m_color_bank)); } -READ16_MEMBER(suna16_state::suna16_paletteram16_r) +READ16_MEMBER(suna16_state::paletteram_r) { return m_paletteram[offset + m_color_bank * 256]; } -WRITE16_MEMBER(suna16_state::suna16_paletteram16_w) +WRITE16_MEMBER(suna16_state::paletteram_w) { offset += m_color_bank * 256; data = COMBINE_DATA(&m_paletteram[offset]); @@ -117,11 +119,10 @@ WRITE16_MEMBER(suna16_state::suna16_paletteram16_w) void suna16_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 *sprites, int gfx) { - int offs; int max_x = m_screen->width() - 8; int max_y = m_screen->height() - 8; - for ( offs = 0xfc00/2; offs < 0x10000/2 ; offs += 4/2 ) + for ( int offs = 0xfc00/2; offs < 0x10000/2 ; offs += 4/2 ) { int srcpg, srcx,srcy, dimx,dimy; int tile_x, tile_xinc, tile_xstart; @@ -213,7 +214,7 @@ void suna16_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, ***************************************************************************/ -UINT32 suna16_state::screen_update_suna16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 suna16_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* Suna Quiz indicates the background is the last pen */ bitmap.fill(0xff, cliprect); From ec7e08d074dbeeabeab8800bab698c489ec33d75 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Fri, 20 Mar 2015 22:50:32 +0100 Subject: [PATCH 117/201] Use the special asserts only for regression testing (nw) --- src/emu/emucore.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 899ee9fa670..d1eea01e08f 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -214,6 +214,11 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define FUNC(x) &x, #x #define FUNC_NULL NULL, "(null)" +#ifndef REGRESSION_TESTING + +#define assert_always(x, msg) do { if (!(x)) { fprintf(stderr, "%s:%d: Assert failure: %s: %s\n", __FILE__, __LINE__, msg, #x); abort(); }} while (0) + +#else // standard assertion macros #undef assert @@ -230,6 +235,8 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) #endif +#endif + // macros to convert radians to degrees and degrees to radians #define RADIAN_TO_DEGREE(x) ((180.0 / M_PI) * (x)) From c5bfb8287fb00916b858c0ae70bdbc1fa79fa9b8 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 21 Mar 2015 01:13:57 +0100 Subject: [PATCH 118/201] verfied anem, bnem, ayy. entex pacman2 and galaxian2 are playable, coleco alien attack still seems glitchy --- src/emu/cpu/hmcs40/hmcs40.c | 150 ++++++++++++++--------------------- src/emu/cpu/hmcs40/hmcs40d.c | 18 ++--- src/mess/drivers/hh_hmcs40.c | 34 ++++---- 3 files changed, 86 insertions(+), 116 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index 9bffeba24f5..f80852283df 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -575,107 +575,65 @@ void hmcs40_cpu_device::execute_run() // fetch next opcode debugger_instruction_hook(this, m_pc); m_op = m_program->read_word(m_pc << 1) & 0x3ff; - m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for immediate param (except for XAMR?) + m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for 4-bit immediate param (except for XAMR) increment_pc(); // handle opcode switch (m_op) { - // unknown: - /* - lay 118 - ayy 058 - syy 258 - am 034 - anem 124/324/024/234 - alem - bnem - blem - nega 244 - */ - - case 0x118: - op_lay(); // probably lay - break; - case 0x034: - op_am(); // probably am - break; - - - case 0x124: - //op_illegal(); - op_alem(); - break; - case 0x324: - //op_illegal(); - op_anem(); - break; - - case 0x024: - //op_illegal(); - op_bnem(); - break; - case 0x234: - //op_illegal(); - op_blem(); - break; - - - - - - - - - - /* 0x000 */ case 0x000: case 0x001: case 0x002: case 0x003: -/* ok */ op_xsp(); break; + op_xsp(); break; case 0x004: case 0x005: case 0x006: case 0x007: op_sem(); break; case 0x008: case 0x009: case 0x00a: case 0x00b: -/* ok */ op_lam(); break; + op_lam(); break; case 0x010: case 0x011: case 0x012: case 0x013: case 0x014: case 0x015: case 0x016: case 0x017: case 0x018: case 0x019: case 0x01a: case 0x01b: case 0x01c: case 0x01d: case 0x01e: case 0x01f: -/* ok */ op_lmiiy(); break; + op_lmiiy(); break; case 0x020: case 0x021: case 0x022: case 0x023: op_lbm(); break; + case 0x024: + op_blem(); break; case 0x030: -/* ok */ op_amc(); break; + op_amc(); break; + case 0x034: + op_am(); break; case 0x03c: op_lta(); break; case 0x040: -/* ok */ op_lxa(); break; + op_lxa(); break; case 0x045: -/* ok */ op_das(); break; + op_das(); break; case 0x046: -/* ok */ op_daa(); break; + op_daa(); break; case 0x04c: -/* ok */ op_rec(); break; + op_rec(); break; case 0x04f: -/* ok */ op_sec(); break; + op_sec(); break; case 0x050: op_lya(); break; case 0x054: -/* ok */ op_iy(); break; + op_iy(); break; + case 0x058: + op_ayy(); break; case 0x060: op_lba(); break; case 0x064: op_ib(); break; case 0x070: case 0x071: case 0x072: case 0x073: case 0x074: case 0x075: case 0x076: case 0x077: case 0x078: case 0x079: case 0x07a: case 0x07b: case 0x07c: case 0x07d: case 0x07e: case 0x07f: -/* ok */ op_lai(); break; + op_lai(); break; case 0x080: case 0x081: case 0x082: case 0x083: case 0x084: case 0x085: case 0x086: case 0x087: case 0x088: case 0x089: case 0x08a: case 0x08b: case 0x08c: case 0x08d: case 0x08e: case 0x08f: -/* ok */ op_ai(); break; + op_ai(); break; case 0x090: -/* ok */ op_sed(); break; + op_sed(); break; case 0x094: -/* ok */ op_td(); break; + op_td(); break; case 0x0a0: op_seif1(); break; case 0x0a1: @@ -683,7 +641,7 @@ void hmcs40_cpu_device::execute_run() case 0x0a2: op_seif0(); break; case 0x0a4: -/* ok */ op_seie(); break; + op_seie(); break; case 0x0a5: op_setf(); break; @@ -696,30 +654,34 @@ void hmcs40_cpu_device::execute_run() op_lbr(); break; case 0x0f0: case 0x0f1: case 0x0f2: case 0x0f3: case 0x0f4: case 0x0f5: case 0x0f6: case 0x0f7: case 0x0f8: case 0x0f9: case 0x0fa: case 0x0fb: case 0x0fc: case 0x0fd: case 0x0fe: case 0x0ff: -/* ok */ op_xamr(); break; + op_xamr(); break; /* 0x100 */ -/* ok */ case 0x110: case 0x111: + case 0x110: case 0x111: op_lmaiy(); break; -/* ok */ case 0x114: case 0x115: + case 0x114: case 0x115: op_lmady(); break; + case 0x118: + op_lay(); break; case 0x120: op_or(); break; + case 0x124: + op_anem(); break; case 0x140: case 0x141: case 0x142: case 0x143: case 0x144: case 0x145: case 0x146: case 0x147: case 0x148: case 0x149: case 0x14a: case 0x14b: case 0x14c: case 0x14d: case 0x14e: case 0x14f: -/* ok */ op_lxi(); break; + op_lxi(); break; case 0x150: case 0x151: case 0x152: case 0x153: case 0x154: case 0x155: case 0x156: case 0x157: case 0x158: case 0x159: case 0x15a: case 0x15b: case 0x15c: case 0x15d: case 0x15e: case 0x15f: -/* ok */ op_lyi(); break; + op_lyi(); break; case 0x160: case 0x161: case 0x162: case 0x163: case 0x164: case 0x165: case 0x166: case 0x167: case 0x168: case 0x169: case 0x16a: case 0x16b: case 0x16c: case 0x16d: case 0x16e: case 0x16f: -/* ok */ op_lbi(); break; + op_lbi(); break; case 0x170: case 0x171: case 0x172: case 0x173: case 0x174: case 0x175: case 0x176: case 0x177: case 0x178: case 0x179: case 0x17a: case 0x17b: case 0x17c: case 0x17d: case 0x17e: case 0x17f: -/* ok */ op_lti(); break; + op_lti(); break; case 0x1a0: op_tif1(); break; @@ -740,7 +702,7 @@ void hmcs40_cpu_device::execute_run() case 0x1e8: case 0x1e9: case 0x1ea: case 0x1eb: case 0x1ec: case 0x1ed: case 0x1ee: case 0x1ef: case 0x1f0: case 0x1f1: case 0x1f2: case 0x1f3: case 0x1f4: case 0x1f5: case 0x1f6: case 0x1f7: case 0x1f8: case 0x1f9: case 0x1fa: case 0x1fb: case 0x1fc: case 0x1fd: case 0x1fe: case 0x1ff: -/* ok */ op_br(); break; + op_br(); break; /* 0x200 */ @@ -750,42 +712,48 @@ void hmcs40_cpu_device::execute_run() case 0x204: case 0x205: case 0x206: case 0x207: op_rem(); break; case 0x208: case 0x209: case 0x20a: case 0x20b: -/* ok */ op_xma(); break; + op_xma(); break; case 0x210: case 0x211: case 0x212: case 0x213: case 0x214: case 0x215: case 0x216: case 0x217: case 0x218: case 0x219: case 0x21a: case 0x21b: case 0x21c: case 0x21d: case 0x21e: case 0x21f: op_mnei(); break; case 0x220: case 0x221: case 0x222: case 0x223: -/* ok */ op_xmb(); break; + op_xmb(); break; case 0x224: -/* ok */ op_rotr(); break; + op_rotr(); break; case 0x225: -/* ok */ op_rotl(); break; + op_rotl(); break; case 0x230: -/* ok */ op_smc(); break; + op_smc(); break; + case 0x234: + op_alem(); break; case 0x23c: op_lat(); break; case 0x240: -/* ok */ op_laspx(); break; + op_laspx(); break; + case 0x244: + op_nega(); break; case 0x24f: op_tc(); break; case 0x250: -/* ok */ op_laspy(); break; + op_laspy(); break; case 0x254: op_dy(); break; + case 0x258: + op_syy(); break; case 0x260: -/* ok */ op_lab(); break; + op_lab(); break; case 0x267: op_db(); break; case 0x270: case 0x271: case 0x272: case 0x273: case 0x274: case 0x275: case 0x276: case 0x277: case 0x278: case 0x279: case 0x27a: case 0x27b: case 0x27c: case 0x27d: case 0x27e: case 0x27f: -/* ok */ op_alei(); break; + op_alei(); break; case 0x280: case 0x281: case 0x282: case 0x283: case 0x284: case 0x285: case 0x286: case 0x287: case 0x288: case 0x289: case 0x28a: case 0x28b: case 0x28c: case 0x28d: case 0x28e: case 0x28f: -/* ok */ op_ynei(); break; + op_ynei(); break; case 0x290: -/* ok */ op_red(); break; + op_red(); break; case 0x2a0: op_reif1(); break; case 0x2a1: @@ -795,10 +763,10 @@ void hmcs40_cpu_device::execute_run() case 0x2a4: op_reie(); break; case 0x2a5: -/* ok */ op_retf(); break; + op_retf(); break; case 0x2c0: case 0x2c1: case 0x2c2: case 0x2c3: case 0x2c4: case 0x2c5: case 0x2c6: case 0x2c7: -/* ok */ op_lra(); break; + op_lra(); break; case 0x2d0: case 0x2d1: case 0x2d2: case 0x2d3: case 0x2d4: case 0x2d5: case 0x2d6: case 0x2d7: case 0x2d8: case 0x2d9: case 0x2da: case 0x2db: case 0x2dc: case 0x2dd: case 0x2de: case 0x2df: op_redd(); break; @@ -809,21 +777,23 @@ void hmcs40_cpu_device::execute_run() /* 0x300 */ case 0x320: op_comb(); break; + case 0x324: + op_bnem(); break; case 0x340: case 0x341: case 0x342: case 0x343: case 0x344: case 0x345: case 0x346: case 0x347: case 0x348: case 0x349: case 0x34a: case 0x34b: case 0x34c: case 0x34d: case 0x34e: case 0x34f: case 0x350: case 0x351: case 0x352: case 0x353: case 0x354: case 0x355: case 0x356: case 0x357: case 0x358: case 0x359: case 0x35a: case 0x35b: case 0x35c: case 0x35d: case 0x35e: case 0x35f: -/* ok */ op_lpu(); break; + op_lpu(); break; case 0x360: case 0x361: case 0x362: case 0x363: case 0x364: case 0x365: case 0x366: case 0x367: op_tbr(); break; case 0x368: case 0x369: case 0x36a: case 0x36b: case 0x36c: case 0x36d: case 0x36e: case 0x36f: -/* ok */ op_p(); break; + op_p(); break; case 0x3a4: -/* ok */ op_rtni(); break; + op_rtni(); break; case 0x3a7: -/* ok */ op_rtn(); break; + op_rtn(); break; case 0x3c0: case 0x3c1: case 0x3c2: case 0x3c3: case 0x3c4: case 0x3c5: case 0x3c6: case 0x3c7: case 0x3c8: case 0x3c9: case 0x3ca: case 0x3cb: case 0x3cc: case 0x3cd: case 0x3ce: case 0x3cf: @@ -833,7 +803,7 @@ void hmcs40_cpu_device::execute_run() case 0x3e8: case 0x3e9: case 0x3ea: case 0x3eb: case 0x3ec: case 0x3ed: case 0x3ee: case 0x3ef: case 0x3f0: case 0x3f1: case 0x3f2: case 0x3f3: case 0x3f4: case 0x3f5: case 0x3f6: case 0x3f7: case 0x3f8: case 0x3f9: case 0x3fa: case 0x3fb: case 0x3fc: case 0x3fd: case 0x3fe: case 0x3ff: -/* ok */ op_cal(); break; + op_cal(); break; default: diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 8866d85a4ce..8ba142510e5 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -93,11 +93,11 @@ static const UINT8 hmcs40_mnemonic[0x400] = /* 0x000 */ mNOP, mXSP, mXSP, mXSP, mSEM, mSEM, mSEM, mSEM, mLAM, mLAM, mLAM, mLAM, mILL, mILL, mILL, mILL, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, - mLBM, mLBM, mLBM, mLBM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mAMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLTA, mILL, mILL, mILL, + mLBM, mLBM, mLBM, mLBM, mBLEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mAMC, mILL, mILL, mILL, mAM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLTA, mILL, mILL, mILL, /* 0x040 */ mLXA, mILL, mILL, mILL, mILL, mDAS, mDAA, mILL, mILL, mILL, mILL, mILL, mREC, mILL, mILL, mSEC, - mLYA, mILL, mILL, mILL, mIY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLYA, mILL, mILL, mILL, mIY, mILL, mILL, mILL, mAYY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLBA, mILL, mILL, mILL, mIB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, /* 0x080 */ @@ -114,8 +114,8 @@ static const UINT8 hmcs40_mnemonic[0x400] = /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /* 0x100 */ mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mLMAIY, mLMAIY, mILL, mILL, mLMADY, mLMADY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mOR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLMAIY, mLMAIY, mILL, mILL, mLMADY, mLMADY, mILL, mILL, mLAY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mOR, mILL, mILL, mILL, mANEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, /* 0x140 */ mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, @@ -138,10 +138,10 @@ static const UINT8 hmcs40_mnemonic[0x400] = mTM, mTM, mTM, mTM, mREM, mREM, mREM, mREM, mXMA, mXMA, mXMA, mXMA, mILL, mILL, mILL, mILL, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mXMB, mXMB, mXMB, mXMB, mROTR, mROTL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mSMC, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAT, mILL, mILL, mILL, + mSMC, mILL, mILL, mILL, mALEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAT, mILL, mILL, mILL, /* 0x240 */ - mLASPX, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mTC, - mLASPY, mILL, mILL, mILL, mDY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLASPX, mILL, mILL, mILL, mNEGA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mTC, + mLASPY, mILL, mILL, mILL, mDY, mILL, mILL, mILL, mSYY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAB, mILL, mILL, mILL, mILL, mILL, mILL, mDB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, /* 0x280 */ @@ -159,7 +159,7 @@ static const UINT8 hmcs40_mnemonic[0x400] = /* 0x300 */ mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mCOMB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mCOMB, mILL, mILL, mILL, mBNEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, /* 0x340 */ mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 1c554cf4419..37243f834b0 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -611,19 +611,19 @@ READ8_MEMBER(hh_hmcs40_state::egalaxn2_input_r) static INPUT_PORTS_START( egalaxn2 ) PORT_START("IN.0") // D1 port R0x PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // separate directional buttons, hence 16way PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // " PORT_START("IN.1") // D2 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY // separate directional buttons, hence 16way - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY // " + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // " PORT_START("IN.2") // D3 port R0x PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -688,13 +688,13 @@ static INPUT_PORTS_START( epacman2 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // " PORT_START("IN.1") // D2 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY // separate directional buttons, hence 16way - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY // " + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY // separate directional buttons, hence 16way + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // " PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Skill Control") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Skill Control") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Demo Light Test") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -702,12 +702,12 @@ static INPUT_PORTS_START( epacman2 ) PORT_START("IN.3") // D4 port R0x PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONFNAME( 0x02, 0x02, "Skill" ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x0c, 0x00, "Players" ) - PORT_CONFSETTING( 0x08, "0 (Demo)" ) PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFNAME( 0x0c, 0x04, "Players" ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) INPUT_PORTS_END From 6e6a3ef1de612cd238c8bc123cea9a247b988aa8 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 21 Mar 2015 16:30:30 +1100 Subject: [PATCH 119/201] Hook up VBLANK IRQ enable in unkch sets, fixes crash on second coin when Super Jackpot is enabled --- src/mame/drivers/goldstar.c | 71 ++++++++++++++++++++++-------------- src/mame/includes/goldstar.h | 4 ++ 2 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 9cb49d0527e..923e7d52417 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -119,10 +119,6 @@ * unkch sets - unkch4 always crashes if you insert coins while already credited. unkch1 and - unkch2 show the same behaviour only if you enable the Super Jackpot feature with - DSW2-6/7. - unkch3 has a handy input test mode. To access it, first enable it with DSW4-5, then hold the Settings button (9) during boot. @@ -222,21 +218,10 @@ WRITE8_MEMBER(goldstar_state::p1_lamps_w) -x-- ---- hold x--- ---- - 7654 3210 unkch1 - ---- ---x bet-a/stop 2 - ---- --x- start/stop all - ---- -x-- info/small/stop 3 - ---- x--- big - ---x ---- bet-b/d-up - --x- ---- take/stop 1 - -x-- ---- - x--- ---- always on - all cm/cmaster use the same scheme tonypok uses lamps to indicate current button functions rather than active buttons skill98 is like schery97 but doesn't activate bit 0 for stop nfb96, roypok96 and nc96 sets are like schery97 but they don't activate bit 2 for select - all unkch use the same scheme, these sets use crude PWM to dim lamps which requires better lamp simulation */ output_set_lamp_value(0, (data >> 0) & 1); output_set_lamp_value(1, (data >> 1) & 1); @@ -999,6 +984,34 @@ WRITE8_MEMBER(unkch_state::coincount_w) popmessage("coin counters: %02x", data); } +WRITE8_MEMBER(unkch_state::unkcm_0x02_w) +{ +/* bits + 7654 3210 + ---- ---x button lamp: Bet-A / Stop 2 + ---- --x- button lamp: Start / Stop All + ---- -x-- button lamp: Info / Small / Stop 3 + ---- x--- button lamp: Big + ---x ---- button lamp: Bet-B / D-Up + --x- ---- button lamp: Take / Stop 1 + -x-- ---- unknown/unused + x--- ---- vblank IRQ enable + + these sets use crude PWM to dim lamp 2 which requires filament physics simulation to work properly +*/ + + //popmessage("unkcm_0x02_w %02x", data); + + m_vblank_irq_enable = data & 0x80; + + output_set_lamp_value(0, (data >> 0) & 1); /* Bet-A / Stop 2 */ + output_set_lamp_value(1, (data >> 1) & 1); /* Start / Stop All */ + output_set_lamp_value(2, (data >> 2) & 1); /* Info / Small / Stop 3 */ + output_set_lamp_value(3, (data >> 3) & 1); /* Big */ + output_set_lamp_value(4, (data >> 4) & 1); /* Bet-B / D-Up */ + output_set_lamp_value(5, (data >> 5) & 1); /* Take / Stop 1 */ +} + WRITE8_MEMBER(unkch_state::unkcm_0x03_w) { //popmessage("unkcm_0x03_w %02x", data); @@ -1013,7 +1026,7 @@ static ADDRESS_MAP_START( unkch_portmap, AS_IO, 8, unkch_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x01, 0x01) AM_WRITE(coincount_w) - AM_RANGE(0x02, 0x02) AM_WRITE(p1_lamps_w) + AM_RANGE(0x02, 0x02) AM_WRITE(unkcm_0x02_w) AM_RANGE(0x03, 0x03) AM_WRITE(unkcm_0x03_w) AM_RANGE(0x08, 0x08) AM_READ_PORT("IN0") @@ -7230,6 +7243,7 @@ static MACHINE_CONFIG_START( cmast91, goldstar_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END + INTERRUPT_GEN_MEMBER(wingco_state::masked_irq) { if (m_nmi_enable) @@ -7672,14 +7686,20 @@ static MACHINE_CONFIG_DERIVED( nfm, amcoe2 ) MCFG_GFXDECODE_MODIFY("gfxdecode", nfm) MACHINE_CONFIG_END + +INTERRUPT_GEN_MEMBER(unkch_state::vblank_irq) +{ + if (m_vblank_irq_enable) + device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( unkch, unkch_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK) MCFG_CPU_PROGRAM_MAP(unkch_map) MCFG_CPU_IO_MAP(unkch_portmap) - MCFG_CPU_VBLANK_INT_DRIVER("screen", goldstar_state, nmi_line_pulse) - //MCFG_CPU_VBLANK_INT_DRIVER("screen", goldstar_state, irq0_line_hold) + MCFG_CPU_VBLANK_INT_DRIVER("screen", unkch_state, vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -12854,9 +12874,8 @@ DRIVER_INIT_MEMBER(cb3_state, cherrys) DRIVER_INIT_MEMBER(unkch_state, unkch1) { // game stores $02 at ($D75C) and expects it to change - // missing interrupt? before enabling interrupts so could only be NMI - // peripheral with RAM access? - // something other than RAM there? + // possibly expecting stack to grow to this point in NMI handler? + // it does this before enabling vblank irq, so if that's the case there's a missing nmi source UINT8 *ROM = memregion("maincpu")->base(); ROM[0x9d52] = 0x00; ROM[0x9d53] = 0x00; @@ -12865,9 +12884,8 @@ DRIVER_INIT_MEMBER(unkch_state, unkch1) DRIVER_INIT_MEMBER(unkch_state, unkch3) { // game stores $04 at ($D77F) and expects it to change - // missing interrupt? before enabling interrupts so could only be NMI - // peripheral with RAM access? - // something other than RAM there? + // possibly expecting stack to grow to this point in NMI handler? + // it does this before enabling vblank irq, so if that's the case there's a missing nmi source UINT8 *ROM = memregion("maincpu")->base(); ROM[0x9b86] = 0x00; ROM[0x9b87] = 0x00; @@ -12876,9 +12894,8 @@ DRIVER_INIT_MEMBER(unkch_state, unkch3) DRIVER_INIT_MEMBER(unkch_state, unkch4) { // game stores $02 at ($D75C) and expects it to change - // missing interrupt? before enabling interrupts so could only be NMI - // peripheral with RAM access? - // something other than RAM there? + // possibly expecting stack to grow to this point in NMI handler? + // it does this before enabling vblank irq, so if that's the case there's a missing nmi source UINT8 *ROM = memregion("maincpu")->base(); ROM[0x9a6e] = 0x00; ROM[0x9a6f] = 0x00; diff --git a/src/mame/includes/goldstar.h b/src/mame/includes/goldstar.h index f3fa27a0593..929b41aaef0 100644 --- a/src/mame/includes/goldstar.h +++ b/src/mame/includes/goldstar.h @@ -255,6 +255,7 @@ public: } DECLARE_WRITE8_MEMBER(coincount_w); + DECLARE_WRITE8_MEMBER(unkcm_0x02_w); DECLARE_WRITE8_MEMBER(unkcm_0x03_w); DECLARE_WRITE8_MEMBER(reel1_attrram_w); @@ -268,6 +269,8 @@ public: DECLARE_VIDEO_START(unkch); UINT32 screen_update_unkch(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(vblank_irq); + protected: TILE_GET_INFO_MEMBER(get_reel1_tile_info); TILE_GET_INFO_MEMBER(get_reel2_tile_info); @@ -278,5 +281,6 @@ private: required_shared_ptr m_reel2_attrram; required_shared_ptr m_reel3_attrram; + UINT8 m_vblank_irq_enable; UINT8 m_vidreg; }; From d1084eea02ca6f2a7d7e8bc9d461619135cf553c Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 21 Mar 2015 16:48:43 +1100 Subject: [PATCH 120/201] unkch sets are good enough to accept bug reports New games added or promoted from NOT_WORKING status --------------------------------------------------- New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1) [Vas Crabb] Super Cherry Gold (bootleg of Super Cherry Master) [Vas Crabb] New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2) [Vas Crabb] Grand Cherry Master (bootleg of Super Cherry Master) [Vas Crabb] --- src/mame/drivers/goldstar.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 923e7d52417..8723e938f75 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -13119,10 +13119,10 @@ GAME( 2003, carb2003, nfb96, amcoe2, nfb96bl, driver_device, 0, GAME( 2003, nfm, 0, nfm, nfb96bl, driver_device, 0, ROT0, "Ming-Yang Electronic", "New Fruit Machine (Ming-Yang Electronic)", GAME_NOT_WORKING ) // vFB02-07A "Copyright By Ms. Liu Orchis 2003/03/06" // these have 'cherry 1994' in the program roms, but also "Super Cherry / New Cherry Gold '99" probably hacks of a 1994 version of Cherry Bonus / Cherry Master (Super Cherry Master?) -GAMEL(1999, unkch1, 0, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", GAME_NOT_WORKING, layout_unkch ) -GAMEL(1999, unkch2, unkch1, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "Super Cherry Gold (bootleg of Super Cherry Master)", GAME_NOT_WORKING, layout_unkch ) -GAMEL(1999, unkch3, unkch1, unkch, unkch3, unkch_state, unkch3, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2)", GAME_NOT_WORKING, layout_unkch ) // cards have been hacked to look like barrels, girl removed? -GAMEL(1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, ROT0, "bootleg", "Grand Cherry Master (bootleg of Super Cherry Master)", GAME_NOT_WORKING, layout_unkch ) // by 'Toy System' Hungary +GAMEL(1999, unkch1, 0, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 1)", 0, layout_unkch ) +GAMEL(1999, unkch2, unkch1, unkch, unkch, unkch_state, unkch1, ROT0, "bootleg", "Super Cherry Gold (bootleg of Super Cherry Master)", 0, layout_unkch ) +GAMEL(1999, unkch3, unkch1, unkch, unkch3, unkch_state, unkch3, ROT0, "bootleg", "New Cherry Gold '99 (bootleg of Super Cherry Master) (set 2)", 0, layout_unkch ) // cards have been hacked to look like barrels, girl removed? +GAMEL(1999, unkch4, unkch1, unkch, unkch4, unkch_state, unkch4, ROT0, "bootleg", "Grand Cherry Master (bootleg of Super Cherry Master)", 0, layout_unkch ) // by 'Toy System' Hungary /* Stealth sets. From 867188ab6ee8de40fe77715aa85f6581e0390162 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sat, 21 Mar 2015 08:20:12 +0100 Subject: [PATCH 121/201] srmp2.c: added save state support (nw) seta001.c: moved from old style callback to delegate --- src/mame/drivers/seta.c | 97 +++++++++++++++++------- src/mame/drivers/srmp2.c | 153 +++++++++++++++++++++++--------------- src/mame/includes/seta.h | 1 + src/mame/includes/srmp2.h | 47 +++++++----- src/mame/video/seta.c | 6 +- src/mame/video/seta001.c | 8 +- src/mame/video/seta001.h | 12 ++- src/mame/video/srmp2.c | 10 +-- 8 files changed, 207 insertions(+), 127 deletions(-) diff --git a/src/mame/drivers/seta.c b/src/mame/drivers/seta.c index f3f81918fe4..3b2ba24c92d 100644 --- a/src/mame/drivers/seta.c +++ b/src/mame/drivers/seta.c @@ -7695,6 +7695,7 @@ static MACHINE_CONFIG_START( tndrcade, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -7749,6 +7750,7 @@ static MACHINE_CONFIG_START( twineagl, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -7793,7 +7795,8 @@ static MACHINE_CONFIG_START( downtown, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */ @@ -7853,7 +7856,8 @@ static MACHINE_CONFIG_START( usclssic, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -7907,7 +7911,8 @@ static MACHINE_CONFIG_START( calibr50, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */ @@ -7950,7 +7955,8 @@ static MACHINE_CONFIG_START( metafox, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -7988,6 +7994,7 @@ static MACHINE_CONFIG_START( atehate, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -8032,7 +8039,8 @@ static MACHINE_CONFIG_START( blandia, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8069,7 +8077,8 @@ static MACHINE_CONFIG_START( blandiap, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8111,6 +8120,7 @@ static MACHINE_CONFIG_START( blockcar, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -8185,7 +8195,8 @@ static MACHINE_CONFIG_START( daioh, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on PCB */ @@ -8223,7 +8234,8 @@ static MACHINE_CONFIG_START( daiohp, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on PCB */ @@ -8266,7 +8278,8 @@ static MACHINE_CONFIG_START( drgnunit, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8303,7 +8316,8 @@ static MACHINE_CONFIG_START( qzkklgy2, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8353,7 +8367,8 @@ static MACHINE_CONFIG_START( setaroul, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + MCFG_NVRAM_ADD_RANDOM_FILL("nvram") /* video hardware */ @@ -8396,7 +8411,8 @@ static MACHINE_CONFIG_START( eightfrc, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8439,7 +8455,8 @@ static MACHINE_CONFIG_START( extdwnhl, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8504,7 +8521,8 @@ static MACHINE_CONFIG_START( gundhara, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8549,7 +8567,8 @@ static MACHINE_CONFIG_START( jjsquawk, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8585,7 +8604,8 @@ static MACHINE_CONFIG_START( jjsquawb, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8630,7 +8650,8 @@ static MACHINE_CONFIG_START( kamenrid, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8669,6 +8690,7 @@ static MACHINE_CONFIG_START( orbs, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -8711,6 +8733,7 @@ static MACHINE_CONFIG_START( keroppij, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -8752,6 +8775,7 @@ static MACHINE_CONFIG_START( krzybowl, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -8795,7 +8819,8 @@ static MACHINE_CONFIG_START( madshark, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8840,7 +8865,8 @@ static MACHINE_CONFIG_START( magspeed, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8888,7 +8914,8 @@ static MACHINE_CONFIG_START( msgundam, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56.66) /* between 56 and 57 to match a real PCB's game speed */ @@ -8928,7 +8955,8 @@ static MACHINE_CONFIG_START( oisipuzl, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -8967,7 +8995,8 @@ static MACHINE_CONFIG_START( triplfun, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -9005,6 +9034,7 @@ static MACHINE_CONFIG_START( kiwame, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -9046,7 +9076,8 @@ static MACHINE_CONFIG_START( rezon, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -9087,6 +9118,7 @@ static MACHINE_CONFIG_START( thunderl, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -9160,6 +9192,7 @@ static MACHINE_CONFIG_START( wiggie, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -9197,6 +9230,7 @@ static MACHINE_CONFIG_START( wits, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -9235,6 +9269,7 @@ static MACHINE_CONFIG_START( umanclub, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -9277,7 +9312,8 @@ static MACHINE_CONFIG_START( utoukond, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -9328,7 +9364,8 @@ static MACHINE_CONFIG_START( wrofaero, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -9373,7 +9410,8 @@ static MACHINE_CONFIG_START( zingzip, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -9430,6 +9468,7 @@ static MACHINE_CONFIG_START( pairlove, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -9479,7 +9518,8 @@ static MACHINE_CONFIG_START( crazyfgt, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -9544,7 +9584,8 @@ static MACHINE_CONFIG_START( inttoote, seta_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") - + MCFG_SETA001_SPRITE_GFXBANK_CB(seta_state, setac_gfxbank_callback) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) diff --git a/src/mame/drivers/srmp2.c b/src/mame/drivers/srmp2.c index 24b260e53a5..85b7be44059 100644 --- a/src/mame/drivers/srmp2.c +++ b/src/mame/drivers/srmp2.c @@ -69,48 +69,81 @@ Note: ***************************************************************************/ +void srmp2_state::machine_start() +{ + save_item(NAME(m_adpcm_bank)); + save_item(NAME(m_adpcm_data)); + save_item(NAME(m_adpcm_sptr)); + save_item(NAME(m_adpcm_eptr)); + save_item(NAME(m_iox.mux)); + save_item(NAME(m_iox.ff)); + save_item(NAME(m_iox.data)); +} + MACHINE_START_MEMBER(srmp2_state,srmp2) { - iox_t &iox = m_iox; - - iox.reset = 0x1f; - iox.ff_event = -1; - iox.ff_1 = 0x00; + machine_start(); + + m_iox.reset = 0x1f; + m_iox.ff_event = -1; + m_iox.ff_1 = 0x00; /* note: protection in srmp1/mjyuugi/ponchin is never checked, assume to be the same */ - iox.protcheck[0] = 0x60; iox.protlatch[0] = 0x2a; - iox.protcheck[1] = -1; iox.protlatch[1] = -1; - iox.protcheck[2] = -1; iox.protlatch[2] = -1; - iox.protcheck[3] = -1; iox.protlatch[3] = -1; + m_iox.protcheck[0] = 0x60; m_iox.protlatch[0] = 0x2a; + m_iox.protcheck[1] = -1; m_iox.protlatch[1] = -1; + m_iox.protcheck[2] = -1; m_iox.protlatch[2] = -1; + m_iox.protcheck[3] = -1; m_iox.protlatch[3] = -1; + + save_item(NAME(m_color_bank)); } MACHINE_START_MEMBER(srmp2_state,srmp3) { - iox_t &iox = m_iox; - - iox.reset = 0xc8; - iox.ff_event = 0xef; - iox.ff_1 = -1; - iox.protcheck[0] = 0x49; iox.protlatch[0] = 0xc9; - iox.protcheck[1] = 0x4c; iox.protlatch[1] = 0x00; - iox.protcheck[2] = 0x1c; iox.protlatch[2] = 0x04; - iox.protcheck[3] = 0x45; iox.protlatch[3] = 0x00; + machine_start(); + + m_iox.reset = 0xc8; + m_iox.ff_event = 0xef; + m_iox.ff_1 = -1; + m_iox.protcheck[0] = 0x49; m_iox.protlatch[0] = 0xc9; + m_iox.protcheck[1] = 0x4c; m_iox.protlatch[1] = 0x00; + m_iox.protcheck[2] = 0x1c; m_iox.protlatch[2] = 0x04; + m_iox.protcheck[3] = 0x45; m_iox.protlatch[3] = 0x00; membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base(), 0x2000); + + save_item(NAME(m_gfx_bank)); } MACHINE_START_MEMBER(srmp2_state,rmgoldyh) { - iox_t &iox = m_iox; - - iox.reset = 0xc8; - iox.ff_event = 0xff; - iox.ff_1 = -1; - iox.protcheck[0] = 0x43; iox.protlatch[0] = 0x9a; - iox.protcheck[1] = 0x45; iox.protlatch[1] = 0x00; - iox.protcheck[2] = -1; iox.protlatch[2] = -1; - iox.protcheck[3] = -1; iox.protlatch[3] = -1; + machine_start(); + + m_iox.reset = 0xc8; + m_iox.ff_event = 0xff; + m_iox.ff_1 = -1; + m_iox.protcheck[0] = 0x43; m_iox.protlatch[0] = 0x9a; + m_iox.protcheck[1] = 0x45; m_iox.protlatch[1] = 0x00; + m_iox.protcheck[2] = -1; m_iox.protlatch[2] = -1; + m_iox.protcheck[3] = -1; m_iox.protlatch[3] = -1; membank("bank1")->configure_entries(0, 32, memregion("maincpu")->base(), 0x2000); + + save_item(NAME(m_gfx_bank)); +} + +MACHINE_START_MEMBER(srmp2_state,mjyuugi) +{ + machine_start(); + + m_iox.reset = 0x1f; + m_iox.ff_event = -1; + m_iox.ff_1 = 0x00; + /* note: protection in srmp1/mjyuugi/ponchin is never checked, assume to be the same */ + m_iox.protcheck[0] = 0x60; m_iox.protlatch[0] = 0x2a; + m_iox.protcheck[1] = -1; m_iox.protlatch[1] = -1; + m_iox.protcheck[2] = -1; m_iox.protlatch[2] = -1; + m_iox.protcheck[3] = -1; m_iox.protlatch[3] = -1; + + save_item(NAME(m_gfx_bank)); } /*************************************************************************** @@ -207,7 +240,7 @@ WRITE8_MEMBER(srmp2_state::srmp3_adpcm_code_w) } -WRITE_LINE_MEMBER(srmp2_state::srmp2_adpcm_int) +WRITE_LINE_MEMBER(srmp2_state::adpcm_int) { UINT8 *ROM = memregion("adpcm")->base(); @@ -270,32 +303,30 @@ UINT8 srmp2_state::iox_key_matrix_calc(UINT8 p_side) READ8_MEMBER(srmp2_state::iox_mux_r) { - iox_t &iox = m_iox; - /* first off check any pending protection value */ { int i; for(i=0;i<4;i++) { - if(iox.protcheck[i] == -1) + if(m_iox.protcheck[i] == -1) continue; //skip - if(iox.data == iox.protcheck[i]) + if(m_iox.data == m_iox.protcheck[i]) { - iox.data = 0; //clear write latch - return iox.protlatch[i]; + m_iox.data = 0; //clear write latch + return m_iox.protlatch[i]; } } } - if(iox.ff == 0) + if(m_iox.ff == 0) { - if(iox.mux != 1 && iox.mux != 2 && iox.mux != 4) + if(m_iox.mux != 1 && m_iox.mux != 2 && m_iox.mux != 4) return 0xff; //unknown command /* both side checks */ - if(iox.mux == 1) + if(m_iox.mux == 1) { UINT8 p1_side = iox_key_matrix_calc(0); UINT8 p2_side = iox_key_matrix_calc(4); @@ -307,7 +338,7 @@ READ8_MEMBER(srmp2_state::iox_mux_r) } /* check individual input side */ - return iox_key_matrix_calc((iox.mux == 2) ? 0 : 4); + return iox_key_matrix_calc((m_iox.mux == 2) ? 0 : 4); } return ioport("SERVICE")->read() & 0xff; @@ -320,7 +351,6 @@ READ8_MEMBER(srmp2_state::iox_status_r) WRITE8_MEMBER(srmp2_state::iox_command_w) { - iox_t &iox = m_iox; /* bit wise command port apparently 0x01: selects both sides @@ -328,23 +358,22 @@ WRITE8_MEMBER(srmp2_state::iox_command_w) 0x04: selects p2 side */ - iox.mux = data; - iox.ff = 0; // this also set flip flop back to 0 + m_iox.mux = data; + m_iox.ff = 0; // this also set flip flop back to 0 } WRITE8_MEMBER(srmp2_state::iox_data_w) { - iox_t &iox = m_iox; - iox.data = data; + m_iox.data = data; - if(data == iox.reset && iox.reset != -1) //resets device - iox.ff = 0; + if(data == m_iox.reset && m_iox.reset != -1) //resets device + m_iox.ff = 0; - if(data == iox.ff_event && iox.ff_event != -1) // flip flop event - iox.ff ^= 1; + if(data == m_iox.ff_event && m_iox.ff_event != -1) // flip flop event + m_iox.ff ^= 1; - if(data == iox.ff_1 && iox.ff_1 != -1) // set flip flop to 1 - iox.ff = 1; + if(data == m_iox.ff_1 && m_iox.ff_1 != -1) // set flip flop to 1 + m_iox.ff = 1; } WRITE8_MEMBER(srmp2_state::srmp3_rombank_w) @@ -1163,7 +1192,7 @@ static MACHINE_CONFIG_START( srmp2, srmp2_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40) MCFG_SOUND_ADD("msm", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(srmp2_state, srmp2_adpcm_int)) /* IRQ handler */ + MCFG_MSM5205_VCLK_CB(WRITELINE(srmp2_state, adpcm_int)) /* IRQ handler */ MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8 KHz, 4 Bits */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45) MACHINE_CONFIG_END @@ -1185,6 +1214,7 @@ static MACHINE_CONFIG_START( srmp3, srmp2_state ) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(srmp2_state, srmp3_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1210,7 +1240,7 @@ static MACHINE_CONFIG_START( srmp3, srmp2_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) MCFG_SOUND_ADD("msm", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(srmp2_state, srmp2_adpcm_int)) /* IRQ handler */ + MCFG_MSM5205_VCLK_CB(WRITELINE(srmp2_state, adpcm_int)) /* IRQ handler */ MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8 KHz, 4 Bits */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45) MACHINE_CONFIG_END @@ -1232,13 +1262,14 @@ static MACHINE_CONFIG_START( mjyuugi, srmp2_state ) MCFG_CPU_VBLANK_INT_DRIVER("screen", srmp2_state, irq4_line_assert) MCFG_CPU_PERIODIC_INT_DRIVER(srmp2_state, irq2_line_assert, 15*60) /* Interrupt times is not understood */ - MCFG_MACHINE_START_OVERRIDE(srmp2_state,srmp2) + MCFG_MACHINE_START_OVERRIDE(srmp2_state,mjyuugi) MCFG_NVRAM_ADD_0FILL("nvram") MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") MCFG_SETA001_SPRITE_PALETTE("palette") + MCFG_SETA001_SPRITE_GFXBANK_CB(srmp2_state, srmp3_gfxbank_callback) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1262,7 +1293,7 @@ static MACHINE_CONFIG_START( mjyuugi, srmp2_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) MCFG_SOUND_ADD("msm", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(srmp2_state, srmp2_adpcm_int)) /* IRQ handler */ + MCFG_MSM5205_VCLK_CB(WRITELINE(srmp2_state, adpcm_int)) /* IRQ handler */ MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8 KHz, 4 Bits */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45) MACHINE_CONFIG_END @@ -1537,11 +1568,11 @@ ROM_END -GAME( 1987, srmp1, 0, srmp2, srmp2, driver_device, 0, ROT0, "Seta", "Super Real Mahjong Part 1 (Japan)", 0 ) -GAME( 1987, srmp2, 0, srmp2, srmp2, driver_device, 0, ROT0, "Seta", "Super Real Mahjong Part 2 (Japan)", 0 ) -GAME( 1988, srmp3, 0, srmp3, srmp3, driver_device, 0, ROT0, "Seta", "Super Real Mahjong Part 3 (Japan)", 0 ) -GAME( 1988, rmgoldyh, srmp3, rmgoldyh, rmgoldyh, driver_device, 0, ROT0, "Seta (Alba license)", "Real Mahjong Gold Yumehai / Super Real Mahjong GOLD part.2 [BET] (Japan)", 0 ) -GAME( 1990, mjyuugi, 0, mjyuugi, mjyuugi, driver_device, 0, ROT0, "Visco", "Mahjong Yuugi (Japan set 1)", 0 ) -GAME( 1990, mjyuugia, mjyuugi, mjyuugi, mjyuugi, driver_device, 0, ROT0, "Visco", "Mahjong Yuugi (Japan set 2)", 0 ) -GAME( 1991, ponchin, 0, mjyuugi, ponchin, driver_device, 0, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 1)", 0 ) -GAME( 1991, ponchina, ponchin, mjyuugi, ponchin, driver_device, 0, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 2)", 0 ) +GAME( 1987, srmp1, 0, srmp2, srmp2, driver_device, 0, ROT0, "Seta", "Super Real Mahjong Part 1 (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1987, srmp2, 0, srmp2, srmp2, driver_device, 0, ROT0, "Seta", "Super Real Mahjong Part 2 (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1988, srmp3, 0, srmp3, srmp3, driver_device, 0, ROT0, "Seta", "Super Real Mahjong Part 3 (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1988, rmgoldyh, srmp3, rmgoldyh, rmgoldyh, driver_device, 0, ROT0, "Seta (Alba license)", "Real Mahjong Gold Yumehai / Super Real Mahjong GOLD part.2 [BET] (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1990, mjyuugi, 0, mjyuugi, mjyuugi, driver_device, 0, ROT0, "Visco", "Mahjong Yuugi (Japan set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1990, mjyuugia, mjyuugi, mjyuugi, mjyuugi, driver_device, 0, ROT0, "Visco", "Mahjong Yuugi (Japan set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1991, ponchin, 0, mjyuugi, ponchin, driver_device, 0, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1991, ponchina, ponchin, mjyuugi, ponchin, driver_device, 0, ROT0, "Visco", "Mahjong Pon Chin Kan (Japan set 2)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/seta.h b/src/mame/includes/seta.h index 596b0f44e23..e8e2b7e821c 100644 --- a/src/mame/includes/seta.h +++ b/src/mame/includes/seta.h @@ -234,4 +234,5 @@ public: void uPD71054_timer_init( ); DECLARE_WRITE_LINE_MEMBER(pit_out0); DECLARE_WRITE_LINE_MEMBER(utoukond_ym3438_interrupt); + SETA001_SPRITE_GFXBANK_CB_MEMBER(setac_gfxbank_callback); }; diff --git a/src/mame/includes/srmp2.h b/src/mame/includes/srmp2.h index 04f9b3d63e7..3c440148725 100644 --- a/src/mame/includes/srmp2.h +++ b/src/mame/includes/srmp2.h @@ -13,51 +13,64 @@ class srmp2_state : public driver_device { public: srmp2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) , + : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_seta001(*this, "spritegen"), m_msm(*this, "msm") { } + required_device m_maincpu; + required_device m_seta001; + required_device m_msm; + int m_color_bank; int m_gfx_bank; - int m_adpcm_bank; int m_adpcm_data; UINT32 m_adpcm_sptr; UINT32 m_adpcm_eptr; - - int m_port_select; - iox_t m_iox; - DECLARE_WRITE16_MEMBER(srmp2_flags_w); - DECLARE_WRITE16_MEMBER(mjyuugi_flags_w); - DECLARE_WRITE16_MEMBER(mjyuugi_adpcm_bank_w); + + // common DECLARE_READ8_MEMBER(vox_status_r); DECLARE_READ8_MEMBER(iox_mux_r); DECLARE_READ8_MEMBER(iox_status_r); DECLARE_WRITE8_MEMBER(iox_command_w); DECLARE_WRITE8_MEMBER(iox_data_w); - DECLARE_WRITE8_MEMBER(srmp3_rombank_w); - DECLARE_WRITE8_MEMBER(srmp2_irq2_ack_w); - DECLARE_WRITE8_MEMBER(srmp2_irq4_ack_w); + DECLARE_WRITE_LINE_MEMBER(adpcm_int); + + // mjuugi + DECLARE_WRITE16_MEMBER(mjyuugi_flags_w); + DECLARE_WRITE16_MEMBER(mjyuugi_adpcm_bank_w); DECLARE_READ8_MEMBER(mjyuugi_irq2_ack_r); DECLARE_READ8_MEMBER(mjyuugi_irq4_ack_r); + + // rmgoldyh + DECLARE_WRITE8_MEMBER(rmgoldyh_rombank_w); + + // srmp2 + DECLARE_WRITE8_MEMBER(srmp2_irq2_ack_w); + DECLARE_WRITE8_MEMBER(srmp2_irq4_ack_w); + DECLARE_WRITE16_MEMBER(srmp2_flags_w); + DECLARE_WRITE16_MEMBER(srmp2_adpcm_code_w); + + // srmp3 + DECLARE_WRITE8_MEMBER(srmp3_rombank_w); DECLARE_WRITE8_MEMBER(srmp3_flags_w); DECLARE_WRITE8_MEMBER(srmp3_irq_ack_w); - DECLARE_WRITE8_MEMBER(rmgoldyh_rombank_w); - DECLARE_WRITE16_MEMBER(srmp2_adpcm_code_w); DECLARE_WRITE8_MEMBER(srmp3_adpcm_code_w); + + virtual void machine_start(); DECLARE_MACHINE_START(srmp2); DECLARE_PALETTE_INIT(srmp2); DECLARE_MACHINE_START(srmp3); DECLARE_PALETTE_INIT(srmp3); DECLARE_MACHINE_START(rmgoldyh); + DECLARE_MACHINE_START(mjyuugi); + UINT32 screen_update_srmp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_srmp3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_mjyuugi(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + SETA001_SPRITE_GFXBANK_CB_MEMBER(srmp3_gfxbank_callback); + UINT8 iox_key_matrix_calc(UINT8 p_side); - DECLARE_WRITE_LINE_MEMBER(srmp2_adpcm_int); - required_device m_maincpu; - required_device m_seta001; - required_device m_msm; }; diff --git a/src/mame/video/seta.c b/src/mame/video/seta.c index 74cc22b321a..ca5cfd8ea54 100644 --- a/src/mame/video/seta.c +++ b/src/mame/video/seta.c @@ -523,7 +523,7 @@ VIDEO_START_MEMBER(seta_state,twineagl_1_layer) m_tilemap_1->set_transparent_pen(0); } -int setac_gfxbank_callback( running_machine &machine, UINT16 code, UINT8 color ) +SETA001_SPRITE_GFXBANK_CB_MEMBER(seta_state::setac_gfxbank_callback) { int bank = (color & 0x06) >> 1; code = (code & 0x3fff) + (bank * 0x4000); @@ -549,10 +549,6 @@ VIDEO_START_MEMBER(seta_state,seta_no_layers) // position kludges m_seta001->set_fg_xoffsets(m_global_offsets->sprite_offs[1], m_global_offsets->sprite_offs[0]); m_seta001->set_fg_yoffsets( -0x0a, 0x0e ); - - // banking - m_seta001->set_gfxbank_callback( setac_gfxbank_callback ); - } diff --git a/src/mame/video/seta001.c b/src/mame/video/seta001.c index ed5d689ddd5..796efafbd4a 100644 --- a/src/mame/video/seta001.c +++ b/src/mame/video/seta001.c @@ -83,9 +83,9 @@ void seta001_device::device_start() m_colorbase = 0; m_spritelimit = 0x1ff; - m_bankcallback = NULL; - m_bgflag = 0x00; + + m_gfxbank_cb.bind_relative_to(*owner()); save_item(NAME(m_bgflag)); save_item(NAME(m_spritectrl)); @@ -237,7 +237,7 @@ void seta001_device::draw_background( bitmap_ind16 &bitmap, const rectangle &cli int max_y = 0xf0; // HACKS - // used in conjuntion with setac_type + // used in conjunction with setac_type int col0; /* Kludge, needed for krzybowl and kiwame */ switch (ctrl & 0x0f) { @@ -372,7 +372,7 @@ void seta001_device::draw_foreground( screen_device &screen, bitmap_ind16 &bitma flipx = ctrl_pointer[i] & 0x80; flipy = ctrl_pointer[i] & 0x40; - if (m_bankcallback) code = m_bankcallback(machine(), code, color_pointer[i]); + if (!m_gfxbank_cb.isnull()) code = m_gfxbank_cb(code, color_pointer[i]); color %= total_color_codes; diff --git a/src/mame/video/seta001.h b/src/mame/video/seta001.h index f5acc6c94d5..bd5de9d4c80 100644 --- a/src/mame/video/seta001.h +++ b/src/mame/video/seta001.h @@ -1,5 +1,10 @@ -typedef int (*seta001_gfxbank_callback_func)(running_machine &machine, UINT16 code, UINT8 color); +typedef device_delegate gfxbank_cb_delegate; + +#define SETA001_SPRITE_GFXBANK_CB_MEMBER(_name) int _name(UINT16 code, UINT8 color) + +#define MCFG_SETA001_SPRITE_GFXBANK_CB(_class, _method) \ + seta001_device::set_gfxbank_callback(*device, gfxbank_cb_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); class seta001_device : public device_t { @@ -9,6 +14,7 @@ public: // static configuration static void static_set_gfxdecode_tag(device_t &device, const char *tag); static void static_set_palette_tag(device_t &device, const char *tag); + static void set_gfxbank_callback(device_t &device, gfxbank_cb_delegate callback) { downcast(device).m_gfxbank_cb = callback; } DECLARE_WRITE8_MEMBER( spritebgflag_w8 ); @@ -46,8 +52,6 @@ public: int is_flipped() { return ((m_spritectrl[ 0 ] & 0x40) >> 6); }; - void set_gfxbank_callback(seta001_gfxbank_callback_func callback) { m_bankcallback = callback; }; - protected: virtual void device_start(); virtual void device_reset(); @@ -59,7 +63,7 @@ private: required_device m_gfxdecode; required_device m_palette; - seta001_gfxbank_callback_func m_bankcallback; + gfxbank_cb_delegate m_gfxbank_cb; // configuration int m_fg_flipxoffs, m_fg_noflipxoffs; diff --git a/src/mame/video/srmp2.c b/src/mame/video/srmp2.c index bd059fea2a0..4c3fd389786 100644 --- a/src/mame/video/srmp2.c +++ b/src/mame/video/srmp2.c @@ -37,14 +37,12 @@ PALETTE_INIT_MEMBER(srmp2_state,srmp3) } } -int srmp3_gfxbank_callback( running_machine &machine, UINT16 code, UINT8 color ) +SETA001_SPRITE_GFXBANK_CB_MEMBER(srmp2_state::srmp3_gfxbank_callback) { - srmp2_state *state = machine.driver_data(); - if (code & 0x2000) { code = (code & 0x1fff); - code += ((state->m_gfx_bank + 1) * 0x2000); + code += ((m_gfx_bank + 1) * 0x2000); } return code; @@ -77,8 +75,6 @@ UINT32 srmp2_state::screen_update_srmp3(screen_device &screen, bitmap_ind16 &bit m_seta001->set_bg_xoffsets( -0x01, 0x10 ); m_seta001->set_bg_yoffsets( -0x06, 0x06 ); - m_seta001->set_gfxbank_callback( srmp3_gfxbank_callback ); - m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000, 1); return 0; } @@ -93,8 +89,6 @@ UINT32 srmp2_state::screen_update_mjyuugi(screen_device &screen, bitmap_ind16 &b m_seta001->set_spritelimit( 0x1ff-6 ); - m_seta001->set_gfxbank_callback( srmp3_gfxbank_callback ); - m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000, 1); return 0; } From 466ed7c2593a8902aaf8b89cb1364ae7454ecfc2 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sat, 21 Mar 2015 09:43:43 +0100 Subject: [PATCH 122/201] Added / improved save state support to the devices used in seta2.c. Save state support in the driver isn't enabled for now. Need to figure out why x1 produced sound isn't reloaded properly (nw) --- src/emu/cpu/h8/h8.c | 3 +- src/emu/machine/mcf5206e.c | 30 +++++++++--- src/emu/machine/mcf5206e.h | 4 +- src/emu/machine/tmp68301.c | 8 ++++ src/emu/sound/okim9810.c | 39 +++++++++++++++- src/emu/sound/okim9810.h | 3 +- src/mame/drivers/seta2.c | 96 +++++++++++++++++++++----------------- src/mame/includes/seta2.h | 66 ++++++++++++++------------ src/mame/video/seta2.c | 23 ++++----- 9 files changed, 173 insertions(+), 99 deletions(-) diff --git a/src/emu/cpu/h8/h8.c b/src/emu/cpu/h8/h8.c index 3a7a3c27789..8d773ea7a5e 100644 --- a/src/emu/cpu/h8/h8.c +++ b/src/emu/cpu/h8/h8.c @@ -107,8 +107,9 @@ void h8_device::device_start() } save_item(NAME(PPC)); - save_item(NAME(PC)); save_item(NAME(NPC)); + save_item(NAME(PC)); + save_item(NAME(PIR)); save_item(NAME(IR)); save_item(NAME(R)); save_item(NAME(EXR)); diff --git a/src/emu/machine/mcf5206e.c b/src/emu/machine/mcf5206e.c index 5429cc16482..d7b99c42483 100644 --- a/src/emu/machine/mcf5206e.c +++ b/src/emu/machine/mcf5206e.c @@ -672,7 +672,7 @@ TIMER_CALLBACK_MEMBER(mcf5206e_peripheral_device::timer1_callback) debuglogtimer("timer1_callback\n"); m_TER1 |= 0x02; - timer1->adjust(attotime::from_msec(10)); // completely made up value just to fire our timers for now + m_timer1->adjust(attotime::from_msec(10)); // completely made up value just to fire our timers for now } @@ -703,11 +703,11 @@ WRITE16_MEMBER( mcf5206e_peripheral_device::TMR1_w) if (m_TMR1 & 0x0001) { - timer1->adjust(attotime::from_seconds(1)); // completely made up value just to fire our timers for now + m_timer1->adjust(attotime::from_seconds(1)); // completely made up value just to fire our timers for now } else { - timer1->adjust(attotime::never); + m_timer1->adjust(attotime::never); } @@ -859,8 +859,26 @@ void mcf5206e_peripheral_device::device_start() { init_regs(true); - timer1 = machine().scheduler().timer_alloc( timer_expired_delegate( FUNC( mcf5206e_peripheral_device::timer1_callback ), this) ); - + m_timer1 = machine().scheduler().timer_alloc( timer_expired_delegate( FUNC( mcf5206e_peripheral_device::timer1_callback ), this) ); + + save_item(NAME(m_ICR)); + save_item(NAME(m_CSAR)); + save_item(NAME(m_CSMR)); + save_item(NAME(m_CSCR)); + save_item(NAME(m_DMCR)); + save_item(NAME(m_PAR)); + save_item(NAME(m_TMR1)); + save_item(NAME(m_TRR1)); + save_item(NAME(m_TER1)); + save_item(NAME(m_TCN1)); + save_item(NAME(m_PPDDR)); + save_item(NAME(m_PPDAT)); + save_item(NAME(m_IMR)); + save_item(NAME(m_MBCR)); + save_item(NAME(m_MBSR)); + save_item(NAME(m_MFDR)); + save_item(NAME(m_MBDR)); + save_item(NAME(m_coldfire_regs)); } void mcf5206e_peripheral_device::device_reset() @@ -868,7 +886,7 @@ void mcf5206e_peripheral_device::device_reset() m_cpu = (cpu_device*)machine().device(":maincpu"); // hack. this device should really be attached to a modern CPU core init_regs(false); - timer1->adjust(attotime::never); + m_timer1->adjust(attotime::never); } READ32_MEMBER(mcf5206e_peripheral_device::dev_r) diff --git a/src/emu/machine/mcf5206e.h b/src/emu/machine/mcf5206e.h index 8bda69d7cfb..84c9003eafe 100644 --- a/src/emu/machine/mcf5206e.h +++ b/src/emu/machine/mcf5206e.h @@ -1,6 +1,6 @@ /*************************************************************************** - Konami 033906 + MCF5206E Peripherals ***************************************************************************/ @@ -183,7 +183,7 @@ private: UINT16 m_DMCR; UINT16 m_PAR; - emu_timer *timer1; + emu_timer *m_timer1; UINT16 m_TMR1; UINT16 m_TRR1; UINT8 m_TER1; diff --git a/src/emu/machine/tmp68301.c b/src/emu/machine/tmp68301.c index 3c88faf7f8f..d9793f0fefd 100644 --- a/src/emu/machine/tmp68301.c +++ b/src/emu/machine/tmp68301.c @@ -116,6 +116,14 @@ void tmp68301_device::device_start() m_in_parallel_cb.resolve_safe(0); m_out_parallel_cb.resolve_safe(); + + save_item(NAME(m_regs)); + save_item(NAME(m_IE)); + save_item(NAME(m_irq_vector)); + save_item(NAME(m_imr)); + save_item(NAME(m_iisr)); + save_item(NAME(m_scr)); + save_item(NAME(m_pdir)); } //------------------------------------------------- diff --git a/src/emu/sound/okim9810.c b/src/emu/sound/okim9810.c index 9b041fda765..3370ee460e8 100644 --- a/src/emu/sound/okim9810.c +++ b/src/emu/sound/okim9810.c @@ -88,6 +88,14 @@ okim9810_device::okim9810_device(const machine_config &mconfig, const char *tag, { } +okim9810_device::okim_voice *okim9810_device::get_voice(int which) +{ + which &= 8; + if (which < OKIM9810_VOICES) + return &m_voice[which]; + + return NULL; +} //------------------------------------------------- // device_start - device-specific startup @@ -103,8 +111,35 @@ void okim9810_device::device_start() m_stream = machine().sound().stream_alloc(*this, 0, 2, clock()); // save state stuff - // m_TMP_register - // m_voice + save_item(NAME(m_TMP_register)); + save_item(NAME(m_global_volume)); + save_item(NAME(m_filter_type)); + save_item(NAME(m_output_level)); + + for (int i = 0; i < OKIM9810_VOICES; i++) + { + okim_voice *voice = get_voice(i); + + save_item(NAME(voice->m_adpcm.m_signal), i); + save_item(NAME(voice->m_adpcm.m_step), i); + save_item(NAME(voice->m_adpcm2.m_signal), i); + save_item(NAME(voice->m_adpcm2.m_step), i); + save_item(NAME(voice->m_playbackAlgo), i); + save_item(NAME(voice->m_looping), i); + save_item(NAME(voice->m_startFlags), i); + save_item(NAME(voice->m_endFlags), i); + save_item(NAME(voice->m_base_offset), i); + save_item(NAME(voice->m_count), i); + save_item(NAME(voice->m_samplingFreq), i); + save_item(NAME(voice->m_playing), i); + save_item(NAME(voice->m_sample), i); + save_item(NAME(voice->m_channel_volume), i); + save_item(NAME(voice->m_pan_volume_left), i); + save_item(NAME(voice->m_pan_volume_right), i); + save_item(NAME(voice->m_startSample), i); + save_item(NAME(voice->m_endSample), i); + save_item(NAME(voice->m_interpSampleNum), i); + } } diff --git a/src/emu/sound/okim9810.h b/src/emu/sound/okim9810.h index 75316b7cf96..823a8e25f59 100644 --- a/src/emu/sound/okim9810.h +++ b/src/emu/sound/okim9810.h @@ -134,7 +134,8 @@ protected: static const UINT8 s_volume_table[16]; }; - + okim_voice *get_voice(int which); + // internal state const address_space_config m_space_config; diff --git a/src/mame/drivers/seta2.c b/src/mame/drivers/seta2.c index d4193425e6f..93d469a6e2a 100644 --- a/src/mame/drivers/seta2.c +++ b/src/mame/drivers/seta2.c @@ -115,6 +115,7 @@ reelquak: #include "machine/ticket.h" #include "machine/mcf5206e.h" + /*************************************************************************** @@ -123,7 +124,7 @@ reelquak: ***************************************************************************/ -WRITE16_MEMBER(seta2_state::seta2_sound_bank_w) +WRITE16_MEMBER(seta2_state::sound_bank_w) { if (ACCESSING_BITS_0_7) { @@ -169,8 +170,8 @@ static ADDRESS_MAP_START( grdians_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0xc00000, 0xc3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xc40000, 0xc4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette AM_RANGE(0xc50000, 0xc5ffff) AM_RAM // cleared - AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers - AM_RANGE(0xe00010, 0xe0001f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xe00010, 0xe0001f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -207,8 +208,8 @@ static ADDRESS_MAP_START( gundamex_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0xc00000, 0xc3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xc40000, 0xc4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette AM_RANGE(0xc50000, 0xc5ffff) AM_RAM // cleared - AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers - AM_RANGE(0xe00010, 0xe0001f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xe00010, 0xe0001f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -217,6 +218,11 @@ ADDRESS_MAP_END Wakakusamonogatari Mahjong Yonshimai ***************************************************************************/ +MACHINE_START_MEMBER(seta2_state, mj4simai) +{ + save_item(NAME(m_keyboard_row)); +} + READ16_MEMBER(seta2_state::mj4simai_p1_r) { switch (m_keyboard_row) @@ -260,11 +266,11 @@ static ADDRESS_MAP_START( mj4simai_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x600200, 0x600201) AM_WRITENOP // Leds? Coins? AM_RANGE(0x600300, 0x600301) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE(0x600302, 0x600303) AM_READ_PORT("DSW2") // DSW 2 - AM_RANGE(0x600300, 0x60030f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0x600300, 0x60030f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound AM_RANGE(0xc00000, 0xc3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xc40000, 0xc4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -283,11 +289,11 @@ static ADDRESS_MAP_START( myangel_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x700200, 0x700201) AM_WRITENOP // Leds? Coins? AM_RANGE(0x700300, 0x700301) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE(0x700302, 0x700303) AM_READ_PORT("DSW2") // DSW 2 - AM_RANGE(0x700310, 0x70031f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0x700310, 0x70031f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound AM_RANGE(0xc00000, 0xc3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xc40000, 0xc4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -306,11 +312,11 @@ static ADDRESS_MAP_START( myangel2_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x600200, 0x600201) AM_WRITENOP // Leds? Coins? AM_RANGE(0x600300, 0x600301) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE(0x600302, 0x600303) AM_READ_PORT("DSW2") // DSW 2 - AM_RANGE(0x600300, 0x60030f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0x600300, 0x60030f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound AM_RANGE(0xd00000, 0xd3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xd40000, 0xd4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0xd60000, 0xd6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xd60000, 0xd6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -346,7 +352,7 @@ static ADDRESS_MAP_START( pzlbowl_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x200000, 0x20ffff) AM_RAM // RAM AM_RANGE(0x400300, 0x400301) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE(0x400302, 0x400303) AM_READ_PORT("DSW2") // DSW 2 - AM_RANGE(0x400300, 0x40030f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0x400300, 0x40030f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0x500000, 0x500001) AM_READ_PORT("P1") // P1 AM_RANGE(0x500002, 0x500003) AM_READ_PORT("P2") // P2 AM_RANGE(0x500004, 0x500005) AM_READWRITE(pzlbowl_coins_r,pzlbowl_coin_counter_w) // Coins + Protection? @@ -354,7 +360,7 @@ static ADDRESS_MAP_START( pzlbowl_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x700000, 0x700001) AM_READ(pzlbowl_protection_r) // Protection AM_RANGE(0x800000, 0x83ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0x840000, 0x84ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0x860000, 0x86003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0x860000, 0x86003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE(0x900000, 0x903fff) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -371,7 +377,7 @@ static ADDRESS_MAP_START( penbros_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x300000, 0x30ffff) AM_RAM // RAM AM_RANGE(0x500300, 0x500301) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE(0x500302, 0x500303) AM_READ_PORT("DSW2") // DSW 2 - AM_RANGE(0x500300, 0x50030f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0x500300, 0x50030f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0x600000, 0x600001) AM_READ_PORT("P1") // P1 AM_RANGE(0x600002, 0x600003) AM_READ_PORT("P2") // P2 AM_RANGE(0x600004, 0x600005) AM_READ_PORT("SYSTEM") // Coins @@ -380,7 +386,7 @@ static ADDRESS_MAP_START( penbros_map, AS_PROGRAM, 16, seta2_state ) //AM_RANGE(0x700000, 0x700001) AM_READ(pzlbowl_protection_r) // Protection AM_RANGE(0xb00000, 0xb3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xb40000, 0xb4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0xb60000, 0xb6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") + AM_RANGE(0xb60000, 0xb6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") AM_RANGE(0xa00000, 0xa03fff) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -435,11 +441,11 @@ static ADDRESS_MAP_START( reelquak_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x400200, 0x400201) AM_WRITE(reelquak_coin_w) // Coin Counters / IRQ Ack AM_RANGE(0x400300, 0x400301) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE(0x400302, 0x400303) AM_READ_PORT("DSW2") // DSW 2 - AM_RANGE(0x400300, 0x40030f) AM_WRITE(seta2_sound_bank_w) // Samples Banks + AM_RANGE(0x400300, 0x40030f) AM_WRITE(sound_bank_w) // Samples Banks AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound AM_RANGE(0xc00000, 0xc3ffff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0xc40000, 0xc4ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -453,7 +459,7 @@ static ADDRESS_MAP_START( namcostr_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM AM_RANGE(0x200000, 0x20ffff) AM_RAM // RAM AM_RANGE(0xc00000, 0xc3ffff) AM_RAM AM_SHARE("spriteram") // Sprites - AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE(0xc60000, 0xc6003f) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE(0xfffc00, 0xffffff) AM_DEVREADWRITE("tmp68301", tmp68301_device, regs_r, regs_w) // TMP68301 Registers ADDRESS_MAP_END @@ -483,7 +489,7 @@ static ADDRESS_MAP_START( samshoot_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE( 0x400000, 0x400001 ) AM_READ_PORT("DSW1") // DSW 1 AM_RANGE( 0x400002, 0x400003 ) AM_READ_PORT("BUTTONS") // Buttons - AM_RANGE( 0x400300, 0x40030f ) AM_WRITE(seta2_sound_bank_w ) // Samples Banks + AM_RANGE( 0x400300, 0x40030f ) AM_WRITE(sound_bank_w ) // Samples Banks AM_RANGE( 0x500000, 0x500001 ) AM_READ_PORT("GUN1") // P1 AM_RANGE( 0x580000, 0x580001 ) AM_READ_PORT("GUN2") // P2 @@ -495,7 +501,7 @@ static ADDRESS_MAP_START( samshoot_map, AS_PROGRAM, 16, seta2_state ) AM_RANGE( 0x800000, 0x83ffff ) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE( 0x840000, 0x84ffff ) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE( 0x860000, 0x86003f ) AM_WRITE(seta2_vregs_w) AM_SHARE("vregs") // Video Registers + AM_RANGE( 0x860000, 0x86003f ) AM_WRITE(vregs_w) AM_SHARE("vregs") // Video Registers AM_RANGE( 0x900000, 0x903fff ) AM_DEVREADWRITE("x1snd", x1_010_device, word_r, word_w) // Sound @@ -579,6 +585,11 @@ void funcube_touchscreen_device::device_start() emu_timer *tm = timer_alloc(0); tm->adjust(attotime::from_ticks(1, clock()), 0, attotime::from_ticks(1, clock())); m_tx_cb.resolve_safe(); + + save_item(NAME(m_button_state)); + save_item(NAME(m_serial_pos)); + save_item(NAME(m_serial)); + device_serial_interface::register_save_state(machine().save(), this); } void funcube_touchscreen_device::device_reset() @@ -693,7 +704,7 @@ static ADDRESS_MAP_START( funcube_map, AS_PROGRAM, 32, seta2_state ) AM_RANGE( 0x00800000, 0x0083ffff ) AM_READWRITE16(spriteram16_word_r, spriteram16_word_w, 0xffffffff ) AM_SHARE("spriteram") AM_RANGE( 0x00840000, 0x0084ffff ) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE( 0x00860000, 0x0086003f ) AM_WRITE16(seta2_vregs_w, 0xffffffff ) AM_SHARE("vregs") + AM_RANGE( 0x00860000, 0x0086003f ) AM_WRITE16(vregs_w, 0xffffffff ) AM_SHARE("vregs") AM_RANGE( 0x00c00000, 0x00c002ff ) AM_READWRITE(funcube_nvram_dword_r, funcube_nvram_dword_w ) @@ -712,7 +723,7 @@ static ADDRESS_MAP_START( funcube2_map, AS_PROGRAM, 32, seta2_state ) AM_RANGE( 0x00800000, 0x0083ffff ) AM_READWRITE16(spriteram16_word_r, spriteram16_word_w, 0xffffffff ) AM_SHARE("spriteram") AM_RANGE( 0x00840000, 0x0084ffff ) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - AM_RANGE( 0x00860000, 0x0086003f ) AM_WRITE16(seta2_vregs_w, 0xffffffff ) AM_SHARE("vregs") + AM_RANGE( 0x00860000, 0x0086003f ) AM_WRITE16(vregs_w, 0xffffffff ) AM_SHARE("vregs") AM_RANGE( 0x00c00000, 0x00c002ff ) AM_READWRITE(funcube_nvram_dword_r, funcube_nvram_dword_w ) @@ -2101,16 +2112,14 @@ static MACHINE_CONFIG_START( seta2, seta2_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0x40, 0x1c0-1, 0x80, 0x170-1) - MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update_seta2) - MCFG_SCREEN_VBLANK_DRIVER(seta2_state, screen_eof_seta2) + MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update) + MCFG_SCREEN_VBLANK_DRIVER(seta2_state, screen_eof) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", seta2) MCFG_PALETTE_ADD("palette", 0x8000+0xf0) // extra 0xf0 because we might draw 256-color object with 16-color granularity MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB) - MCFG_VIDEO_START_OVERRIDE(seta2_state,seta2) - // sound hardware MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -2121,12 +2130,8 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( mj4simai, seta2 ) - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_PROGRAM_MAP(mj4simai_map) + MCFG_MACHINE_START_OVERRIDE(seta2_state, mj4simai) - // video hardware - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0x40, 0x1c0-1, 0x80, 0x170-1) MACHINE_CONFIG_END @@ -2164,7 +2169,7 @@ static MACHINE_CONFIG_DERIVED( myangel, seta2 ) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 0x178-1, 0x00, 0xf0-1) - MCFG_VIDEO_START_OVERRIDE(seta2_state,seta2_yoffset) + MCFG_VIDEO_START_OVERRIDE(seta2_state,yoffset) MACHINE_CONFIG_END @@ -2176,7 +2181,7 @@ static MACHINE_CONFIG_DERIVED( myangel2, seta2 ) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 0x178-1, 0x00, 0xf0-1) - MCFG_VIDEO_START_OVERRIDE(seta2_state,seta2_yoffset) + MCFG_VIDEO_START_OVERRIDE(seta2_state,yoffset) MACHINE_CONFIG_END @@ -2214,7 +2219,7 @@ static MACHINE_CONFIG_DERIVED( reelquak, seta2 ) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0x40, 0x180-1, 0x80, 0x170-1) - MCFG_VIDEO_START_OVERRIDE(seta2_state,seta2_xoffset) + MCFG_VIDEO_START_OVERRIDE(seta2_state,xoffset) MACHINE_CONFIG_END @@ -2249,7 +2254,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(seta2_state::funcube_interrupt) m_maincpu->set_input_line(2, HOLD_LINE); } -MACHINE_RESET_MEMBER(seta2_state,funcube) +MACHINE_START_MEMBER(seta2_state, funcube) +{ + save_item(NAME(m_funcube_coin_start_cycles)); + save_item(NAME(m_funcube_hopper_motor)); +} + +MACHINE_RESET_MEMBER(seta2_state, funcube) { m_funcube_coin_start_cycles = 0; m_funcube_hopper_motor = 0; @@ -2272,7 +2283,8 @@ static MACHINE_CONFIG_START( funcube, seta2_state ) MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_MACHINE_RESET_OVERRIDE(seta2_state, funcube ) + MCFG_MACHINE_START_OVERRIDE(seta2_state, funcube) + MCFG_MACHINE_RESET_OVERRIDE(seta2_state, funcube) // video hardware MCFG_SCREEN_ADD("screen", RASTER) @@ -2280,16 +2292,14 @@ static MACHINE_CONFIG_START( funcube, seta2_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0x0+1, 0x140-1+1, 0x80, 0x170-1) - MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update_seta2) - MCFG_SCREEN_VBLANK_DRIVER(seta2_state, screen_eof_seta2) + MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update) + MCFG_SCREEN_VBLANK_DRIVER(seta2_state, screen_eof) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", funcube) MCFG_PALETTE_ADD("palette", 0x8000+0xf0) // extra 0xf0 because we might draw 256-color object with 16-color granularity MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB) - MCFG_VIDEO_START_OVERRIDE(seta2_state,seta2) - // sound hardware MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -2333,16 +2343,14 @@ static MACHINE_CONFIG_START( namcostr, seta2_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0x40, 0x1c0-1, 0x80, 0x170-1) - MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update_seta2) - MCFG_SCREEN_VBLANK_DRIVER(seta2_state, screen_eof_seta2) + MCFG_SCREEN_UPDATE_DRIVER(seta2_state, screen_update) + MCFG_SCREEN_VBLANK_DRIVER(seta2_state, screen_eof) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", funcube) MCFG_PALETTE_ADD("palette", 0x8000+0xf0) // extra 0xf0 because we might draw 256-color object with 16-color granularity MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB) - MCFG_VIDEO_START_OVERRIDE(seta2_state,seta2) - // sound hardware MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff --git a/src/mame/includes/seta2.h b/src/mame/includes/seta2.h index f17c3242b22..5bfca4ffbad 100644 --- a/src/mame/includes/seta2.h +++ b/src/mame/includes/seta2.h @@ -8,87 +8,93 @@ class seta2_state : public driver_device public: seta2_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this,"maincpu"), - m_tmp68301(*this, "tmp68301"), - m_nvram(*this, "nvram") , - m_spriteram(*this, "spriteram", 0), - m_vregs(*this, "vregs", 0), - m_funcube_outputs(*this, "funcube_outputs"), - m_funcube_leds(*this, "funcube_leds"), + m_maincpu(*this,"maincpu"), + m_tmp68301(*this, "tmp68301"), m_x1(*this, "x1snd"), m_oki(*this, "oki"), m_eeprom(*this, "eeprom"), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_nvram(*this, "nvram"), + m_spriteram(*this, "spriteram", 0), + m_vregs(*this, "vregs", 0), + m_funcube_outputs(*this, "funcube_outputs"), + m_funcube_leds(*this, "funcube_leds") { } required_device m_maincpu; optional_device m_tmp68301; - optional_shared_ptr m_nvram; - - optional_shared_ptr m_spriteram; - optional_shared_ptr m_vregs; - - optional_shared_ptr m_funcube_outputs; - optional_shared_ptr m_funcube_leds; - optional_device m_x1; optional_device m_oki; optional_device m_eeprom; required_device m_gfxdecode; required_device m_screen; required_device m_palette; + + optional_shared_ptr m_nvram; + optional_shared_ptr m_spriteram; + optional_shared_ptr m_vregs; + optional_shared_ptr m_funcube_outputs; + optional_shared_ptr m_funcube_leds; int m_xoffset; int m_yoffset; int m_keyboard_row; - UINT16 *m_buffered_spriteram; - + UINT64 m_funcube_coin_start_cycles; UINT8 m_funcube_hopper_motor; - DECLARE_WRITE16_MEMBER(seta2_vregs_w); - DECLARE_WRITE16_MEMBER(seta2_sound_bank_w); + DECLARE_WRITE16_MEMBER(vregs_w); + DECLARE_WRITE16_MEMBER(sound_bank_w); + DECLARE_WRITE16_MEMBER(grdians_lockout_w); + DECLARE_READ16_MEMBER(mj4simai_p1_r); DECLARE_READ16_MEMBER(mj4simai_p2_r); DECLARE_WRITE16_MEMBER(mj4simai_keyboard_w); + DECLARE_READ16_MEMBER(pzlbowl_protection_r); DECLARE_READ16_MEMBER(pzlbowl_coins_r); DECLARE_WRITE16_MEMBER(pzlbowl_coin_counter_w); + DECLARE_WRITE16_MEMBER(reelquak_leds_w); DECLARE_WRITE16_MEMBER(reelquak_coin_w); + DECLARE_WRITE16_MEMBER(samshoot_coin_w); + + DECLARE_READ16_MEMBER(gundamex_eeprom_r); + DECLARE_WRITE16_MEMBER(gundamex_eeprom_w); + DECLARE_READ32_MEMBER(funcube_nvram_dword_r); DECLARE_WRITE32_MEMBER(funcube_nvram_dword_w); DECLARE_WRITE16_MEMBER(spriteram16_word_w); DECLARE_READ16_MEMBER(spriteram16_word_r); - DECLARE_WRITE32_MEMBER(coldfire_regs_w); - DECLARE_READ32_MEMBER(coldfire_regs_r); DECLARE_READ32_MEMBER(funcube_debug_r); DECLARE_READ16_MEMBER(funcube_coins_r); DECLARE_WRITE16_MEMBER(funcube_leds_w); DECLARE_READ16_MEMBER(funcube_outputs_r); DECLARE_WRITE16_MEMBER(funcube_outputs_w); DECLARE_READ16_MEMBER(funcube_battery_r); - DECLARE_READ16_MEMBER(gundamex_eeprom_r); - DECLARE_WRITE16_MEMBER(gundamex_eeprom_w); DECLARE_READ32_MEMBER(oki_read); DECLARE_WRITE32_MEMBER(oki_write); + DECLARE_DRIVER_INIT(funcube3); DECLARE_DRIVER_INIT(funcube); DECLARE_DRIVER_INIT(funcube2); - DECLARE_VIDEO_START(seta2); + virtual void video_start(); + DECLARE_MACHINE_START(mj4simai); + DECLARE_MACHINE_START(funcube); DECLARE_MACHINE_RESET(funcube); - DECLARE_VIDEO_START(seta2_yoffset); - DECLARE_VIDEO_START(seta2_xoffset); - UINT32 screen_update_seta2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void screen_eof_seta2(screen_device &screen, bool state); + DECLARE_VIDEO_START(yoffset); + DECLARE_VIDEO_START(xoffset); + INTERRUPT_GEN_MEMBER(seta2_interrupt); INTERRUPT_GEN_MEMBER(samshoot_interrupt); - INTERRUPT_GEN_MEMBER(funcube_sub_timer_irq); TIMER_DEVICE_CALLBACK_MEMBER(funcube_interrupt); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void screen_eof(screen_device &screen, bool state); void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); void funcube_debug_outputs(); }; diff --git a/src/mame/video/seta2.c b/src/mame/video/seta2.c index 229b01d81df..333bf9daa0d 100644 --- a/src/mame/video/seta2.c +++ b/src/mame/video/seta2.c @@ -108,7 +108,7 @@ ***************************************************************************/ -WRITE16_MEMBER(seta2_state::seta2_vregs_w) +WRITE16_MEMBER(seta2_state::vregs_w) { /* 02/04 = horizontal display start/end mj4simai = 0065/01E5 (0180 visible area) @@ -441,7 +441,7 @@ void seta2_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) ***************************************************************************/ -VIDEO_START_MEMBER(seta2_state,seta2) +void seta2_state::video_start() { m_gfxdecode->gfx(2)->set_granularity(16); m_gfxdecode->gfx(3)->set_granularity(16); @@ -452,26 +452,23 @@ VIDEO_START_MEMBER(seta2_state,seta2) m_xoffset = 0; m_yoffset = 0; - - //TODO:FIX - //save_pointer(NAME(m_vregs), 0x40); } -VIDEO_START_MEMBER(seta2_state,seta2_xoffset) +VIDEO_START_MEMBER(seta2_state,xoffset) { - VIDEO_START_CALL_MEMBER(seta2); - + video_start(); + m_xoffset = 0x200; } -VIDEO_START_MEMBER(seta2_state,seta2_yoffset) +VIDEO_START_MEMBER(seta2_state,yoffset) { - VIDEO_START_CALL_MEMBER(seta2); - + video_start(); + m_yoffset = 0x10; } -UINT32 seta2_state::screen_update_seta2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 seta2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // Black or pen 0? bitmap.fill(m_palette->pen(0), cliprect); @@ -482,7 +479,7 @@ UINT32 seta2_state::screen_update_seta2(screen_device &screen, bitmap_ind16 &bit return 0; } -void seta2_state::screen_eof_seta2(screen_device &screen, bool state) +void seta2_state::screen_eof(screen_device &screen, bool state) { // rising edge if (state) From f4a04ca8e5a4b4055f3d065e693ef56d581cbbd4 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sat, 21 Mar 2015 10:46:40 +0100 Subject: [PATCH 123/201] Whatever, I'll keep what I need locally, as always (nw) --- src/emu/emucore.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/emu/emucore.h b/src/emu/emucore.h index d1eea01e08f..899ee9fa670 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -214,11 +214,6 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define FUNC(x) &x, #x #define FUNC_NULL NULL, "(null)" -#ifndef REGRESSION_TESTING - -#define assert_always(x, msg) do { if (!(x)) { fprintf(stderr, "%s:%d: Assert failure: %s: %s\n", __FILE__, __LINE__, msg, #x); abort(); }} while (0) - -#else // standard assertion macros #undef assert @@ -235,8 +230,6 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define assert_always(x, msg) do { if (!(x)) throw emu_fatalerror("Fatal error: %s (%s:%d)", msg, __FILE__, __LINE__); } while (0) #endif -#endif - // macros to convert radians to degrees and degrees to radians #define RADIAN_TO_DEGREE(x) ((180.0 / M_PI) * (x)) From 9e0f59152fd5bc9dd928ce8b381fa005054dd335 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 21 Mar 2015 11:41:40 +0100 Subject: [PATCH 124/201] updated mongoose with some patches sent upstream (nw) --- 3rdparty/mongoose/docs/ReleaseNotes.md | 25 ++++ 3rdparty/mongoose/examples/.gitignore | 1 + 3rdparty/mongoose/examples/Makefile | 9 +- .../mongoose/examples/web_server/web_server.c | 12 +- 3rdparty/mongoose/mongoose.c | 112 ++++++++++++------ 3rdparty/mongoose/test/unit_test.c | 17 +-- 6 files changed, 121 insertions(+), 55 deletions(-) create mode 100644 3rdparty/mongoose/examples/.gitignore diff --git a/3rdparty/mongoose/docs/ReleaseNotes.md b/3rdparty/mongoose/docs/ReleaseNotes.md index 2b45b99a466..24874f824a0 100644 --- a/3rdparty/mongoose/docs/ReleaseNotes.md +++ b/3rdparty/mongoose/docs/ReleaseNotes.md @@ -1,5 +1,30 @@ # Mongoose Release Notes +## Release 5.6, 2015-03-17 + +Changes in Libmongoose library: + +- Added `-dav_root` configuration option that gives an ability to mount + a different root directory (not document_root) +- Fixes for build under Win23 and MinGW +- Bugfix: Double dots removal +- Bugfix: final chunked response double-send +- Fixed compilation in 64-bit environments +- Added OS/2 compatibility +- Added `getaddrinfo()` call and `NS_ENABLE_GETADDRINFO` +- Various SSL-related fixes +- Added integer overflow protection in `iobuf_append()` and `deliver_websocket_frame()` +- Fixed NetBSD build +- Enabled `NS_ENABLE_IPV6` build for Visual Studio 2008+ +- Enhanced comma detection in `parse_header()` +- Fixed unchanged memory accesses on ARM +- Added ability to use custom memory allocator through NS_MALLOC, NS_FREE, NS_REALLOC + +Changes in Mongoose binary: + +- Added `-start_browser` option to disable automatic browser launch +- Added experimental SSL support. To listen on HTTPS port, use `ssl://PORT:SSL_CERT` format. For example, to listen on HTTP port 8080 and HTTPS port 8043, use `-listening_port 8080,ssl://8043:ssl_cert.pem` + ## Release 5.5, October 28 2014 Changes in Libmongoose library: diff --git a/3rdparty/mongoose/examples/.gitignore b/3rdparty/mongoose/examples/.gitignore new file mode 100644 index 00000000000..b883f1fdc6d --- /dev/null +++ b/3rdparty/mongoose/examples/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/3rdparty/mongoose/examples/Makefile b/3rdparty/mongoose/examples/Makefile index 2964d37e9fb..43483c3f860 100644 --- a/3rdparty/mongoose/examples/Makefile +++ b/3rdparty/mongoose/examples/Makefile @@ -3,13 +3,18 @@ SUBDIRS = $(sort $(filter-out csharp/, $(dir $(wildcard */)))) X = $(SUBDIRS) +ifdef WINDIR + # appending the Winsock2 library at the end of the compiler + # invocation + CFLAGS_EXTRA += -lws2_32 +endif .PHONY: $(SUBDIRS) all: $(SUBDIRS) $(SUBDIRS): - @$(MAKE) -C $@ + @$(MAKE) CFLAGS_EXTRA="$(CFLAGS_EXTRA)" -C $@ clean: - for d in $(SUBDIRS) ; do $(MAKE) -C $$d clean ; done \ No newline at end of file + for d in $(SUBDIRS) ; do $(MAKE) -C $$d clean ; done diff --git a/3rdparty/mongoose/examples/web_server/web_server.c b/3rdparty/mongoose/examples/web_server/web_server.c index 07fda84ed17..03c13d0aab2 100644 --- a/3rdparty/mongoose/examples/web_server/web_server.c +++ b/3rdparty/mongoose/examples/web_server/web_server.c @@ -71,12 +71,7 @@ static char server_name[50]; // Set by init_server_name() static char s_config_file[PATH_MAX]; // Set by process_command_line_arguments static struct mg_server *server; // Set by start_mongoose() static const char *s_default_document_root = "."; -#ifndef NS_ENABLE_SSL static const char *s_default_listening_port = "8080"; -#else -static const char *s_default_listening_port = "ssl://8443:certs/cert.pem"; -#endif - static char **s_argv = { NULL }; static void set_options(char *argv[]); @@ -101,11 +96,8 @@ static void __cdecl signal_handler(int sig_num) { } static void vnotify(const char *fmt, va_list ap, int must_exit) { - char msg[200]; - - vsnprintf(msg, sizeof(msg), fmt, ap); - fprintf(stderr, "%s\n", msg); - + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); if (must_exit) { exit(EXIT_FAILURE); } diff --git a/3rdparty/mongoose/mongoose.c b/3rdparty/mongoose/mongoose.c index 550c3bd2415..d85f6ff3c0a 100644 --- a/3rdparty/mongoose/mongoose.c +++ b/3rdparty/mongoose/mongoose.c @@ -34,8 +34,6 @@ // // Alternatively, you can license this software under a commercial // license, as set out in . -// -// $Date: 2014-09-28 05:04:41 UTC $ #ifndef NS_SKELETON_HEADER_INCLUDED #define NS_SKELETON_HEADER_INCLUDED @@ -46,7 +44,9 @@ #undef _UNICODE // Use multibyte encoding on Windows #define _MBCS // Use multibyte encoding on Windows #define _INTEGRAL_MAX_BITS 64 // Enable _stati64() on Windows +#ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS // Disable deprecation warning in VS2005+ +#endif #undef WIN32_LEAN_AND_MEAN // Let windows.h always include winsock2.h #ifdef __Linux__ #define _XOPEN_SOURCE 600 // For flockfile() on Linux @@ -63,6 +63,10 @@ #pragma warning (disable : 4204) // missing c99 support #endif +#ifndef MONGOOSE_ENABLE_THREADS +#define NS_DISABLE_THREADS +#endif + #ifdef __OS2__ #define _MMAP_DECLARED // Prevent dummy mmap() declaration in stdio.h #endif @@ -618,8 +622,6 @@ static int ns_resolve2(const char *host, struct in_addr *ina) { int rv = 0; struct addrinfo hints, *servinfo, *p; struct sockaddr_in *h = NULL; - char *ip = NS_MALLOC(17); - memset(ip, '\0', 17); memset(&hints, 0, sizeof hints); hints.ai_family = AF_INET; @@ -705,8 +707,8 @@ static int ns_parse_address(const char *str, union socket_address *sa, sa->sin.sin_port = htons((uint16_t) port); } - if (*use_ssl && (sscanf(str + len, ":%99[^:]:%99[^:]%n", cert, ca, &n) == 2 || - sscanf(str + len, ":%99[^:]%n", cert, &n) == 1)) { + if (*use_ssl && (sscanf(str + len, ":%99[^:,]:%99[^:,]%n", cert, ca, &n) == 2 || + sscanf(str + len, ":%99[^:,]%n", cert, &n) == 1)) { len += n; } @@ -1387,7 +1389,7 @@ typedef pid_t process_id_t; struct vec { const char *ptr; - uintptr_t len; + size_t len; }; // For directory listing and WevDAV support @@ -1410,6 +1412,7 @@ enum { CGI_PATTERN, #endif DAV_AUTH_FILE, + DAV_ROOT, DOCUMENT_ROOT, #ifndef MONGOOSE_NO_DIRECTORY_LISTING ENABLE_DIRECTORY_LISTING, @@ -1448,6 +1451,7 @@ static const char *static_config_options[] = { "cgi_pattern", DEFAULT_CGI_PATTERN, #endif "dav_auth_file", NULL, + "dav_root", NULL, "document_root", NULL, #ifndef MONGOOSE_NO_DIRECTORY_LISTING "enable_directory_listing", "yes", @@ -1751,7 +1755,7 @@ static int mg_snprintf(char *buf, size_t buflen, const char *fmt, ...) { // >0 actual request length, including last \r\n\r\n static int get_request_len(const char *s, size_t buf_len) { const unsigned char *buf = (unsigned char *) s; - int i; + size_t i; for (i = 0; i < buf_len; i++) { // Control characters are not allowed but >=128 are. @@ -1791,7 +1795,7 @@ static char *skip(char **buf, const char *delimiters) { // Parse HTTP headers from the given buffer, advance buffer to the point // where parsing stopped. static void parse_http_headers(char **buf, struct mg_connection *ri) { - int i; + size_t i; for (i = 0; i < ARRAY_SIZE(ri->http_headers); i++) { ri->http_headers[i].name = skip(buf, ": "); @@ -2343,12 +2347,12 @@ static void on_cgi_data(struct ns_connection *nc) { if (conn->ns_conn->flags & NSF_BUFFER_BUT_DONT_SEND) { struct iobuf *io = &conn->ns_conn->send_iobuf; size_t s_len = sizeof(cgi_status) - 1; - ssize_t len = get_request_len(io->buf + s_len, io->len - s_len); + int len = get_request_len(io->buf + s_len, io->len - s_len); char buf[MAX_REQUEST_SIZE], *s = buf; if (len == 0) return; - if (len < 0 || len > sizeof(buf)) { + if (len < 0 || len > (int) sizeof(buf)) { len = io->len; iobuf_remove(io, io->len); send_http_error(conn, 500, "CGI program sent malformed headers: [%.*s]", @@ -2434,7 +2438,9 @@ static void remove_double_dots_and_double_slashes(char *s) { // Skip all following slashes, backslashes and double-dots while (s[0] != '\0') { if (s[0] == '/' || s[0] == '\\') { s++; } - else if (s[0] == '.' && s[1] == '.') { s += 2; } + else if (s[0] == '.' && (s[1] == '/' || s[1] == '\\')) { s += 2; } + else if (s[0] == '.' && s[1] == '.' && s[2] == '\0') { s += 2; } + else if (s[0] == '.' && s[1] == '.' && (s[2] == '/' || s[2] == '\\')) { s += 3; } else { break; } } } @@ -2444,11 +2450,12 @@ static void remove_double_dots_and_double_slashes(char *s) { int mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len, int is_form_url_encoded) { - int i, j, a, b; -#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + size_t i, j = 0; + int a, b; +#define HEXTOI(x) (isdigit(x) ? (x) - '0' : (x) - 'W') for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { - if (src[i] == '%' && i < src_len - 2 && + if (src[i] == '%' && i + 2 < src_len && isxdigit(* (const unsigned char *) (src + i + 1)) && isxdigit(* (const unsigned char *) (src + i + 2))) { a = tolower(* (const unsigned char *) (src + i + 1)); @@ -2470,14 +2477,16 @@ int mg_url_decode(const char *src, size_t src_len, char *dst, static int is_valid_http_method(const char *s) { return !strcmp(s, "GET") || !strcmp(s, "POST") || !strcmp(s, "HEAD") || !strcmp(s, "CONNECT") || !strcmp(s, "PUT") || !strcmp(s, "DELETE") || - !strcmp(s, "OPTIONS") || !strcmp(s, "PROPFIND") || !strcmp(s, "MKCOL"); + !strcmp(s, "OPTIONS") || !strcmp(s, "PROPFIND") || !strcmp(s, "MKCOL") || + !strcmp(s, "PATCH"); } // Parse HTTP request, fill in mg_request structure. // This function modifies the buffer by NUL-terminating // HTTP request components, header names and header values. // Note that len must point to the last \n of HTTP headers. -static size_t parse_http_message(char *buf, size_t len, struct mg_connection *ri) { +static size_t parse_http_message(char *buf, size_t len, + struct mg_connection *ri) { int is_request, n; // Reset the connection. Make sure that we don't touch fields that are @@ -2485,6 +2494,8 @@ static size_t parse_http_message(char *buf, size_t len, struct mg_connection *ri ri->request_method = ri->uri = ri->http_version = ri->query_string = NULL; ri->num_headers = ri->status_code = ri->is_websocket = ri->content_len = 0; + if (len < 1) return ~0; + buf[len - 1] = '\0'; // RFC says that all initial whitespaces should be ingored @@ -2500,7 +2511,7 @@ static size_t parse_http_message(char *buf, size_t len, struct mg_connection *ri is_request = is_valid_http_method(ri->request_method); if ((is_request && memcmp(ri->http_version, "HTTP/", 5) != 0) || (!is_request && memcmp(ri->request_method, "HTTP/", 5) != 0)) { - len = -1; + len = ~0; } else { if (is_request) { ri->http_version += 5; @@ -2631,6 +2642,12 @@ void mg_template(struct mg_connection *conn, const char *s, } #ifndef MONGOOSE_NO_FILESYSTEM +static int is_dav_request(const struct connection *conn) { + const char *s = conn->mg_conn.request_method; + return !strcmp(s, "PUT") || !strcmp(s, "DELETE") || + !strcmp(s, "MKCOL") || !strcmp(s, "PROPFIND"); +} + static int must_hide_file(struct connection *conn, const char *path) { const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$"; const char *pattern = conn->server->config_options[HIDE_FILES_PATTERN]; @@ -2643,7 +2660,12 @@ static int convert_uri_to_file_name(struct connection *conn, char *buf, size_t buf_len, file_stat_t *st) { struct vec a, b; const char *rewrites = conn->server->config_options[URL_REWRITES]; - const char *root = conn->server->config_options[DOCUMENT_ROOT]; + const char *root = +#ifndef MONGOOSE_NO_DAV + is_dav_request(conn) && conn->server->config_options[DAV_ROOT] != NULL ? + conn->server->config_options[DAV_ROOT] : +#endif + conn->server->config_options[DOCUMENT_ROOT]; #ifndef MONGOOSE_NO_CGI const char *cgi_pat = conn->server->config_options[CGI_PATTERN]; char *p; @@ -2655,7 +2677,7 @@ static int convert_uri_to_file_name(struct connection *conn, char *buf, // Perform virtual hosting rewrites if (rewrites != NULL && domain != NULL) { const char *colon = strchr(domain, ':'); - ssize_t domain_len = colon == NULL ? strlen(domain) : colon - domain; + size_t domain_len = colon == NULL ? strlen(domain) : colon - domain; while ((rewrites = next_option(rewrites, &a, &b)) != NULL) { if (a.len > 1 && a.ptr[0] == '@' && a.len == domain_len + 1 && @@ -3262,8 +3284,12 @@ static int find_index_file(struct connection *conn, char *path, // path and see if the file exists. If it exists, break the loop while ((list = next_option(list, &filename_vec, NULL)) != NULL) { + if (path_len <= n + 2) { + continue; + } + // Ignore too long entries that may overflow path buffer - if (filename_vec.len > (int) (path_len - (n + 2))) + if (filename_vec.len > (path_len - (n + 2))) continue; // Prepare full path to the index file @@ -3331,7 +3357,8 @@ static void open_file_endpoint(struct connection *conn, const char *path, // Prepare Etag, Date, Last-Modified headers. Must be in UTC, according to // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 gmt_time_string(date, sizeof(date), &curtime); - gmt_time_string(lm, sizeof(lm), &st->st_mtime); + time_t t = st->st_mtime; + gmt_time_string(lm, sizeof(lm), &t); construct_etag(etag, sizeof(etag), st); n = mg_snprintf(headers, sizeof(headers), @@ -3551,7 +3578,8 @@ static void print_dir_entry(const struct dir_entry *de) { mg_snprintf(size, sizeof(size), "%.1fG", (double) fsize / 1073741824); } } - strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", localtime(&de->st.st_mtime)); + time_t t = de->st.st_mtime; + strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", localtime(&t)); mg_url_encode(de->file_name, strlen(de->file_name), href, sizeof(href)); mg_printf_data(&de->conn->mg_conn, "%s%s" @@ -3622,8 +3650,8 @@ static void send_directory_listing(struct connection *conn, const char *dir) { static void print_props(struct connection *conn, const char *uri, file_stat_t *stp) { char mtime[64]; - - gmt_time_string(mtime, sizeof(mtime), &stp->st_mtime); + time_t t = stp->st_mtime; + gmt_time_string(mtime, sizeof(mtime), &t); mg_printf(&conn->mg_conn, "" "%s" @@ -4182,12 +4210,6 @@ static int is_authorized_for_dav(struct connection *conn) { return authorized; } - -static int is_dav_request(const struct connection *conn) { - const char *s = conn->mg_conn.request_method; - return !strcmp(s, "PUT") || !strcmp(s, "DELETE") || - !strcmp(s, "MKCOL") || !strcmp(s, "PROPFIND"); -} #endif // MONGOOSE_NO_AUTH static int parse_header(const char *str, size_t str_len, const char *var_name, @@ -5123,20 +5145,38 @@ const char *mg_set_option(struct mg_server *server, const char *name, DBG(("%s [%s]", name, *v)); if (ind == LISTENING_PORT) { + char buf[500] = ""; + size_t n = 0; struct vec vec; + /* + * Ports can be specified as 0, meaning that OS has to choose any + * free port that is available. In order to pass chosen port number to + * the user, we rewrite all 0 port to chosen values. + */ while ((value = next_option(value, &vec, NULL)) != NULL) { struct ns_connection *c = ns_bind(&server->ns_mgr, vec.ptr, mg_ev_handler, NULL); - if (c== NULL) { + if (c == NULL) { error_msg = "Cannot bind to port"; break; } else { - char buf[100]; - ns_sock_to_str(c->sock, buf, sizeof(buf), 2); - NS_FREE(*v); - *v = mg_strdup(buf); + char buf2[50], cert[100], ca[100]; + union socket_address sa; + int proto, use_ssl; + + ns_parse_address(vec.ptr, &sa, &proto, &use_ssl, cert, ca); + ns_sock_to_str(c->sock, buf2, sizeof(buf2), + memchr(vec.ptr, ':', vec.len) == NULL ? 2 : 3); + + n += snprintf(buf + n, sizeof(buf) - n, "%s%s%s%s%s%s%s", + n > 0 ? "," : "", + use_ssl ? "ssl://" : "", + buf2, cert[0] ? ":" : "", cert, ca[0] ? ":" : "", ca); } } + buf[sizeof(buf) - 1] = '\0'; + NS_FREE(*v); + *v = mg_strdup(buf); #ifndef MONGOOSE_NO_FILESYSTEM } else if (ind == HEXDUMP_FILE) { server->ns_mgr.hexdump_file = *v; diff --git a/3rdparty/mongoose/test/unit_test.c b/3rdparty/mongoose/test/unit_test.c index 39e36ae02ef..6492317bcbd 100644 --- a/3rdparty/mongoose/test/unit_test.c +++ b/3rdparty/mongoose/test/unit_test.c @@ -120,8 +120,8 @@ static const char *test_parse_http_message() { ASSERT(strcmp(ri.http_version, "1.1") == 0); ASSERT(ri.num_headers == 0); - ASSERT(parse_http_message(req2, sizeof(req2) - 1, &ri) == -1); - ASSERT(parse_http_message(req6, 0, &ri) == -1); + ASSERT(parse_http_message(req2, sizeof(req2) - 1, &ri) == (size_t) ~0); + ASSERT(parse_http_message(req6, 0, &ri) == (size_t) ~0); ASSERT(parse_http_message(req8, sizeof(req8) - 1, &ri) == sizeof(req8) - 1); // TODO(lsm): Fix this. Header value may span multiple lines. @@ -198,17 +198,19 @@ static const char *test_match_prefix(void) { } static const char *test_remove_double_dots() { - struct { char before[20], after[20]; } data[] = { + struct { char before[30], after[30]; } data[] = { {"////a", "/a"}, - {"/.....", "/."}, - {"/......", "/"}, + {"/.....", "/....."}, + {"/......", "/......"}, {"...", "..."}, - {"/...///", "/./"}, + {"/...///", "/.../"}, {"/a...///", "/a.../"}, {"/.x", "/.x"}, {"/\\", "/"}, {"/a\\", "/a\\"}, - {"/a\\\\...", "/a\\."}, + {"/a\\\\...", "/a\\..."}, + {"foo/x..y/././y/../../..", "foo/x..y/y/"}, + {"foo/..x", "foo/..x"}, }; size_t i; @@ -261,6 +263,7 @@ static const char *test_url_decode(void) { ASSERT(strcmp(buf, "a ") == 0); ASSERT(mg_url_decode("%61", 1, buf, sizeof(buf), 1) == 1); + printf("[%s]\n", buf); ASSERT(strcmp(buf, "%") == 0); ASSERT(mg_url_decode("%61", 2, buf, sizeof(buf), 1) == 2); From 65a7e23b2d0bf30dc950b28dd9e903f2cab14b6a Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 21 Mar 2015 11:42:10 +0100 Subject: [PATCH 125/201] official proposal for Android fix (nw) --- 3rdparty/lua/src/luaconf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/3rdparty/lua/src/luaconf.h b/3rdparty/lua/src/luaconf.h index fd28d21aec9..615f1a2da4b 100644 --- a/3rdparty/lua/src/luaconf.h +++ b/3rdparty/lua/src/luaconf.h @@ -729,6 +729,9 @@ +#ifdef __ANDROID__ +#define l_getlocaledecpoint() '.' +#endif #endif From 8eb93098ed6a51eeaf972c29c2bd58cd7ed5be91 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 21 Mar 2015 11:42:53 +0100 Subject: [PATCH 126/201] more Android fixes (nw) --- src/emu/luaengine.c | 2 +- src/emu/netlist/plists.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/emu/luaengine.c b/src/emu/luaengine.c index 59eae3870d5..256fa460be6 100644 --- a/src/emu/luaengine.c +++ b/src/emu/luaengine.c @@ -130,7 +130,7 @@ lua_engine::hook::hook() cb = -1; } -#ifdef SDLMAME_SOLARIS +#if defined(SDLMAME_SOLARIS) || defined(__ANDROID__) #undef _L #endif diff --git a/src/emu/netlist/plists.h b/src/emu/netlist/plists.h index c7eb594cdb2..e3d3a99d184 100644 --- a/src/emu/netlist/plists.h +++ b/src/emu/netlist/plists.h @@ -199,7 +199,7 @@ private: // pnamedlist_t: a simple list // ---------------------------------------------------------------------------------------- -#ifdef SDLMAME_SOLARIS +#if defined(SDLMAME_SOLARIS) || defined(__ANDROID__) #undef _C #endif From 84a5fadd43ef657b5d5ed785496e0e45d1d08246 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 10:57:15 +0000 Subject: [PATCH 127/201] chelnov: simulate some protection instead of patching rom [iq_132] --- src/mame/drivers/karnov.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/karnov.c b/src/mame/drivers/karnov.c index 391489ac700..6666d06eb5e 100644 --- a/src/mame/drivers/karnov.c +++ b/src/mame/drivers/karnov.c @@ -215,8 +215,13 @@ void karnov_state::chelnov_i8751_w( int data ) if (data == 0x100 && m_microcontroller_id == CHELNOVJ) /* Japan version */ m_i8751_return = 0x71a; - if (data >= 0x6000 && data < 0x8000) - m_i8751_return = 1; /* patched */ + if ((data & 0xe000) == 0x6000) { + if (data & 0x1000) { + m_i8751_return = ((data & 0x0f) + ((data >> 4) & 0x0f)) * ((data >> 8) & 0x0f); + } else { + m_i8751_return = (data & 0x0f) * (((data >> 8) & 0x0f) + ((data >> 4) & 0x0f)); + } + } if ((data & 0xf000) == 0x1000) m_i8751_level = 1; /* Level 1 */ if ((data & 0xf000) == 0x2000) m_i8751_level++; /* Level Increment */ @@ -1283,7 +1288,6 @@ DRIVER_INIT_MEMBER(karnov_state,chelnov) m_microcontroller_id = CHELNOV; m_coin_mask = 0xe0; - RAM[0x0a26/2] = 0x4e71; /* removes a protection lookup table */ RAM[0x062a/2] = 0x4e71; /* hangs waiting on i8751 int */ } @@ -1293,7 +1297,6 @@ DRIVER_INIT_MEMBER(karnov_state,chelnovu) m_microcontroller_id = CHELNOVU; m_coin_mask = 0xe0; - RAM[0x0a26/2] = 0x4e71; /* removes a protection lookup table */ RAM[0x062a/2] = 0x4e71; /* hangs waiting on i8751 int */ } @@ -1303,7 +1306,6 @@ DRIVER_INIT_MEMBER(karnov_state,chelnovj) m_microcontroller_id = CHELNOVJ; m_coin_mask = 0xe0; - RAM[0x0a2e/2] = 0x4e71; /* removes a protection lookup table */ RAM[0x062a/2] = 0x4e71; /* hangs waiting on i8751 int */ } From 489bfb979e672c721d4cf7f9cd4aef2a68ae0b33 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 21 Mar 2015 11:58:52 +0100 Subject: [PATCH 128/201] Some compilers have issue with ! signs (nw) --- src/lib/util/corestr.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/util/corestr.h b/src/lib/util/corestr.h index dad4880b268..e9750b5f85f 100644 --- a/src/lib/util/corestr.h +++ b/src/lib/util/corestr.h @@ -26,11 +26,11 @@ int core_stricmp(const char *s1, const char *s2); /* this macro prevents people from using stricmp directly */ #undef stricmp -#define stricmp !MUST_USE_CORE_STRICMP_INSTEAD! +#define stricmp MUST_USE_CORE_STRICMP_INSTEAD /* this macro prevents people from using strcasecmp directly */ #undef strcasecmp -#define strcasecmp !MUST_USE_CORE_STRICMP_INSTEAD! +#define strcasecmp MUST_USE_CORE_STRICMP_INSTEAD /* since strnicmp is not part of the standard, we use this instead */ @@ -38,11 +38,11 @@ int core_strnicmp(const char *s1, const char *s2, size_t n); /* this macro prevents people from using strnicmp directly */ #undef strnicmp -#define strnicmp !MUST_USE_CORE_STRNICMP_INSTEAD! +#define strnicmp MUST_USE_CORE_STRNICMP_INSTEAD /* this macro prevents people from using strncasecmp directly */ #undef strncasecmp -#define strncasecmp !MUST_USE_CORE_STRNICMP_INSTEAD! +#define strncasecmp MUST_USE_CORE_STRNICMP_INSTEAD /* since strdup is not part of the standard, we use this instead - free with osd_free() */ @@ -50,7 +50,7 @@ char *core_strdup(const char *str); /* this macro prevents people from using strdup directly */ #undef strdup -#define strdup !MUST_USE_CORE_STRDUP_INSTEAD! +#define strdup MUST_USE_CORE_STRDUP_INSTEAD /* additional string compare helper (up to 16 characters at the moment) */ From bfa68aef3182661e1df1ee22b39fa50b274dc928 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 21 Mar 2015 11:59:28 +0100 Subject: [PATCH 129/201] MAX_CLOCKS is defined in Android sdk (nw) --- src/lib/formats/dfi_dsk.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/formats/dfi_dsk.c b/src/lib/formats/dfi_dsk.c index d6790f76943..16341f55b26 100644 --- a/src/lib/formats/dfi_dsk.c +++ b/src/lib/formats/dfi_dsk.c @@ -16,13 +16,13 @@ #include #define NUMBER_OF_MULTIREADS 3 // threshholds for brickwall windowing -//define MIN_CLOCKS 65 +//define DFI_MIN_CLOCKS 65 // number_please apple2 wants 40 min -#define MIN_CLOCKS 60 +#define DFI_MIN_CLOCKS 60 //define MAX_CLOCKS 260 -#define MAX_CLOCKS 270 -#define MIN_THRESH (MIN_CLOCKS*(clock_rate/25000000)) -#define MAX_THRESH (MAX_CLOCKS*(clock_rate/25000000)) +#define DFI_MAX_CLOCKS 270 +#define MIN_THRESH (DFI_MIN_CLOCKS*(clock_rate/25000000)) +#define MAX_THRESH (DFI_MAX_CLOCKS*(clock_rate/25000000)) // constants to help guess clockrate and rpm // constant is 25mhz / 6 revolutions per second (360rpm) = 4166667 +- 2.5% #define REV25_MIN 4062500 From 8b6fea68c21ff2c31f60974c0028a97c7f1fe47b Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sat, 21 Mar 2015 14:02:26 +0100 Subject: [PATCH 130/201] cocoloco.c: added save state support (nw) --- src/mame/drivers/cocoloco.c | 56 +++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/mame/drivers/cocoloco.c b/src/mame/drivers/cocoloco.c index d47795cefb4..8932025cc9b 100644 --- a/src/mame/drivers/cocoloco.c +++ b/src/mame/drivers/cocoloco.c @@ -190,19 +190,24 @@ public: m_maincpu(*this, "maincpu"), m_palette(*this, "palette") { } - UINT8 *m_videoram; - UINT8 m_videobank; - DECLARE_READ8_MEMBER(cocoloco_vram_r); - DECLARE_WRITE8_MEMBER(cocoloco_vram_w); - DECLARE_WRITE8_MEMBER(cocoloco_vbank_w); - DECLARE_WRITE8_MEMBER(cocoloco_vram_clear_w); - DECLARE_WRITE8_MEMBER(cocoloco_coin_counter_w); - DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); - virtual void video_start(); - DECLARE_PALETTE_INIT(cocoloco); - UINT32 screen_update_cocoloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); required_device m_maincpu; required_device m_palette; + + UINT8 *m_videoram; + UINT8 m_videobank; + + DECLARE_READ8_MEMBER(vram_r); + DECLARE_WRITE8_MEMBER(vram_w); + DECLARE_WRITE8_MEMBER(vbank_w); + DECLARE_WRITE8_MEMBER(vram_clear_w); + DECLARE_WRITE8_MEMBER(coincounter_w); + + DECLARE_INPUT_CHANGED_MEMBER(coin_inserted); + + virtual void video_start(); + DECLARE_PALETTE_INIT(cocoloco); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); }; /*********************************** @@ -284,9 +289,12 @@ PALETTE_INIT_MEMBER(cocoloco_state, cocoloco) void cocoloco_state::video_start() { m_videoram = auto_alloc_array(machine(), UINT8, 0x2000 * 8); + + save_pointer(NAME(m_videoram), 0x2000 * 8); + save_item(NAME(m_videobank)); } -UINT32 cocoloco_state::screen_update_cocoloco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 cocoloco_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int x, y, count, xi; @@ -318,12 +326,12 @@ UINT32 cocoloco_state::screen_update_cocoloco(screen_device &screen, bitmap_ind1 } -READ8_MEMBER( cocoloco_state::cocoloco_vram_r ) +READ8_MEMBER( cocoloco_state::vram_r ) { return m_videoram[offset|0x0000] | m_videoram[offset|0x2000] | m_videoram[offset|0x4000] | m_videoram[offset|0x6000]; } -WRITE8_MEMBER( cocoloco_state::cocoloco_vram_w ) +WRITE8_MEMBER( cocoloco_state::vram_w ) { m_videoram[offset|0x0000] = (m_videobank == 0) ? data : 0; m_videoram[offset|0x2000] = (m_videobank & 2) ? data : 0; @@ -331,12 +339,12 @@ WRITE8_MEMBER( cocoloco_state::cocoloco_vram_w ) m_videoram[offset|0x6000] = (m_videobank & 8) ? data : 0; } -WRITE8_MEMBER( cocoloco_state::cocoloco_vbank_w ) +WRITE8_MEMBER( cocoloco_state::vbank_w ) { m_videobank = data; } -WRITE8_MEMBER( cocoloco_state::cocoloco_vram_clear_w ) +WRITE8_MEMBER( cocoloco_state::vram_clear_w ) { /* ??? */ // for(int i=0;i<0x8000;i++) @@ -346,7 +354,7 @@ WRITE8_MEMBER( cocoloco_state::cocoloco_vram_clear_w ) } -WRITE8_MEMBER( cocoloco_state::cocoloco_coin_counter_w ) +WRITE8_MEMBER( cocoloco_state::coincounter_w ) { /* - bits - 7654 3210 @@ -367,14 +375,14 @@ WRITE8_MEMBER( cocoloco_state::cocoloco_coin_counter_w ) static ADDRESS_MAP_START( cocoloco_map, AS_PROGRAM, 8, cocoloco_state ) AM_RANGE(0x0000, 0x1fff) AM_RAM - AM_RANGE(0x2000, 0x3fff) AM_READWRITE(cocoloco_vram_r, cocoloco_vram_w) // 256 x 256 x 1 + AM_RANGE(0x2000, 0x3fff) AM_READWRITE(vram_r, vram_w) // 256 x 256 x 1 AM_RANGE(0x6001, 0x6001) AM_DEVREAD("ay8910", ay8910_device, data_r) AM_RANGE(0x6002, 0x6002) AM_DEVWRITE("ay8910", ay8910_device, data_w) AM_RANGE(0x6003, 0x6003) AM_DEVWRITE("ay8910", ay8910_device, address_w) - AM_RANGE(0x8003, 0x8003) AM_WRITE(cocoloco_vbank_w) - AM_RANGE(0x8005, 0x8005) AM_WRITE(cocoloco_coin_counter_w) + AM_RANGE(0x8003, 0x8003) AM_WRITE(vbank_w) + AM_RANGE(0x8005, 0x8005) AM_WRITE(coincounter_w) AM_RANGE(0xa000, 0xa000) AM_READ_PORT("IN0") - AM_RANGE(0xa005, 0xa005) AM_WRITE(cocoloco_vram_clear_w) + AM_RANGE(0xa005, 0xa005) AM_WRITE(vram_clear_w) AM_RANGE(0xd000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -465,7 +473,7 @@ static MACHINE_CONFIG_START( cocoloco, cocoloco_state ) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(CPU_CLOCK * 4, 384, 0, 256, 262, 0, 256) /* TODO: not accurate, ~50 Hz */ - MCFG_SCREEN_UPDATE_DRIVER(cocoloco_state, screen_update_cocoloco) + MCFG_SCREEN_UPDATE_DRIVER(cocoloco_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 0x10) @@ -519,5 +527,5 @@ ROM_END * Game Drivers * ***********************************/ -/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 198?, cocoloco, 0, cocoloco, cocoloco, driver_device, 0, ROT90, "Petaco S.A.", "Coco Loco", 0 ) +/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ +GAME( 198?, cocoloco, 0, cocoloco, cocoloco, driver_device, 0, ROT90, "Petaco S.A.", "Coco Loco", GAME_SUPPORTS_SAVE ) From 5b7e18898038e0d22918cafe7349cfe071775e2b Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 22 Mar 2015 03:24:00 +1100 Subject: [PATCH 131/201] Hook up ticket dispenser in unkch sets, add notes, figure out a couple more DIPs --- src/mame/drivers/goldstar.c | 173 +++++++++++++++++++---------------- src/mame/includes/goldstar.h | 10 +- 2 files changed, 105 insertions(+), 78 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index 8723e938f75..ea295e7fb49 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -119,6 +119,27 @@ * unkch sets + In unkch1/unkch2 the payout rate is set with a combination of DSW1-3 (Punti) + and DSW3-3 (Gettoni/Ticket). If Punti is set to Ticket, the payout rate is + the second number of the Gettoni/Ticket setting (100 or 200). If Punti is set + to Gettoni, the payout rate is the first number of the Gettoni/Ticket setting + (10 or 20). If your points/credits aren't a multiple of the payout rate, you + lose the remainder. If you hit Key Out when your points/credits are less than + 100, you get nothing at all. If Gettoni/Ticket is set to 20/200 and you hit + Key Out when credits/points are at least 100 but less than 200, tickets will + be dispensed continuously until you insert another coin - game bug or MAME + bug? + + Payout rate in unkch3 seems to be set with DSW1-3 (Punti) directly. This game + also seems to be able to easily get into a state where tickets are dispensed + continuously. Maybe there's something more complicated about the ticket + dispenser hookup that we're missing? + + In unkch4 the payout rate is set with DSW1-3 (Punti) - 100 for Ticket and 10 + for Gettoni. It's also nice enough to let you keep the remainder if you hit + Key Out when your credits/points aren't a multiple of 100. This is the only + set that doesn't have issues with dispensing tickets continuously + unkch3 has a handy input test mode. To access it, first enable it with DSW4-5, then hold the Settings button (9) during boot. @@ -972,16 +993,22 @@ WRITE8_MEMBER(unkch_state::coincount_w) { /* 7654 3210 + ---- --x- Payout counter (rate set with DIP switches) ---- -x-- Credit counter (1 pulse/10 credits) ---- x--- Key In counter - xxxx --xx Unknown + --xx ---- used for something during ticket dispensing + x--- ---- Ticket Dispenser Motor + -x-- ---x unused/unknown */ + + m_ticket_dispenser->write(space, offset, data & 0x80); + coin_counter_w(machine(), 0, data & 0x04); /* Credit counter */ coin_counter_w(machine(), 1, data & 0x08); /* Key In counter */ + coin_counter_w(machine(), 2, data & 0x02); /* payout counter */ - if (data & 0xf3) - popmessage("coin counters: %02x", data); + //popmessage("coin counters: %02x", data); } WRITE8_MEMBER(unkch_state::unkcm_0x02_w) @@ -4763,9 +4790,7 @@ static INPUT_PORTS_START( unkch_controls ) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) /* Trips "call attendant" state if activated while credited - something to do with hopper out? */ PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("tickets", ticket_dispenser_device, line_r) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) @@ -4791,9 +4816,9 @@ static INPUT_PORTS_START( unkch ) PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x04, "Ticket" ) PORT_DIPSETTING( 0x00, "Gettoni" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Ticket Dispenser" ) PORT_DIPLOCATION("DSW1:4") /* OK */ + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) @@ -4836,15 +4861,15 @@ static INPUT_PORTS_START( unkch ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ + PORT_DIPNAME( 0x03, 0x00, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) PORT_DIPSETTING( 0x02, "1 Coin/20 Credits" ) PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" ) - PORT_DIPNAME( 0x04, 0x04, "Gettoni/Ticket" ) PORT_DIPLOCATION("DSW3:3") /* OK */ - PORT_DIPSETTING( 0x04, "20/200" ) + PORT_DIPNAME( 0x04, 0x00, "Gettoni/Ticket" ) PORT_DIPLOCATION("DSW3:3") /* OK */ PORT_DIPSETTING( 0x00, "10/100" ) - PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ + PORT_DIPSETTING( 0x04, "20/200" ) + PORT_DIPNAME( 0x18, 0x00, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ PORT_DIPSETTING( 0x00, "1 Coin/25 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*5 */ PORT_DIPSETTING( 0x08, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*10 */ PORT_DIPSETTING( 0x10, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 5*20 */ @@ -4861,13 +4886,13 @@ static INPUT_PORTS_START( unkch ) PORT_DIPSETTING( 0x08, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ PORT_DIPSETTING( 0x10, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ PORT_DIPSETTING( 0x18, "1 Coin/2,500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*50 */ - PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x00, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x00, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x80, 0x80, "Max Bet Type" ) PORT_DIPLOCATION("DSW3:8") /* OK */ + PORT_DIPNAME( 0x80, 0x00, "Max Bet Type" ) PORT_DIPLOCATION("DSW3:8") /* OK */ PORT_DIPSETTING( 0x80, "Total" ) /* Max Bet applies to total of BET-A and BET-B unless set to 64 */ PORT_DIPSETTING( 0x00, "Individual" ) /* Max Bet applies individually to each of BET-A and BET-B */ @@ -4909,9 +4934,9 @@ static INPUT_PORTS_START( unkch3 ) PORT_DIPNAME( 0x04, 0x04, "Punti Unit" ) PORT_DIPLOCATION("DSW1:3") /* OK */ PORT_DIPSETTING( 0x00, "500" ) PORT_DIPSETTING( 0x04, "1000" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Ticket Dispenser" ) PORT_DIPLOCATION("DSW1:4") /* OK */ + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) @@ -4954,28 +4979,28 @@ static INPUT_PORTS_START( unkch3 ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:1") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:2") + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:4") + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:5") + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPNAME( 0x20, 0x00, "Coin B Enable" ) PORT_DIPLOCATION("DSW3:6") /* OK */ PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPNAME( 0x40, 0x00, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x80, 0x80, "Max Bet Type" ) PORT_DIPLOCATION("DSW3:8") /* OK */ + PORT_DIPNAME( 0x80, 0x00, "Max Bet Type" ) PORT_DIPLOCATION("DSW3:8") /* OK */ PORT_DIPSETTING( 0x80, "Total" ) /* Max Bet applies to total of BET-A and BET-B unless set to 64 */ PORT_DIPSETTING( 0x00, "Individual" ) /* Max Bet applies individually to each of BET-A and BET-B */ @@ -5001,7 +5026,7 @@ static INPUT_PORTS_START( unkch3 ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Cherry/Bell Bonus" ) PORT_DIPLOCATION("DSW4:8") /* OK */ + PORT_DIPNAME( 0x80, 0x80, "Cherry/Bell Bonus" ) PORT_DIPLOCATION("DSW4:8") /* OK */ PORT_DIPSETTING( 0x80, "x6 / x3" ) PORT_DIPSETTING( 0x00, "x9 / x5" ) INPUT_PORTS_END @@ -5023,11 +5048,11 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x01, "Mid 2" ) PORT_DIPSETTING( 0x00, "Hard" ) PORT_DIPNAME( 0x04, 0x04, "Punti" ) PORT_DIPLOCATION("DSW1:3") /* OK */ - PORT_DIPSETTING( 0x04, "Ticket" ) - PORT_DIPSETTING( 0x00, "Gettoni" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x04, "Ticket" ) /* payout rate 100 */ + PORT_DIPSETTING( 0x00, "Gettoni" ) /* payout rate 10 */ + PORT_DIPNAME( 0x08, 0x08, "Ticket Dispenser" ) PORT_DIPLOCATION("DSW1:4") /* OK */ + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) PORT_DIPNAME( 0x10, 0x10, "Reel Speed" ) PORT_DIPLOCATION("DSW1:5") /* OK */ PORT_DIPSETTING( 0x10, DEF_STR( Low ) ) PORT_DIPSETTING( 0x00, DEF_STR( High ) ) @@ -5067,50 +5092,41 @@ static INPUT_PORTS_START( unkch4 ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x03, 0x03, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2") /* OK */ - PORT_DIPSETTING( 0x00, DEF_STR( 1C_8C ) ) - PORT_DIPSETTING( 0x01, "1 Coin/10 Credits" ) - PORT_DIPSETTING( 0x02, "1 Coin/20 Credits" ) - PORT_DIPSETTING( 0x03, "1 Coin/50 Credits" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x18, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ - PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*5 */ - PORT_DIPSETTING( 0x08, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ - PORT_DIPSETTING( 0x10, "1 Coin/160 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*20 */ - PORT_DIPSETTING( 0x18, "1 Coin/400 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*50 */ - PORT_DIPSETTING( 0x00, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*5 */ - PORT_DIPSETTING( 0x08, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*10 */ - PORT_DIPSETTING( 0x10, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*20 */ - PORT_DIPSETTING( 0x18, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*50 */ - PORT_DIPSETTING( 0x00, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*5 */ - PORT_DIPSETTING( 0x08, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*10 */ - PORT_DIPSETTING( 0x10, "1 Coin/400 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*20 */ - PORT_DIPSETTING( 0x18, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*50 */ - PORT_DIPSETTING( 0x00, "1 Coin/250 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*5 */ - PORT_DIPSETTING( 0x08, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ - PORT_DIPSETTING( 0x10, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ - PORT_DIPSETTING( 0x18, "1 Coin/2,500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*50 */ - PORT_DIPNAME( 0x20, 0x20, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:6") /* OK */ - PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*5 */ - PORT_DIPSETTING( 0x20, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ - PORT_DIPSETTING( 0x00, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*5 */ - PORT_DIPSETTING( 0x20, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*10 */ - PORT_DIPSETTING( 0x00, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*5 */ - PORT_DIPSETTING( 0x20, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*10 */ - PORT_DIPSETTING( 0x00, "1 Coin/250 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*5 */ - PORT_DIPSETTING( 0x20, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ - PORT_DIPNAME( 0x40, 0x40, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ - PORT_DIPSETTING( 0x00, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*10 */ - PORT_DIPSETTING( 0x40, "1 Coin/160 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x00) /* 8*20 */ - PORT_DIPSETTING( 0x00, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*10 */ - PORT_DIPSETTING( 0x40, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x01) /* 10*20 */ - PORT_DIPSETTING( 0x00, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*10 */ - PORT_DIPSETTING( 0x40, "1 Coin/400 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x02) /* 20*20 */ - PORT_DIPSETTING( 0x00, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*10 */ - PORT_DIPSETTING( 0x40, "1 Coin/1,000 Credits" ) PORT_CONDITION("DSW3",0x03,EQUALS,0x03) /* 50*20 */ - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPNAME( 0x07, 0x00, "Coin A Rate" ) PORT_DIPLOCATION("DSW3:1,2,3") /* OK */ + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_8C ) ) + PORT_DIPSETTING( 0x05, "1 Coin/10 Credits" ) + PORT_DIPSETTING( 0x06, "1 Coin/20 Credits" ) + PORT_DIPSETTING( 0x07, "1 Coin/50 Credits" ) + PORT_DIPNAME( 0x18, 0x00, "Key In Rate" ) PORT_DIPLOCATION("DSW3:4,5") /* OK */ + PORT_DIPSETTING( 0x00, "5x Coin A" ) + PORT_DIPSETTING( 0x08, "10x Coin A" ) + PORT_DIPSETTING( 0x10, "20x Coin A" ) + PORT_DIPSETTING( 0x18, "50x Coin A" ) + PORT_DIPNAME( 0x20, 0x00, "Coin C Rate" ) PORT_DIPLOCATION("DSW3:6") /* OK */ + PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_CONDITION("DSW3",0x07,EQUALS,0x00) /* 1*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/10 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x00) /* 1*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x01) /* 2*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/20 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x01) /* 2*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/20 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x02) /* 4*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x02) /* 4*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/25 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x03) /* 5*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x03) /* 5*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/40 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x04) /* 8*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/80 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x04) /* 8*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/50 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x05) /* 10*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x05) /* 10*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/100 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x06) /* 20*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/200 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x06) /* 20*10 */ + PORT_DIPSETTING( 0x00, "1 Coin/250 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x07) /* 50*5 */ + PORT_DIPSETTING( 0x20, "1 Coin/500 Credits" ) PORT_CONDITION("DSW3",0x07,EQUALS,0x07) /* 50*10 */ + PORT_DIPNAME( 0x40, 0x00, "Coin B Rate" ) PORT_DIPLOCATION("DSW3:7") /* OK */ + PORT_DIPSETTING( 0x00, "1x Coin C" ) + PORT_DIPSETTING( 0x40, "2x Coin C" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW3:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -7724,6 +7740,9 @@ static MACHINE_CONFIG_START( unkch, unkch_state ) MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW1")) MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW2")) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + /* payout hardware */ + MCFG_TICKET_DISPENSER_ADD("tickets", attotime::from_msec(200), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW) MACHINE_CONFIG_END diff --git a/src/mame/includes/goldstar.h b/src/mame/includes/goldstar.h index 929b41aaef0..db8edbbb34e 100644 --- a/src/mame/includes/goldstar.h +++ b/src/mame/includes/goldstar.h @@ -1,3 +1,8 @@ +#include "emu.h" + +#include "machine/ticket.h" + + class goldstar_state : public driver_device { public: @@ -250,7 +255,8 @@ public: goldstar_state(mconfig, type, tag), m_reel1_attrram(*this, "reel1_attrram"), m_reel2_attrram(*this, "reel2_attrram"), - m_reel3_attrram(*this, "reel3_attrram") + m_reel3_attrram(*this, "reel3_attrram"), + m_ticket_dispenser(*this, "tickets") { } @@ -283,4 +289,6 @@ private: UINT8 m_vblank_irq_enable; UINT8 m_vidreg; + + optional_device m_ticket_dispenser; }; From f31a7d3811c2d52fd366008320e20426f0f45db0 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 17:52:27 +0000 Subject: [PATCH 132/201] use ramdac for palette on twinsa set, improve colours in spider.. not really sure how the 'sprites' work yet, appears to be the same as ttchamp and I never figured that out either --- src/mame/drivers/twins.c | 183 ++++++++++++++++++++++----------------- 1 file changed, 105 insertions(+), 78 deletions(-) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index 0158cae5a38..9e875a37d40 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -28,7 +28,7 @@ Notes: -seems a similar board to hotblocks +seems a similar board to Hot Blocks same TPC1020 AFN-084C chip same 24c02 eeprom @@ -46,12 +46,19 @@ takes a long time to boot (eeprom?) Electronic Devices was printed on rom labels 1994 date string is in ROM +Spider seems to have some kind of sprites / blitter that works the same as as Table Tennis Champ (ttchamp.c) +Spider must also have some ROM banking, or the blitter must be able to access non-cpu visible space, the title logo is at 0x00000 in ROM + +Twins (set 2) is significantly changed hardware. + + */ #include "emu.h" #include "cpu/nec/nec.h" #include "sound/ay8910.h" - +#include "machine/i2cmem.h" +#include "video/ramdac.h" class twins_state : public driver_device { @@ -61,23 +68,26 @@ public: m_maincpu(*this, "maincpu"), m_videoram(*this, "videoram"), m_paletteram(*this, "paletteram"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_i2cmem(*this, "i2cmem") + { } required_device m_maincpu; required_shared_ptr m_videoram; - required_shared_ptr m_paletteram; + optional_shared_ptr m_paletteram; required_device m_palette; + optional_device m_i2cmem; UINT16 m_paloff; DECLARE_READ16_MEMBER(twins_port4_r); DECLARE_WRITE16_MEMBER(twins_port4_w); - DECLARE_WRITE16_MEMBER(port6_pal0_w); + DECLARE_WRITE16_MEMBER(twins_pal_w); + DECLARE_WRITE16_MEMBER(spider_pal_w); DECLARE_WRITE16_MEMBER(porte_paloff0_w); - DECLARE_WRITE16_MEMBER(twinsa_port4_w); - DECLARE_READ16_MEMBER(twinsa_unk_r); + DECLARE_WRITE16_MEMBER(spider_paloff0_w); + DECLARE_VIDEO_START(twins); DECLARE_VIDEO_START(twinsa); UINT32 screen_update_twins(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - UINT32 screen_update_twinsa(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); }; @@ -85,22 +95,50 @@ public: /* port 4 is eeprom */ READ16_MEMBER(twins_state::twins_port4_r) { - return 0xffff; +// doesn't work?? +// printf("%08x: twins_port4_r %04x\n", space.device().safe_pc(), mem_mask); +// return m_i2cmem->read_sda();// | 0xfffe; + + return 0x0001; } WRITE16_MEMBER(twins_state::twins_port4_w) { +// printf("%08x: twins_port4_w %04x %04x\n", space.device().safe_pc(), data, mem_mask); + int i2c_clk = BIT(data, 1); + int i2c_mem = BIT(data, 0); + m_i2cmem->write_scl(i2c_clk); + m_i2cmem->write_sda(i2c_mem); } -WRITE16_MEMBER(twins_state::port6_pal0_w) +WRITE16_MEMBER(twins_state::twins_pal_w) { COMBINE_DATA(&m_paletteram[m_paloff]); + + { + int dat,r,g,b; + dat = m_paletteram[m_paloff]; + + r = dat & 0x1f; + r = BITSWAP8(r,7,6,5,0,1,2,3,4); + + g = (dat>>5) & 0x1f; + g = BITSWAP8(g,7,6,5,0,1,2,3,4); + + b = (dat>>10) & 0x1f; + b = BITSWAP8(b,7,6,5,0,1,2,3,4); + + m_palette->set_pen_color(m_paloff, pal5bit(r),pal5bit(g),pal5bit(b)); + + } + m_paloff = (m_paloff + 1) & 0xff; } /* ??? weird ..*/ WRITE16_MEMBER(twins_state::porte_paloff0_w) { +// printf("porte_paloff0_w %04x\n", data); m_paloff = 0; } @@ -114,7 +152,7 @@ static ADDRESS_MAP_START( twins_io, AS_IO, 16, twins_state ) AM_RANGE(0x0000, 0x0003) AM_DEVWRITE8("aysnd", ay8910_device, address_data_w, 0x00ff) AM_RANGE(0x0002, 0x0003) AM_DEVREAD8("aysnd", ay8910_device, data_r, 0x00ff) AM_RANGE(0x0004, 0x0005) AM_READWRITE(twins_port4_r, twins_port4_w) - AM_RANGE(0x0006, 0x0007) AM_WRITE(port6_pal0_w) AM_SHARE("paletteram") + AM_RANGE(0x0006, 0x0007) AM_WRITE(twins_pal_w) AM_SHARE("paletteram") AM_RANGE(0x000e, 0x000f) AM_WRITE(porte_paloff0_w) ADDRESS_MAP_END @@ -127,28 +165,10 @@ VIDEO_START_MEMBER(twins_state,twins) UINT32 twins_state::screen_update_twins(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int y,x,count; - int i; static const int xxx=320,yyy=204; bitmap.fill(m_palette->black_pen()); - for (i=0;i<0x100;i++) - { - int dat,r,g,b; - dat = m_paletteram[i]; - - r = dat & 0x1f; - r = BITSWAP8(r,7,6,5,0,1,2,3,4); - - g = (dat>>5) & 0x1f; - g = BITSWAP8(g,7,6,5,0,1,2,3,4); - - b = (dat>>10) & 0x1f; - b = BITSWAP8(b,7,6,5,0,1,2,3,4); - - m_palette->set_pen_color(i, pal5bit(r),pal5bit(g),pal5bit(b)); - } - count=0; UINT8 *videoram = reinterpret_cast(m_videoram.target()); for (y=0;yblack_pen()); - - for (i=0;i<0x1000-3;i+=3) - { - int r,g,b; - r = m_paletteram[i]; - g = m_paletteram[i+1]; - b = m_paletteram[i+2]; - - m_palette->set_pen_color(i/3, pal6bit(r), pal6bit(g), pal6bit(b)); - } - - count=0; - UINT8 *videoram = reinterpret_cast(m_videoram.target()); - for (y=0;y>5) & 0x1f; + b = (dat>>10) & 0x1f; + m_palette->set_pen_color(m_paloff-1, pal5bit(r),pal5bit(g),pal5bit(b)); + } + else + { + // printf("first palette write %04x\n", data); + } + + m_paloff++; + + if (m_paloff == 0x101) + m_paloff = 0; +} + + +WRITE16_MEMBER(twins_state::spider_paloff0_w) // probably not.. +{ +// printf("porte_paloff0_w %04x\n", data); +// m_paloff = 0; +} + static ADDRESS_MAP_START( spider_io, AS_IO, 16, twins_state ) AM_RANGE(0x0000, 0x0003) AM_DEVWRITE8("aysnd", ay8910_device, address_data_w, 0x00ff) AM_RANGE(0x0002, 0x0003) AM_DEVREAD8("aysnd", ay8910_device, data_r, 0x00ff) AM_RANGE(0x0004, 0x0005) AM_READWRITE(twins_port4_r, twins_port4_w) - AM_RANGE(0x0008, 0x0009) AM_WRITE(port6_pal0_w) AM_SHARE("paletteram") - AM_RANGE(0x0010, 0x0011) AM_WRITE(porte_paloff0_w) + AM_RANGE(0x0008, 0x0009) AM_WRITE(spider_pal_w) AM_SHARE("paletteram") + AM_RANGE(0x0010, 0x0011) AM_WRITE(spider_paloff0_w) ADDRESS_MAP_END + + + static MACHINE_CONFIG_START( spider, twins_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", V30, 8000000) @@ -334,6 +358,8 @@ static MACHINE_CONFIG_START( spider, twins_state ) MCFG_PALETTE_ADD("palette", 0x100) MCFG_VIDEO_START_OVERRIDE(twins_state,twins) + + MCFG_24C02_ADD("i2cmem") /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -341,6 +367,7 @@ static MACHINE_CONFIG_START( spider, twins_state ) MCFG_SOUND_ADD("aysnd", AY8910, 2000000) MCFG_AY8910_PORT_A_READ_CB(IOPORT("P1")) MCFG_AY8910_PORT_B_READ_CB(IOPORT("P2")) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END From 033c15f9693bd1dcffe77b1807ced2d414c63002 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 21 Mar 2015 20:28:06 +0100 Subject: [PATCH 133/201] fix REDD/SEDD opcodes --- src/emu/cpu/hmcs40/hmcs40.c | 4 ++-- src/emu/cpu/hmcs40/hmcs40d.c | 2 +- src/emu/cpu/hmcs40/hmcs40op.inc | 4 ++-- src/mess/drivers/hh_hmcs40.c | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40.c b/src/emu/cpu/hmcs40/hmcs40.c index f80852283df..c279f07aec0 100644 --- a/src/emu/cpu/hmcs40/hmcs40.c +++ b/src/emu/cpu/hmcs40/hmcs40.c @@ -315,7 +315,7 @@ void hmcs40_cpu_device::device_reset() UINT8 hmcs40_cpu_device::read_r(int index) { index &= 7; - UINT8 inp = 0xf; + UINT8 inp = 0; switch (index) { @@ -575,7 +575,7 @@ void hmcs40_cpu_device::execute_run() // fetch next opcode debugger_instruction_hook(this, m_pc); m_op = m_program->read_word(m_pc << 1) & 0x3ff; - m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for 4-bit immediate param (except for XAMR) + m_i = BITSWAP8(m_op,7,6,5,4,0,1,2,3) & 0xf; // reversed bit-order for 4-bit immediate param (except for XAMR, REDD, SEDD) increment_pc(); // handle opcode diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 8ba142510e5..9629df6067b 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -55,7 +55,7 @@ static const INT8 s_bits[] = 2, 2, 2, 6, 6, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0, - 0, 0, 0, -4, -4, 3, 3, 3, 3, 3, + 0, 0, 0, 4, 4, 3, 3, 3, 3, 3, 0, 0 }; diff --git a/src/emu/cpu/hmcs40/hmcs40op.inc b/src/emu/cpu/hmcs40/hmcs40op.inc index 74c8b5a1efa..9732d86f53f 100644 --- a/src/emu/cpu/hmcs40/hmcs40op.inc +++ b/src/emu/cpu/hmcs40/hmcs40op.inc @@ -618,13 +618,13 @@ void hmcs40_cpu_device::op_td() void hmcs40_cpu_device::op_sedd() { // SEDD n: Set Discrete I/O Latch Direct - write_d(m_i, 1); + write_d(m_op & 0xf, 1); } void hmcs40_cpu_device::op_redd() { // REDD n: Reset Discrete I/O Latch Direct - write_d(m_i, 0); + write_d(m_op & 0xf, 0); } void hmcs40_cpu_device::op_lar() diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 37243f834b0..4bdbd69b069 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -694,8 +694,8 @@ static INPUT_PORTS_START( epacman2 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // " PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Skill Control") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Demo Light Test") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Skill Control") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Demo Light Test") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) From 202cc2f7ec2be2759f74fbc32362ce2088cdfeec Mon Sep 17 00:00:00 2001 From: Luca Elia Date: Sat, 21 Mar 2015 20:29:16 +0100 Subject: [PATCH 134/201] New games added or promoted from NOT_WORKING status --------------------------------------------------- Castle Of Dracula [Caius, The Dumping Union, Luca Elia] --- src/mame/drivers/dynax.c | 211 +++++++++++++++++++++++++++++++++++++- src/mame/includes/dynax.h | 4 + src/mame/mame.lst | 1 + src/mame/video/dynax.c | 70 ++++++++++++- 4 files changed, 283 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/dynax.c b/src/mame/drivers/dynax.c index 4676ba1983a..16063eeda08 100644 --- a/src/mame/drivers/dynax.c +++ b/src/mame/drivers/dynax.c @@ -5,7 +5,7 @@ Some Dynax games using the second version of their blitter driver by Luca Elia and Nicola Salmoria CPU: Z80 or TLCS90 -Sound: [AY] + [YM] + [YM] + [M5205] +Sound: [AY] + [YM] + [YM] + [M5205] / M6295 VDP: HD46505SP (6845) (CRT controller) Custom: TC17G032AP-0246 (blitter) @@ -37,8 +37,9 @@ Year + Game Main Board Sub Board CPU Sound 91 Mj Ougon No Pai D6209038L1-0 TLCS AY8910 YM2413 RAM Undumped TMP91P640 Code, Battery 92 Quiz TV Gassyuukoku D5512068L1-2 D6410288L-1 Z80 AY8912 YM2413 M5205 RAM 92 Hanafuda Hana Tengoku D6502208L1 D6107068L-1 Z80 AY8910 YM2413 M6242 RAM +94 Castle Of Dracula Z80 M6295 PROM Blitter is an FPGA 94 Mj Reach (bootleg) bootleg TLCS AY8910 YM2413 M6242 PROM Battery -94 Maya Z80 YM2203 PROM +94 Maya Z80 YM2203 PROM Blitter is an FPGA 96 Mj Raijinhai DX D10010318L1 D10502168 TLCS AY8910 M6242 PROM Undumped TMP91P640 Code, Battery 9? Inca Z80 YM2203 PROM --------------------------------------------------------------------------------------------------------------------- @@ -440,6 +441,11 @@ WRITE8_MEMBER(dynax_state::yarunara_layer_half2_w) hnoridur_layer_half2_w(space, 0, data >> 1); } +static ADDRESS_MAP_START( cdracula_mem_map, AS_PROGRAM, 8, dynax_state ) + AM_RANGE( 0x0000, 0xbfff ) AM_ROM + AM_RANGE( 0xc000, 0xffff ) AM_RAM +ADDRESS_MAP_END + static ADDRESS_MAP_START( sprtmtch_mem_map, AS_PROGRAM, 8, dynax_state ) AM_RANGE( 0x0000, 0x6fff ) AM_ROM AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram") @@ -1539,6 +1545,48 @@ static ADDRESS_MAP_START( gekisha_io_map, AS_IO, 8, dynax_state ) ADDRESS_MAP_END +/*************************************************************************** + Castle Of Dracula +***************************************************************************/ + +WRITE8_MEMBER(dynax_state::cdracula_sound_rombank_w) +{ +// logerror("%s: sound bank = %02x\n", machine().describe_context(), data); + + int num_banks = memregion("oki")->bytes() / 0x40000; + if (data < num_banks) + m_oki->set_bank_base(data * 0x40000); + else + logerror("%s: warning, invalid sound bank = %02x\n", machine().describe_context(), data); +} + +static ADDRESS_MAP_START( cdracula_io_map, AS_IO, 8, dynax_state ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE( 0x01, 0x07 ) AM_WRITE(cdracula_blitter_rev2_w) // Blitter + Destination Layers + AM_RANGE( 0x10, 0x10 ) AM_DEVREADWRITE("oki", okim6295_device, read, write) + AM_RANGE( 0x11, 0x11 ) AM_NOP // unpopulated oki +// AM_RANGE( 0x12, 0x12 ) AM_WRITENOP // CRT Controller +// AM_RANGE( 0x13, 0x13 ) AM_WRITENOP // CRT Controller + AM_RANGE( 0x20, 0x20 ) AM_READ_PORT("P1") // P1 + AM_RANGE( 0x21, 0x21 ) AM_READ_PORT("P2") // P2 + AM_RANGE( 0x22, 0x22 ) AM_READ_PORT("COINS") // Coins + AM_RANGE( 0x30, 0x30 ) AM_WRITE(dynax_layer_enable_w) // Layers Enable +// AM_RANGE( 0x31, 0x31 ) AM_WRITE(dynax_rombank_w) // BANK ROM Select + AM_RANGE( 0x32, 0x32 ) AM_WRITE(dynax_blit_pen_w) // Destination Pen + AM_RANGE( 0x33, 0x33 ) AM_WRITE(dynax_blit_flags_w) // Flags + Do Blit + AM_RANGE( 0x34, 0x34 ) AM_WRITE(dynax_blit_palette01_w) // Layers Palettes (Low Bits) + AM_RANGE( 0x35, 0x35 ) AM_WRITE(dynax_blit_palette23_w) // + AM_RANGE( 0x36, 0x36 ) AM_WRITE(dynax_blit_backpen_w) // Background Color + AM_RANGE( 0x37, 0x37 ) AM_WRITE(dynax_vblank_ack_w) // VBlank IRQ Ack + AM_RANGE( 0x41, 0x41 ) AM_WRITE(dynax_flipscreen_w) // Flip Screen + AM_RANGE( 0x44, 0x44 ) AM_WRITE(jantouki_blitter_ack_w) // Blitter IRQ Ack + AM_RANGE( 0x45, 0x45 ) AM_WRITE(dynax_blit_palbank_w) // Layers Palettes (High Bit) + AM_RANGE( 0x60, 0x60 ) AM_READ_PORT("DSW2") + AM_RANGE( 0x61, 0x61 ) AM_READ_PORT("DSW1") + AM_RANGE( 0x6b, 0x6b ) AM_WRITE(cdracula_sound_rombank_w) // OKI Bank +ADDRESS_MAP_END + + /*************************************************************************** @@ -1963,6 +2011,85 @@ static INPUT_PORTS_START( HANAFUDA_KEYS_BET_ALT ) INPUT_PORTS_END #endif +static INPUT_PORTS_START( cdracula ) + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // same as button1 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) + + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // same as button1 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) + + PORT_START("COINS") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW1") // port $61 -> c217 + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Difficulty ) ) PORT_DIPLOCATION( "SW1:1,2" ) + PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) // 44 + PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) // 47 + PORT_DIPSETTING( 0x01, DEF_STR( Hard ) ) // 4a + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // 4d + PORT_DIPNAME( 0x0c, 0x08, "Time" ) PORT_DIPLOCATION( "SW1:3,4" ) + PORT_DIPSETTING( 0x0c, "120 sec" ) + PORT_DIPSETTING( 0x08, "90 sec" ) + PORT_DIPSETTING( 0x04, "60 sec" ) + PORT_DIPSETTING( 0x00, "60 sec (duplicate)" ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) ) PORT_DIPLOCATION( "SW1:5" ) + PORT_DIPSETTING( 0x10, "3" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x20, 0x20, "Max Lives" ) PORT_DIPLOCATION( "SW1:6" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPNAME( 0x40, 0x40, "Unknown 1-7" ) PORT_DIPLOCATION( "SW1:7" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) PORT_DIPLOCATION( "SW1:8" ) + + PORT_START("DSW2") // port $60 -> c216 + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION( "SW2:1,2" ) + PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPNAME( 0x04, 0x04, "Unknown 2-3" ) PORT_DIPLOCATION( "SW2:3" ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Reset Tiles After Miss" ) PORT_DIPLOCATION( "SW2:4" ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Unknown 2-5" ) PORT_DIPLOCATION( "SW2:5" ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION( "SW2:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, "Sound Test" ) PORT_DIPLOCATION( "SW2:7" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Graphics Test" ) PORT_DIPLOCATION( "SW2:8" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + static INPUT_PORTS_START( hanamai ) PORT_START("DSW0") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) @@ -4212,6 +4339,45 @@ MACHINE_START_MEMBER(dynax_state,hnoridur) MACHINE_START_CALL_MEMBER(dynax); } +/*************************************************************************** + Castle Of Dracula +***************************************************************************/ + +static MACHINE_CONFIG_START( cdracula, dynax_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", Z80, XTAL_4MHz) + MCFG_CPU_PROGRAM_MAP(cdracula_mem_map) + MCFG_CPU_IO_MAP(cdracula_io_map) + MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + + MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax) + MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) + +// MCFG_NVRAM_ADD_0FILL("nvram") // no battery + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(512, 256) + MCFG_SCREEN_VISIBLE_AREA(16, 512-16-1, 16, 256-1) + MCFG_SCREEN_UPDATE_DRIVER(dynax_state, screen_update_cdracula) + MCFG_SCREEN_PALETTE("palette") + + MCFG_PALETTE_ADD("palette", 512) + + MCFG_PALETTE_INIT_OWNER(dynax_state,sprtmtch) // static palette + MCFG_VIDEO_START_OVERRIDE(dynax_state,hanamai) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_OKIM6295_ADD("oki", XTAL_4MHz / 4, OKIM6295_PIN7_HIGH) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) +MACHINE_CONFIG_END + + /*************************************************************************** Hana no Mai ***************************************************************************/ @@ -4862,6 +5028,46 @@ MACHINE_CONFIG_END ***************************************************************************/ +/*************************************************************************** + +Castle Of Dracula +1994 Y.S.E. + +Not a Dynax board: + +GoldStar Z8400A PS (4 MHz 40-pin plastic DIP) +GoldStar GM68B45S +TI TPC1020AFN-084C +OKI M6295 (second OKI spot is unpopulated) +2 x DSW8, 28-way connector +PAL16L8ACN +4 MHz & 21.47727 MHz XTALs + +***************************************************************************/ + +ROM_START( cdracula ) + ROM_REGION( 0x10000, "maincpu", 0 ) // Z80 Code + ROM_LOAD( "escape.u202", 0x000000, 0x10000, CRC(92ceb689) SHA1(1b5d6cd51fc961f1b9a7b99d9ba48da8ea2e503b) ) + + ROM_REGION( 0xc0000, "gfx1", 0 ) // blitter data + ROM_LOAD( "escape.u214", 0x00000, 0x40000, CRC(52c2f3bc) SHA1(764fb447d749c1b83d2bb6bcd517949a1cd76593) ) + ROM_LOAD( "escape.u212", 0x40000, 0x40000, CRC(df536e91) SHA1(2c988e7793b2665d8ebb12a8f80a9aefdd3ed1dd) ) + ROM_LOAD( "escape.u210", 0x80000, 0x40000, CRC(d3f5bac2) SHA1(d81ac3ca159985b0a79d02ebe707b46fdeaefe64) ) + + ROM_REGION( 0xc0000, "oki", 0 ) + ROM_LOAD( "escape.ua", 0x00000, 0x20000, CRC(2f25be27) SHA1(9b7653ae9ebfd4a301d786c5c731478774e5171d) ) + ROM_LOAD( "escape.ub", 0x20000, 0x20000, CRC(536a8dd0) SHA1(1ec226b0cd4d1320cdfce0a447ea0e481b85a802) ) + ROM_LOAD( "escape.uc", 0x40000, 0x20000, CRC(393fa285) SHA1(654ab2fb92efa28f65bcc7c70a9fae2e43657309) ) + ROM_LOAD( "escape.ud", 0x60000, 0x20000, CRC(eff474af) SHA1(7ab1f0079d051c9b0c4aa566a4d92032c7060d8e) ) + ROM_LOAD( "escape.ue", 0x80000, 0x20000, CRC(0f9dc93b) SHA1(a3b33795cf07882ecc80d9afa5174e771ee0df08) ) + ROM_FILL( 0xa0000, 0x20000, 0 ) + + ROM_REGION( 0x400, "proms", 0 ) // Color PROMs + ROM_LOAD( "82s147an.u26", 0x000, 0x200, CRC(1a3fe146) SHA1(7d1b4dd66fc95ea5ed584f0bb571cca09fe519b0) ) // FIXED BITS (00xxxxxx) + ROM_LOAD( "82s147an.u25", 0x200, 0x200, CRC(31791990) SHA1(526c0d516f290dc6cc2ec76d9bcec8c900e2ae10) ) +ROM_END + + /*************************************************************************** Hana no Mai @@ -7118,5 +7324,6 @@ GAME( 1991, tenkaie, tenkai, tenkai, tenkai, driver_device, 0, ROT GAME( 1991, ougonpai, 0, tenkai, tenkai, driver_device, 0, ROT0, "Dynax", "Mahjong Ougon No Pai", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1991, ougonpaib,ougonpai, tenkai, tenkai, driver_device, 0, ROT0, "bootleg", "Mahjong Ougon No Pai (bootleg)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1994, mjreach, 0, tenkai, mjreach, dynax_state, mjreach, ROT0, "bootleg / Dynax", "Mahjong Reach (bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1994, cdracula, 0, cdracula, cdracula, driver_device, 0, ROT0, "Yun Sung (Escape license)","Castle Of Dracula", GAME_SUPPORTS_SAVE ) // not a dynax board GAME( 1995, shpeng, 0, sprtmtch, drgpunch, driver_device, 0, ROT0, "WSAC Systems?", "Sea Hunter Penguin", GAME_NO_COCKTAIL | GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) // not a dynax board. proms? GAME( 1996, majrjhdx, 0, majrjhdx, tenkai, driver_device, 0, ROT0, "Dynax", "Mahjong Raijinhai DX", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/dynax.h b/src/mame/includes/dynax.h index 45b87468847..45c74dde3f0 100644 --- a/src/mame/includes/dynax.h +++ b/src/mame/includes/dynax.h @@ -125,6 +125,7 @@ public: DECLARE_WRITE8_MEMBER(hanamai_keyboard_w); DECLARE_WRITE8_MEMBER(dynax_rombank_w); DECLARE_WRITE8_MEMBER(jantouki_sound_rombank_w); + DECLARE_WRITE8_MEMBER(cdracula_sound_rombank_w); DECLARE_WRITE8_MEMBER(hnoridur_rombank_w); DECLARE_WRITE8_MEMBER(hnoridur_palbank_w); DECLARE_WRITE8_MEMBER(hnoridur_palette_w); @@ -188,6 +189,7 @@ public: DECLARE_WRITE8_MEMBER(tenkai_blit_dest_w); DECLARE_WRITE8_MEMBER(mjembase_blit_dest_w); DECLARE_WRITE8_MEMBER(dynax_blit_backpen_w); + DECLARE_WRITE8_MEMBER(dynax_blit_flags_w); DECLARE_WRITE8_MEMBER(dynax_blit_palette01_w); DECLARE_WRITE8_MEMBER(tenkai_blit_palette01_w); DECLARE_WRITE8_MEMBER(dynax_blit_palette45_w); @@ -211,6 +213,7 @@ public: DECLARE_WRITE8_MEMBER(dynax_blit2_scroll_w); DECLARE_WRITE8_MEMBER(dynax_blitter_rev2_w); DECLARE_WRITE8_MEMBER(tenkai_blitter_rev2_w); + DECLARE_WRITE8_MEMBER(cdracula_blitter_rev2_w); DECLARE_WRITE8_MEMBER(jantouki_blitter_rev2_w); DECLARE_WRITE8_MEMBER(jantouki_blitter2_rev2_w); DECLARE_WRITE8_MEMBER(hanamai_priority_w); @@ -229,6 +232,7 @@ public: UINT32 screen_update_mjdialq2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_jantouki_top(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_jantouki_bottom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + UINT32 screen_update_cdracula(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(sprtmtch_vblank_interrupt); INTERRUPT_GEN_MEMBER(jantouki_vblank_interrupt); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 791b665c920..d9ef90e1fa2 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -9618,6 +9618,7 @@ tenkaie // 1991 Dynax ougonpai // 1991 Dynax ougonpaib // bootleg htengoku // 1992 Dynax +cdracula // 1994 Y.S.E. mjreach // 1994 Dynax mjdialq2 // "52" (c) 1991 Dynax yarunara // "55" Mahjong Yarunara 1991 Dynax diff --git a/src/mame/video/dynax.c b/src/mame/video/dynax.c index 7f3f8d3d0b4..86994063971 100644 --- a/src/mame/video/dynax.c +++ b/src/mame/video/dynax.c @@ -214,7 +214,7 @@ WRITE8_MEMBER(dynax_state::dynax_blit2_palbank_w) } -/* Which half of the layers to write two (interleaved games only) */ +/* Which half of the layers to write to (interleaved games only) */ WRITE8_MEMBER(dynax_state::hanamai_layer_half_w) { m_hanamai_layer_half = (~data) & 1; @@ -380,7 +380,15 @@ void dynax_state::blitter_plot_pixel( int layer, int mask, int x, int y, int pen } } +/* + Flags: + 7654 ---- - + ---- 3--- Rotation = SWAPXY + FLIPY + ---- -2-- - + ---- --1- 0 = Ignore the pens specified in ROM, draw everything with the pen supplied as parameter + ---- ---0 Clear +*/ int dynax_state::blitter_drawgfx( int layer, int mask, const char *gfx, int src, int pen, int x, int y, int wrap, int flags ) { UINT8 cmd; @@ -702,6 +710,7 @@ WRITE8_MEMBER(dynax_state::tenkai_blitter_rev2_w) } +// two blitters/screens WRITE8_MEMBER(dynax_state::jantouki_blitter_rev2_w) { switch (offset) @@ -730,6 +739,44 @@ WRITE8_MEMBER(dynax_state::jantouki_blitter2_rev2_w) } } +// first register does not trigger a blit, it sets the destination +WRITE8_MEMBER(dynax_state::cdracula_blitter_rev2_w) +{ + switch (offset) + { + case 0: + LOG(("DD=%02X ", data)); + + if (data & 0xf0) + { + hanamai_layer_half_w(space, offset, 0, mem_mask); + dynax_blit_dest_w(space, offset, data >> 4, mem_mask); + } + if (data & 0x0f) + { + hanamai_layer_half_w(space, offset, 1, mem_mask); + dynax_blit_dest_w(space, offset, data & 0x0f, mem_mask); + } + break; + case 1: m_blit_x = data; break; + case 2: m_blit_y = data; break; + case 3: m_blit_src = (m_blit_src & 0xffff00) | (data << 0); break; + case 4: m_blit_src = (m_blit_src & 0xff00ff) | (data << 8); break; + case 5: m_blit_src = (m_blit_src & 0x00ffff) | (data << 16); break; + case 6: dynax_blit_scroll_w(space, 0, data); break; + } +} + +WRITE8_MEMBER(dynax_state::dynax_blit_flags_w) +{ + LOG(("FLG=%02X ", data)); + + int flags = (data & 0x08) ? 0x08 : 0x00; + flags |= (data & 0x10) ? 0x02 : 0x00; + flags |= (data & 0x80) ? 0x01 : 0x00; + + dynax_blitter_start(flags); +} /*************************************************************************** @@ -1402,3 +1449,24 @@ UINT32 dynax_state::screen_update_mjdialq2(screen_device &screen, bitmap_ind16 & if (BIT(layers_ctrl, 1)) mjdialq2_copylayer(bitmap, cliprect, 1); return 0; } + + +UINT32 dynax_state::screen_update_cdracula(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int layers_ctrl = ~m_layer_enable; + + if (debug_viewer(bitmap,cliprect)) + return 0; + + layers_ctrl &= debug_mask(); + + bitmap.fill((m_blit_backpen & 0xff) + (m_blit_palbank & 1) * 256, cliprect); + + m_extra_scroll_y = -8; + + if (BIT(layers_ctrl, 3)) hanamai_copylayer(bitmap, cliprect, 3); + if (BIT(layers_ctrl, 1)) hanamai_copylayer(bitmap, cliprect, 1); + if (BIT(layers_ctrl, 2)) hanamai_copylayer(bitmap, cliprect, 2); + if (BIT(layers_ctrl, 0)) hanamai_copylayer(bitmap, cliprect, 0); + return 0; +} From 7d74f0117cff191455e3af31b050d7d2ec5986fd Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 21 Mar 2015 20:38:18 +0100 Subject: [PATCH 135/201] nw --- src/emu/cpu/hmcs40/hmcs40d.c | 138 ++++++++++++++++++----------------- 1 file changed, 70 insertions(+), 68 deletions(-) diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 9629df6067b..e16fa8ed618 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -87,96 +87,98 @@ static const INT16 s_next_pc[0x40] = }; +#define m mILL static const UINT8 hmcs40_mnemonic[0x400] = { -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /* 0x000 */ - mNOP, mXSP, mXSP, mXSP, mSEM, mSEM, mSEM, mSEM, mLAM, mLAM, mLAM, mLAM, mILL, mILL, mILL, mILL, - mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, mLMIIY, - mLBM, mLBM, mLBM, mLBM, mBLEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mAMC, mILL, mILL, mILL, mAM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLTA, mILL, mILL, mILL, + mNOP, mXSP, mXSP, mXSP, mSEM, mSEM, mSEM, mSEM, mLAM, mLAM, mLAM, mLAM, m, m, m, m, + mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY,mLMIIY, + mLBM, mLBM, mLBM, mLBM, mBLEM, m, m, m, m, m, m, m, m, m, m, m, + mAMC, m, m, m, mAM, m, m, m, m, m, m, m, mLTA, m, m, m, /* 0x040 */ - mLXA, mILL, mILL, mILL, mILL, mDAS, mDAA, mILL, mILL, mILL, mILL, mILL, mREC, mILL, mILL, mSEC, - mLYA, mILL, mILL, mILL, mIY, mILL, mILL, mILL, mAYY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mLBA, mILL, mILL, mILL, mIB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, + mLXA, m, m, m, m, mDAS, mDAA, m, m, m, m, m, mREC, m, m, mSEC, + mLYA, m, m, m, mIY, m, m, m, mAYY, m, m, m, m, m, m, m, + mLBA, m, m, m, mIB, m, m, m, m, m, m, m, m, m, m, m, + mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, mLAI, /* 0x080 */ - mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, - mSED, mILL, mILL, mILL, mTD, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mSEIF1, mSECF, mSEIF0, mILL, mSEIE, mSETF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, mAI, + mSED, m, m, m, mTD, m, m, m, m, m, m, m, m, m, m, m, + mSEIF1,mSECF, mSEIF0,m, mSEIE, mSETF, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x0c0 */ - mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, - mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, + mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, mLAR, m, m, m, m, m, m, m, m, + mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, mSEDD, + mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, mLBR, m, m, m, m, m, m, m, m, + mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, mXAMR, -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /* 0x100 */ - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mLMAIY, mLMAIY, mILL, mILL, mLMADY, mLMADY, mILL, mILL, mLAY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mOR, mILL, mILL, mILL, mANEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + mLMAIY,mLMAIY,m, m, mLMADY,mLMADY,m, m, mLAY, m, m, m, m, m, m, m, + mOR, m, m, m, mANEM, m, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x140 */ - mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, - mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, - mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, - mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, + mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, mLXI, + mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, mLYI, + mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, mLBI, + mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, mLTI, /* 0x180 */ - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mTIF1, mTI1, mTIF0, mTI0, mILL, mTTF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + mTIF1, mTI1, mTIF0, mTI0, m, mTTF, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x1c0 */ - mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, - mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, - mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, - mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, + mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, mBR, -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /* 0x200 */ - mTM, mTM, mTM, mTM, mREM, mREM, mREM, mREM, mXMA, mXMA, mXMA, mXMA, mILL, mILL, mILL, mILL, - mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, - mXMB, mXMB, mXMB, mXMB, mROTR, mROTL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mSMC, mILL, mILL, mILL, mALEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mLAT, mILL, mILL, mILL, + mTM, mTM, mTM, mTM, mREM, mREM, mREM, mREM, mXMA, mXMA, mXMA, mXMA, m, m, m, m, + mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, mMNEI, + mXMB, mXMB, mXMB, mXMB, mROTR, mROTL, m, m, m, m, m, m, m, m, m, m, + mSMC, m, m, m, mALEM, m, m, m, m, m, m, m, mLAT, m, m, m, /* 0x240 */ - mLASPX, mILL, mILL, mILL, mNEGA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mTC, - mLASPY, mILL, mILL, mILL, mDY, mILL, mILL, mILL, mSYY, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mLAB, mILL, mILL, mILL, mILL, mILL, mILL, mDB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, + mLASPX,m, m, m, mNEGA, m, m, m, m, m, m, m, m, m, m, mTC, + mLASPY,m, m, m, mDY, m, m, m, mSYY, m, m, m, m, m, m, m, + mLAB, m, m, m, m, m, m, mDB, m, m, m, m, m, m, m, m, + mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, mALEI, /* 0x280 */ - mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, - mRED, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mREIF1, mRECF, mREIF0, mILL, mREIE, mRETF, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, mYNEI, + mRED, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + mREIF1,mRECF, mREIF0,m, mREIE, mRETF, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x2c0 */ - mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, - mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, mLRA, m, m, m, m, m, m, m, m, + mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, mREDD, + mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, mLRB, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, -/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ /* 0x300 */ - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mCOMB, mILL, mILL, mILL, mBNEM, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + mCOMB, m, m, m, mBNEM, m, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x340 */ - mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, - mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, - mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mP, mP, mP, mP, mP, mP, mP, mP, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, + mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, mLPU, + mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mTBR, mP, mP, mP, mP, mP, mP, mP, mP, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x380 */ - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mRTNI, mILL, mILL, mRTN, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, - mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, mILL, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, + m, m, m, m, mRTNI, m, m, mRTN, m, m, m, m, m, m, m, m, + m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, m, /* 0x3c0 */ - mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, - mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, - mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, - mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, + mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL }; +#undef m From 1990de612afdaf12a0e1e24f5540fa10d7b41d7c Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 21 Mar 2015 20:41:41 +0100 Subject: [PATCH 136/201] fix uninitialized display at start --- src/mess/drivers/hh_hmcs40.c | 2 +- src/mess/drivers/hh_pic16.c | 2 +- src/mess/drivers/hh_tms1k.c | 4 ++-- src/mess/drivers/hh_ucom4.c | 2 +- src/mess/drivers/ticalc1x.c | 2 +- src/mess/drivers/tispeak.c | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 4bdbd69b069..5bc8225b84c 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -107,7 +107,7 @@ void hh_hmcs40_state::machine_start() { // zerofill memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_cache, ~0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, 0, sizeof(m_display_segmask)); diff --git a/src/mess/drivers/hh_pic16.c b/src/mess/drivers/hh_pic16.c index bdabf44dd43..566c109ece2 100644 --- a/src/mess/drivers/hh_pic16.c +++ b/src/mess/drivers/hh_pic16.c @@ -76,7 +76,7 @@ void hh_pic16_state::machine_start() { // zerofill memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_cache, ~0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, 0, sizeof(m_display_segmask)); diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 6e86d6489f3..63551c2c631 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -17,7 +17,7 @@ @MP0914 TMS1000 1979, Entex Baseball 1 *MP0923 TMS1000? 1979, Entex Baseball 2 @MP1030 TMS1100 1980, APF Mathemagician - *MP1133 ? 1979, Kosmos Astro + *MP1133 TMS1470 1979, Kosmos Astro @MP1204 TMS1100 1980, Entex Baseball 3 *MP1221 TMS1100 1980, Entex Raise The Devil *MP1312 TMS1100 198?, Tandy/RadioShack Science Fair Microcomputer Trainer @@ -216,7 +216,7 @@ void hh_tms1k_state::machine_start() { // zerofill memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_cache, ~0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, 0, sizeof(m_display_segmask)); diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index c31c962d08f..1210d58492f 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -117,7 +117,7 @@ void hh_ucom4_state::machine_start() { // zerofill memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_cache, ~0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, 0, sizeof(m_display_segmask)); diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 076d49c7000..f5a948a58db 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -99,7 +99,7 @@ void ticalc1x_state::machine_start() { // zerofill memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_cache, ~0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, ~0, sizeof(m_display_segmask)); // ! diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index df40fbf214f..4c941d6cc23 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -731,7 +731,7 @@ void tispeak_state::machine_start() { // zerofill memset(m_display_state, 0, sizeof(m_display_state)); - memset(m_display_cache, 0, sizeof(m_display_cache)); + memset(m_display_cache, ~0, sizeof(m_display_cache)); memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, ~0, sizeof(m_display_segmask)); // ! From 52db3c565e5371fdaa45b3b6926ca03d01f46568 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 21 Mar 2015 20:55:33 +0100 Subject: [PATCH 137/201] (MESS)New working games added ----------------- Coleco Alien Attack [hap, Kevin Horton] Entex Galaxian 2 [hap, Kevin Horton] Entex Pacman 2 [hap, Kevin Horton] --- src/mess/drivers/hh_hmcs40.c | 8 ++++---- src/mess/drivers/hh_ucom4.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 5bc8225b84c..4052f128758 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -633,7 +633,7 @@ static INPUT_PORTS_START( egalaxn2 ) PORT_CONFSETTING( 0x02, "1" ) PORT_CONFSETTING( 0x00, "2" ) PORT_CONFNAME( 0x0c, 0x00, "Players" ) - PORT_CONFSETTING( 0x08, "0 (Demo)" ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) // for Demo mode: need to hold down Fire button at power-on PORT_CONFSETTING( 0x00, "1" ) PORT_CONFSETTING( 0x04, "2" ) INPUT_PORTS_END @@ -953,15 +953,15 @@ CONS( 1979, bambball, 0, 0, bambball, bambball, driver_device, 0, "Bambi CONS( 1981, packmon, 0, 0, packmon, packmon, driver_device, 0, "Bandai", "Packri Monster", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1983, zackman, 0, 0, zackman, zackman, driver_device, 0, "Bandai", "Zackman", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) -CONS( 1981, alnattck, 0, 0, alnattck, alnattck, driver_device, 0, "Coleco", "Alien Attack", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1981, alnattck, 0, 0, alnattck, alnattck, driver_device, 0, "Coleco", "Alien Attack", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1982, cdkong, 0, 0, cdkong, cdkong, driver_device, 0, "Coleco", "Donkey Kong (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, driver_device, 0, "Coleco", "Galaxian (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, cpacman, 0, 0, cpacman, cpacman, driver_device, 0, "Coleco", "Pac-Man (Coleco, Rev. 29)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, driver_device, 0, "Coleco", "Pac-Man (Coleco, Rev. 28)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, driver_device, 0, "Coleco", "Ms. Pac-Man (Coleco)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) -CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex", "Galaxian 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) -CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) +CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, driver_device, 0, "Entex", "Galaxian 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) +CONS( 1981, epacman2, 0, 0, epacman2, epacman2, driver_device, 0, "Entex", "Pac Man 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK ) CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, driver_device, 0, "Parker Brothers", "Q*Bert (Parker Brothers)", GAME_SUPPORTS_SAVE | GAME_REQUIRES_ARTWORK | GAME_NOT_WORKING ) diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index 1210d58492f..d274457bed2 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -351,7 +351,7 @@ MACHINE_CONFIG_END Bambino Space Laser Fight (manufactured in Japan) * PCB label Emix Corp. ET-12 * NEC uCOM-43 MCU, labeled D553C 055 - * blue VFD display Emix-104 (some versions had a green display) + * cyan VFD display Emix-104, with color overlay (blue or green overlay, depending on region) NOTE!: MESS external artwork is recommended From 04dd059a79b2347e68d8f0651a5266da227aeff6 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sun, 22 Mar 2015 07:48:05 +1100 Subject: [PATCH 138/201] Save NVRAM for unkch sets --- src/mame/drivers/goldstar.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/goldstar.c b/src/mame/drivers/goldstar.c index ea295e7fb49..f1868c108a5 100644 --- a/src/mame/drivers/goldstar.c +++ b/src/mame/drivers/goldstar.c @@ -146,7 +146,7 @@ * Crazy Bonus (crazybon): - Appears to be from a bootleg conversion set for Poker Master (pokrmast). There + Appears to be from a bootleg conversion set for Poker Master (pkrmast). There is another undumped bootleg conversion set advertised that displays Spirit or Dyna copyright depending on DIP settings and has both poker and slots games (the set in MAME displays "Crazy Co." copyright and only has a slots game). @@ -7717,6 +7717,8 @@ static MACHINE_CONFIG_START( unkch, unkch_state ) MCFG_CPU_IO_MAP(unkch_portmap) MCFG_CPU_VBLANK_INT_DRIVER("screen", unkch_state, vblank_irq) + MCFG_NVRAM_ADD_1FILL("nvram") + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -7730,8 +7732,6 @@ static MACHINE_CONFIG_START( unkch, unkch_state ) MCFG_PALETTE_ADD("palette", 512) MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) - //MCFG_NVRAM_HANDLER(goldstar) - MCFG_VIDEO_START_OVERRIDE(unkch_state, unkch) /* sound hardware */ From e7fd6f7f6d9cb7eaf3b41a145862df965f9bb61e Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 21:22:28 +0000 Subject: [PATCH 139/201] cdracula: left/right are needed for high score entry (only shows when you complete the game??) (nw) --- src/mame/drivers/dynax.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/dynax.c b/src/mame/drivers/dynax.c index 16063eeda08..f78e19f8507 100644 --- a/src/mame/drivers/dynax.c +++ b/src/mame/drivers/dynax.c @@ -2015,8 +2015,8 @@ static INPUT_PORTS_START( cdracula ) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // same as button1 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -2025,8 +2025,8 @@ static INPUT_PORTS_START( cdracula ) PORT_START("P2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // same as button1 PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) From 97af9b117ff13a1f6ea1c2f234c75971b8d7e2d4 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 21:37:44 +0000 Subject: [PATCH 140/201] button2 is also used (nw) --- src/mame/drivers/dynax.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/dynax.c b/src/mame/drivers/dynax.c index f78e19f8507..46eae7c920e 100644 --- a/src/mame/drivers/dynax.c +++ b/src/mame/drivers/dynax.c @@ -2018,7 +2018,7 @@ static INPUT_PORTS_START( cdracula ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // same as button1 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // erase on highscore entry PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) @@ -2028,7 +2028,7 @@ static INPUT_PORTS_START( cdracula ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // same as button1 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) // erase on highscore entry PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) From 52c7bf8e5be52076bbe50a01c0a8808804cfe32e Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 22:59:24 +0000 Subject: [PATCH 141/201] there's some kind of perverted madness going on here (nw) --- src/mame/drivers/twins.c | 95 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index 9e875a37d40..338eea54514 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -69,7 +69,8 @@ public: m_videoram(*this, "videoram"), m_paletteram(*this, "paletteram"), m_palette(*this, "palette"), - m_i2cmem(*this, "i2cmem") + m_i2cmem(*this, "i2cmem"), + m_spritesinit(0) { } required_device m_maincpu; @@ -84,6 +85,15 @@ public: DECLARE_WRITE16_MEMBER(spider_pal_w); DECLARE_WRITE16_MEMBER(porte_paloff0_w); DECLARE_WRITE16_MEMBER(spider_paloff0_w); + DECLARE_WRITE16_MEMBER(spider_blitter_w); + + DECLARE_READ16_MEMBER(spider_port_18_r); + DECLARE_READ16_MEMBER(spider_port_1e_r); + DECLARE_WRITE16_MEMBER(spider_port_1c_w); + int m_spritesinit; + int m_spriteswidth; + int m_spritesaddr; + DECLARE_VIDEO_START(twins); DECLARE_VIDEO_START(twinsa); @@ -142,10 +152,56 @@ WRITE16_MEMBER(twins_state::porte_paloff0_w) m_paloff = 0; } +WRITE16_MEMBER(twins_state::spider_blitter_w) +{ + // this is very strange, we use the offset (address bits) not data bits to set values.. + // I get the impression this might actually overlay the entire address range, including RAM and regular VRAM? + + if (m_spritesinit == 1) + { + // printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); + + m_spritesinit = 2; + m_spritesaddr = offset; + } + else if (m_spritesinit == 2) + { +// printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); + m_spriteswidth = offset; + if (m_spriteswidth == 0) + m_spriteswidth = 80; + + m_spritesinit = 0; + + } + else + { + UINT8 *src = memregion( "maincpu" )->base(); + + // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); + offset &=0x7fff; + + for (int i = 0; i < m_spriteswidth; i++) + { + UINT16 data = (src[m_spritesaddr+1] << 8) | src[m_spritesaddr]; + m_spritesaddr += 2; + + m_videoram[offset] = data; + offset++; + offset &= 0x7fff; + } + + + } + + +} + + static ADDRESS_MAP_START( twins_map, AS_PROGRAM, 16, twins_state ) AM_RANGE(0x00000, 0x0ffff) AM_RAM AM_RANGE(0x10000, 0x1ffff) AM_RAM AM_SHARE("videoram") - AM_RANGE(0x20000, 0xfffff) AM_ROM + AM_RANGE(0x20000, 0xfffff) AM_ROM AM_WRITE(spider_blitter_w) ADDRESS_MAP_END static ADDRESS_MAP_START( twins_io, AS_IO, 16, twins_state ) @@ -321,18 +377,47 @@ WRITE16_MEMBER(twins_state::spider_pal_w) } -WRITE16_MEMBER(twins_state::spider_paloff0_w) // probably not.. +WRITE16_MEMBER(twins_state::spider_paloff0_w) { -// printf("porte_paloff0_w %04x\n", data); -// m_paloff = 0; + // this seems to be video ram banking } +WRITE16_MEMBER(twins_state::spider_port_1c_w) +{ + // done before the 'sprite' read / writes + // might clear a buffer? +} + + +READ16_MEMBER(twins_state::spider_port_18_r) +{ +// printf("spider_port_18_r %04x\n", mem_mask); + + m_spritesinit = 1; + + return 0xff; +} + +READ16_MEMBER(twins_state::spider_port_1e_r) +{ + // done before each sprite pixel 'write' + // the data read is the data written, but only reads one pixel?? + return 0xff; +} + + static ADDRESS_MAP_START( spider_io, AS_IO, 16, twins_state ) AM_RANGE(0x0000, 0x0003) AM_DEVWRITE8("aysnd", ay8910_device, address_data_w, 0x00ff) AM_RANGE(0x0002, 0x0003) AM_DEVREAD8("aysnd", ay8910_device, data_r, 0x00ff) AM_RANGE(0x0004, 0x0005) AM_READWRITE(twins_port4_r, twins_port4_w) AM_RANGE(0x0008, 0x0009) AM_WRITE(spider_pal_w) AM_SHARE("paletteram") AM_RANGE(0x0010, 0x0011) AM_WRITE(spider_paloff0_w) + + AM_RANGE(0x0018, 0x0019) AM_READ(spider_port_18_r) + AM_RANGE(0x001c, 0x001d) AM_WRITE(spider_port_1c_w) + AM_RANGE(0x001e, 0x001f) AM_READ(spider_port_1e_r) + + ADDRESS_MAP_END From 52e378aa5b37b268cd1ee2bf3c9076da39894a88 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 23:23:22 +0000 Subject: [PATCH 142/201] yeah.. the blitter seems to watch the entire bus... (nw) --- src/mame/drivers/twins.c | 84 +++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index 338eea54514..a0c1e9651e5 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -66,7 +66,6 @@ public: twins_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_videoram(*this, "videoram"), m_paletteram(*this, "paletteram"), m_palette(*this, "palette"), m_i2cmem(*this, "i2cmem"), @@ -74,7 +73,6 @@ public: { } required_device m_maincpu; - required_shared_ptr m_videoram; optional_shared_ptr m_paletteram; required_device m_palette; optional_device m_i2cmem; @@ -86,6 +84,7 @@ public: DECLARE_WRITE16_MEMBER(porte_paloff0_w); DECLARE_WRITE16_MEMBER(spider_paloff0_w); DECLARE_WRITE16_MEMBER(spider_blitter_w); + DECLARE_READ16_MEMBER(spider_blitter_r); DECLARE_READ16_MEMBER(spider_port_18_r); DECLARE_READ16_MEMBER(spider_port_1e_r); @@ -94,13 +93,25 @@ public: int m_spriteswidth; int m_spritesaddr; + UINT16 m_mainram[0x10000 / 2]; + UINT16 m_videoram[0x10000 / 2]; DECLARE_VIDEO_START(twins); DECLARE_VIDEO_START(twinsa); UINT32 screen_update_twins(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + virtual void machine_start(); + UINT16* m_rom16; + UINT8* m_rom8; + }; +void twins_state::machine_start() +{ + m_rom16 = (UINT16*)memregion("maincpu")->base(); + m_rom8 = memregion("maincpu")->base(); +} /* port 4 is eeprom */ READ16_MEMBER(twins_state::twins_port4_r) @@ -152,6 +163,24 @@ WRITE16_MEMBER(twins_state::porte_paloff0_w) m_paloff = 0; } +READ16_MEMBER(twins_state::spider_blitter_r) +{ + if (offset <= 0x10000 / 2) + { + return m_mainram[offset&0x7fff]; + } + else if (offset <= 0x20000 / 2) + { + return m_videoram[offset&0x7fff]; + } + else + { + UINT16 *src = m_rom16; + return src[offset]; + } +} + + WRITE16_MEMBER(twins_state::spider_blitter_w) { // this is very strange, we use the offset (address bits) not data bits to set values.. @@ -159,15 +188,15 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) if (m_spritesinit == 1) { - // printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); + printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); m_spritesinit = 2; m_spritesaddr = offset; } else if (m_spritesinit == 2) { -// printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); - m_spriteswidth = offset; + printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); + m_spriteswidth = offset & 0xff; if (m_spriteswidth == 0) m_spriteswidth = 80; @@ -176,32 +205,41 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) } else { - UINT8 *src = memregion( "maincpu" )->base(); - - // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); - offset &=0x7fff; - - for (int i = 0; i < m_spriteswidth; i++) + if (offset <= 0x10000 / 2) { - UINT16 data = (src[m_spritesaddr+1] << 8) | src[m_spritesaddr]; - m_spritesaddr += 2; - - m_videoram[offset] = data; - offset++; - offset &= 0x7fff; + COMBINE_DATA(&m_mainram[offset&0x7fff]); } + else if (offset <= 0x20000 / 2) + { + COMBINE_DATA(&m_videoram[offset&0x7fff]); + } + else if (offset <= 0x30000 / 2) + { + UINT8 *src = m_rom8; + // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); + offset &= 0x7fff; + for (int i = 0; i < m_spriteswidth; i++) + { + UINT16 data = (src[(m_spritesaddr*2) + 1] << 8) | src[(m_spritesaddr*2)]; + m_spritesaddr ++; + + m_videoram[offset] = data; + offset++; + offset &= 0x7fff; + } + } + else + { + printf("spider_blitter_w unhandled RAM access %08x %04x %04x", offset * 2, data, mem_mask); + } } - - } static ADDRESS_MAP_START( twins_map, AS_PROGRAM, 16, twins_state ) - AM_RANGE(0x00000, 0x0ffff) AM_RAM - AM_RANGE(0x10000, 0x1ffff) AM_RAM AM_SHARE("videoram") - AM_RANGE(0x20000, 0xfffff) AM_ROM AM_WRITE(spider_blitter_w) + AM_RANGE(0x00000, 0xfffff) AM_READWRITE(spider_blitter_r, spider_blitter_w) ADDRESS_MAP_END static ADDRESS_MAP_START( twins_io, AS_IO, 16, twins_state ) @@ -226,7 +264,7 @@ UINT32 twins_state::screen_update_twins(screen_device &screen, bitmap_ind16 &bit bitmap.fill(m_palette->black_pen()); count=0; - UINT8 *videoram = reinterpret_cast(m_videoram.target()); + UINT8 *videoram = (UINT8*)m_videoram; for (y=0;y Date: Sat, 21 Mar 2015 23:30:34 +0000 Subject: [PATCH 143/201] oops (nw) --- src/mame/drivers/twins.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index a0c1e9651e5..117c395efcd 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -165,11 +165,11 @@ WRITE16_MEMBER(twins_state::porte_paloff0_w) READ16_MEMBER(twins_state::spider_blitter_r) { - if (offset <= 0x10000 / 2) + if (offset < 0x10000 / 2) { return m_mainram[offset&0x7fff]; } - else if (offset <= 0x20000 / 2) + else if (offset < 0x20000 / 2) { return m_videoram[offset&0x7fff]; } @@ -188,14 +188,14 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) if (m_spritesinit == 1) { - printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); + // printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); m_spritesinit = 2; m_spritesaddr = offset; } else if (m_spritesinit == 2) { - printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); + // printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); m_spriteswidth = offset & 0xff; if (m_spriteswidth == 0) m_spriteswidth = 80; @@ -205,19 +205,19 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) } else { - if (offset <= 0x10000 / 2) + if (offset < 0x10000 / 2) { COMBINE_DATA(&m_mainram[offset&0x7fff]); } - else if (offset <= 0x20000 / 2) + else if (offset < 0x20000 / 2) { COMBINE_DATA(&m_videoram[offset&0x7fff]); } - else if (offset <= 0x30000 / 2) + else if (offset < 0x30000 / 2) { UINT8 *src = m_rom8; - // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); + // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); offset &= 0x7fff; for (int i = 0; i < m_spriteswidth; i++) From 0b7956b2c1fd3f697a35a87d14ebb6215e2289bd Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sat, 21 Mar 2015 23:55:21 +0000 Subject: [PATCH 144/201] improve further (nw) --- src/mame/drivers/twins.c | 100 +++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 9 deletions(-) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index 117c395efcd..b663bc6b7db 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -69,7 +69,8 @@ public: m_paletteram(*this, "paletteram"), m_palette(*this, "palette"), m_i2cmem(*this, "i2cmem"), - m_spritesinit(0) + m_spritesinit(0), + m_videorambank(0) { } required_device m_maincpu; @@ -88,6 +89,7 @@ public: DECLARE_READ16_MEMBER(spider_port_18_r); DECLARE_READ16_MEMBER(spider_port_1e_r); + DECLARE_WRITE16_MEMBER(spider_port_1a_w); DECLARE_WRITE16_MEMBER(spider_port_1c_w); int m_spritesinit; int m_spriteswidth; @@ -95,10 +97,13 @@ public: UINT16 m_mainram[0x10000 / 2]; UINT16 m_videoram[0x10000 / 2]; + UINT16 m_videoram2[0x10000 / 2]; + UINT16 m_videorambank; DECLARE_VIDEO_START(twins); DECLARE_VIDEO_START(twinsa); UINT32 screen_update_twins(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + UINT32 screen_update_spider(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); virtual void machine_start(); UINT16* m_rom16; @@ -165,13 +170,19 @@ WRITE16_MEMBER(twins_state::porte_paloff0_w) READ16_MEMBER(twins_state::spider_blitter_r) { + UINT16* vram; + if (m_videorambank & 1) + vram = m_videoram2; + else + vram = m_videoram; + if (offset < 0x10000 / 2) { return m_mainram[offset&0x7fff]; } else if (offset < 0x20000 / 2) { - return m_videoram[offset&0x7fff]; + return vram[offset&0x7fff]; } else { @@ -185,6 +196,11 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) { // this is very strange, we use the offset (address bits) not data bits to set values.. // I get the impression this might actually overlay the entire address range, including RAM and regular VRAM? + UINT16* vram; + if (m_videorambank & 1) + vram = m_videoram2; + else + vram = m_videoram; if (m_spritesinit == 1) { @@ -211,7 +227,7 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) } else if (offset < 0x20000 / 2) { - COMBINE_DATA(&m_videoram[offset&0x7fff]); + COMBINE_DATA(&vram[offset&0x7fff]); } else if (offset < 0x30000 / 2) { @@ -222,11 +238,23 @@ WRITE16_MEMBER(twins_state::spider_blitter_w) for (int i = 0; i < m_spriteswidth; i++) { - UINT16 data = (src[(m_spritesaddr*2) + 1] << 8) | src[(m_spritesaddr*2)]; - m_spritesaddr ++; + UINT8 data; + + data = (src[(m_spritesaddr * 2) + 1]); + + if (data) + vram[offset] = (vram[offset] & 0x00ff) | data << 8; - m_videoram[offset] = data; + + data = src[(m_spritesaddr*2)]; + + if (data) + vram[offset] = (vram[offset] & 0xff00) | data; + + + m_spritesaddr ++; offset++; + offset &= 0x7fff; } } @@ -276,6 +304,38 @@ UINT32 twins_state::screen_update_twins(screen_device &screen, bitmap_ind16 &bit return 0; } +UINT32 twins_state::screen_update_spider(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int y,x,count; + static const int xxx=320,yyy=204; + + bitmap.fill(m_palette->black_pen()); + + count=0; + UINT8 *videoram = (UINT8*)m_videoram; + for (y=0;y Date: Sun, 22 Mar 2015 01:00:02 +0100 Subject: [PATCH 145/201] added ebball2 skeleton --- src/mess/drivers/hh_tms1k.c | 80 ++++++++++++++- src/mess/layout/ebball2.lay | 199 ++++++++++++++++++++++++++++++++++++ src/mess/mess.lst | 1 + src/mess/mess.mak | 1 + 4 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 src/mess/layout/ebball2.lay diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 63551c2c631..39698d00f8d 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -15,7 +15,7 @@ @MP0905B TMS0970 1977, Parker Brothers Codename Sector *MP0168 TMS1000? 1979, Conic Basketball @MP0914 TMS1000 1979, Entex Baseball 1 - *MP0923 TMS1000? 1979, Entex Baseball 2 + @MP0923 TMS1000 1979, Entex Baseball 2 @MP1030 TMS1100 1980, APF Mathemagician *MP1133 TMS1470 1979, Kosmos Astro @MP1204 TMS1100 1980, Entex Baseball 3 @@ -79,6 +79,7 @@ #include "bankshot.lh" #include "cnsector.lh" #include "ebball.lh" +#include "ebball2.lh" #include "ebball3.lh" #include "elecdet.lh" #include "comp4.lh" @@ -158,6 +159,10 @@ public: DECLARE_WRITE16_MEMBER(ebball_write_o); DECLARE_READ8_MEMBER(ebball_read_k); + DECLARE_WRITE16_MEMBER(ebball2_write_r); + DECLARE_WRITE16_MEMBER(ebball2_write_o); + DECLARE_READ8_MEMBER(ebball2_read_k); + void ebball3_display(); DECLARE_WRITE16_MEMBER(ebball3_write_r); DECLARE_WRITE16_MEMBER(ebball3_write_o); @@ -938,6 +943,67 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Entex Electronic Baseball 2 + * TMS1000 MP0923 (die labeled MP0923) + + + lamp translation table: led zz from game PCB = MESS lampyx: + + 00 = - 10 = lamp94 20 = lamp74 30 = lamp50 + 01 = lamp53 11 = lamp93 21 = lamp75 31 = lamp51 + 02 = lamp07 12 = lamp92 22 = lamp80 32 = lamp52 + 03 = lamp17 13 = lamp62 23 = lamp81 33 = lamp40 + 04 = lamp27 14 = lamp70 24 = lamp82 34 = lamp41 + 05 = lamp97 15 = lamp71 25 = lamp83 35 = lamp31 + 06 = lamp90 16 = lamp61 26 = lamp84 36 = lamp30 + 07 = lamp95 17 = lamp72 27 = lamp85 37 = lamp33 + 08 = lamp63 18 = lamp73 28 = lamp42 38 = lamp32 + 09 = lamp91 19 = lamp60 29 = lamp43 + +***************************************************************************/ + +WRITE16_MEMBER(hh_tms1k_state::ebball2_write_r) +{ +} + +WRITE16_MEMBER(hh_tms1k_state::ebball2_write_o) +{ +} + +READ8_MEMBER(hh_tms1k_state::ebball2_read_k) +{ + return 0; +} + + +static INPUT_PORTS_START( ebball2 ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( ebball2, hh_tms1k_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1000, 350000) // RC osc. R=47K, C=47pf -> ~350kHz + MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, ebball2_read_k)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, ebball2_write_r)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, ebball2_write_o)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_ebball) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + /*************************************************************************** @@ -2190,6 +2256,17 @@ ROM_START( ebball ) ROM_END +ROM_START( ebball2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ebball2_mpla.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ebball2_opla.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) ) +ROM_END + + ROM_START( ebball3 ) ROM_REGION( 0x0800, "maincpu", 0 ) ROM_LOAD( "mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) ) @@ -2359,6 +2436,7 @@ CONS( 1979, amaztron, 0, 0, amaztron, amaztron, driver_device, 0, "Col CONS( 1981, tc4, 0, 0, tc4, tc4, driver_device, 0, "Coleco", "Total Control 4", GAME_SUPPORTS_SAVE ) CONS( 1979, ebball, 0, 0, ebball, ebball, driver_device, 0, "Entex", "Electronic Baseball (Entex)", GAME_SUPPORTS_SAVE ) +CONS( 1979, ebball2, 0, 0, ebball2, ebball2, driver_device, 0, "Entex", "Electronic Baseball 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) CONS( 1980, ebball3, 0, 0, ebball3, ebball3, driver_device, 0, "Entex", "Electronic Baseball 3 (Entex)", GAME_SUPPORTS_SAVE ) CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE ) // *** diff --git a/src/mess/layout/ebball2.lay b/src/mess/layout/ebball2.lay new file mode 100644 index 00000000000..48bcb51853b --- /dev/null +++ b/src/mess/layout/ebball2.lay @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 2ea9ed1c715..6c77898a21f 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2195,6 +2195,7 @@ mathmagi // APF amaztron // Coleco tc4 // Coleco ebball // Entex +ebball2 // Entex ebball3 // Entex elecdet // Ideal starwbc // Kenner diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 0fe95ee9534..0130009eb22 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -2139,6 +2139,7 @@ $(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \ $(MESS_LAYOUT)/cnsector.lh \ $(MESS_LAYOUT)/comp4.lh \ $(MESS_LAYOUT)/ebball.lh \ + $(MESS_LAYOUT)/ebball2.lh \ $(MESS_LAYOUT)/ebball3.lh \ $(MESS_LAYOUT)/elecdet.lh \ $(MESS_LAYOUT)/mathmagi.lh \ From eb960ff5dafe1b7b5780337702e347ccd31b7ccf Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 22 Mar 2015 02:21:57 +0100 Subject: [PATCH 146/201] added ebball2 outputs --- src/mess/drivers/hh_tms1k.c | 44 +++++++++++++++---- src/mess/layout/ebball2.lay | 84 ++++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 46 deletions(-) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 39698d00f8d..d8344eeffb0 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -159,6 +159,7 @@ public: DECLARE_WRITE16_MEMBER(ebball_write_o); DECLARE_READ8_MEMBER(ebball_read_k); + void ebball2_display(); DECLARE_WRITE16_MEMBER(ebball2_write_r); DECLARE_WRITE16_MEMBER(ebball2_write_o); DECLARE_READ8_MEMBER(ebball2_read_k); @@ -946,14 +947,20 @@ MACHINE_CONFIG_END /*************************************************************************** Entex Electronic Baseball 2 - * TMS1000 MP0923 (die labeled MP0923) + * boards are labeled: ZENY + * TMS1000 MCU, MP0923 (die labeled MP0923) + + The Japanese version was published by Gakken, black casing instead of white. + + The sequel to Entex Baseball, this version keeps up with score and innings. + As its predecessor, the pitcher controls are on a separate joypad. lamp translation table: led zz from game PCB = MESS lampyx: 00 = - 10 = lamp94 20 = lamp74 30 = lamp50 01 = lamp53 11 = lamp93 21 = lamp75 31 = lamp51 - 02 = lamp07 12 = lamp92 22 = lamp80 32 = lamp52 + 02 = lamp7 12 = lamp92 22 = lamp80 32 = lamp52 03 = lamp17 13 = lamp62 23 = lamp81 33 = lamp40 04 = lamp27 14 = lamp70 24 = lamp82 34 = lamp41 05 = lamp97 15 = lamp71 25 = lamp83 35 = lamp31 @@ -964,16 +971,38 @@ MACHINE_CONFIG_END ***************************************************************************/ +void hh_tms1k_state::ebball2_display() +{ + // the first 3 are 7segs + for (int y = 0; y < 3; y++) + m_display_segmask[y] = 0x7f; + + display_matrix(8, 10, ~m_o, m_r); +} + WRITE16_MEMBER(hh_tms1k_state::ebball2_write_r) { + // R3-R6: input mux + m_inp_mux = data >> 3 & 0xf; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R9: led columns + m_r = data; + ebball2_display(); } WRITE16_MEMBER(hh_tms1k_state::ebball2_write_o) { + // O0-O7: led row/segment + m_o = data; + ebball2_display(); } READ8_MEMBER(hh_tms1k_state::ebball2_read_k) { + if (m_inp_mux&1) return 2; return 0; } @@ -991,7 +1020,7 @@ static MACHINE_CONFIG_START( ebball2, hh_tms1k_state ) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, ebball2_write_o)) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) - MCFG_DEFAULT_LAYOUT(layout_ebball) + MCFG_DEFAULT_LAYOUT(layout_ebball2) /* no video! */ @@ -1008,13 +1037,12 @@ MACHINE_CONFIG_END /*************************************************************************** Entex Electronic Baseball 3 - * boards are labeled: Zeny + * boards are labeled: ZENY * TMS1100NLL 6007 MP1204 (die labeled MP1204) * 2*SN75492N LED display driver This is another improvement over Entex Baseball, where gameplay is a bit more - varied, and it keeps up with score and innings. Like the others, the pitcher - controls are on a separate joypad. + varied. Like the others, the pitcher controls are on a separate joypad. lamp translation table: led zz from game PCB = MESS lampyx: @@ -1575,7 +1603,7 @@ MACHINE_CONFIG_END /*************************************************************************** Parker Brothers Code Name: Sector, by Bob Doyle - * MP0905BNL ZA0379 (die labeled 0970F-05B) + * TMS0970 MCU, MP0905BNL ZA0379 (die labeled 0970F-05B) This is a tabletop submarine pursuit game. A grid board and small toy boats are used to remember your locations (a Paint app should be ok too). @@ -2067,7 +2095,7 @@ MACHINE_CONFIG_END /*************************************************************************** Tandy Radio Shack Computerized Arcade (1981, 1982, 1995) - * TMS1100 CD7282SL + * TMS1100 MCU, labeled CD7282SL This handheld contains 12 minigames. It looks and plays like "Fabulous Fred" by the Japanese company Mego Corp. in 1980, which in turn is a mix of Merlin diff --git a/src/mess/layout/ebball2.lay b/src/mess/layout/ebball2.lay index 48bcb51853b..6f93f0f8d47 100644 --- a/src/mess/layout/ebball2.lay +++ b/src/mess/layout/ebball2.lay @@ -46,8 +46,7 @@ - - + @@ -71,23 +70,32 @@ - - + + + + + + + + + + + - - + + - - - + + + - - + + @@ -103,21 +111,21 @@ - - + + - - + + - + @@ -125,15 +133,15 @@ - + - + - + @@ -141,39 +149,39 @@ - - - - + + + + - - + + - + - + - + - + - + - + - + @@ -183,16 +191,16 @@ - - + + - - + + - - + + From f547f924bb43d4752a4d483195075442712c0582 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 22 Mar 2015 03:14:17 +0100 Subject: [PATCH 147/201] ebball2 inputs --- src/mess/drivers/hh_tms1k.c | 34 +++++++++++++++++++++++++++------- src/mess/layout/ebball2.lay | 8 ++++---- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index d8344eeffb0..6c79654a162 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -859,7 +859,7 @@ void hh_tms1k_state::ebball_display() // R8 is a 7seg m_display_segmask[8] = 0x7f; - display_matrix(7, 9, ~m_o, m_r); + display_matrix(7, 9, m_o, m_r); } WRITE16_MEMBER(hh_tms1k_state::ebball_write_r) @@ -879,7 +879,7 @@ WRITE16_MEMBER(hh_tms1k_state::ebball_write_o) { // O0-O6: led row // O7: N/C - m_o = data; + m_o = ~data; ebball_display(); } @@ -977,7 +977,7 @@ void hh_tms1k_state::ebball2_display() for (int y = 0; y < 3; y++) m_display_segmask[y] = 0x7f; - display_matrix(8, 10, ~m_o, m_r); + display_matrix(8, 10, m_o, m_r); } WRITE16_MEMBER(hh_tms1k_state::ebball2_write_r) @@ -989,25 +989,45 @@ WRITE16_MEMBER(hh_tms1k_state::ebball2_write_r) m_speaker->level_w(data >> 10 & 1); // R0-R9: led columns - m_r = data; + m_r = data ^ 0x7f; ebball2_display(); } WRITE16_MEMBER(hh_tms1k_state::ebball2_write_o) { // O0-O7: led row/segment - m_o = data; + m_o = ~data; ebball2_display(); } READ8_MEMBER(hh_tms1k_state::ebball2_read_k) { - if (m_inp_mux&1) return 2; - return 0; + return read_inputs(4); } static INPUT_PORTS_START( ebball2 ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, "Pitcher" ) + PORT_CONFSETTING( 0x02, "Auto" ) + PORT_CONFSETTING( 0x00, "Manual" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END diff --git a/src/mess/layout/ebball2.lay b/src/mess/layout/ebball2.lay index 6f93f0f8d47..52ba3ddb93e 100644 --- a/src/mess/layout/ebball2.lay +++ b/src/mess/layout/ebball2.lay @@ -113,15 +113,15 @@ - - + + - - + + From 248c45520b40e75b125324b22ede488cbae3f8bd Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 22 Mar 2015 03:35:54 +0100 Subject: [PATCH 148/201] added skeleton for Super Simon --- src/mess/drivers/hh_tms1k.c | 74 +++++++++++++++++++++++++++++++++++-- src/mess/layout/ssimon.lay | 19 ++++++++++ src/mess/mess.lst | 1 + src/mess/mess.mak | 1 + 4 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 src/mess/layout/ssimon.lay diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 6c79654a162..078278a5568 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -35,7 +35,7 @@ MP3457 TMS1100 1979, MicroVision cartridge: Mindbuster MP3474 TMS1100 1979, MicroVision cartridge: Vegas Slots MP3475 TMS1100 1979, MicroVision cartridge: Bowling - *MP3476 TMS1100 1979, Milton Bradley Super Simon + @MP3476 TMS1100 1979, Milton Bradley Super Simon MP3479 TMS1100 1980, MicroVision cartridge: Baseball MP3481 TMS1100 1979, MicroVision cartridge: Connect Four MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel @@ -86,6 +86,7 @@ #include "mathmagi.lh" #include "merlin.lh" // clickable #include "simon.lh" // clickable +#include "ssimon.lh" // clickable #include "splitsec.lh" #include "starwbc.lh" #include "stopthie.lh" @@ -189,6 +190,10 @@ public: DECLARE_WRITE16_MEMBER(simon_write_o); DECLARE_READ8_MEMBER(simon_read_k); + DECLARE_WRITE16_MEMBER(ssimon_write_r); + DECLARE_WRITE16_MEMBER(ssimon_write_o); + DECLARE_READ8_MEMBER(ssimon_read_k); + DECLARE_WRITE16_MEMBER(cnsector_write_r); DECLARE_WRITE16_MEMBER(cnsector_write_o); DECLARE_READ8_MEMBER(cnsector_read_k); @@ -1535,7 +1540,7 @@ MACHINE_CONFIG_END Newer revisions (also Pocket Simon) have a smaller 16-pin MB4850 chip instead of the TMS1000. This one has been decapped too, but we couldn't find an internal ROM. It is possibly a cost-reduced custom ASIC specifically - for Simon. The semi-sequel Super Simon uses a TMS1100. + for Simon. The semi-sequel Super Simon uses a TMS1100 (see next minidriver). ***************************************************************************/ @@ -1620,6 +1625,57 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Milton Bradley Super Simon + * TMS1100 MP3476NLL (die labeled MP3476) + + x + +***************************************************************************/ + +WRITE16_MEMBER(hh_tms1k_state::ssimon_write_r) +{ +} + +WRITE16_MEMBER(hh_tms1k_state::ssimon_write_o) +{ + // N/C +} + +READ8_MEMBER(hh_tms1k_state::ssimon_read_k) +{ + return 0; +} + + +static INPUT_PORTS_START( ssimon ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( ssimon, hh_tms1k_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1000, 350000) // x + MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, ssimon_read_k)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, ssimon_write_r)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, ssimon_write_o)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_ssimon) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Parker Brothers Code Name: Sector, by Bob Doyle @@ -2383,11 +2439,22 @@ ROM_START( simon ) ROM_REGION( 867, "maincpu:mpla", 0 ) ROM_LOAD( "tms1000_simon_mpla.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused ROM_LOAD( "tms1000_simon_opla.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) ROM_END +ROM_START( ssimon ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mp3476", 0x0000, 0x800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1100_ssimon_opla.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) +ROM_END + + ROM_START( cnsector ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) @@ -2494,6 +2561,7 @@ CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Ken CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE ) +CONS( 1979, ssimon, 0, 0, ssimon, ssimon, driver_device, 0, "Milton Bradley", "Super Simon", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // *** CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin - The Electronic Wizard", GAME_SUPPORTS_SAVE ) diff --git a/src/mess/layout/ssimon.lay b/src/mess/layout/ssimon.lay new file mode 100644 index 00000000000..940ef1a955e --- /dev/null +++ b/src/mess/layout/ssimon.lay @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 6c77898a21f..54dd74e7e2e 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2202,6 +2202,7 @@ starwbc // Kenner starwbcp // Kenner (prototype) comp4 // Milton Bradley simon // Milton Bradley +ssimon // Milton Bradley cnsector // Parker Bros merlin // Parker Bros stopthie // Parker Bros diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 0130009eb22..146e69b9665 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -2145,6 +2145,7 @@ $(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \ $(MESS_LAYOUT)/mathmagi.lh \ $(MESS_LAYOUT)/merlin.lh \ $(MESS_LAYOUT)/simon.lh \ + $(MESS_LAYOUT)/ssimon.lh \ $(MESS_LAYOUT)/splitsec.lh \ $(MESS_LAYOUT)/starwbc.lh \ $(MESS_LAYOUT)/stopthie.lh \ From 245c047f54b4ad89a0b36ece5fca270072945d70 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 22 Mar 2015 04:43:51 +0100 Subject: [PATCH 149/201] (MESS)New working game added ----------------- Entex Electronic Baseball 2 [hap, Sean Riddle] --- src/mess/drivers/hh_tms1k.c | 2 +- src/mess/layout/ebball2.lay | 46 ++++++++++++++++++++++--------------- src/mess/layout/ebball3.lay | 4 +++- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 078278a5568..ef958c39920 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -2551,7 +2551,7 @@ CONS( 1979, amaztron, 0, 0, amaztron, amaztron, driver_device, 0, "Col CONS( 1981, tc4, 0, 0, tc4, tc4, driver_device, 0, "Coleco", "Total Control 4", GAME_SUPPORTS_SAVE ) CONS( 1979, ebball, 0, 0, ebball, ebball, driver_device, 0, "Entex", "Electronic Baseball (Entex)", GAME_SUPPORTS_SAVE ) -CONS( 1979, ebball2, 0, 0, ebball2, ebball2, driver_device, 0, "Entex", "Electronic Baseball 2 (Entex)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +CONS( 1979, ebball2, 0, 0, ebball2, ebball2, driver_device, 0, "Entex", "Electronic Baseball 2 (Entex)", GAME_SUPPORTS_SAVE ) CONS( 1980, ebball3, 0, 0, ebball3, ebball3, driver_device, 0, "Entex", "Electronic Baseball 3 (Entex)", GAME_SUPPORTS_SAVE ) CONS( 1979, elecdet, 0, 0, elecdet, elecdet, driver_device, 0, "Ideal", "Electronic Detective", GAME_SUPPORTS_SAVE ) // *** diff --git a/src/mess/layout/ebball2.lay b/src/mess/layout/ebball2.lay index 52ba3ddb93e..525d4219af4 100644 --- a/src/mess/layout/ebball2.lay +++ b/src/mess/layout/ebball2.lay @@ -7,6 +7,7 @@ + @@ -47,6 +48,9 @@ + + + @@ -70,32 +74,38 @@ - + - - - + + + + + + + - - + + + - - + + + + - - - + + - - - - + + - - - + + + + + diff --git a/src/mess/layout/ebball3.lay b/src/mess/layout/ebball3.lay index 7338a3cc1d6..ac22cde7ead 100644 --- a/src/mess/layout/ebball3.lay +++ b/src/mess/layout/ebball3.lay @@ -121,7 +121,7 @@ - + @@ -156,6 +156,8 @@ + + From 69419ee50ee62a90cc6c9c964b81b96d602613d0 Mon Sep 17 00:00:00 2001 From: briantro Date: Sat, 21 Mar 2015 22:49:54 -0500 Subject: [PATCH 150/201] dynax.c: Update Castle of Dracula to measured clocks based of OSC clocks. - NW --- src/mame/drivers/dynax.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/dynax.c b/src/mame/drivers/dynax.c index 46eae7c920e..7570f3ea052 100644 --- a/src/mame/drivers/dynax.c +++ b/src/mame/drivers/dynax.c @@ -4346,7 +4346,7 @@ MACHINE_START_MEMBER(dynax_state,hnoridur) static MACHINE_CONFIG_START( cdracula, dynax_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, XTAL_4MHz) + MCFG_CPU_ADD("maincpu", Z80, XTAL_21_4772MHz/4) /* 5.3693175MHz measured */ MCFG_CPU_PROGRAM_MAP(cdracula_mem_map) MCFG_CPU_IO_MAP(cdracula_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ @@ -4358,7 +4358,7 @@ static MACHINE_CONFIG_START( cdracula, dynax_state ) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_REFRESH_RATE(58.56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(16, 512-16-1, 16, 256-1) @@ -4373,7 +4373,7 @@ static MACHINE_CONFIG_START( cdracula, dynax_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_OKIM6295_ADD("oki", XTAL_4MHz / 4, OKIM6295_PIN7_HIGH) + MCFG_OKIM6295_ADD("oki", XTAL_4MHz / 4, OKIM6295_PIN7_HIGH) /* 1MHz measured */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) MACHINE_CONFIG_END @@ -5035,7 +5035,7 @@ Castle Of Dracula Not a Dynax board: -GoldStar Z8400A PS (4 MHz 40-pin plastic DIP) +GoldStar Z8400A PS (40-pin plastic DIP) GoldStar GM68B45S TI TPC1020AFN-084C OKI M6295 (second OKI spot is unpopulated) @@ -5043,6 +5043,12 @@ OKI M6295 (second OKI spot is unpopulated) PAL16L8ACN 4 MHz & 21.47727 MHz XTALs +Clocks: + Z80 - 5.359MHz measured (21.47727MHz/4) + M6295 - 1Mhz (4Mhz/4) + + V-SYNC - 58.560 Hz + H-SYNC - 15.41 KHz ***************************************************************************/ ROM_START( cdracula ) From d42d2c5e0402260558b857154895332c1687d84f Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 22 Mar 2015 09:10:35 +0100 Subject: [PATCH 151/201] sub.c, subs.c: added save state support (nw) --- src/mame/audio/subs.c | 10 +++---- src/mame/drivers/sub.c | 48 ++++++++++++++++++-------------- src/mame/drivers/subs.c | 36 ++++++++++++------------ src/mame/includes/subs.h | 60 +++++++++++++++++++++++----------------- src/mame/machine/subs.c | 53 +++++++++++++++++++++-------------- src/mame/video/subs.c | 48 ++++++++++++++------------------ 6 files changed, 136 insertions(+), 119 deletions(-) diff --git a/src/mame/audio/subs.c b/src/mame/audio/subs.c index 286ac5c5ded..b4511bc6430 100644 --- a/src/mame/audio/subs.c +++ b/src/mame/audio/subs.c @@ -12,27 +12,27 @@ sub sound functions ***************************************************************************/ -WRITE8_MEMBER(subs_state::subs_sonar1_w) +WRITE8_MEMBER(subs_state::sonar1_w) { m_discrete->write(space, SUBS_SONAR1_EN, offset & 0x01); } -WRITE8_MEMBER(subs_state::subs_sonar2_w) +WRITE8_MEMBER(subs_state::sonar2_w) { m_discrete->write(space, SUBS_SONAR2_EN, offset & 0x01); } -WRITE8_MEMBER(subs_state::subs_crash_w) +WRITE8_MEMBER(subs_state::crash_w) { m_discrete->write(space, SUBS_CRASH_EN, offset & 0x01); } -WRITE8_MEMBER(subs_state::subs_explode_w) +WRITE8_MEMBER(subs_state::explode_w) { m_discrete->write(space, SUBS_EXPLODE_EN, offset & 0x01); } -WRITE8_MEMBER(subs_state::subs_noise_reset_w) +WRITE8_MEMBER(subs_state::noise_reset_w) { /* Pulse noise reset */ m_discrete->write(space, SUBS_NOISE_RESET, 0); diff --git a/src/mame/drivers/sub.c b/src/mame/drivers/sub.c index d9b807cdc12..11a3100c313 100644 --- a/src/mame/drivers/sub.c +++ b/src/mame/drivers/sub.c @@ -119,39 +119,45 @@ class sub_state : public driver_device public: sub_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_soundcpu(*this, "soundcpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), m_attr(*this, "attr"), m_vid(*this, "vid"), m_spriteram(*this, "spriteram"), m_spriteram2(*this, "spriteram2"), - m_scrolly(*this, "scrolly"), - m_maincpu(*this, "maincpu"), - m_soundcpu(*this, "soundcpu"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_scrolly(*this, "scrolly") { } + + required_device m_maincpu; + required_device m_soundcpu; + required_device m_gfxdecode; + required_device m_palette; required_shared_ptr m_attr; required_shared_ptr m_vid; required_shared_ptr m_spriteram; required_shared_ptr m_spriteram2; required_shared_ptr m_scrolly; + UINT8 m_nmi_en; - DECLARE_WRITE8_MEMBER(subm_to_sound_w); + + DECLARE_WRITE8_MEMBER(to_sound_w); DECLARE_WRITE8_MEMBER(nmi_mask_w); - virtual void video_start(); + + virtual void machine_start(); DECLARE_PALETTE_INIT(sub); - UINT32 screen_update_sub(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(subm_sound_irq); - required_device m_maincpu; - required_device m_soundcpu; - required_device m_gfxdecode; - required_device m_palette; + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + INTERRUPT_GEN_MEMBER(sound_irq); }; -void sub_state::video_start() +void sub_state::machine_start() { + save_item(NAME(m_nmi_en)); } -UINT32 sub_state::screen_update_sub(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 sub_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { gfx_element *gfx = m_gfxdecode->gfx(0); gfx_element *gfx_1 = m_gfxdecode->gfx(1); @@ -255,7 +261,7 @@ static ADDRESS_MAP_START( subm_map, AS_PROGRAM, 8, sub_state ) AM_RANGE(0xf060, 0xf060) AM_READ_PORT("IN0") ADDRESS_MAP_END -WRITE8_MEMBER(sub_state::subm_to_sound_w) +WRITE8_MEMBER(sub_state::to_sound_w) { soundlatch_byte_w(space, 0, data & 0xff); m_soundcpu->set_input_line(0, HOLD_LINE); @@ -268,7 +274,7 @@ WRITE8_MEMBER(sub_state::nmi_mask_w) static ADDRESS_MAP_START( subm_io, AS_IO, 8, sub_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_READ(soundlatch2_byte_r) AM_WRITE(subm_to_sound_w) // to/from sound CPU + AM_RANGE(0x00, 0x00) AM_READ(soundlatch2_byte_r) AM_WRITE(to_sound_w) // to/from sound CPU ADDRESS_MAP_END static ADDRESS_MAP_START( subm_sound_map, AS_PROGRAM, 8, sub_state ) @@ -425,7 +431,7 @@ PALETTE_INIT_MEMBER(sub_state, sub) } -INTERRUPT_GEN_MEMBER(sub_state::subm_sound_irq) +INTERRUPT_GEN_MEMBER(sub_state::sound_irq) { if(m_nmi_en) m_soundcpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); @@ -442,7 +448,7 @@ static MACHINE_CONFIG_START( sub, sub_state ) MCFG_CPU_ADD("soundcpu", Z80,MASTER_CLOCK/6) /* ? MHz */ MCFG_CPU_PROGRAM_MAP(subm_sound_map) MCFG_CPU_IO_MAP(subm_sound_io) - MCFG_CPU_PERIODIC_INT_DRIVER(sub_state, subm_sound_irq, 120) //??? + MCFG_CPU_PERIODIC_INT_DRIVER(sub_state, sound_irq, 120) //??? /* video hardware */ @@ -451,7 +457,7 @@ static MACHINE_CONFIG_START( sub, sub_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE_DRIVER(sub_state, screen_update_sub) + MCFG_SCREEN_UPDATE_DRIVER(sub_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", sub) @@ -502,4 +508,4 @@ ROM_START( sub ) ROM_LOAD( "prom pos c8 n82s129", 0x0600, 0x100, CRC(351e1ef8) SHA1(530c9012ff5abda1c4ba9787ca999ca1ae1a893d) ) ROM_END -GAME( 1985, sub, 0, sub, sub, driver_device, 0, ROT270, "Sigma Enterprises Inc.", "Submarine (Sigma)", GAME_NO_COCKTAIL ) +GAME( 1985, sub, 0, sub, sub, driver_device, 0, ROT270, "Sigma Enterprises Inc.", "Submarine (Sigma)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/subs.c b/src/mame/drivers/subs.c index 4e45a78fdd5..327dfcdf941 100644 --- a/src/mame/drivers/subs.c +++ b/src/mame/drivers/subs.c @@ -47,21 +47,21 @@ PALETTE_INIT_MEMBER(subs_state, subs) static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, subs_state ) ADDRESS_MAP_GLOBAL_MASK(0x3fff) - AM_RANGE(0x0000, 0x0000) AM_WRITE(subs_noise_reset_w) - AM_RANGE(0x0000, 0x0007) AM_READ(subs_control_r) - AM_RANGE(0x0020, 0x0020) AM_WRITE(subs_steer_reset_w) - AM_RANGE(0x0020, 0x0027) AM_READ(subs_coin_r) -// AM_RANGE(0x0040, 0x0040) AM_WRITE(subs_timer_reset_w) - AM_RANGE(0x0060, 0x0063) AM_READ(subs_options_r) - AM_RANGE(0x0060, 0x0061) AM_WRITE(subs_lamp1_w) - AM_RANGE(0x0062, 0x0063) AM_WRITE(subs_lamp2_w) - AM_RANGE(0x0064, 0x0065) AM_WRITE(subs_sonar2_w) - AM_RANGE(0x0066, 0x0067) AM_WRITE(subs_sonar1_w) + AM_RANGE(0x0000, 0x0000) AM_WRITE(noise_reset_w) + AM_RANGE(0x0000, 0x0007) AM_READ(control_r) + AM_RANGE(0x0020, 0x0020) AM_WRITE(steer_reset_w) + AM_RANGE(0x0020, 0x0027) AM_READ(coin_r) +// AM_RANGE(0x0040, 0x0040) AM_WRITE(timer_reset_w) + AM_RANGE(0x0060, 0x0063) AM_READ(options_r) + AM_RANGE(0x0060, 0x0061) AM_WRITE(lamp1_w) + AM_RANGE(0x0062, 0x0063) AM_WRITE(lamp2_w) + AM_RANGE(0x0064, 0x0065) AM_WRITE(sonar2_w) + AM_RANGE(0x0066, 0x0067) AM_WRITE(sonar1_w) // Schematics show crash and explode reversed. But this is proper. - AM_RANGE(0x0068, 0x0069) AM_WRITE(subs_explode_w) - AM_RANGE(0x006a, 0x006b) AM_WRITE(subs_crash_w) - AM_RANGE(0x006c, 0x006d) AM_WRITE(subs_invert1_w) - AM_RANGE(0x006e, 0x006f) AM_WRITE(subs_invert2_w) + AM_RANGE(0x0068, 0x0069) AM_WRITE(explode_w) + AM_RANGE(0x006a, 0x006b) AM_WRITE(crash_w) + AM_RANGE(0x006c, 0x006d) AM_WRITE(invert1_w) + AM_RANGE(0x006e, 0x006f) AM_WRITE(invert2_w) AM_RANGE(0x0090, 0x009f) AM_SHARE("spriteram") AM_RANGE(0x0000, 0x01ff) AM_RAM AM_RANGE(0x0800, 0x0bff) AM_RAM AM_SHARE("videoram") @@ -179,7 +179,7 @@ static MACHINE_CONFIG_START( subs, subs_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502,12096000/16) /* clock input is the "4H" signal */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_PERIODIC_INT_DRIVER(subs_state, subs_interrupt, 4*57) + MCFG_CPU_PERIODIC_INT_DRIVER(subs_state, interrupt, 4*57) /* video hardware */ @@ -195,7 +195,7 @@ static MACHINE_CONFIG_START( subs, subs_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE_DRIVER(subs_state, screen_update_subs_left) + MCFG_SCREEN_UPDATE_DRIVER(subs_state, screen_update_left) MCFG_SCREEN_PALETTE("palette") MCFG_SCREEN_ADD("rscreen", RASTER) @@ -203,7 +203,7 @@ static MACHINE_CONFIG_START( subs, subs_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE_DRIVER(subs_state, screen_update_subs_right) + MCFG_SCREEN_UPDATE_DRIVER(subs_state, screen_update_right) MCFG_SCREEN_PALETTE("palette") @@ -250,4 +250,4 @@ ROM_END * *************************************/ -GAME( 1977, subs, 0, subs, subs, driver_device, 0, ROT0, "Atari", "Subs", GAME_IMPERFECT_SOUND ) +GAME( 1977, subs, 0, subs, subs, driver_device, 0, ROT0, "Atari", "Subs", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/subs.h b/src/mame/includes/subs.h index 72ca1adf0f1..1b9629a7b29 100644 --- a/src/mame/includes/subs.h +++ b/src/mame/includes/subs.h @@ -21,45 +21,53 @@ class subs_state : public driver_device public: subs_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_spriteram(*this, "spriteram"), - m_videoram(*this, "videoram"), - m_discrete(*this, "discrete"), m_maincpu(*this, "maincpu"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette"), + m_discrete(*this, "discrete"), + m_spriteram(*this, "spriteram"), + m_videoram(*this, "videoram") { } + + required_device m_maincpu; + required_device m_gfxdecode; + required_device m_palette; + required_device m_discrete; required_shared_ptr m_spriteram; required_shared_ptr m_videoram; - required_device m_discrete; + int m_steering_buf1; int m_steering_buf2; int m_steering_val1; int m_steering_val2; int m_last_val_1; int m_last_val_2; - DECLARE_WRITE8_MEMBER(subs_steer_reset_w); - DECLARE_READ8_MEMBER(subs_control_r); - DECLARE_READ8_MEMBER(subs_coin_r); - DECLARE_READ8_MEMBER(subs_options_r); - DECLARE_WRITE8_MEMBER(subs_lamp1_w); - DECLARE_WRITE8_MEMBER(subs_lamp2_w); - DECLARE_WRITE8_MEMBER(subs_invert1_w); - DECLARE_WRITE8_MEMBER(subs_invert2_w); + + DECLARE_WRITE8_MEMBER(steer_reset_w); + DECLARE_READ8_MEMBER(control_r); + DECLARE_READ8_MEMBER(coin_r); + DECLARE_READ8_MEMBER(options_r); + DECLARE_WRITE8_MEMBER(lamp1_w); + DECLARE_WRITE8_MEMBER(lamp2_w); + DECLARE_WRITE8_MEMBER(invert1_w); + DECLARE_WRITE8_MEMBER(invert2_w); + DECLARE_WRITE8_MEMBER(sonar1_w); + DECLARE_WRITE8_MEMBER(sonar2_w); + DECLARE_WRITE8_MEMBER(crash_w); + DECLARE_WRITE8_MEMBER(explode_w); + DECLARE_WRITE8_MEMBER(noise_reset_w); + + virtual void machine_start(); virtual void machine_reset(); DECLARE_PALETTE_INIT(subs); - UINT32 screen_update_subs_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - UINT32 screen_update_subs_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(subs_interrupt); - DECLARE_WRITE8_MEMBER(subs_sonar1_w); - DECLARE_WRITE8_MEMBER(subs_sonar2_w); - DECLARE_WRITE8_MEMBER(subs_crash_w); - DECLARE_WRITE8_MEMBER(subs_explode_w); - DECLARE_WRITE8_MEMBER(subs_noise_reset_w); - int subs_steering_1(); - int subs_steering_2(); - required_device m_maincpu; - required_device m_gfxdecode; - required_device m_palette; + + UINT32 screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + UINT32 screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + INTERRUPT_GEN_MEMBER(interrupt); + + int steering_1(); + int steering_2(); }; /*----------- defined in audio/subs.c -----------*/ diff --git a/src/mame/machine/subs.c b/src/mame/machine/subs.c index 9947a95ac4b..b16c52671c7 100644 --- a/src/mame/machine/subs.c +++ b/src/mame/machine/subs.c @@ -9,8 +9,19 @@ /*************************************************************************** -subs_init_machine +machine initialization ***************************************************************************/ + +void subs_state::machine_start() +{ + save_item(NAME(m_steering_buf1)); + save_item(NAME(m_steering_buf2)); + save_item(NAME(m_steering_val1)); + save_item(NAME(m_steering_val2)); + save_item(NAME(m_last_val_1)); + save_item(NAME(m_last_val_2)); +} + void subs_state::machine_reset() { m_steering_buf1 = 0; @@ -20,9 +31,9 @@ void subs_state::machine_reset() } /*************************************************************************** -subs_interrupt +interrupt ***************************************************************************/ -INTERRUPT_GEN_MEMBER(subs_state::subs_interrupt) +INTERRUPT_GEN_MEMBER(subs_state::interrupt) { /* only do NMI interrupt if not in TEST mode */ if ((ioport("IN1")->read() & 0x40)==0x40) @@ -36,7 +47,7 @@ When D7 is high, the steering wheel has moved. If D6 is high, it moved left. If D6 is low, it moved right. Be sure to keep returning a direction until steer_reset is called. ***************************************************************************/ -int subs_state::subs_steering_1() +int subs_state::steering_1() { int this_val; int delta; @@ -64,7 +75,7 @@ int subs_state::subs_steering_1() return m_steering_val1; } -int subs_state::subs_steering_2() +int subs_state::steering_2() { int this_val; int delta; @@ -93,18 +104,18 @@ int subs_state::subs_steering_2() } /*************************************************************************** -subs_steer_reset +steer_reset ***************************************************************************/ -WRITE8_MEMBER(subs_state::subs_steer_reset_w) +WRITE8_MEMBER(subs_state::steer_reset_w) { m_steering_val1 = 0x00; m_steering_val2 = 0x00; } /*************************************************************************** -subs_control_r +control_r ***************************************************************************/ -READ8_MEMBER(subs_state::subs_control_r) +READ8_MEMBER(subs_state::control_r) { int inport = ioport("IN0")->read(); @@ -114,19 +125,19 @@ READ8_MEMBER(subs_state::subs_control_r) case 0x01: return ((inport & 0x02) << 6); /* diag hold */ case 0x02: return ((inport & 0x04) << 5); /* slam */ case 0x03: return ((inport & 0x08) << 4); /* spare */ - case 0x04: return ((subs_steering_1() & 0x40) << 1); /* steer dir 1 */ - case 0x05: return ((subs_steering_1() & 0x80) << 0); /* steer flag 1 */ - case 0x06: return ((subs_steering_2() & 0x40) << 1); /* steer dir 2 */ - case 0x07: return ((subs_steering_2() & 0x80) << 0); /* steer flag 2 */ + case 0x04: return ((steering_1() & 0x40) << 1); /* steer dir 1 */ + case 0x05: return ((steering_1() & 0x80) << 0); /* steer flag 1 */ + case 0x06: return ((steering_2() & 0x40) << 1); /* steer dir 2 */ + case 0x07: return ((steering_2() & 0x80) << 0); /* steer flag 2 */ } return 0; } /*************************************************************************** -subs_coin_r +coin_r ***************************************************************************/ -READ8_MEMBER(subs_state::subs_coin_r) +READ8_MEMBER(subs_state::coin_r) { int inport = ioport("IN1")->read(); @@ -146,9 +157,9 @@ READ8_MEMBER(subs_state::subs_coin_r) } /*************************************************************************** -subs_options_r +options_r ***************************************************************************/ -READ8_MEMBER(subs_state::subs_options_r) +READ8_MEMBER(subs_state::options_r) { int opts = ioport("DSW")->read(); @@ -164,17 +175,17 @@ READ8_MEMBER(subs_state::subs_options_r) } /*************************************************************************** -subs_lamp1_w +lamp1_w ***************************************************************************/ -WRITE8_MEMBER(subs_state::subs_lamp1_w) +WRITE8_MEMBER(subs_state::lamp1_w) { set_led_status(machine(), 0,~offset & 1); } /*************************************************************************** -subs_lamp2_w +lamp2_w ***************************************************************************/ -WRITE8_MEMBER(subs_state::subs_lamp2_w) +WRITE8_MEMBER(subs_state::lamp2_w) { set_led_status(machine(), 1,~offset & 1); } diff --git a/src/mame/video/subs.c b/src/mame/video/subs.c index 52a3462a167..eca6b79a098 100644 --- a/src/mame/video/subs.c +++ b/src/mame/video/subs.c @@ -8,7 +8,7 @@ #include "includes/subs.h" #include "sound/discrete.h" -WRITE8_MEMBER(subs_state::subs_invert1_w) +WRITE8_MEMBER(subs_state::invert1_w) { if ((offset & 0x01) == 1) { @@ -22,7 +22,7 @@ WRITE8_MEMBER(subs_state::subs_invert1_w) } } -WRITE8_MEMBER(subs_state::subs_invert2_w) +WRITE8_MEMBER(subs_state::invert2_w) { if ((offset & 0x01) == 1) { @@ -37,15 +37,11 @@ WRITE8_MEMBER(subs_state::subs_invert2_w) } -UINT32 subs_state::screen_update_subs_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 subs_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - UINT8 *videoram = m_videoram; - UINT8 *spriteram = m_spriteram; - int offs; - /* for every character in the Video RAM, check if it has been modified */ /* since last time and update it accordingly. */ - for (offs = 0x400 - 1; offs >= 0; offs--) + for (int offs = 0x400 - 1; offs >= 0; offs--) { int charcode; int sx,sy; @@ -55,7 +51,7 @@ UINT32 subs_state::screen_update_subs_left(screen_device &screen, bitmap_ind16 & left_sonar_window = 0; right_sonar_window = 0; - charcode = videoram[offs]; + charcode = m_videoram[offs]; /* Which monitor is this for? */ // right_enable = charcode & 0x40; @@ -84,18 +80,18 @@ UINT32 subs_state::screen_update_subs_left(screen_device &screen, bitmap_ind16 & } /* draw the motion objects */ - for (offs = 0; offs < 4; offs++) + for (int offs = 0; offs < 4; offs++) { int sx,sy; int charcode; int prom_set; int sub_enable; - sx = spriteram[0x00 + (offs * 2)] - 16; - sy = spriteram[0x08 + (offs * 2)] - 16; - charcode = spriteram[0x09 + (offs * 2)]; + sx = m_spriteram[0x00 + (offs * 2)] - 16; + sy = m_spriteram[0x08 + (offs * 2)] - 16; + charcode = m_spriteram[0x09 + (offs * 2)]; if (offs < 2) - sub_enable = spriteram[0x01 + (offs * 2)] & 0x80; + sub_enable = m_spriteram[0x01 + (offs * 2)] & 0x80; else sub_enable = 1; @@ -112,20 +108,16 @@ UINT32 subs_state::screen_update_subs_left(screen_device &screen, bitmap_ind16 & /* Update sound */ address_space &space = machine().driver_data()->generic_space(); - m_discrete->write(space, SUBS_LAUNCH_DATA, spriteram[5] & 0x0f); // Launch data - m_discrete->write(space, SUBS_CRASH_DATA, spriteram[5] >> 4); // Crash/explode data + m_discrete->write(space, SUBS_LAUNCH_DATA, m_spriteram[5] & 0x0f); // Launch data + m_discrete->write(space, SUBS_CRASH_DATA, m_spriteram[5] >> 4); // Crash/explode data return 0; } -UINT32 subs_state::screen_update_subs_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 subs_state::screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - UINT8 *videoram = m_videoram; - UINT8 *spriteram = m_spriteram; - int offs; - /* for every character in the Video RAM, check if it has been modified */ /* since last time and update it accordingly. */ - for (offs = 0x400 - 1; offs >= 0; offs--) + for (int offs = 0x400 - 1; offs >= 0; offs--) { int charcode; int sx,sy; @@ -135,7 +127,7 @@ UINT32 subs_state::screen_update_subs_right(screen_device &screen, bitmap_ind16 left_sonar_window = 0; right_sonar_window = 0; - charcode = videoram[offs]; + charcode = m_videoram[offs]; /* Which monitor is this for? */ right_enable = charcode & 0x40; @@ -164,18 +156,18 @@ UINT32 subs_state::screen_update_subs_right(screen_device &screen, bitmap_ind16 } /* draw the motion objects */ - for (offs = 0; offs < 4; offs++) + for (int offs = 0; offs < 4; offs++) { int sx,sy; int charcode; int prom_set; int sub_enable; - sx = spriteram[0x00 + (offs * 2)] - 16; - sy = spriteram[0x08 + (offs * 2)] - 16; - charcode = spriteram[0x09 + (offs * 2)]; + sx = m_spriteram[0x00 + (offs * 2)] - 16; + sy = m_spriteram[0x08 + (offs * 2)] - 16; + charcode = m_spriteram[0x09 + (offs * 2)]; if (offs < 2) - sub_enable = spriteram[0x01 + (offs * 2)] & 0x80; + sub_enable = m_spriteram[0x01 + (offs * 2)] & 0x80; else sub_enable = 1; From ac34f207b4e78e2eed5a3825e0b1cd187776f40c Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Sun, 22 Mar 2015 09:34:09 +0100 Subject: [PATCH 152/201] rltennis.c: added save state support (nw) --- src/mame/drivers/rltennis.c | 30 +++++++++++++++++++----------- src/mame/includes/rltennis.h | 35 +++++++++++++++-------------------- src/mame/video/rltennis.c | 6 ++++-- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/mame/drivers/rltennis.c b/src/mame/drivers/rltennis.c index 26019dce032..40f3558cddc 100644 --- a/src/mame/drivers/rltennis.c +++ b/src/mame/drivers/rltennis.c @@ -69,17 +69,17 @@ player - when there's nothing to play - first, empty 2k of ROMs are selected. #define RLT_TIMER_FREQ (RLT_REFRESH_RATE*256) #define RLT_XTAL XTAL_12MHz -READ16_MEMBER(rltennis_state::rlt_io_r) +READ16_MEMBER(rltennis_state::io_r) { return (ioport("P1" )->read()&0x1fff) | (m_unk_counter<<13); /* top 3 bits controls smaple address update */ } -WRITE16_MEMBER(rltennis_state::rlt_snd1_w) +WRITE16_MEMBER(rltennis_state::snd1_w) { COMBINE_DATA(&m_data760000); } -WRITE16_MEMBER(rltennis_state::rlt_snd2_w) +WRITE16_MEMBER(rltennis_state::snd2_w) { COMBINE_DATA(&m_data740000); } @@ -88,15 +88,15 @@ static ADDRESS_MAP_START( rltennis_main, AS_PROGRAM, 16, rltennis_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") AM_RANGE(0x200000, 0x20ffff) AM_RAM - AM_RANGE(0x700000, 0x70000f) AM_WRITE(rlt_blitter_w) + AM_RANGE(0x700000, 0x70000f) AM_WRITE(blitter_w) AM_RANGE(0x720000, 0x720001) AM_DEVWRITE8("ramdac",ramdac_device,index_w,0x00ff) AM_RANGE(0x720002, 0x720003) AM_DEVREADWRITE8("ramdac",ramdac_device,pal_r,pal_w,0x00ff) AM_RANGE(0x720006, 0x720007) AM_DEVWRITE8("ramdac",ramdac_device,index_r_w,0x00ff) - AM_RANGE(0x740000, 0x740001) AM_WRITE(rlt_snd1_w) - AM_RANGE(0x760000, 0x760001) AM_WRITE(rlt_snd2_w) + AM_RANGE(0x740000, 0x740001) AM_WRITE(snd1_w) + AM_RANGE(0x760000, 0x760001) AM_WRITE(snd2_w) AM_RANGE(0x780000, 0x780001) AM_WRITENOP /* sound control, unknown, usually = 0x0044 */ AM_RANGE(0x7a0000, 0x7a0003) AM_READNOP /* unknown, read only at boot time*/ - AM_RANGE(0x7e0000, 0x7e0001) AM_READ(rlt_io_r) + AM_RANGE(0x7e0000, 0x7e0001) AM_READ(io_r) AM_RANGE(0x7e0002, 0x7e0003) AM_READ_PORT("P2") ADDRESS_MAP_END @@ -144,7 +144,7 @@ TIMER_CALLBACK_MEMBER(rltennis_state::sample_player) m_timer->adjust(attotime::from_hz( RLT_TIMER_FREQ )); } -INTERRUPT_GEN_MEMBER(rltennis_state::rltennis_interrupt) +INTERRUPT_GEN_MEMBER(rltennis_state::interrupt) { ++m_unk_counter; /* frame counter? verify */ device.execute().set_input_line(4, HOLD_LINE); @@ -157,6 +157,14 @@ void rltennis_state::machine_start() m_samples_2 = memregion("samples2")->base(); m_gfx = memregion("gfx1")->base(); m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(rltennis_state::sample_player),this)); + + save_item(NAME(m_data760000)); + save_item(NAME(m_data740000)); + save_item(NAME(m_dac_counter)); + save_item(NAME(m_sample_rom_offset_1)); + save_item(NAME(m_sample_rom_offset_2)); + save_item(NAME(m_offset_shift)); + save_item(NAME(m_unk_counter)); } void rltennis_state::machine_reset() @@ -172,13 +180,13 @@ static MACHINE_CONFIG_START( rltennis, rltennis_state ) MCFG_CPU_ADD("maincpu", M68000, RLT_XTAL/2) /* 68000P8 ??? */ MCFG_CPU_PROGRAM_MAP(rltennis_main) - MCFG_CPU_VBLANK_INT_DRIVER("screen", rltennis_state, rltennis_interrupt) + MCFG_CPU_VBLANK_INT_DRIVER("screen", rltennis_state, interrupt) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( RLT_REFRESH_RATE ) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0,319, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(rltennis_state, screen_update_rltennis) + MCFG_SCREEN_UPDATE_DRIVER(rltennis_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD("palette", 256) @@ -221,4 +229,4 @@ ROM_START( rltennis ) ROM_LOAD( "tennis_3.u52", 0x00000, 0x80000, CRC(517dcd0e) SHA1(b2703e185ee8cf7e115ea07151e7bee8be34948b) ) ROM_END -GAME( 1993, rltennis, 0, rltennis, rltennis, driver_device, 0, ROT0, "TCH", "Reality Tennis", GAME_IMPERFECT_GRAPHICS) +GAME( 1993, rltennis, 0, rltennis, rltennis, driver_device, 0, ROT0, "TCH", "Reality Tennis", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/rltennis.h b/src/mame/includes/rltennis.h index bfc60e1d400..fb02b1a41b5 100644 --- a/src/mame/includes/rltennis.h +++ b/src/mame/includes/rltennis.h @@ -10,45 +10,40 @@ public: rltennis_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_data760000(0), m_data740000(0), m_dac_counter(0), m_sample_rom_offset_1(0), m_sample_rom_offset_2(0), - m_offset_shift(0), m_dac_1(*this, "dac1"), - m_dac_2(*this, "dac2") { } + m_dac_2(*this, "dac2"), + m_data760000(0), m_data740000(0), m_dac_counter(0), m_sample_rom_offset_1(0), m_sample_rom_offset_2(0), + m_offset_shift(0) { } required_device m_maincpu; - + required_device m_dac_1; + required_device m_dac_2; + UINT16 m_blitter[RLT_NUM_BLITTER_REGS]; - INT32 m_data760000; INT32 m_data740000; INT32 m_dac_counter; INT32 m_sample_rom_offset_1; INT32 m_sample_rom_offset_2; - INT32 m_offset_shift; - INT32 m_unk_counter; - bitmap_ind16 *m_tmp_bitmap[RLT_NUM_BITMAPS]; - - required_device m_dac_1; - required_device m_dac_2; - UINT8 *m_samples_1; UINT8 *m_samples_2; - UINT8 *m_gfx; - emu_timer *m_timer; - DECLARE_READ16_MEMBER(rlt_io_r); - DECLARE_WRITE16_MEMBER(rlt_snd1_w); - DECLARE_WRITE16_MEMBER(rlt_snd2_w); - DECLARE_WRITE16_MEMBER(rlt_blitter_w); + DECLARE_READ16_MEMBER(io_r); + DECLARE_WRITE16_MEMBER(snd1_w); + DECLARE_WRITE16_MEMBER(snd2_w); + DECLARE_WRITE16_MEMBER(blitter_w); + virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); - UINT32 screen_update_rltennis(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(rltennis_interrupt); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + INTERRUPT_GEN_MEMBER(interrupt); TIMER_CALLBACK_MEMBER(sample_player); }; diff --git a/src/mame/video/rltennis.c b/src/mame/video/rltennis.c index 6ce70857c74..993e719d08a 100644 --- a/src/mame/video/rltennis.c +++ b/src/mame/video/rltennis.c @@ -110,7 +110,7 @@ enum #define SRC_SHIFT 8 -WRITE16_MEMBER(rltennis_state::rlt_blitter_w) +WRITE16_MEMBER(rltennis_state::blitter_w) { int old_data=m_blitter[offset]; COMBINE_DATA(&m_blitter[offset]); @@ -224,9 +224,11 @@ void rltennis_state::video_start() m_tmp_bitmap[BITMAP_FG_1] = auto_bitmap_ind16_alloc(machine(), 512, 256); m_tmp_bitmap[BITMAP_FG_2] = auto_bitmap_ind16_alloc(machine(), 512, 256); m_tmp_bitmap[BITMAP_FG_DISPLAY] = auto_bitmap_ind16_alloc(machine(), 512, 256); + + save_item(NAME(m_blitter)); } -UINT32 rltennis_state::screen_update_rltennis(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 rltennis_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { copybitmap(bitmap, *m_tmp_bitmap[BITMAP_BG], 0, 0, 0, 0, cliprect); copybitmap_trans(bitmap, *m_tmp_bitmap[BITMAP_FG_DISPLAY], 0, 0, 0, 0, cliprect, 0); From b7dcf5cb588d3638416710499d3b2ed0fdfcdf29 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 22 Mar 2015 09:58:27 +0100 Subject: [PATCH 153/201] added darktower skeleton --- src/mess/drivers/hh_tms1k.c | 71 +++++++++++++++++++++++++++++++++++- src/mess/layout/ebball2.lay | 46 +++++++++++------------ src/mess/layout/ebball3.lay | 2 +- src/mess/layout/mbdtower.lay | 19 ++++++++++ src/mess/mess.lst | 1 + src/mess/mess.mak | 1 + 6 files changed, 113 insertions(+), 27 deletions(-) create mode 100644 src/mess/layout/mbdtower.lay diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index ef958c39920..39817dd91b6 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -48,7 +48,7 @@ *MP7303 TMS1400? 19??, Tiger 7-in-1 Sports Stadium @MP7313 TMS1400 1980, Parker Brothers Bank Shot @MP7314 TMS1400 1980, Parker Brothers Split Second - *MP7332 TMS1400 1981, Milton Bradley Dark Tower + @MP7332 TMS1400 1981, Milton Bradley Dark Tower @MP7334 TMS1400 1981, Coleco Total Control 4 inconsistent: @@ -84,9 +84,10 @@ #include "elecdet.lh" #include "comp4.lh" #include "mathmagi.lh" +#include "mbdtower.lh" #include "merlin.lh" // clickable #include "simon.lh" // clickable -#include "ssimon.lh" // clickable +#include "ssimon.lh" #include "splitsec.lh" #include "starwbc.lh" #include "stopthie.lh" @@ -194,6 +195,10 @@ public: DECLARE_WRITE16_MEMBER(ssimon_write_o); DECLARE_READ8_MEMBER(ssimon_read_k); + DECLARE_WRITE16_MEMBER(mbdtower_write_r); + DECLARE_WRITE16_MEMBER(mbdtower_write_o); + DECLARE_READ8_MEMBER(mbdtower_read_k); + DECLARE_WRITE16_MEMBER(cnsector_write_r); DECLARE_WRITE16_MEMBER(cnsector_write_o); DECLARE_READ8_MEMBER(cnsector_read_k); @@ -1676,6 +1681,56 @@ MACHINE_CONFIG_END +/*************************************************************************** + + Milton Bradley Dark Tower + * TMS1400 MP7332-N2LL (die labeled MP7332) + + x + +***************************************************************************/ + +WRITE16_MEMBER(hh_tms1k_state::mbdtower_write_r) +{ +} + +WRITE16_MEMBER(hh_tms1k_state::mbdtower_write_o) +{ +} + +READ8_MEMBER(hh_tms1k_state::mbdtower_read_k) +{ + return 0; +} + + +static INPUT_PORTS_START( mbdtower ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( mbdtower, hh_tms1k_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1400, 400000) // approximation - RC osc. R=43K, C=56pf, but unknown RC curve + MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, mbdtower_read_k)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, mbdtower_write_r)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, mbdtower_write_o)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_mbdtower) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + + /*************************************************************************** Parker Brothers Code Name: Sector, by Bob Doyle @@ -2455,6 +2510,17 @@ ROM_START( ssimon ) ROM_END +ROM_START( mbdtower ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_mbdtower_opla.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) +ROM_END + + ROM_START( cnsector ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) @@ -2562,6 +2628,7 @@ CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Ken CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE ) CONS( 1979, ssimon, 0, 0, ssimon, ssimon, driver_device, 0, "Milton Bradley", "Super Simon", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, driver_device, 0, "Milton Bradley", "Dark Tower (Milton Bradley)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) // *** CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // *** CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin - The Electronic Wizard", GAME_SUPPORTS_SAVE ) diff --git a/src/mess/layout/ebball2.lay b/src/mess/layout/ebball2.lay index 525d4219af4..91d3427f5e3 100644 --- a/src/mess/layout/ebball2.lay +++ b/src/mess/layout/ebball2.lay @@ -74,38 +74,36 @@ - + - - - + + + - - - - + + + + - - - + + + - - + + + - - + - - + + + - - + + - - - - - + + diff --git a/src/mess/layout/ebball3.lay b/src/mess/layout/ebball3.lay index ac22cde7ead..3e6a5df9031 100644 --- a/src/mess/layout/ebball3.lay +++ b/src/mess/layout/ebball3.lay @@ -121,7 +121,7 @@ - + diff --git a/src/mess/layout/mbdtower.lay b/src/mess/layout/mbdtower.lay new file mode 100644 index 00000000000..940ef1a955e --- /dev/null +++ b/src/mess/layout/mbdtower.lay @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 54dd74e7e2e..315d92650a9 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2203,6 +2203,7 @@ starwbcp // Kenner (prototype) comp4 // Milton Bradley simon // Milton Bradley ssimon // Milton Bradley +mbdtower // Milton Bradley cnsector // Parker Bros merlin // Parker Bros stopthie // Parker Bros diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 146e69b9665..46470db1236 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -2143,6 +2143,7 @@ $(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \ $(MESS_LAYOUT)/ebball3.lh \ $(MESS_LAYOUT)/elecdet.lh \ $(MESS_LAYOUT)/mathmagi.lh \ + $(MESS_LAYOUT)/mbdtower.lh \ $(MESS_LAYOUT)/merlin.lh \ $(MESS_LAYOUT)/simon.lh \ $(MESS_LAYOUT)/ssimon.lh \ From ba0a29334a8edc0224b6e57d38ff6c809f2fa4ee Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sun, 22 Mar 2015 11:10:42 +0000 Subject: [PATCH 154/201] new clones Willow (World) [Jets (from Emu-france) and Layer (from Neo-arcadia)] --- src/mame/drivers/cps1.c | 52 +++++++++++++++++++++++++++++++++++++---- src/mame/mame.lst | 5 ++-- src/mame/video/cps1.c | 3 ++- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/mame/drivers/cps1.c b/src/mame/drivers/cps1.c index 4b9fecc0e5f..32ffdd00d1c 100644 --- a/src/mame/drivers/cps1.c +++ b/src/mame/drivers/cps1.c @@ -224,7 +224,7 @@ Stephh's log (2006.09.20) : - Applied these changes to src/drivers/fcrash.c as well. - Added debug features in the following sets : * 'ghoulsu' - * 'willow', 'willowo' and 'willowj' + * 'willowu', 'willowou' and 'willowj' - Checked sets with no debug features : * 'forgottnua' and 'lostwrld' * 'ghouls' and 'daimakai' @@ -4225,6 +4225,49 @@ ROM_END /* B-Board 89624B-3 */ ROM_START( willow ) + ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "wle_30.11f", 0x00000, 0x20000, CRC(15372aa2) SHA1(ba8e1984180b0438255dfc68dc4eb560f3ecbe56) ) + ROM_LOAD16_BYTE( "wle_35.11h", 0x00001, 0x20000, CRC(2e64623b) SHA1(473f6fd10b2456553f1cbf92fd9a61ce94b1c59f) ) + ROM_LOAD16_BYTE( "wlu_31.12f", 0x40000, 0x20000, CRC(0eb48a83) SHA1(28c40c4b5d767f88922cd899e948abf11a85a864) ) + ROM_LOAD16_BYTE( "wlu_36.12h", 0x40001, 0x20000, CRC(36100209) SHA1(63c9338e71dba8b52daffba50b4bca31aaa10d9e) ) + ROM_LOAD16_WORD_SWAP( "wlm-32.8h", 0x80000, 0x80000, CRC(dfd9f643) SHA1(9c760c30af593a87e7fd39fb213a4c73c68ca440) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROMX_LOAD( "wlm-7.7a", 0x000000, 0x80000, CRC(afa74b73) SHA1(09081926260c76986a13ac5351dddd2ea11d7a10) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "5" socket + ROMX_LOAD( "wlm-5.9a", 0x000002, 0x80000, CRC(12a0dc0b) SHA1(fea235ce9489f04919daf52f4d3f3bac9b558316) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "7" socket + ROMX_LOAD( "wlm-3.3a", 0x000004, 0x80000, CRC(c6f2abce) SHA1(ff5fcfe417c43b4747bbe12db6052fdb60f5f0e4) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "1" socket + ROMX_LOAD( "wlm-1.5a", 0x000006, 0x80000, CRC(4aa4c6d3) SHA1(7dd6f18f6126c380821a2ca8955439fd6864f4c6) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "3" socket + ROMX_LOAD( "wl_24.7d", 0x200000, 0x20000, CRC(6f0adee5) SHA1(07b18e51b376001f25173b78e0e816f252400210) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_14.7c", 0x200001, 0x20000, CRC(9cf3027d) SHA1(1e8eb20d51a54f6f756c0ab9395ac38b96e67fb2) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_26.9d", 0x200002, 0x20000, CRC(f09c8ecf) SHA1(b39f83e80af010d6481693d9ec8b1d7e258b531d) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_16.9c", 0x200003, 0x20000, CRC(e35407aa) SHA1(7ddae9cef96839da72488c1fe73268c50e0262ff) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_20.3d", 0x200004, 0x20000, CRC(84992350) SHA1(f0ebd810ce099337cda94222dccce8ab9b3c3281) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_10.3c", 0x200005, 0x20000, CRC(b87b5a36) SHA1(25fb8f9698142473233ee509d4146089920e94e1) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_22.5d", 0x200006, 0x20000, CRC(fd3f89f0) SHA1(51ff95cff56ac78682ea56401b35a0aa63cef8cb) , ROM_SKIP(7) ) + ROMX_LOAD( "wl_12.5c", 0x200007, 0x20000, CRC(7da49d69) SHA1(b0ae7ac4f858ee8d72e6877c4275da7a631e2e4c) , ROM_SKIP(7) ) + + ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "wl_09.12b", 0x00000, 0x08000, CRC(f6b3d060) SHA1(0ed2e2f64ba53ba2c371b66ab1e52e40b16d8baf) ) + ROM_CONTINUE( 0x10000, 0x08000 ) + + ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ + ROM_LOAD( "wl_18.11c", 0x00000, 0x20000, CRC(bde23d4d) SHA1(d1fee2f99c858dfb07edcd600da491c7b656afe0) ) + ROM_LOAD( "wl_19.12c", 0x20000, 0x20000, CRC(683898f5) SHA1(316a77b663d78c8b9ff6d85756cb05aaaeef4003) ) + + ROM_REGION( 0x0200, "aboardplds", 0 ) + ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) + ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) ) + ROM_LOAD( "prg1", 0x0000, 0x0117, CRC(f1129744) SHA1(a5300f301c1a08a7da768f0773fa0fe3f683b237) ) + ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) + ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) + + ROM_REGION( 0x0200, "bboardplds", 0 ) + ROM_LOAD( "wl24b.1a", 0x0000, 0x0117, CRC(7101cdf1) SHA1(c848f109d09641b3159dbbb2d2ee49cf30bc9e9c) ) + ROM_LOAD( "lwio.11e", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) +ROM_END + +/* B-Board 89624B-3 */ +ROM_START( willowu ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "wlu_30.11f", 0x00000, 0x20000, CRC(d604dbb1) SHA1(b5d78871011ff11a67f1a0cad147cd4de8d67f35) ) ROM_LOAD16_BYTE( "35.11h", 0x00001, 0x20000, CRC(7a791e77) SHA1(fe1429588b7eceab1d369abe03f2cad8de727f71) ) @@ -4270,7 +4313,7 @@ ROM_END /* Note that this set comes from a pcb running on an original Capcom USA Willow arcade cabinet, so even if there is the Japan "warning" it's confirmed to be a genuine USA set and almost certainly the first USA release. Then Capcom removed the incorrect "warning" releasing a new proper set of Willow (USA), as documented above. */ -ROM_START( willowo ) +ROM_START( willowuo ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "wlu_30.11f", 0x00000, 0x20000, CRC(d604dbb1) SHA1(b5d78871011ff11a67f1a0cad147cd4de8d67f35) ) ROM_LOAD16_BYTE( "wlu_35.11h", 0x00001, 0x20000, CRC(daee72fe) SHA1(2ec62f44394fac2887821881f56b6f24d05234b3) ) @@ -11637,8 +11680,9 @@ GAME( 1989, dynwar, 0, cps1_10MHz, dynwar, cps_state, cps1, GAME( 1989, dynwara, dynwar, cps1_10MHz, dynwar, cps_state, cps1, ROT0, "Capcom", "Dynasty Wars (USA, B-Board 88622B-3)", GAME_SUPPORTS_SAVE ) // (c) Capcom U.S.A. GAME( 1989, dynwarj, dynwar, cps1_10MHz, dynwar, cps_state, cps1, ROT0, "Capcom", "Tenchi wo Kurau (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1989, dynwarjr, dynwar, cps1_12MHz, dynwar, cps_state, cps1, ROT0, "Capcom", "Tenchi wo Kurau (Japan Resale Ver.)", GAME_SUPPORTS_SAVE ) // 12MHz verified -GAME( 1989, willow, 0, cps1_10MHz, willow, cps_state, cps1, ROT0, "Capcom", "Willow (USA)", GAME_SUPPORTS_SAVE ) -GAME( 1989, willowo, willow, cps1_10MHz, willow, cps_state, cps1, ROT0, "Capcom", "Willow (USA Old Ver.)", GAME_SUPPORTS_SAVE ) // Japan "warning" but (c) Capcom U.S.A. +GAME( 1989, willow, 0, cps1_10MHz, willow, cps_state, cps1, ROT0, "Capcom", "Willow (World)", GAME_SUPPORTS_SAVE ) // No "Warning" (c) Capcom U.S.A., genuine export ROM labels +GAME( 1989, willowu, willow, cps1_10MHz, willow, cps_state, cps1, ROT0, "Capcom", "Willow (USA)", GAME_SUPPORTS_SAVE ) +GAME( 1989, willowuo, willow, cps1_10MHz, willow, cps_state, cps1, ROT0, "Capcom", "Willow (USA Old Ver.)", GAME_SUPPORTS_SAVE ) // Japan "warning" but (c) Capcom U.S.A. GAME( 1989, willowj, willow, cps1_10MHz, willow, cps_state, cps1, ROT0, "Capcom", "Willow (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1989, unsquad, 0, cps1_10MHz, unsquad, cps_state, cps1, ROT0, "Capcom / Daipro", "U.N. Squadron (USA)", GAME_SUPPORTS_SAVE ) GAME( 1989, area88, unsquad, cps1_10MHz, unsquad, cps_state, cps1, ROT0, "Capcom / Daipro", "Area 88 (Japan)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index d9ef90e1fa2..ffd1409ea42 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -3109,8 +3109,9 @@ dynwar // 4/1989 (c) 1989 (USA) dynwara // 4/1989 (c) 1989 (USA) dynwarj // 4/1989 (c) 1989 (Japan) dynwarjr // 4/1989 (c) 1989 (Japan) -willow // 6/1989 (c) 1989 (USA) -willowo // 6/1989 (c) 1989 (USA) +willow // 6/1989 (c) 1989 (World) +willowu // 6/1989 (c) 1989 (USA) +willowuo // 6/1989 (c) 1989 (USA) willowj // 6/1989 (c) 1989 (Japan) unsquad // 8/1989 (c) 1989 (USA) area88 // 8/1989 (c) 1989 (Japan) diff --git a/src/mame/video/cps1.c b/src/mame/video/cps1.c index abf941d700e..83223de978e 100644 --- a/src/mame/video/cps1.c +++ b/src/mame/video/cps1.c @@ -1399,7 +1399,8 @@ static const struct CPS1config cps1_config_table[]= {"dynwarj", CPS_B_02, mapper_TK22B }, {"dynwarjr", CPS_B_21_DEF, mapper_TK22B }, // wrong, this set uses TK163B, still not dumped {"willow", CPS_B_03, mapper_WL24B }, - {"willowo", CPS_B_03, mapper_WL24B }, + {"willowu", CPS_B_03, mapper_WL24B }, + {"willowuo", CPS_B_03, mapper_WL24B }, {"willowj", CPS_B_03, mapper_WL24B }, // wrong, this set uses WL22B, still not dumped {"ffight", CPS_B_04, mapper_S224B }, {"ffighta", CPS_B_04, mapper_S224B }, From 6ce56b64db3039296847c3387884585b7082e0f7 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sun, 22 Mar 2015 11:48:50 +0000 Subject: [PATCH 155/201] ttchamp is the same kind of blitter madness as spider (nw) --- src/mame/drivers/ttchamp.c | 284 ++++++++++++++++++++----------------- 1 file changed, 154 insertions(+), 130 deletions(-) diff --git a/src/mame/drivers/ttchamp.c b/src/mame/drivers/ttchamp.c index 849c8797da6..f9618ea522b 100644 --- a/src/mame/drivers/ttchamp.c +++ b/src/mame/drivers/ttchamp.c @@ -1,8 +1,4 @@ -/* Peno Cup? - -no idea if this is the real title, I just see a large Peno Cup logo in the 2/3 roms - -looks like some kind of ping pong / tennis game? +/* Table Tennis Champions ? ___________________________________________________ | __ _________ __________ __________ | @@ -35,9 +31,32 @@ looks like some kind of ping pong / tennis game? The PCB is Spanish and manufacured by Gamart. ---- Need to work out how the program rom is banked ---- hw is similar to hotblock and twins +Table tennis Championships by Gamart 1995 +This game come from Gamart,an obscure spanish software house. +Hardware info: +main cpu: V30 +sound chip: oki6295 +custom chip: tpc1020bfn x2 +osc: 16 mhz +Rom files definition: +ttennis2/3 main program +ttennis1 adpcm data +ttennis4/5 graphics +*there is a pic16c84 that i cannot dump because my programmer doesn't support it. + +Dumped by tirino73 >isolani (at) interfree.it< + + + + +- works in a very similar way to 'Spider' (twins.c) + including the blitter (seems to be doubled up hardware tho, twice as many layers?) +- need to work out how it selects between upper/lower + program roms as blitter source +- PIC is probably for sound +- more than one layer +- layer clearing */ @@ -53,36 +72,29 @@ public: m_maincpu(*this, "maincpu"), m_palette(*this, "palette") { } - UINT16* m_peno_vram; UINT16* m_peno_mainram; UINT16 m_paloff; DECLARE_WRITE16_MEMBER(paloff_w); DECLARE_WRITE16_MEMBER(pcup_prgbank_w); DECLARE_WRITE16_MEMBER(paldat_w); - DECLARE_READ16_MEMBER(peno_rand); - DECLARE_READ16_MEMBER(peno_rand2); DECLARE_DRIVER_INIT(ttchamp); - DECLARE_WRITE16_MEMBER( penocup_vid_w ) - { - offset &=0x7fff; - COMBINE_DATA(&m_peno_vram[offset]); - } + DECLARE_READ16_MEMBER(ttchamp_blit_start_r); - DECLARE_READ16_MEMBER( penocup_mainram_r ) - { - return m_peno_mainram[offset]; - } + DECLARE_READ16_MEMBER(ttchamp_mem_r); + DECLARE_WRITE16_MEMBER(ttchamp_mem_w); - DECLARE_WRITE16_MEMBER( penocup_mainram_w ) - { - offset &=0x7fff; - COMBINE_DATA(&m_peno_mainram[offset]); -// COMBINE_DATA(&m_peno_vram[offset]); - } + UINT16 m_videoram[0x10000 / 2]; + UINT16 m_mainram[0x10000 / 2]; + int m_spritesinit; + int m_spriteswidth; + int m_spritesaddr; + virtual void machine_start(); + UINT16* m_rom16; + UINT8* m_rom8; virtual void video_start(); UINT32 screen_update_ttchamp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -91,38 +103,27 @@ public: required_device m_palette; }; - +void ttchamp_state::machine_start() +{ + m_rom16 = (UINT16*)memregion("maincpu")->base(); + m_rom8 = memregion("maincpu")->base(); +} void ttchamp_state::video_start() { - m_peno_vram = (UINT16*)auto_alloc_array_clear(machine(), UINT16, 0x10000/2); - m_peno_mainram = (UINT16*)auto_alloc_array_clear(machine(), UINT16, 0x10000/2); - - } UINT32 ttchamp_state::screen_update_ttchamp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int y,x,count; -// int i; + static const int xxx=320,yyy=204; bitmap.fill(m_palette->black_pen()); -// for (i=0;i<256;i++) -// { -// int dat,r,g,b; -// dat=(hotblock_pal[i*2+1]<<8)|hotblock_pal[i*2]; -// -// b = (dat>>10)&0x1f; -// g = (dat>>5)&0x1f; -// r = (dat>>0)&0x1f; -// m_palette->set_pen_color(i,pal5bit(r),pal5bit(g),pal5bit(b)); -// } - count=0; - UINT8 *videoram = (UINT8*)m_peno_vram; + UINT8 *videoram = (UINT8*)m_videoram; for (y=0;ybase(); - - if (ACCESSING_BITS_0_7) - { - bank = (data>>4) &0x07; - membank("bank2")->set_base(&ROM1[0x80000*(bank)]); - } -} -#endif WRITE16_MEMBER(ttchamp_state::paldat_w) { m_palette->set_pen_color(m_paloff & 0x7fff,pal5bit(data>>0),pal5bit(data>>5),pal5bit(data>>10)); } -READ16_MEMBER(ttchamp_state::peno_rand) + + +READ16_MEMBER(ttchamp_state::ttchamp_mem_r) { - return 0xffff;// machine().rand(); + UINT16* vram; +// if (m_videorambank & 1) +// vram = m_videoram2; +// else + vram = m_videoram; + + if (offset < 0x10000 / 2) + { + return m_mainram[offset&0x7fff]; + } + else if (offset < 0x20000 / 2) + { + return vram[offset&0x7fff]; + } + else + { + UINT16 *src = m_rom16 + (0x100000/2); // can the CPU ever see the lower bank? + return src[offset]; + } } -#ifdef UNUSED_FUNCTION -READ16_MEMBER(ttchamp_state::peno_rand2) +WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) { - return machine().rand(); + // this is very strange, we use the offset (address bits) not data bits to set values.. + // I get the impression this might actually overlay the entire address range, including RAM and regular VRAM? + UINT16* vram; +// if (m_videorambank & 1) +// vram = m_videoram2; +// else + vram = m_videoram; + + if (m_spritesinit == 1) + { + // printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); + + m_spritesinit = 2; + m_spritesaddr = offset; + } + else if (m_spritesinit == 2) + { + // printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); + m_spriteswidth = offset & 0xff; + if (m_spriteswidth == 0) + m_spriteswidth = 80; + + m_spritesinit = 0; + + } + else + { + if (offset < 0x10000 / 2) + { + COMBINE_DATA(&m_mainram[offset&0x7fff]); + } + else if (offset < 0x20000 / 2) + { + COMBINE_DATA(&vram[offset&0x7fff]); + } + else if (offset < 0x40000 / 2) + { + // 0x30000-0x3ffff and 0x40000-0x4ffff seem to be used here? + offset &= 0x7fff; + + UINT8 *src = m_rom8; + + // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); + offset &= 0x7fff; + + for (int i = 0; i < m_spriteswidth; i++) + { + UINT8 data; + + data = (src[(m_spritesaddr * 2) + 1]); + + if (data) + vram[offset] = (vram[offset] & 0x00ff) | data << 8; + + + data = src[(m_spritesaddr*2)]; + + if (data) + vram[offset] = (vram[offset] & 0xff00) | data; + + + m_spritesaddr ++; + offset++; + + offset &= 0x7fff; + } + } + else + { + printf("spider_blitter_w unhandled RAM access %08x %04x %04x\n", offset * 2, data, mem_mask); + } + } +} + +READ16_MEMBER(ttchamp_state::ttchamp_blit_start_r) +{ + m_spritesinit = 1; + return 0xff; } -#endif static ADDRESS_MAP_START( ttchamp_map, AS_PROGRAM, 16, ttchamp_state ) - AM_RANGE(0x00000, 0x0ffff) AM_RAM AM_READWRITE(penocup_mainram_r, penocup_mainram_w) - - /* 0x10000 - 0x1ffff is where it writes most image stuff, but other address get written to 0 where the left edge of 'sprites' would be? why? bad code execution, or some kind of write address based blitter? - see for example the lines written down the side of where the (not displayed) CREDIT text would go, as well as beside the actual credit number.. also ingame if you can get it to start - */ - - AM_RANGE(0x10000, 0xfffff) AM_WRITE(penocup_vid_w) - - // how are these banked? what are the bank sizes? data needed for startup is at 0x20000-0x2ffff (strings) and 0x30000-0x3ffff (code) the rest seems to be graphics.. - AM_RANGE(0x00000, 0x7ffff) AM_ROMBANK("bank1") // ? - AM_RANGE(0x80000, 0xfffff) AM_ROMBANK("bank2") // ? + AM_RANGE(0x00000, 0xfffff) AM_READWRITE(ttchamp_mem_r, ttchamp_mem_w) ADDRESS_MAP_END static ADDRESS_MAP_START( ttchamp_io, AS_IO, 16, ttchamp_state ) @@ -191,7 +264,8 @@ static ADDRESS_MAP_START( ttchamp_io, AS_IO, 16, ttchamp_state ) AM_RANGE(0x0002, 0x0003) AM_READ_PORT("SYSTEM") AM_RANGE(0x0004, 0x0005) AM_READ_PORT("P1_P2") -// AM_RANGE(0x0018, 0x0019) AM_READ(peno_rand2) + + AM_RANGE(0x0018, 0x0019) AM_READ(ttchamp_blit_start_r) // AM_RANGE(0x001e, 0x001f) AM_READ(peno_rand2) AM_RANGE(0x0008, 0x0009) AM_WRITE(paldat_w) @@ -202,11 +276,10 @@ static ADDRESS_MAP_START( ttchamp_io, AS_IO, 16, ttchamp_state ) AM_RANGE(0x0020, 0x0021) AM_WRITENOP - AM_RANGE(0x0034, 0x0035) AM_READ(peno_rand) AM_WRITENOP +// AM_RANGE(0x0034, 0x0035) AM_READ(peno_rand) AM_WRITENOP ADDRESS_MAP_END - static INPUT_PORTS_START(ttchamp) PORT_START("SYSTEM") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -299,39 +372,12 @@ static MACHINE_CONFIG_START( ttchamp, ttchamp_state ) MACHINE_CONFIG_END ROM_START( ttchamp ) - - /* hopefully this is a good dump */ - - ROM_REGION16_LE( 0x200000, "user1", 0 ) + ROM_REGION16_LE( 0x200000, "maincpu", 0 ) ROM_LOAD16_BYTE( "2.bin", 0x000000, 0x080000, CRC(6a6c6d75) SHA1(3742b82462176d77732a69e142db9e6f61f25dc5) ) ROM_LOAD16_BYTE( "3.bin", 0x000001, 0x080000, CRC(6062c0b2) SHA1(c5f0ac58c847ce2588c805f40180f2586a6477b7) ) ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x080000, CRC(4388dead) SHA1(1965e4b84452b244e32c8d218aace8d287c67ec2) ) ROM_LOAD16_BYTE( "5.bin", 0x100001, 0x080000, CRC(fdbf9b28) SHA1(2d260555586097c8a396f65111f55ace801c7a5d) ) - /* dumps below are bad dumps */ - - /* dump a */ -// ROM_REGION( 0x200000, "user1", 0 ) -// ROM_LOAD16_BYTE( "27c040_dump_a.2", 0x000000, 0x080000, BAD_DUMP CRC(791d68c8) SHA1(641c989d50e95ac3ff7c87d148cfab44abbdc774) ) -// ROM_LOAD16_BYTE( "27c040_dump_a.3", 0x000001, 0x080000, BAD_DUMP CRC(00c81241) SHA1(899d4d1566f5f5d2967b6a8ec7dca60833846bbe) ) -// ROM_LOAD16_BYTE( "27c040_dump_a.4", 0x100000, 0x080000, BAD_DUMP CRC(11af50f6) SHA1(1e5b6cc5c5a6c1ec302b2de7ce40c9ebfb349b46) ) -// ROM_LOAD16_BYTE( "27c040_dump_a.5", 0x100001, 0x080000, BAD_DUMP CRC(f6b87231) SHA1(3db461c0858c207e8a3dfd822c99d28e3a26b4ee) ) - - /* dump b */ -// ROM_REGION( 0x200000, "user2", 0 ) -// ROM_LOAD16_BYTE( "27c040_dump_b.2", 0x000000, 0x080000, BAD_DUMP CRC(df1f2618) SHA1(7c6abb7a6ec55c49b95809f003d217f1ea758729) ) -// ROM_LOAD16_BYTE( "27c040_dump_b.3", 0x000001, 0x080000, BAD_DUMP CRC(0292ca69) SHA1(fe3b0e78d9e946d8f8a86e8246e5a94483f44ce1) ) -// ROM_LOAD16_BYTE( "27c040_dump_b.4", 0x100000, 0x080000, BAD_DUMP CRC(f6bcadc6) SHA1(d8c61c207175d67f4229103696dc2a4447af2ba4) ) -// ROM_LOAD16_BYTE( "27c040_dump_b.5", 0x100001, 0x080000, BAD_DUMP CRC(b872747c) SHA1(24d2aa2603a71cdfd3d45608177bb60ab7cfe8a2) ) - - /* dump c */ -// ROM_REGION( 0x200000, "user3", 0 ) -// ROM_LOAD16_BYTE( "27c040_dump_c.2", 0x000000, 0x080000, BAD_DUMP CRC(be70adc7) SHA1(fe439caa54856c75ef310e456a7e61b15321031d) ) -// ROM_LOAD16_BYTE( "27c040_dump_c.3", 0x000001, 0x080000, BAD_DUMP CRC(8e3b3396) SHA1(f47243041b9283712e34ea58fa2456c35785c5ee) ) -// ROM_LOAD16_BYTE( "27c040_dump_c.4", 0x100000, 0x080000, BAD_DUMP CRC(34ab75e9) SHA1(779f03139b336cdc46f4d00bf3fd9e6de79942e2) ) -// ROM_LOAD16_BYTE( "27c040_dump_c.5", 0x100001, 0x080000, BAD_DUMP CRC(3e7b3533) SHA1(433439c2b8a8e54bb20fc3c1690d3f183c6fa6f6) ) - - /* these were the same in each dump..*/ ROM_REGION( 0x10000, "cpu1", 0 ) /* not verified if this is correct yet, seems very empty, maybe protected */ ROM_LOAD( "pic16c84.rom", 0x000000, 0x4280, CRC(900f2ef8) SHA1(08f206fe52f413437436e4b0d2b4ec310767446c) ) @@ -339,30 +385,8 @@ ROM_START( ttchamp ) ROM_LOAD( "27c020.1", 0x000000, 0x040000, CRC(e2c4fe95) SHA1(da349035cc348db220a1e12b4c2a6021e2168425) ) ROM_END -/* - -Table tennis Championships by Gamart 1995 - -This game come from Gamart,an obscure spanish software house. -Hardware info: -main cpu: V30 -sound chip: oki6295 -custom chip: tpc1020bfn x2 -osc: 16 mhz -Rom files definition: -ttennis2/3 main program -ttennis1 adpcm data -ttennis4/5 graphics -*there is a pic16c84 that i cannot dump because my programmer doesn't support it. - -Dumped by tirino73 >isolani (at) interfree.it< - -*/ - ROM_START( ttchampa ) - /* this is from a different board */ - - ROM_REGION16_LE( 0x200000, "user1", 0 ) + ROM_REGION16_LE( 0x200000, "maincpu", 0 ) ROM_LOAD16_BYTE( "ttennis2.bin", 0x000000, 0x080000, CRC(b060e72c) SHA1(376e71bb4b1687fec4b719cbc5a7b25b64d159ac) ) ROM_LOAD16_BYTE( "ttennis3.bin", 0x000001, 0x080000, CRC(33e085a8) SHA1(ea6af05690b4b0803c303a3c858df10e4d907fb1) ) ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x080000, CRC(4388dead) SHA1(1965e4b84452b244e32c8d218aace8d287c67ec2) ) @@ -377,9 +401,9 @@ ROM_END DRIVER_INIT_MEMBER(ttchamp_state,ttchamp) { - UINT8 *ROM1 = memregion("user1")->base(); - membank("bank1")->set_base(&ROM1[0x100000]); - membank("bank2")->set_base(&ROM1[0x180000]); +// UINT8 *ROM1 = memregion("user1")->base(); +// membank("bank1")->set_base(&ROM1[0x100000]); +// membank("bank2")->set_base(&ROM1[0x180000]); } GAME( 1995, ttchamp, 0, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart", "Table Tennis Champions (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) From 2fbc689de95f15dad3de380f3b22e3b658606af7 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Sun, 22 Mar 2015 12:43:44 +0000 Subject: [PATCH 156/201] experimenting, at least identified the main difference between the two sets (nw) --- src/mame/drivers/ttchamp.c | 109 +++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 18 deletions(-) diff --git a/src/mame/drivers/ttchamp.c b/src/mame/drivers/ttchamp.c index f9618ea522b..3ce64987e4a 100644 --- a/src/mame/drivers/ttchamp.c +++ b/src/mame/drivers/ttchamp.c @@ -78,6 +78,10 @@ public: DECLARE_WRITE16_MEMBER(paloff_w); DECLARE_WRITE16_MEMBER(pcup_prgbank_w); DECLARE_WRITE16_MEMBER(paldat_w); + + DECLARE_WRITE16_MEMBER(port10_w); + UINT16 m_port10; + DECLARE_DRIVER_INIT(ttchamp); DECLARE_READ16_MEMBER(ttchamp_blit_start_r); @@ -85,7 +89,12 @@ public: DECLARE_READ16_MEMBER(ttchamp_mem_r); DECLARE_WRITE16_MEMBER(ttchamp_mem_w); - UINT16 m_videoram[0x10000 / 2]; + UINT16 m_videoram0[0x10000 / 2]; + UINT16 m_videoram1[0x10000 / 2]; + UINT16 m_videoram2[0x10000 / 2]; + + + UINT16 m_mainram[0x10000 / 2]; int m_spritesinit; @@ -116,6 +125,7 @@ void ttchamp_state::video_start() UINT32 ttchamp_state::screen_update_ttchamp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + logerror("update\n"); int y,x,count; static const int xxx=320,yyy=204; @@ -123,7 +133,7 @@ UINT32 ttchamp_state::screen_update_ttchamp(screen_device &screen, bitmap_ind16 bitmap.fill(m_palette->black_pen()); count=0; - UINT8 *videoram = (UINT8*)m_videoram; + UINT8 *videoram = (UINT8*)m_videoram0; for (y=0;yset_base(&ROM1[0x180000]); } -GAME( 1995, ttchamp, 0, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart", "Table Tennis Champions (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1995, ttchampa,ttchamp, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart", "Table Tennis Champions (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1995, ttchamp, 0, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart", "Table Tennis Champions", GAME_NOT_WORKING|GAME_NO_SOUND ) // this has various advertising boards, including 'Electronic Devices' and 'Deniam' +GAME( 1995, ttchampa,ttchamp, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart (Palencia Elektronik license)", "Table Tennis Champions (Palencia Elektronik license)", GAME_NOT_WORKING|GAME_NO_SOUND ) // this only has Palencia Elektronik advertising boards From d95761b9cc0b1a10be56c55e818e1a158efb0f68 Mon Sep 17 00:00:00 2001 From: Luca Elia Date: Sun, 22 Mar 2015 17:29:16 +0100 Subject: [PATCH 157/201] Decrypt a tiny bit of astoneag (nw) --- src/mame/drivers/astrcorp.c | 154 +++++++++++++++++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/src/mame/drivers/astrcorp.c b/src/mame/drivers/astrcorp.c index 65aa35433c1..8ee006d0f17 100644 --- a/src/mame/drivers/astrcorp.c +++ b/src/mame/drivers/astrcorp.c @@ -67,6 +67,7 @@ public: DECLARE_READ16_MEMBER(astrocorp_unk_r); DECLARE_WRITE16_MEMBER(astrocorp_sound_bank_w); DECLARE_WRITE16_MEMBER(skilldrp_sound_bank_w); + DECLARE_DRIVER_INIT(astoneag); DECLARE_DRIVER_INIT(showhanc); DECLARE_DRIVER_INIT(showhand); DECLARE_VIDEO_START(astrocorp); @@ -1148,13 +1149,164 @@ DRIVER_INIT_MEMBER(astrocorp_state,showhanc) #endif } +DRIVER_INIT_MEMBER(astrocorp_state,astoneag) +{ +#if 0 + UINT16 *rom = (UINT16*)memregion("maincpu")->base(); + UINT16 x; + int i; + + for (i = 0x25100/2; i < 0x25200/2; i++) + { + x = 0x0000; + if ( (i & 0x0001) ) x |= 0x0200; + if ( (i & 0x0004) && !(i & 0x0001) ) x |= 0x0080; + if ( (i & 0x0040) || (i & 0x0001) ) x |= 0x0040; + if ( (i & 0x0010) && !(i & 0x0001) ) x |= 0x0020; + if ( !(i & 0x0020) || (i & 0x0001) ) x |= 0x0010; + if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0008; + if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0004; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0002; + if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0001; + rom[i] ^= x; + } + +/* + for (i = 0x25300/2; i < 0x25400/2; i++) + { + x = 0x1300; + rom[i] ^= x; + } +*/ + + for (i = 0x25400/2; i < 0x25500/2; i++) + { + x = 0x4200; + if ( (i & 0x0001) ) x |= 0x0400; + if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0080; + if ( !(i & 0x0010) || (i & 0x0001) ) x |= 0x0040; + if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0020; + if ( !(i & 0x0004) || (i & 0x0001) ) x |= 0x0010; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0004; + if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0002; + if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0001; + rom[i] ^= x; + } + + for (i = 0x25500/2; i < 0x25600/2; i++) + { + x = 0x4200; + if ( (i & 0x0001) ) x |= 0x0400; + if ( (i & 0x0010) && !(i & 0x0001) ) x |= 0x0080; + if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0040; + if ( !(i & 0x0002) && !(i & 0x0001) ) x |= 0x0020; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0010; + if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0008; + if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0004; + if ( (i & 0x0004) && !(i & 0x0001) ) x |= 0x0002; + if ( (i & 0x0001) ) x |= 0x0001; + rom[i] ^= x; + } + +/* + for (i = 0x25700/2; i < 0x25800/2; i++) + { + x = 0x6800; + if ( !(i & 0x0001) ) x |= 0x8000; + + if ( !(i & 0x0040) || ((i & 0x0001) || !(i & 0x0001)) ) x |= 0x0100; + + rom[i] ^= x; + } +*/ + + for (i = 0x25800/2; i < 0x25900/2; i++) + { + x = 0x8300; + if ( (i & 0x0040) || (i & 0x0001) ) x |= 0x2000; + if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0080; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0040; + if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0020; + if ( !(i & 0x0004) || (i & 0x0001) ) x |= 0x0010; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0008; + if ( (i & 0x0010) && !(i & 0x0001) ) x |= 0x0004; + if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0002; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0001; + rom[i] ^= x; + } + +// for (i = 0x25900/2; i < 0x25a00/2; i++) + + for (i = 0x25c00/2; i < 0x25d00/2; i++) + { + // changed from 25400 +// x = 0x4200; + x = 0x4000; +// if ( (i & 0x0001) ) x |= 0x0400; + if ( (i & 0x0020) && !(i & 0x0001) ) x |= 0x0080; + if ( !(i & 0x0010) || (i & 0x0001) ) x |= 0x0040; + if ( (i & 0x0040) && !(i & 0x0001) ) x |= 0x0020; + if ( !(i & 0x0004) || (i & 0x0001) ) x |= 0x0010; + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0004; + if ( (i & 0x0008) && !(i & 0x0001) ) x |= 0x0002; + if ( (i & 0x0002) || (i & 0x0001) ) x |= 0x0001; + rom[i] ^= x; + } + +/* + for (i = 0x25d00/2; i < 0x25e00/2; i++) + { + x = 0x4000; + if ( !(i & 0x0040) ) x |= 0x0800; + + if ( !(i & 0x0040) && !(i & 0x0001) ) x |= 0x0100; // almost!! + + if ( ((i & 0x0040)&&((i & 0x0020)||(i & 0x0010))) || !(i & 0x0001) ) x |= 0x0200; // almost!! + if ( (!(i & 0x0040) || !(i & 0x0008)) && !(i & 0x0001) ) x |= 0x0008; + if ( (i & 0x0040) || !(i & 0x0020) || (i & 0x0001) ) x |= 0x0001; // almost!! + rom[i] ^= x; + } +*/ + +/* + for (i = 0x25e00/2; i < 0x25f00/2; i++) + { + x = 0xa600; + + if ( (i & 0x0040) && (i & 0x0001) ) x |= 0x4000; + if ( (i & 0x0040) && (i & 0x0001) ) x |= 0x0800; + if ( !(i & 0x0001) ) x |= 0x0100; + + if ( ( (i & 0x0040) && (i & 0x0008) && !(i & 0x0001)) || + ( !(i & 0x0040) && ((i & 0x0004) ^ (i & 0x0002)) && !(i & 0x0001) ) ) x |= 0x0002; // almost!! + + if ( !(i & 0x0040) || !(i & 0x0002) || (i & 0x0001) ) x |= 0x0001; + rom[i] ^= x; + } +*/ + + for (i = 0x26f00/2; i < 0x27000/2; i++) + { + x = 0xb94c; + rom[i] ^= x; + } + + for (i = 0x27000/2; i < 0x27100/2; i++) + { + x = 0x5f10; + rom[i] ^= x; + } + +#endif +} + GAME( 2000, showhand, 0, showhand, showhand, astrocorp_state, showhand, ROT0, "Astro Corp.", "Show Hand (Italy)", GAME_SUPPORTS_SAVE ) GAME( 2000, showhanc, showhand, showhanc, showhanc, astrocorp_state, showhanc, ROT0, "Astro Corp.", "Wang Pai Dui Jue (China)", GAME_SUPPORTS_SAVE ) GAME( 2002, skilldrp, 0, skilldrp, skilldrp, driver_device, 0, ROT0, "Astro Corp.", "Skill Drop Georgia (Ver. G1.0S)", GAME_SUPPORTS_SAVE ) GAME( 2003, speeddrp, 0, speeddrp, skilldrp, driver_device, 0, ROT0, "Astro Corp.", "Speed Drop (Ver. 1.06)", GAME_SUPPORTS_SAVE ) // Encrypted games (not working): -GAME( 2004?, astoneag, 0, skilldrp, skilldrp, driver_device, 0, ROT0, "Astro Corp.", "Stone Age (Astro, Ver. ENG.03.A)", GAME_NOT_WORKING ) +GAME( 2004?, astoneag, 0, skilldrp, skilldrp, astrocorp_state, astoneag, ROT0, "Astro Corp.", "Stone Age (Astro, Ver. ENG.03.A)", GAME_NOT_WORKING ) GAME( 2005?, winbingo, 0, skilldrp, skilldrp, driver_device, 0, ROT0, "Astro Corp.", "Win Win Bingo (set 1)", GAME_NOT_WORKING ) GAME( 2005?, winbingoa, winbingo, skilldrp, skilldrp, driver_device, 0, ROT0, "Astro Corp.", "Win Win Bingo (set 2)", GAME_NOT_WORKING ) GAME( 2005?, hacher, winbingo, skilldrp, skilldrp, driver_device, 0, ROT0, "bootleg (Gametron)", "Hacher (hack of Win Win Bingo)", GAME_NOT_WORKING ) From 79be8cde49afea7afd0b31749c44a638c57f2fc7 Mon Sep 17 00:00:00 2001 From: Luca Elia Date: Sun, 22 Mar 2015 18:21:06 +0100 Subject: [PATCH 158/201] Videos of the unemulated mosaic effect used in tshingen and p47 service mode (nw) --- src/mame/drivers/megasys1.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/megasys1.c b/src/mame/drivers/megasys1.c index c874925a887..0da05bb5416 100644 --- a/src/mame/drivers/megasys1.c +++ b/src/mame/drivers/megasys1.c @@ -40,7 +40,7 @@ Year + Game System Protection Peek-a-Boo! D Inputs --------------------------------------------------------------------- -NOTE: Chimera Beast is the game game missing a dump of it's priority PROM +NOTE: Chimera Beast is the only game missing a dump of its priority PROM Hardware Main CPU Sound CPU Sound Chips @@ -92,8 +92,8 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? < -------------- - There is a 512 byte PROM in the video section (differs by game) that - controls the priorities. This prom is currently missing for two games, - so we have to use fake data for those two (64th Street & Chimera Beast). + controls the priorities. This prom is currently missing for one game, + so we have to use fake data for it (Chimera Beast). - Making the M6295 status register return 0 fixes the music tempo in avspirit, 64street, astyanax etc. but makes most of the effects in @@ -107,6 +107,11 @@ RAM RW 0f0000-0f3fff 0e0000-0effff? < - 64street: player characters in attract mode doesn't move at all, protection? they move on the real PCB +- tshingen: unemulated mosaic effect when killing enemies with the flashing sword. + See https://youtu.be/m4ZH0v8UqWs + The effect can be tested in e.g. stdragon and p47 test mode: + See https://youtu.be/zo3FTCqkNBc and https://youtu.be/dEqH017YBzw + - Understand a handful of unknown bits in video regs @@ -4130,8 +4135,8 @@ GAME( 1988, p47, 0, system_A, p47, driver_device, 0, GAME( 1988, p47j, p47, system_A, p47, driver_device, 0, ROT0, "Jaleco", "P-47 - The Freedom Fighter (Japan)", 0 ) GAME( 1988, p47je, p47, system_A, p47, driver_device, 0, ROT0, "Jaleco", "P-47 - The Freedom Fighter (Japan, Export)", 0 ) GAME( 1988, kickoff, 0, system_A, kickoff, driver_device, 0, ROT0, "Jaleco", "Kick Off (Japan)", 0 ) -GAME( 1988, tshingen, 0, system_A, tshingen, megasys1_state, phantasm, ROT0, "Jaleco", "Shingen Samurai-Fighter (Japan, English)", 0 ) -GAME( 1988, tshingena,tshingen, system_A, tshingen, megasys1_state, phantasm, ROT0, "Jaleco", "Takeda Shingen (Japan, Japanese)", 0 ) +GAME( 1988, tshingen, 0, system_A, tshingen, megasys1_state, phantasm, ROT0, "Jaleco", "Shingen Samurai-Fighter (Japan, English)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1988, tshingena,tshingen, system_A, tshingen, megasys1_state, phantasm, ROT0, "Jaleco", "Takeda Shingen (Japan, Japanese)", GAME_IMPERFECT_GRAPHICS ) GAME( 1988, kazan, 0, system_A, kazan, megasys1_state, iganinju, ROT0, "Jaleco", "Ninja Kazan (World)", 0 ) GAME( 1988, iganinju, kazan, system_A, kazan, megasys1_state, iganinju, ROT0, "Jaleco", "Iga Ninjyutsuden (Japan)", 0 ) GAME( 1989, astyanax, 0, system_A, astyanax, megasys1_state, astyanax, ROT0, "Jaleco", "The Astyanax", 0 ) From cadf236b444b412e0b28ce6625b7102fc2ed1d52 Mon Sep 17 00:00:00 2001 From: briantro Date: Sun, 22 Mar 2015 15:05:46 -0500 Subject: [PATCH 159/201] cps1.c: Documentation update - NW --- src/mame/video/cps1.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mame/video/cps1.c b/src/mame/video/cps1.c index 83223de978e..f50066f26ed 100644 --- a/src/mame/video/cps1.c +++ b/src/mame/video/cps1.c @@ -43,7 +43,8 @@ Dynasty Wars (USA, B-Board 89624B-?) 89624B-? TK Tenchi wo Kurau (Japan) 88622B-3 TK22B LWIO 88622-C-2 CPS-B-02 DL-0411-10002 None Tenchi wo Kurau (Japan Resale Ver.) 91634B-2 TK163B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 -Willow (USA Old Ver.) 1989 89624B-3 WL24B LWIO 88622-C-2 CPS-B-03 DL-0411-10003 None +Willow (World) 1989 89624B-3 WL24B LWIO 88622-C-4 CPS-B-03 DL-0411-10003 None +Willow (USA Old Ver.) 89624B-3 WL24B LWIO 88622-C-2 CPS-B-03 DL-0411-10003 None Willow (USA) 89624B-3 WL24B LWIO 88622-C-2/4 CPS-B-03 DL-0411-10003 None Willow (Japan) 88622B-3 WL22B LWIO 88622-C-2 CPS-B-03 DL-0411-10003 None @@ -141,6 +142,8 @@ Street Fighter II': Champion Edition (Japan 920513) 91634B-2 S9 Street Fighter II': Champion Edition (Japan 920803) 91634B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Adventure Quiz Capcom World 2* (Japan 920611) 1992 89625B-1 Q522B LWIO 92641C-1 CPS-B-21 DL-0921-10014 IOC1 +Adventure Quiz Capcom World 2* (Japan 920611) 91634B-2 Q563B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 +Adventure Quiz Capcom World 2 (Japan 920611) 90629B-3 Q529B IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 Varth: Operation Thunderstorm (World 920612) 1992 89624B-? VA24B IOB1 ? CPS-B-04 DL-0411-10005 Varth: Operation Thunderstorm (World 920714) 89624B-3 VA24B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None @@ -1532,8 +1535,8 @@ static const struct CPS1config cps1_config_table[]= {"varthu", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */ {"varthj", CPS_B_21_BT5, mapper_VA22B }, /* CPSB test has been patched out (72=0001) register is also written to, possibly leftover from development */ {"cworld2j", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, /* (ports 36, 34 probably leftover input code from another game) */ - {"cworld2ja", CPS_B_21_DEF, mapper_Q522B }, // patched set, no battery, could be desuicided - {"cworld2jb", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, // actually Q563B + {"cworld2ja", CPS_B_21_DEF, mapper_Q522B }, // patched set, no battery, could be desuicided // wrong, this set uses Q529B, still not dumped + {"cworld2jb", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, // wrong, this set uses Q563B, still not dumped {"wof", CPS_B_21_QS1, mapper_TK263B }, {"wofr1", CPS_B_21_DEF, mapper_TK263B }, // patched set coming from a desuicided board? {"wofa", CPS_B_21_DEF, mapper_TK263B }, // patched set coming from a desuicided board? From 2713f57e26f428d2101d4abfd6d7d69e4c148077 Mon Sep 17 00:00:00 2001 From: arbee Date: Sun, 22 Mar 2015 16:31:52 -0400 Subject: [PATCH 160/201] iteagle: work-in-progress [Ted Green] - Hooked up PCI devices and bridge correctly using new PCI subsystem - Fixed BIOS selection --- src/emu/machine/machine.mak | 1 + src/emu/sound/sound.mak | 9 ++ src/emu/video/video.mak | 10 ++ src/mame/drivers/iteagle.c | 240 +++++++++++++++++------------------- src/mame/mame.mak | 4 +- 5 files changed, 135 insertions(+), 129 deletions(-) diff --git a/src/emu/machine/machine.mak b/src/emu/machine/machine.mak index 327e9ff739a..85bfb92139d 100644 --- a/src/emu/machine/machine.mak +++ b/src/emu/machine/machine.mak @@ -1255,6 +1255,7 @@ MACHINEOBJS += $(MACHINEOBJ)/lpc.o MACHINEOBJS += $(MACHINEOBJ)/lpc-acpi.o MACHINEOBJS += $(MACHINEOBJ)/lpc-rtc.o MACHINEOBJS += $(MACHINEOBJ)/lpc-pit.o +MACHINEOBJS += $(MACHINEOBJ)/vrc4373.o endif #------------------------------------------------- diff --git a/src/emu/sound/sound.mak b/src/emu/sound/sound.mak index de4f8024a5d..10367590e1b 100644 --- a/src/emu/sound/sound.mak +++ b/src/emu/sound/sound.mak @@ -161,6 +161,15 @@ ifneq ($(filter SB0400,$(SOUNDS)),) SOUNDOBJS += $(SOUNDOBJ)/sb0400.o endif +#------------------------------------------------- +# Creative Labs Ensonic AudioPCI97 ES1373 +#@src/emu/sound/es1373.h,SOUNDS += ES1373 +#------------------------------------------------- + +ifneq ($(filter ES1373,$(SOUNDS)),) +SOUNDOBJS += $(SOUNDOBJ)/es1373.o +endif + #------------------------------------------------- diff --git a/src/emu/video/video.mak b/src/emu/video/video.mak index 3ac034a254d..28aeacf9e07 100644 --- a/src/emu/video/video.mak +++ b/src/emu/video/video.mak @@ -598,6 +598,16 @@ VIDEOOBJS+= $(VIDEOOBJ)/voodoo.o endif +#------------------------------------------------- +# +#@src/emu/video/voodoo_pci.h,VIDEOS += VOODOO_PCI +#------------------------------------------------- + +ifneq ($(filter VOODOO_PCI,$(VIDEOS)),) +VIDEOOBJS+= $(VIDEOOBJ)/voodoo_pci.o +endif + + #------------------------------------------------- # #@src/emu/video/crtc_ega.h,VIDEOS += CRTC_EGA diff --git a/src/mame/drivers/iteagle.c b/src/mame/drivers/iteagle.c index 9cb6ff3e3bb..fdbbe6ad173 100644 --- a/src/mame/drivers/iteagle.c +++ b/src/mame/drivers/iteagle.c @@ -90,183 +90,171 @@ www.multitech.com #include "emu.h" #include "cpu/mips/mips3.h" -#include "machine/ataintf.h" -#include "video/voodoo.h" +#include "machine/pci.h" +#include "machine/vrc4373.h" +#include "video/voodoo_pci.h" +#include "sound/es1373.h" +#include "machine/iteagle_fpga.h" + +//************************************* +// Main iteagle driver +//************************************* class iteagle_state : public driver_device { public: iteagle_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_voodoo(*this, "voodoo") + m_maincpu(*this, "maincpu") {} - + required_device m_maincpu; - required_device m_voodoo; - DECLARE_DRIVER_INIT(iteagle); - DECLARE_WRITE_LINE_MEMBER(ide_interrupt); - DECLARE_WRITE_LINE_MEMBER(vblank_assert); - UINT32 screen_update_iteagle(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); virtual void machine_start(); + virtual void machine_reset(); }; - -/************************************* - * - * Machine start - * - *************************************/ - void iteagle_state::machine_start() { /* set the fastest DRC options */ m_maincpu->mips3drc_set_options(MIPS3DRC_FASTEST_OPTIONS); } - - -/************************************* - * - * Video refresh - * - *************************************/ - -UINT32 iteagle_state::screen_update_iteagle(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; -} - - - -/************************************* - * - * Interrupt handling - * - *************************************/ - -WRITE_LINE_MEMBER(iteagle_state::ide_interrupt) +void iteagle_state::machine_reset() { } -/************************************* - * - * Main CPU memory handlers - * - *************************************/ - -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 32, iteagle_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000000, 0x01ffffff) AM_RAM - // Nile 3 northbridge/PCI controller at 0f000000 - AM_RANGE(0x1fc00000, 0x1fcfffff) AM_ROM AM_REGION("maincpu", 0) AM_SHARE("rombase") -ADDRESS_MAP_END - -WRITE_LINE_MEMBER(iteagle_state::vblank_assert) -{ -} - -/************************************* - * - * Port definitions - * - *************************************/ - -static INPUT_PORTS_START( gtfore ) -INPUT_PORTS_END - -/************************************* - * - * Machine driver - * - *************************************/ - static MACHINE_CONFIG_START( gtfore, iteagle_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", VR4310LE, 166666666) MCFG_MIPS3_ICACHE_SIZE(16384) MCFG_MIPS3_DCACHE_SIZE(16384) - MCFG_CPU_PROGRAM_MAP(main_map) + + MCFG_PCI_ROOT_ADD( ":pci") + MCFG_VRC4373_ADD( ":pci:00.0", ":maincpu") + MCFG_ITEAGLE_FPGA_ADD( ":pci:06.0") + MCFG_ITEAGLE_IDE_ADD( ":pci:06.1") + MCFG_ES1373_ADD( ":pci:07.0") + MCFG_VOODOO_ADD( ":pci:09.0") + MCFG_ITEAGLE_EEPROM_ADD( ":pci:0a.0") - MCFG_ATA_INTERFACE_ADD("ata", ata_devices, "hdd", NULL, true) - MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(iteagle_state, ide_interrupt)) - - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_SIZE(320, 240) - MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE_DRIVER(iteagle_state, screen_update_iteagle) + MCFG_SCREEN_REFRESH_RATE(56.644) + MCFG_SCREEN_SIZE(640, 350) + MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 349) + MCFG_SCREEN_UPDATE_DEVICE(":pci:09.0", voodoo_pci_device, screen_update) + - MCFG_DEVICE_ADD("voodoo", VOODOO_BANSHEE, STD_VOODOO_BANSHEE_CLOCK) - MCFG_VOODOO_FBMEM(16) - MCFG_VOODOO_SCREEN_TAG("screen") - MCFG_VOODOO_CPU_TAG("maincpu") - MCFG_VOODOO_VBLANK_CB(WRITELINE(iteagle_state,vblank_assert)) MACHINE_CONFIG_END +/************************************* + * + * Port definitions + * + *************************************/ +static INPUT_PORTS_START( iteagle ) + + PORT_START("SW5") + PORT_DIPNAME( 0x3, 0x1, "Resolution" ) + PORT_DIPSETTING(0x1, "Medium" ) + PORT_DIPSETTING(0x0, "Low" ) + PORT_DIPSETTING(0x2, "Low_Alt" ) + PORT_DIPNAME( 0xC, 0x0, "Always" ) + + PORT_START("VERSION") + PORT_DIPNAME( 0x0F00, 0x0000, "GAME" ) + PORT_DIPNAME( 0x00F0, 0x0000, "MAJOR" ) + PORT_DIPNAME( 0x000F, 0x0000, "MINOR" ) + +INPUT_PORTS_END + +static INPUT_PORTS_START( gtfore05 ) + PORT_INCLUDE(iteagle) + + PORT_MODIFY("VERSION") + PORT_DIPNAME( 0x0F00, 0x0400, "GAME" ) + PORT_DIPNAME( 0x00F0, 0x0050, "MAJOR" ) + PORT_DIPNAME( 0x000F, 0x0001, "MINOR" ) + +INPUT_PORTS_END + +static INPUT_PORTS_START( gtfore04 ) + PORT_INCLUDE(iteagle) + + PORT_MODIFY("VERSION") + PORT_DIPNAME( 0x0F00, 0x0400, "GAME" ) + PORT_DIPNAME( 0x00F0, 0x0040, "MAJOR" ) + PORT_DIPNAME( 0x000F, 0x0000, "MINOR" ) + +INPUT_PORTS_END + +static INPUT_PORTS_START( gtfore02o ) + PORT_INCLUDE(iteagle) + + PORT_MODIFY("VERSION") + PORT_DIPNAME( 0x0F00, 0x0400, "GAME" ) + PORT_DIPNAME( 0x00F0, 0x0030, "MAJOR" ) + PORT_DIPNAME( 0x000F, 0x0000, "MINOR" ) + +INPUT_PORTS_END + +static INPUT_PORTS_START( gtfore02 ) + PORT_INCLUDE(iteagle) + + PORT_MODIFY("VERSION") + PORT_DIPNAME( 0x0F00, 0x0400, "GAME" ) + PORT_DIPNAME( 0x00F0, 0x0060, "MAJOR" ) + PORT_DIPNAME( 0x000F, 0x0000, "MINOR" ) + +INPUT_PORTS_END /************************************* * * ROM definition(s) * *************************************/ - #define EAGLE_BIOS \ - ROM_REGION( 0x100000, "maincpu", 0 ) /* MIPS code */ \ + ROM_REGION( 0x100000, ":pci:00.0", 0 ) /* MIPS code */ \ ROM_SYSTEM_BIOS( 0, "209", "bootrom 2.09" ) \ - ROM_LOAD( "eagle209.u15", 0x000000, 0x100000, CRC(e0fc1a16) SHA1(c9524f7ee6b95bd484a3b75bcbe2243cb273f84c) ) \ + ROMX_LOAD( "eagle209.u15", 0x000000, 0x100000, CRC(e0fc1a16) SHA1(c9524f7ee6b95bd484a3b75bcbe2243cb273f84c), ROM_BIOS(1) ) \ ROM_SYSTEM_BIOS( 1, "208", "bootrom 2.08" ) \ - ROM_LOAD( "eagle208.u15", 0x000000, 0x100000, CRC(772f2864) SHA1(085063a4e34f29ebe3814823cd2c6323a050da36) ) \ + ROMX_LOAD( "eagle208.u15", 0x000000, 0x100000, CRC(772f2864) SHA1(085063a4e34f29ebe3814823cd2c6323a050da36), ROM_BIOS(2) ) \ ROM_SYSTEM_BIOS( 2, "204", "bootrom 2.04" ) \ - ROM_LOAD( "eagle204.u15", 0x000000, 0x100000, CRC(f02e5523) SHA1(b979cf72a6992f1ecad9695a08c8d51e315ab537) ) \ + ROMX_LOAD( "eagle204.u15", 0x000000, 0x100000, CRC(f02e5523) SHA1(b979cf72a6992f1ecad9695a08c8d51e315ab537), ROM_BIOS(3) ) \ ROM_SYSTEM_BIOS( 3, "201", "bootrom 2.01" ) \ - ROM_LOAD( "eagle201.u15", 0x000000, 0x100000, CRC(e180442b) SHA1(4f50821fed5bcd786d989520aa2559d6c416fb1f) ) \ + ROMX_LOAD( "eagle201.u15", 0x000000, 0x100000, CRC(e180442b) SHA1(4f50821fed5bcd786d989520aa2559d6c416fb1f), ROM_BIOS(4) ) \ ROM_SYSTEM_BIOS( 4, "107", "bootrom 1.07" ) \ - ROM_LOAD( "eagle107.u15", 0x000000, 0x100000, CRC(97a01fc9) SHA1(a421dbf4d097b2f50cc005d3cd0d63e562e03df8) ) \ + ROMX_LOAD( "eagle107.u15", 0x000000, 0x100000, CRC(97a01fc9) SHA1(a421dbf4d097b2f50cc005d3cd0d63e562e03df8), ROM_BIOS(5) ) \ ROM_SYSTEM_BIOS( 5, "106a", "bootrom 1.06a" ) \ - ROM_LOAD( "eagle106a.u15", 0x000000, 0x100000, CRC(9c79b7ad) SHA1(ccf1c86e79d65bee30f399e0fa33a7839570d93b) ) \ + ROMX_LOAD( "eagle106a.u15", 0x000000, 0x100000, CRC(9c79b7ad) SHA1(ccf1c86e79d65bee30f399e0fa33a7839570d93b), ROM_BIOS(6) ) \ ROM_SYSTEM_BIOS( 6, "106", "bootrom 1.06" ) \ - ROM_LOAD( "eagle106.u15", 0x000000, 0x100000, CRC(56bc193d) SHA1(e531d208ef27f777d0784414885f390d1be654b9) ) \ + ROMX_LOAD( "eagle106.u15", 0x000000, 0x100000, CRC(56bc193d) SHA1(e531d208ef27f777d0784414885f390d1be654b9), ROM_BIOS(7) ) \ ROM_SYSTEM_BIOS( 7, "105", "bootrom 1.05" ) \ - ROM_LOAD( "eagle105.u15", 0x000000, 0x100000, CRC(3870dbe0) SHA1(09be2d86c7259cd81d945c757044b167a76f30db) ) \ + ROMX_LOAD( "eagle105.u15", 0x000000, 0x100000, CRC(3870dbe0) SHA1(09be2d86c7259cd81d945c757044b167a76f30db), ROM_BIOS(8) ) \ ROM_SYSTEM_BIOS( 8, "103", "bootrom 1.03" ) \ - ROM_LOAD( "eagle103.u15", 0x000000, 0x100000, CRC(c35f4cf2) SHA1(45301c18c7f8f78754c8ad60ea4d2da5a7dc55fb) ) \ + ROMX_LOAD( "eagle103.u15", 0x000000, 0x100000, CRC(c35f4cf2) SHA1(45301c18c7f8f78754c8ad60ea4d2da5a7dc55fb), ROM_BIOS(9) ) \ ROM_SYSTEM_BIOS( 9, "102", "bootrom 1.02" ) \ - ROM_LOAD( "eagle102.u15", 0x000000, 0x100000, CRC(1fd39e73) SHA1(d1ac758f94defc5c55c62594b3999a406dd9ef1f) ) \ + ROMX_LOAD( "eagle102.u15", 0x000000, 0x100000, CRC(1fd39e73) SHA1(d1ac758f94defc5c55c62594b3999a406dd9ef1f), ROM_BIOS(10) ) \ ROM_SYSTEM_BIOS( 10, "101", "bootrom 1.01" ) \ - ROM_LOAD( "eagle101.u15", 0x000000, 0x100000, CRC(2600bc2b) SHA1(c4b89e69c51e4a3bb1874407c4d30b6caed4f396) ) \ - ROM_REGION( 0x30000, "fpga", 0 ) \ - ROM_LOAD( "17s20lpc_sb4.u26", 0x000000, 0x008000, CRC(62c4af8a) SHA1(6eca277b9c66a401990599e98fdca64a9e38cc9a) ) \ - ROM_LOAD( "17s20lpc_sb5.u26", 0x008000, 0x008000, CRC(c88b9d42) SHA1(b912d0fc50ecdc6a198c626f6e1644e8405fac6e) ) \ - ROM_LOAD( "17s50a_red1.u26", 0x010000, 0x020000, CRC(f5cf3187) SHA1(83b4a14de9959e5a776d97d424945d43501bda7f) ) \ - ROM_REGION( 0x2000, "pals", 0 ) \ - ROM_LOAD( "e2-card1.u22.jed", 0x000000, 0x000bd1, CRC(9d1e1ace) SHA1(287d6a30e9f32137ef4eba54f0effa092c97a6eb) ) \ - ROM_LOAD( "e2-res3.u117.jed", 0x001000, 0x000bd1, CRC(4f1ff45a) SHA1(213cbdd6cd37ad9b5bfc9545084892a68d29f5ff) ) - -/* -17s20lpc_sb4.u26 & 17s20lpc_sb5.u26 are alternate versions of configuration data for GREEN boards only. -17s50a_red1.u26 is configuration data for RED boards only. -*/ + ROMX_LOAD( "eagle101.u15", 0x000000, 0x100000, CRC(2600bc2b) SHA1(c4b89e69c51e4a3bb1874407c4d30b6caed4f396), ROM_BIOS(11) ) \ ROM_START( iteagle ) EAGLE_BIOS - DISK_REGION( "ata:0:hdd:image" ) + DISK_REGION( ":pci:06.1:ide:0:hdd:image" ) ROM_END - ROM_START( gtfore02 ) EAGLE_BIOS ROM_REGION( 0x0880, "atmel", 0 ) /* Atmel 90S2313 AVR internal CPU code */ ROM_LOAD( "g42-us-u.u53", 0x0000, 0x0880, CRC(06e0b452) SHA1(f6b865799cb94941e0e77453b9d556d5988b0194) ) - DISK_REGION( "ata:0:hdd:image" ) + DISK_REGION( ":pci:06.1:ide:0:hdd:image" ) DISK_IMAGE( "golf_fore_2002_v2.01.04_umv", 0, SHA1(e902b91bd739daee0b95b10e5cf33700dd63a76b) ) /* Labeled Golf Fore! V2.01.04 UMV */ + //DISK_REGION( "ide:1:cdrom" ) // program CD-ROM + ROM_END ROM_START( gtfore02o ) @@ -275,7 +263,7 @@ ROM_START( gtfore02o ) ROM_REGION( 0x0880, "atmel", 0 ) /* Atmel 90S2313 AVR internal CPU code */ ROM_LOAD( "g42-us-u.u53", 0x0000, 0x0880, CRC(06e0b452) SHA1(f6b865799cb94941e0e77453b9d556d5988b0194) ) - DISK_REGION( "ata:0:hdd:image" ) + DISK_REGION( ":pci:06.1:ide:0:hdd:image" ) DISK_IMAGE( "golf_fore_2002_v2.00.00", 0, SHA1(d789ef86837a5012beb224c487537dd563d93886) ) /* Labeled Golf Fore! 2002 V2.00.00 */ ROM_END @@ -285,7 +273,7 @@ ROM_START( carnking ) ROM_REGION( 0x0880, "atmel", 0 ) /* Atmel 90S2313 AVR internal CPU code */ ROM_LOAD( "ck1-us.u53", 0x0000, 0x0880, NO_DUMP ) - DISK_REGION( "ata:0:hdd:image" ) + DISK_REGION( ":pci:06.1:ide:0:hdd:image" ) DISK_IMAGE( "carnival_king_v_1.00.11", 0, SHA1(c819af66d36df173ab17bf42f4045c7cca3203d8) ) /* Labeled Carnival King V 1.00.11 */ ROM_END @@ -295,7 +283,7 @@ ROM_START( gtfore04 ) ROM_REGION( 0x0880, "atmel", 0 ) /* Atmel 90S2313 AVR internal CPU code */ ROM_LOAD( "g44-us-u.u53", 0x0000, 0x0880, NO_DUMP ) - DISK_REGION( "ata:0:hdd:image" ) + DISK_REGION( ":pci:06.1:ide:0:hdd:image" ) DISK_IMAGE( "gt2004", 0, SHA1(739a52d6ce13bb6ac7a543ee0e8086fb66be19b9) ) ROM_END @@ -305,23 +293,19 @@ ROM_START( gtfore05 ) ROM_REGION( 0x0880, "atmel", 0 ) /* Atmel 90S2313 AVR internal CPU code */ ROM_LOAD( "g45-us-u.u53", 0x0000, 0x0880, NO_DUMP ) - DISK_REGION( "ata:0:hdd:image" ) + DISK_REGION( ":pci:06.1:ide:0:hdd:image" ) DISK_IMAGE( "gt2005", 0, SHA1(d8de569d8cf97b5aaada10ce896eb3c75f1b37f1) ) ROM_END -DRIVER_INIT_MEMBER(iteagle_state, iteagle) -{ -} - /************************************* * * Game driver(s) * *************************************/ -GAME( 2000, iteagle, 0, gtfore, gtfore, iteagle_state, iteagle, ROT0, "Incredible Technologies", "Eagle BIOS", GAME_IS_BIOS_ROOT ) -GAME( 2001, gtfore02, iteagle, gtfore, gtfore, iteagle_state, iteagle, ROT0, "Incredible Technologies", "Golden Tee Fore! 2002 (v2.01.04 UMV)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2001, gtfore02o, gtfore02, gtfore, gtfore, iteagle_state, iteagle, ROT0, "Incredible Technologies", "Golden Tee Fore! 2002 (v2.00.00)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2002, carnking, iteagle, gtfore, gtfore, iteagle_state, iteagle, ROT0, "Incredible Technologies", "Carnival King (v1.00.11)", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2003, gtfore04, iteagle, gtfore, gtfore, iteagle_state, iteagle, ROT0, "Incredible Technologies", "Golden Tee Fore! 2004", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME( 2004, gtfore05, iteagle, gtfore, gtfore, iteagle_state, iteagle, ROT0, "Incredible Technologies", "Golden Tee Fore! 2005", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2000, iteagle, 0, gtfore, iteagle, driver_device, 0, ROT0, "Incredible Technologies", "Eagle BIOS", GAME_IS_BIOS_ROOT ) +GAME( 2001, gtfore02, iteagle, gtfore, gtfore02, driver_device, 0, ROT0, "Incredible Technologies", "Golden Tee Fore! 2002 (v2.01.04 UMV)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2001, gtfore02o, gtfore02, gtfore, gtfore02o, driver_device, 0, ROT0, "Incredible Technologies", "Golden Tee Fore! 2002 (v2.00.00)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2002, carnking, iteagle, gtfore, iteagle, driver_device, 0, ROT0, "Incredible Technologies", "Carnival King (v1.00.11)", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2003, gtfore04, iteagle, gtfore, gtfore04, driver_device, 0, ROT0, "Incredible Technologies", "Golden Tee Fore! 2004", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2004, gtfore05, iteagle, gtfore, gtfore05, driver_device, 0, ROT0, "Incredible Technologies", "Golden Tee Fore! 2005", GAME_NOT_WORKING | GAME_NO_SOUND ) diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 910f4c5bb41..edad5da86bd 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -278,6 +278,7 @@ SOUNDS += MOS7360 #SOUNDS += VRC6 SOUNDS += SB0400 SOUNDS += AC97 +SOUNDS += ES1373 #------------------------------------------------- # specify available video cores @@ -346,6 +347,7 @@ VIDEOS += TMS9928A VIDEOS += V9938 #VIDEOS += VIC4567 VIDEOS += VOODOO +VIDEOS += VOODOO_PCI #------------------------------------------------- # specify available machine cores @@ -1263,7 +1265,7 @@ $(MAMEOBJ)/itech.a: \ $(DRIVERS)/capbowl.o $(VIDEO)/capbowl.o \ $(DRIVERS)/itech8.o $(MACHINE)/slikshot.o $(VIDEO)/itech8.o \ $(DRIVERS)/itech32.o $(VIDEO)/itech32.o \ - $(DRIVERS)/iteagle.o \ + $(DRIVERS)/iteagle.o $(MACHINE)/iteagle_fpga.o \ $(MAMEOBJ)/jaleco.a: \ $(DRIVERS)/aeroboto.o $(VIDEO)/aeroboto.o \ From 2faf681f44d5c87988e4ab3ddaef655753f336c9 Mon Sep 17 00:00:00 2001 From: arbee Date: Sun, 22 Mar 2015 16:34:49 -0400 Subject: [PATCH 161/201] iteagle: don't forget the new files (nw) --- src/emu/machine/vrc4373.c | 344 ++++++++++++++++++++++++++++++ src/emu/machine/vrc4373.h | 116 ++++++++++ src/emu/sound/es1373.c | 196 +++++++++++++++++ src/emu/sound/es1373.h | 63 ++++++ src/emu/video/voodoo_pci.c | 81 +++++++ src/emu/video/voodoo_pci.h | 35 +++ src/mame/machine/iteagle_fpga.c | 364 ++++++++++++++++++++++++++++++++ src/mame/machine/iteagle_fpga.h | 91 ++++++++ 8 files changed, 1290 insertions(+) create mode 100644 src/emu/machine/vrc4373.c create mode 100644 src/emu/machine/vrc4373.h create mode 100644 src/emu/sound/es1373.c create mode 100644 src/emu/sound/es1373.h create mode 100644 src/emu/video/voodoo_pci.c create mode 100644 src/emu/video/voodoo_pci.h create mode 100644 src/mame/machine/iteagle_fpga.c create mode 100644 src/mame/machine/iteagle_fpga.h diff --git a/src/emu/machine/vrc4373.c b/src/emu/machine/vrc4373.c new file mode 100644 index 00000000000..e1a3c7eac81 --- /dev/null +++ b/src/emu/machine/vrc4373.c @@ -0,0 +1,344 @@ +#include "vrc4373.h" + +#define LOG_NILE (1) +#define LOG_NILE_MASTER (0) +#define LOG_NILE_TARGET (1) + +const device_type VRC4373 = &device_creator; + +DEVICE_ADDRESS_MAP_START(config_map, 32, vrc4373_device) + AM_RANGE(0x40, 0x43) AM_READWRITE (pcictrl_r, pcictrl_w) + AM_INHERIT_FROM(pci_host_device::config_map) +ADDRESS_MAP_END + +// cpu i/f map +DEVICE_ADDRESS_MAP_START(cpu_map, 32, vrc4373_device) + AM_RANGE(0x00000000, 0x0000007b) AM_READWRITE( vrc4373_device::cpu_if_r, vrc4373_device::cpu_if_w) +ADDRESS_MAP_END + +// Target Window 1 map +DEVICE_ADDRESS_MAP_START(target1_map, 32, vrc4373_device) + AM_RANGE(0x00000000, 0xFFFFFFFF) AM_READWRITE( vrc4373_device::target1_r, vrc4373_device::target1_w) +ADDRESS_MAP_END + +// Target Window 2 map +DEVICE_ADDRESS_MAP_START(target2_map, 32, vrc4373_device) + AM_RANGE(0x00000000, 0xFFFFFFFF) AM_READWRITE( vrc4373_device::target2_r, vrc4373_device::target2_w) +ADDRESS_MAP_END + +vrc4373_device::vrc4373_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pci_host_device(mconfig, VRC4373, "NEC VRC4373 System Controller", tag, owner, clock, "vrc4373", __FILE__), + m_mem_config("memory_space", ENDIANNESS_LITTLE, 32, 32), + m_io_config("io_space", ENDIANNESS_LITTLE, 32, 32) +{ +} + +const address_space_config *vrc4373_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == AS_PROGRAM) ? pci_bridge_device::memory_space_config(spacenum) : (spacenum == AS_DATA) ? &m_mem_config : (spacenum == AS_IO) ? &m_io_config : NULL; +} + +void vrc4373_device::device_start() +{ + pci_host_device::device_start(); + m_cpu = machine().device(cpu_tag); + m_cpu_space = &m_cpu->space(AS_PROGRAM); + memory_space = &space(AS_DATA); + io_space = &space(AS_IO); + + memset(m_cpu_regs, 0, sizeof(m_cpu_regs)); + + memory_window_start = 0; + memory_window_end = 0xffffffff; + memory_offset = 0; + io_window_start = 0; + io_window_end = 0xffffffff; + io_offset = 0x00000000; + status = 0x0280; + m_ram_size = 1<<22; + m_ram_base = 0; + m_simm_size = 1<<21; + m_simm_base = 0; + regenerate_config_mapping(); +} + +void vrc4373_device::device_reset() +{ + pci_device::device_reset(); + memset(m_cpu_regs, 0, sizeof(m_cpu_regs)); + remap_cb(); +} + +void vrc4373_device::map_extra(UINT64 memory_window_start, UINT64 memory_window_end, UINT64 memory_offset, address_space *memory_space, + UINT64 io_window_start, UINT64 io_window_end, UINT64 io_offset, address_space *io_space) +{ + m_cpu_space->unmap_readwrite(0x00000000, 0xffffffff); + + m_cpu_space->install_rom (0x1fc00000, 0x1fcfffff, m_region->base()); + m_cpu_space->install_device(0x0f000000, 0x0f0000ff, *static_cast(this), &vrc4373_device::cpu_map); + // PCI Configuration also mapped at 0x0f000100 + m_cpu_space->install_device(0x0f000100, 0x0f0001ff, *static_cast(this), &vrc4373_device::config_map); + + UINT32 winStart, winEnd, winSize; + + if (m_cpu_regs[NREG_BMCR]&0x8) { + m_cpu_space->install_ram (m_ram_base, m_ram_base+m_ram_size-1, &m_ram[0]); + if (LOG_NILE) + logerror("%s: map_extra ram_size=%08X ram_base=%08X\n", tag(),m_ram_size,m_ram_base); + } + if (m_cpu_regs[NREG_SIMM1]&0x8) { + m_cpu_space->install_ram (m_simm_base, m_simm_base+m_simm_size-1, &m_simm[0]); + if (LOG_NILE) + logerror("%s: map_extra simm_size=%08X simm_base=%08X\n", tag(),m_simm_size,m_simm_base); + } + // PCI Master Window 1 + if (m_cpu_regs[NREG_PCIMW1]&0x1000) { + winStart = m_cpu_regs[NREG_PCIMW1]&0xff000000; + winEnd = winStart | (~(0x80000000 | (((m_cpu_regs[NREG_PCIMW1]>>13)&0x7f)<<24))); + winSize = winEnd - winStart + 1; + m_cpu_space->install_read_handler(winStart, winEnd, 0, 0, read32_delegate(FUNC(vrc4373_device::master1_r), this)); + m_cpu_space->install_write_handler(winStart, winEnd, 0, 0, write32_delegate(FUNC(vrc4373_device::master1_w), this)); + if (LOG_NILE) + logerror("%s: map_extra Master Window 1 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci1_laddr); + } + // PCI Master Window 2 + if (m_cpu_regs[NREG_PCIMW2]&0x1000) { + winStart = m_cpu_regs[NREG_PCIMW2]&0xff000000; + winEnd = winStart | (~(0x80000000 | (((m_cpu_regs[NREG_PCIMW2]>>13)&0x7f)<<24))); + winSize = winEnd - winStart + 1; + m_cpu_space->install_read_handler(winStart, winEnd, 0, 0, read32_delegate(FUNC(vrc4373_device::master2_r), this)); + m_cpu_space->install_write_handler(winStart, winEnd, 0, 0, write32_delegate(FUNC(vrc4373_device::master2_w), this)); + if (LOG_NILE) + logerror("%s: map_extra Master Window 2 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci2_laddr); + } + // PCI IO Window + if (m_cpu_regs[NREG_PCIMIOW]&0x1000) { + winStart = m_cpu_regs[NREG_PCIMIOW]&0xff000000; + winEnd = winStart | (~(0x80000000 | (((m_cpu_regs[NREG_PCIMIOW]>>13)&0x7f)<<24))); + winSize = winEnd - winStart + 1; + m_cpu_space->install_read_handler(winStart, winEnd, 0, 0, read32_delegate(FUNC(vrc4373_device::master_io_r), this)); + m_cpu_space->install_write_handler(winStart, winEnd, 0, 0, write32_delegate(FUNC(vrc4373_device::master_io_w), this)); + if (LOG_NILE) + logerror("%s: map_extra IO Window start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_pci_io_laddr); + } + // PCI Target Window 1 + if (m_cpu_regs[NREG_PCITW1]&0x1000) { + winStart = m_cpu_regs[NREG_PCITW1]&0xffe00000; + winEnd = winStart | (~(0xf0000000 | (((m_cpu_regs[NREG_PCITW1]>>13)&0x7f)<<21))); + winSize = winEnd - winStart + 1; + memory_space->install_read_handler(winStart, winEnd, 0, 0, read32_delegate(FUNC(vrc4373_device::target1_r), this)); + memory_space->install_write_handler(winStart, winEnd, 0, 0, write32_delegate(FUNC(vrc4373_device::target1_w), this)); + if (LOG_NILE) + logerror("%s: map_extra Target Window 1 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_target1_laddr); + } + // PCI Target Window 2 + if (m_cpu_regs[NREG_PCITW2]&0x1000) { + winStart = m_cpu_regs[NREG_PCITW2]&0xffe00000; + winEnd = winStart | (~(0xf0000000 | (((m_cpu_regs[NREG_PCITW2]>>13)&0x7f)<<21))); + winSize = winEnd - winStart + 1; + memory_space->install_read_handler(winStart, winEnd, 0, 0, read32_delegate(FUNC(vrc4373_device::target2_r), this)); + memory_space->install_write_handler(winStart, winEnd, 0, 0, write32_delegate(FUNC(vrc4373_device::target2_w), this)); + if (LOG_NILE) + logerror("%s: map_extra Target Window 2 start=%08X end=%08X size=%08X laddr=%08X\n", tag(), winStart, winEnd, winSize, m_target2_laddr); + } +} + +void vrc4373_device::reset_all_mappings() +{ + pci_device::reset_all_mappings(); +} + +void vrc4373_device::set_cpu_tag(const char *_cpu_tag) +{ + if (LOG_NILE) + logerror("%s: set_cpu_tag\n", tag()); + cpu_tag = _cpu_tag; +} +// PCI bus control +READ32_MEMBER (vrc4373_device::pcictrl_r) +{ + UINT32 result = 0; + if (LOG_NILE) + logerror("%06X:nile pcictrl_r from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER (vrc4373_device::pcictrl_w) +{ + if (LOG_NILE) + logerror("%06X:nile pcictrl_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); +} +// PCI Master Window 1 +READ32_MEMBER (vrc4373_device::master1_r) +{ + UINT32 result = this->space(AS_DATA).read_dword(m_pci1_laddr | (offset*4), mem_mask); + if (LOG_NILE_MASTER) + logerror("%06X:nile master1 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER (vrc4373_device::master1_w) +{ + this->space(AS_DATA).write_dword(m_pci1_laddr | (offset*4), data, mem_mask); + if (LOG_NILE_MASTER) + logerror("%06X:nile master1 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); +} + +// PCI Master Window 2 +READ32_MEMBER (vrc4373_device::master2_r) +{ + UINT32 result = this->space(AS_DATA).read_dword(m_pci2_laddr | (offset*4), mem_mask); + if (LOG_NILE_MASTER) + logerror("%06X:nile master2 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER (vrc4373_device::master2_w) +{ + this->space(AS_DATA).write_dword(m_pci2_laddr | (offset*4), data, mem_mask); + if (LOG_NILE_MASTER) + logerror("%06X:nile master2 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); +} + +// PCI Master IO Window +READ32_MEMBER (vrc4373_device::master_io_r) +{ + UINT32 result = this->space(AS_IO).read_dword(m_pci_io_laddr | (offset*4), mem_mask); + if (LOG_NILE_MASTER) + logerror("%06X:nile master io read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER (vrc4373_device::master_io_w) +{ + this->space(AS_IO).write_dword(m_pci_io_laddr | (offset*4), data, mem_mask); + if (LOG_NILE_MASTER) + logerror("%06X:nile master io write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); +} + +// PCI Target Window 1 +READ32_MEMBER (vrc4373_device::target1_r) +{ + UINT32 result = this->space(AS_PROGRAM).read_dword(m_target1_laddr | (offset*4), mem_mask); + if (LOG_NILE_TARGET) + logerror("%06X:nile target1 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER (vrc4373_device::target1_w) +{ + this->space(AS_PROGRAM).write_dword(m_target1_laddr | (offset*4), data, mem_mask); + if (LOG_NILE_TARGET) + logerror("%06X:nile target1 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); +} + +// PCI Target Window 2 +READ32_MEMBER (vrc4373_device::target2_r) +{ + UINT32 result = this->space(AS_PROGRAM).read_dword(m_target2_laddr | (offset*4), mem_mask); + if (LOG_NILE_TARGET) + logerror("%06X:nile target2 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER (vrc4373_device::target2_w) +{ + this->space(AS_PROGRAM).write_dword(m_target2_laddr | (offset*4), data, mem_mask); + if (LOG_NILE_TARGET) + logerror("%06X:nile target2 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); +} + +// CPU I/F +READ32_MEMBER (vrc4373_device::cpu_if_r) +{ + UINT32 result = m_cpu_regs[offset]; + switch (offset) { + case NREG_PCICAR: + result = config_address_r(space, offset); + break; + case NREG_PCICDR: + result = config_data_r(space, offset); + break; + default: + break; + } + if (LOG_NILE) + logerror("%06X:nile read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} + +WRITE32_MEMBER(vrc4373_device::cpu_if_w) +{ + if (LOG_NILE) + logerror("%06X:nile write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + + UINT32 modData; + COMBINE_DATA(&m_cpu_regs[offset]); + switch (offset) { + case NREG_PCIMW1: + m_pci1_laddr = (data&0xff)<<24; + remap_cb(); + break; + case NREG_PCIMW2: + m_pci2_laddr = (data&0xff)<<24; + remap_cb(); + break; + case NREG_PCIMIOW: + m_pci_io_laddr = (data&0xff)<<24; + remap_cb(); + break; + case NREG_PCITW1: + m_target1_laddr = (data&0x7FF)<<21; + break; + case NREG_PCITW2: + m_target2_laddr = (data&0x7FF)<<21; + break; + case NREG_PCICAR: + // Bits in reserved area are used for device selection of type 0 config transactions + // Assuming 23:11 get mapped into device number for configuration + if ((data&0x3) == 0x0) { + // Type 0 transaction + modData = 0; + // Select the device based on one hot bit + for (int i=11; i<24; i++) { + if ((data>>i)&0x1) { + // One hot encoding, bit 11 will mean device 1 + modData = i-10; + break; + } + } + // Re-organize into Type 1 transaction for bus 0 (local bus) + modData = (modData<<11) | (data&0x7ff) | (0x80000000); + } else { + // Type 1 transaction, no modification needed + modData = data; + } + pci_host_device::config_address_w(space, offset, modData); + break; + case NREG_PCICDR: + pci_host_device::config_data_w(space, offset, data); + break; + case NREG_BMCR: + if ((data>>3)&0x1) { + m_ram_size = 1<<22; // 4MB + for (int i=14; i<=15; i++) { + if (!((data>>i)&0x1)) m_ram_size<<=1; + else break; + } + m_ram.resize(m_ram_size/4); + m_ram_base = (data & 0x0fc00000); + } + remap_cb(); + break; + case NREG_SIMM1: + if ((data>>3)&0x1) { + m_simm_size = 1<<21; // 2MB + for (int i=13; i<=17; i++) { + if (!((data>>i)&0x1)) m_simm_size<<=1; + else break; + } + m_simm.resize(m_simm_size/4); + m_simm_base = (data & 0x0fe00000); + } + remap_cb(); + break; + default: + break; + } + +} + diff --git a/src/emu/machine/vrc4373.h b/src/emu/machine/vrc4373.h new file mode 100644 index 00000000000..17fa5de7e9c --- /dev/null +++ b/src/emu/machine/vrc4373.h @@ -0,0 +1,116 @@ +// NEC VRC 4373 System Controller + +#ifndef VRC4373_H +#define VRC4373_H + +#include "pci.h" + +#define MCFG_VRC4373_ADD(_tag, _cpu_tag) \ + MCFG_PCI_HOST_ADD(_tag, VRC4373, 0x005B1033, 0x00, 0x00000000) \ + downcast(device)->set_cpu_tag(_cpu_tag); + +#define VRC4373_PAGESHIFT 12 + +/* NILE 3 registers 0x000-0x0ff */ +#define NREG_BMCR (0x000/4) +#define NREG_SIMM1 (0x004/4) +#define NREG_SIMM2 (0x008/4) +#define NREG_SIMM3 (0x00C/4) +#define NREG_SIMM4 (0x010/4) +#define NREG_PCIMW1 (0x014/4) +#define NREG_PCIMW2 (0x018/4) +#define NREG_PCITW1 (0x01C/4) +#define NREG_PCITW2 (0x020/4) +#define NREG_PCIMIOW (0x024/4) +#define NREG_PCICDR (0x028/4) +#define NREG_PCICAR (0x02C/4) +#define NREG_PCIMB1 (0x030/4) +#define NREG_PCIMB2 (0x034/4) +#define NREG_DMACR1 (0x038/4) +#define NREG_DMAMAR1 (0x03C/4) +#define NREG_DMAPCI1 (0x040/4) +#define NREG_DMACR2 (0x044/4) +#define NREG_DMAMAR2 (0x048/4) +#define NREG_DMAPCI2 (0x04C/4) + +#define NREG_BESR (0x050/4) +#define NREG_ICSR (0x054/4) +#define NREG_DRAMRCR (0x058/4) +#define NREG_BOOTWP (0x05C/4) +#define NREG_PCIEAR (0x060/4) +#define NREG_DMA_WR (0x064/4) +#define NREG_DMA_CMAR (0x068/4) +#define NREG_DMA_CPAR (0x06C/4) +#define NREG_PCIRC (0x070/4) +#define NREG_PCIEN (0x074/4) +#define NREG_PMIR (0x078/4) + +class vrc4373_device : public pci_host_device { +public: + vrc4373_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual void reset_all_mappings(); + virtual void map_extra(UINT64 memory_window_start, UINT64 memory_window_end, UINT64 memory_offset, address_space *memory_space, + UINT64 io_window_start, UINT64 io_window_end, UINT64 io_offset, address_space *io_space); + + + void set_cpu_tag(const char *tag); + + virtual DECLARE_ADDRESS_MAP(config_map, 32); + + DECLARE_READ32_MEMBER( pcictrl_r); + DECLARE_WRITE32_MEMBER( pcictrl_w); + //cpu bus registers + DECLARE_READ32_MEMBER (cpu_if_r); + DECLARE_WRITE32_MEMBER(cpu_if_w); + + DECLARE_READ32_MEMBER (master1_r); + DECLARE_WRITE32_MEMBER(master1_w); + + DECLARE_READ32_MEMBER (master2_r); + DECLARE_WRITE32_MEMBER(master2_w); + + DECLARE_READ32_MEMBER (master_io_r); + DECLARE_WRITE32_MEMBER(master_io_w); + + virtual DECLARE_ADDRESS_MAP(target1_map, 32); + DECLARE_READ32_MEMBER (target1_r); + DECLARE_WRITE32_MEMBER(target1_w); + + virtual DECLARE_ADDRESS_MAP(target2_map, 32); + DECLARE_READ32_MEMBER (target2_r); + DECLARE_WRITE32_MEMBER(target2_w); + +protected: + address_space *m_cpu_space; + virtual const address_space_config *memory_space_config(address_spacenum spacenum) const; + virtual void device_start(); + virtual void device_reset(); + +private: + cpu_device *m_cpu; + const char *cpu_tag; + + address_space_config m_mem_config, m_io_config; + + DECLARE_ADDRESS_MAP(cpu_map, 32); + + UINT32 m_ram_size; + UINT32 m_ram_base; + dynamic_array m_ram; + + UINT32 m_simm_size; + UINT32 m_simm_base; + dynamic_array m_simm; + + + UINT32 m_cpu_regs[0x7c]; + + UINT32 m_pci1_laddr, m_pci2_laddr, m_pci_io_laddr; + UINT32 m_target1_laddr, m_target2_laddr; +}; + + +extern const device_type VRC4373; + +#endif diff --git a/src/emu/sound/es1373.c b/src/emu/sound/es1373.c new file mode 100644 index 00000000000..aae26ba93f9 --- /dev/null +++ b/src/emu/sound/es1373.c @@ -0,0 +1,196 @@ +#include "es1373.h" + +#define LOG_ES (1) + +const device_type ES1373 = &device_creator; + +DEVICE_ADDRESS_MAP_START(map, 32, es1373_device) + AM_RANGE(0x00, 0x3f) AM_READWRITE (reg_r, reg_w) +ADDRESS_MAP_END + +es1373_device::es1373_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pci_device(mconfig, ES1373, "Creative Labs Ensoniq AudioPCI97 ES1373", tag, owner, clock, "es1373", __FILE__) +{ +} + +void es1373_device::device_start() +{ + pci_device::device_start(); + add_map(0x40, M_IO, FUNC(es1373_device::map)); +} + +void es1373_device::device_reset() +{ + pci_device::device_reset(); + memset(m_es_regs, 0, sizeof(m_es_regs)); + memset(m_ac97_regs, 0, sizeof(m_ac97_regs)); + m_ac97_regs[0] = 0x0800; +} + +READ32_MEMBER (es1373_device::reg_r) +{ + UINT32 result = m_es_regs[offset]; + switch (offset) { + case ES_CODEC: + break; + case ES_HOST_IF0: // 0x30 + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + result = m_dac1_fr.pci_addr; + break; + case 0xd: + result = m_adc_fr.pci_addr; + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 Read UART offset %02X & %08X\n", space.device().safe_pc(), offset*4, mem_mask); + default: + break; + } + break; + case ES_HOST_IF1: // 0x34 + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + result = (m_dac1_fr.curr_count<<16) | m_dac1_fr.buff_size; + break; + case 0xd: + result = (m_adc_fr.curr_count<<16) | m_adc_fr.buff_size; + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 write UART offset %02X & %08X\n", space.device().safe_pc(), offset*4, mem_mask); + default: + break; + } + break; + case ES_HOST_IF2: // 0x38 + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + result = m_dac2_fr.pci_addr; + break; + case 0xd: + logerror("%06X:ES1373 read Unknown place offset %02X & %08X\n", space.device().safe_pc(), offset*4, mem_mask); + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 read UART offset %02X & %08X\n", space.device().safe_pc(), offset*4, mem_mask); + default: + break; + } + break; + case ES_HOST_IF3: // 0x3C + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + result = (m_dac2_fr.curr_count<<16) | m_dac2_fr.buff_size; + break; + case 0xd: + logerror("%06X:ES1373 read Unknown place offset %02X & %08X\n", space.device().safe_pc(), offset*4, mem_mask); + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 read UART offset %02X & %08X\n", space.device().safe_pc(), offset*4, mem_mask); + default: + break; + } + break; + default: + break; + } + if (LOG_ES) + logerror("%06X:ES1373 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); + return result; +} + +WRITE32_MEMBER(es1373_device::reg_w) +{ + COMBINE_DATA(&m_es_regs[offset]); + switch (offset) { + case ES_SRC_IF: + if (data&(1<<24)) { + // Write to Sample Rate Converter Ram + m_src_ram[(data>>25)&0x7F] = data&0xFFFF; + } else { + // Read From Sample Rate Converter Ram + m_es_regs[offset] = (data&0xFFFF0000) | m_src_ram[(data>>25)&0x7F]; + } + break; + case ES_CODEC: + if (data&(1<<23)) { + // Read from AC97 codec registers + m_es_regs[offset] = (data&0xFFFF0000) | m_ac97_regs[(data>>16)&0x7f] | 0x80000000; + } else { + // Write to AC97 codec registers + m_ac97_regs[(data>>16)&0x7f] = data&0xFFFF; + } + break; + case ES_HOST_IF0: // 0x30 + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + m_dac1_fr.pci_addr = data; + break; + case 0xd: + m_adc_fr.pci_addr = data; + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 write UART offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + default: + break; + } + break; + case ES_HOST_IF1: // 0x34 + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + m_dac1_fr.curr_count = (data>>16)&0xffff; + m_dac1_fr.buff_size = data&0xffff; + break; + case 0xd: + m_adc_fr.curr_count = (data>>16)&0xffff; + m_adc_fr.buff_size = data&0xffff; + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 write UART offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + default: + break; + } + break; + case ES_HOST_IF2: // 0x38 + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + m_dac2_fr.pci_addr = data; + break; + case 0xd: + logerror("%06X:ES1373 write Unknown place offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 write UART offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + default: + break; + } + break; + case ES_HOST_IF3: // 0x3C + switch (m_es_regs[ES_MEM_PAGE]&0xf) { + case 0xc: + m_dac2_fr.curr_count = (data>>16)&0xffff; + m_dac2_fr.buff_size = data&0xffff; + break; + case 0xd: + logerror("%06X:ES1373 write Unknown place offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + break; + case 0xe: + case 0xf: + logerror("%06X:ES1373 write UART offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + default: + break; + } + break; + default: + break; + } + + if (LOG_ES) + logerror("%06X:ES1373 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); + +} diff --git a/src/emu/sound/es1373.h b/src/emu/sound/es1373.h new file mode 100644 index 00000000000..b2ee13f1feb --- /dev/null +++ b/src/emu/sound/es1373.h @@ -0,0 +1,63 @@ +// Creative Labs Ensonic AudioPCI97 ES1373 + +#ifndef ES1373_H +#define ES1373_H + +#include "machine/pci.h" + +#define MCFG_ES1373_ADD(_tag) \ + MCFG_PCI_DEVICE_ADD(_tag, ES1373, 0x12741371, 0x04, 0x040100, 0x12741371) + +/* Ensonic ES1373 registers 0x00-0x3f */ +#define ES_INT_CS_CTRL (0x00/4) +#define ES_INT_CS_STATUS (0x04/4) +#define ES_UART_DATA (0x08/4) +#define ES_UART_STATUS (0x09/4) +#define ES_UART_CTRL (0x09/4) +#define ES_UART_RSVD (0x0A/4) +#define ES_MEM_PAGE (0x0C/4) +#define ES_SRC_IF (0x10/4) +#define ES_CODEC (0x14/4) +#define ES_LEGACY (0x18/4) +#define ES_CHAN_CTRL (0x1C/4) +#define ES_SERIAL_CTRL (0x20/4) +#define ES_DAC1_CNT (0x24/4) +#define ES_DAC2_CNT (0x28/4) +#define ES_ADC_CNT (0x2C/4) +#define ES_ADC_CNT (0x2C/4) +#define ES_HOST_IF0 (0x30/4) +#define ES_HOST_IF1 (0x34/4) +#define ES_HOST_IF2 (0x38/4) +#define ES_HOST_IF3 (0x3C/4) + +struct frame_reg { + UINT32 pci_addr; + UINT16 curr_count; + UINT16 buff_size; + frame_reg() : pci_addr(0), curr_count(0), buff_size(0) {} +}; + +class es1373_device : public pci_device { +public: + es1373_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ32_MEMBER (reg_r); + DECLARE_WRITE32_MEMBER(reg_w); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + DECLARE_ADDRESS_MAP(map, 32); + UINT16 m_ac97_regs[0x80]; + UINT32 m_es_regs[0x10]; + UINT16 m_src_ram[0x80]; + frame_reg m_dac1_fr; + frame_reg m_dac2_fr; + frame_reg m_adc_fr; +}; + +extern const device_type ES1373; + +#endif diff --git a/src/emu/video/voodoo_pci.c b/src/emu/video/voodoo_pci.c new file mode 100644 index 00000000000..2b7a6f07433 --- /dev/null +++ b/src/emu/video/voodoo_pci.c @@ -0,0 +1,81 @@ +#include "voodoo_pci.h" + +static MACHINE_CONFIG_FRAGMENT( voodoo_pci ) + MCFG_DEVICE_ADD("voodoo", VOODOO_BANSHEE, STD_VOODOO_BANSHEE_CLOCK) + MCFG_VOODOO_FBMEM(16) + MCFG_VOODOO_SCREEN_TAG("screen") + MCFG_VOODOO_CPU_TAG(":maincpu") +MACHINE_CONFIG_END + +machine_config_constructor voodoo_pci_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( voodoo_pci ); +} + +const device_type VOODOO_PCI = &device_creator; + +DEVICE_ADDRESS_MAP_START(reg_map, 32, voodoo_pci_device) + AM_RANGE(0x0, 0x01ffffff) AM_DEVREADWRITE("voodoo", voodoo_banshee_device, banshee_r, banshee_w) +ADDRESS_MAP_END +DEVICE_ADDRESS_MAP_START(lfb_map, 32, voodoo_pci_device) + AM_RANGE(0x0, 0x00ffffff) AM_DEVREADWRITE("voodoo", voodoo_banshee_device, banshee_fb_r, banshee_fb_w) +ADDRESS_MAP_END +DEVICE_ADDRESS_MAP_START(io_map, 32, voodoo_pci_device) + AM_RANGE(0x000, 0x0ff) AM_DEVREADWRITE("voodoo", voodoo_banshee_device, banshee_io_r, banshee_io_w) +ADDRESS_MAP_END + +voodoo_pci_device::voodoo_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pci_device(mconfig, VOODOO_PCI, "Voodoo PCI", tag, owner, clock, "voodoo_pci", __FILE__), + m_voodoo(*this, "voodoo") +{ +} + +void voodoo_pci_device::device_start() +{ + pci_device::device_start(); + add_map(32*1024*1024, M_MEM, FUNC(voodoo_pci_device::reg_map)); + add_map(16*1024*1024, M_MEM, FUNC(voodoo_pci_device::lfb_map)); + add_map(256, M_IO, FUNC(voodoo_pci_device::io_map)); +} + +void voodoo_pci_device::device_reset() +{ + pci_device::device_reset(); +} + +void voodoo_pci_device::map_extra(UINT64 memory_window_start, UINT64 memory_window_end, UINT64 memory_offset, address_space *memory_space, + UINT64 io_window_start, UINT64 io_window_end, UINT64 io_offset, address_space *io_space) +{ + logerror("%s: map_extra\n", tag()); + // Really awkward way of getting vga address space mapped + // Should really be dependent on voodoo VGAINIT0 bit 8 and IO base + 0xc3 bit 0 + if (1) { + // io map is on bank_infos[2] + bank_info &bi = bank_infos[2]; + if(bi.adr==-1) + return; + if(UINT32(bi.adr) == UINT32(~(bi.size - 1))) + return; + + UINT64 start; + address_space *space; + if(bi.flags & M_IO) { + space = io_space; + start = bi.adr + io_offset; + } else { + space = memory_space; + start = bi.adr + memory_offset; + } + // The mapping needs to only check high address bits + start = (start & 0xFFFF0000) + 0x300; + UINT64 end = (start & 0xFFFF0000) + 0x3ef; + space->install_device_delegate(start, end, *this, bi.map); + logerror("%s: map %s at %0*x-%0*x\n", tag(), bi.map.name(), bi.flags & M_IO ? 4 : 8, UINT32(start), bi.flags & M_IO ? 4 : 8, UINT32(end)); + } + +} + +UINT32 voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; +} diff --git a/src/emu/video/voodoo_pci.h b/src/emu/video/voodoo_pci.h new file mode 100644 index 00000000000..878c564e4b8 --- /dev/null +++ b/src/emu/video/voodoo_pci.h @@ -0,0 +1,35 @@ +// 3dfx Voodoo Graphics SST-1/2 emulator. + +#ifndef VOODOO_PCI_H +#define VOODOO_PCI_H + +#include "machine/pci.h" +#include "voodoo.h" + +#define MCFG_VOODOO_ADD(_tag) \ + MCFG_PCI_DEVICE_ADD(_tag, VOODOO_PCI, 0x121a0005, 0x02, 0x000003, 0x000000) + +class voodoo_pci_device : public pci_device { +public: + voodoo_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual void map_extra(UINT64 memory_window_start, UINT64 memory_window_end, UINT64 memory_offset, address_space *memory_space, + UINT64 io_window_start, UINT64 io_window_end, UINT64 io_offset, address_space *io_space); + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_voodoo; + + DECLARE_ADDRESS_MAP(reg_map, 32); + DECLARE_ADDRESS_MAP(lfb_map, 32); + DECLARE_ADDRESS_MAP(io_map, 32); +}; + +extern const device_type VOODOO_PCI; + +#endif diff --git a/src/mame/machine/iteagle_fpga.c b/src/mame/machine/iteagle_fpga.c new file mode 100644 index 00000000000..22f907ddcdd --- /dev/null +++ b/src/mame/machine/iteagle_fpga.c @@ -0,0 +1,364 @@ +#include "iteagle_fpga.h" +#include "coreutil.h" + +#define LOG_FPGA (1) +#define LOG_RTC (0) +#define LOG_EEPROM (1) +#define LOG_IDE (0) +#define LOG_IDE_CTRL (0) + + +const device_type ITEAGLE_FPGA = &device_creator; + +DEVICE_ADDRESS_MAP_START(ctrl_map, 32, iteagle_fpga_device) + AM_RANGE(0x000, 0x02f) AM_READWRITE(ctrl_r, ctrl_w) +ADDRESS_MAP_END + +DEVICE_ADDRESS_MAP_START(fpga_map, 32, iteagle_fpga_device) + AM_RANGE(0x000, 0x01f) AM_READWRITE(fpga_r, fpga_w) +ADDRESS_MAP_END + +DEVICE_ADDRESS_MAP_START(rtc_map, 32, iteagle_fpga_device) + AM_RANGE(0x000, 0x800) AM_READWRITE(rtc_r, rtc_w) +ADDRESS_MAP_END + +iteagle_fpga_device::iteagle_fpga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pci_device(mconfig, ITEAGLE_FPGA, "ITEagle FPGA", tag, owner, clock, "iteagle_fpga", __FILE__) +{ +} + +void iteagle_fpga_device::device_start() +{ + pci_device::device_start(); + status = 0x5555; + command = 0x5555; + + add_map(sizeof(m_ctrl_regs), M_IO, FUNC(iteagle_fpga_device::ctrl_map)); + // ctrl defaults to base address 0x00000000 + bank_infos[0].adr = 0x00000000 & (~(bank_infos[0].size - 1)); + + add_map(sizeof(m_fpga_regs), M_IO, FUNC(iteagle_fpga_device::fpga_map)); + // fpga defaults to base address 0x00000300 + bank_infos[1].adr = 0x00000300 & (~(bank_infos[1].size - 1)); + + add_map(sizeof(m_rtc_regs), M_MEM, FUNC(iteagle_fpga_device::rtc_map)); + // RTC defaults to base address 0x000c0000 + bank_infos[2].adr = 0x000c0000 & (~(bank_infos[2].size - 1)); +} + +void iteagle_fpga_device::device_reset() +{ + pci_device::device_reset(); + memset(m_ctrl_regs, 0, sizeof(m_ctrl_regs)); + memset(m_fpga_regs, 0, sizeof(m_fpga_regs)); + memset(m_rtc_regs, 0, sizeof(m_rtc_regs)); + // 0x23 & 0x20 = IDE LED + m_ctrl_regs[0x10/4] = 0x00000000; // 0xFFFFFFFF causes a write of 0xFFFEFFFF then 0xFFFFFFFF // Not sure + // 0x00&0x2 == 1 for boot + m_fpga_regs[0x00/4] = 0xC0000002; // 0xCF000002;// byte 3 is voltage sensor? high = 0x40 good = 0xC0 0xF0 0xFF; //0x80 0x30 0x00FF = voltage low + //m_fpga_regs[0x308/4]=0x0000ffff; // Low 16 bits gets read alot? + m_fpga_regs[0x08/4]=0x00000000; // Low 16 bits gets read alot? + m_prev_reg = 0; +} + +READ32_MEMBER( iteagle_fpga_device::ctrl_r ) +{ + UINT32 result = m_fpga_regs[offset]; + switch (offset) { + case 0x0/4: + if (LOG_FPGA) + logerror("%s:fpga ctrl_r from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + default: + if (LOG_FPGA) + logerror("%s:fpga ctrl_r from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + } + return result; +} + +WRITE32_MEMBER( iteagle_fpga_device::ctrl_w ) +{ + COMBINE_DATA(&m_fpga_regs[offset]); + switch (offset) { + case 0x20/4: // IDE LED and ?? + if (ACCESSING_BITS_16_23) { + // Probably watchdog + } else if (ACCESSING_BITS_24_31) { + // Bit 1 is IDE LED + } else { + if (LOG_FPGA) + logerror("%s:fpga ctrl_w to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + } + break; + default: + if (LOG_FPGA) + logerror("%s:fpga ctrl_w to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + break; + } +} + +READ32_MEMBER( iteagle_fpga_device::fpga_r ) +{ + UINT32 result = m_fpga_regs[offset]; + switch (offset) { + case 0x00/4: + if (LOG_FPGA && (m_prev_reg != offset && m_prev_reg != (0x08/4))) + logerror("%s:fpga read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + case 0x04/4: + result = (result & 0xFF0FFFFF) | (machine().root_device().ioport("SW5")->read()<<20); // Resolution + if (LOG_FPGA) + logerror("%s:fpga read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + + case 0x08/4: + if (LOG_FPGA && (m_prev_reg != offset && m_prev_reg != (0x00/4))) + logerror("%s:fpga read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + default: + if (LOG_FPGA) + logerror("%s:fpga read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + } + m_prev_reg = offset; + return result; +} + +WRITE32_MEMBER( iteagle_fpga_device::fpga_w ) +{ + UINT8 byte; + + COMBINE_DATA(&m_fpga_regs[offset]); + switch (offset) { + case 0x04/4: + if (ACCESSING_BITS_0_7) { + // ATMEL Chip access. Returns version id's when bit 7 is set. + byte = data & 0xFF; + if (byte & 0x80) { + switch (byte&0x3) { + case 0: + m_fpga_regs[offset] = (m_fpga_regs[offset]&0xFFFFFF00) | ((machine().root_device().ioport("VERSION")->read()>>4)&0xF); + break; + case 1: + m_fpga_regs[offset] = (m_fpga_regs[offset]&0xFFFFFF00) | ((machine().root_device().ioport("VERSION")->read()>>8)&0xF); + break; + case 2: + m_fpga_regs[offset] = (m_fpga_regs[offset]&0xFFFFFF00) | ((machine().root_device().ioport("VERSION")->read()>>12)&0xF); + break; + case 3: + m_fpga_regs[offset] = (m_fpga_regs[offset]&0xFFFFFF00) | ((machine().root_device().ioport("VERSION")->read()>>0)&0xF); + break; + } + } // Else??? + } + if (LOG_FPGA) + logerror("%s:fpga write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + break; + default: + if (LOG_FPGA) + logerror("%s:fpga write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + break; + } +} +//************************************* +//* RTC M48T02 +//************************************* +READ32_MEMBER( iteagle_fpga_device::rtc_r ) +{ + UINT32 result = m_rtc_regs[offset]; + + switch (offset) { + default: + if (LOG_RTC) + logerror("%s:RTC read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + } + return result; +} +WRITE32_MEMBER( iteagle_fpga_device::rtc_w ) +{ + system_time systime; + int raw[8]; + + COMBINE_DATA(&m_rtc_regs[offset]); + switch (offset) { + case 0x7F8/4: // M48T02 time + if (data & mem_mask & 0x40) { + // get the current date/time from the core + machine().current_datetime(systime); + raw[0] = 0x40; + raw[1] = dec_2_bcd(systime.local_time.second); + raw[2] = dec_2_bcd(systime.local_time.minute); + raw[3] = dec_2_bcd(systime.local_time.hour); + + raw[4] = dec_2_bcd((systime.local_time.weekday != 0) ? systime.local_time.weekday : 7); + raw[5] = dec_2_bcd(systime.local_time.mday); + raw[6] = dec_2_bcd(systime.local_time.month + 1); + raw[7] = dec_2_bcd(systime.local_time.year - 1900); // Epoch is 1900 + m_rtc_regs[0x7F8/4] = (raw[3]<<24) | (raw[2]<<16) | (raw[1]<<8) | (raw[0] <<0); + //m_rtc_regs[0x7FC/4] = (raw[7]<<24) | (raw[6]<<16) | (raw[5]<<8) | (raw[4] <<0); + m_rtc_regs[0x7FC/4] = (0x95<<24) | (raw[6]<<16) | (raw[5]<<8) | (raw[4] <<0); + } + if (LOG_RTC) + logerror("%s:RTC write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + + break; + default: + if (LOG_RTC) + logerror("%s:RTC write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + break; + } + +} + +//************************************ +// Attached serial EEPROM +//************************************ + +const device_type ITEAGLE_EEPROM = &device_creator; + +DEVICE_ADDRESS_MAP_START(eeprom_map, 32, iteagle_eeprom_device) + AM_RANGE(0x0000, 0x000F) AM_READWRITE(eeprom_r, eeprom_w) AM_SHARE("eeprom") +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( iteagle_eeprom ) + MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") +MACHINE_CONFIG_END + +machine_config_constructor iteagle_eeprom_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( iteagle_eeprom ); +} + +iteagle_eeprom_device::iteagle_eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pci_device(mconfig, ITEAGLE_EEPROM, "ITEagle EEPROM AT93C46", tag, owner, clock, "eeprom", __FILE__), + m_eeprom(*this, "eeprom") +{ +} + +void iteagle_eeprom_device::device_start() +{ + pci_device::device_start(); + skip_map_regs(1); + add_map(0x10, M_IO, FUNC(iteagle_eeprom_device::eeprom_map)); +} + +void iteagle_eeprom_device::device_reset() +{ + pci_device::device_reset(); +} + +READ32_MEMBER( iteagle_eeprom_device::eeprom_r ) +{ + UINT32 result = 0; + + switch (offset) { + case 0xC/4: // I2C Handler + if (ACCESSING_BITS_16_23) { + result = m_eeprom->do_read()<<(16+3); + } else { + if (LOG_EEPROM) + logerror("%s:eeprom read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + } + break; + default: + if (LOG_EEPROM) + logerror("%s:eeprom read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + break; + } + return result; +} + +WRITE32_MEMBER( iteagle_eeprom_device::eeprom_w ) +{ + switch (offset) { + case 0xC/4: // I2C Handler + if (ACCESSING_BITS_16_23) { + m_eeprom->di_write((data & 0x040000) >> (16+2)); + m_eeprom->cs_write((data & 0x020000) ? ASSERT_LINE : CLEAR_LINE); + m_eeprom->clk_write((data & 0x010000) ? ASSERT_LINE : CLEAR_LINE); + } else { + if (LOG_EEPROM) + logerror("%s:eeprom write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + } + break; + default: + if (LOG_EEPROM) + logerror("%s:eeprom write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); + break; + } +} + +//************************************ +// Attached IDE Controller +//************************************ + +const device_type ITEAGLE_IDE = &device_creator; + +DEVICE_ADDRESS_MAP_START(ide_map, 32, iteagle_ide_device) + AM_RANGE(0x0, 0xf) AM_READWRITE(ide_r, ide_w) +ADDRESS_MAP_END + +DEVICE_ADDRESS_MAP_START(ide_ctrl_map, 32, iteagle_ide_device) + AM_RANGE(0x0, 0x3) AM_READWRITE(ide_ctrl_r, ide_ctrl_w) +ADDRESS_MAP_END + + +static MACHINE_CONFIG_FRAGMENT( iteagle_ide ) + MCFG_BUS_MASTER_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", NULL, true) + MCFG_BUS_MASTER_IDE_CONTROLLER_SPACE(":maincpu", AS_PROGRAM) +MACHINE_CONFIG_END + +machine_config_constructor iteagle_ide_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( iteagle_ide ); +} +iteagle_ide_device::iteagle_ide_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pci_device(mconfig, ITEAGLE_IDE, "ITEagle IDE Controller", tag, owner, clock, "ide", __FILE__), + m_ide(*this, "ide") +{ +} + +void iteagle_ide_device::device_start() +{ + pci_device::device_start(); + add_map(0x10, M_IO, FUNC(iteagle_ide_device::ide_map)); + bank_infos[0].adr = 0x1f0; + add_map(0x4, M_IO, FUNC(iteagle_ide_device::ide_ctrl_map)); + bank_infos[1].adr = 0x3f4; +} + +void iteagle_ide_device::device_reset() +{ + pci_device::device_reset(); +} +//************************************* +//* IDE +//************************************* +READ32_MEMBER( iteagle_ide_device::ide_r ) +{ + UINT32 result = m_ide->read_cs0(space, offset, mem_mask); + if (LOG_IDE) + logerror("%s:ide_r read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER( iteagle_ide_device::ide_w ) +{ + m_ide->write_cs0(space, offset, data, mem_mask); + if (LOG_IDE) + logerror("%s:ide_w write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); +} +READ32_MEMBER( iteagle_ide_device::ide_ctrl_r ) +{ + UINT32 result = m_ide->read_cs1(space, offset+1, mem_mask); + if (LOG_IDE_CTRL) + logerror("%s:ide_ctrl_r read from offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, result, mem_mask); + return result; +} +WRITE32_MEMBER( iteagle_ide_device::ide_ctrl_w ) +{ + m_ide->write_cs1(space, offset+1, data, mem_mask); + if (LOG_IDE_CTRL) + logerror("%s:ide_ctrl_w write to offset %04X = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); +} diff --git a/src/mame/machine/iteagle_fpga.h b/src/mame/machine/iteagle_fpga.h new file mode 100644 index 00000000000..acc4bd85b00 --- /dev/null +++ b/src/mame/machine/iteagle_fpga.h @@ -0,0 +1,91 @@ +//************************************* +// iteagle fpga device +//************************************* +#ifndef ITEAGLE_FPGA_H +#define ITEAGLE_FPGA_H + +#include "machine/pci.h" +#include "machine/idectrl.h" +#include "machine/eepromser.h" + +#define MCFG_ITEAGLE_FPGA_ADD(_tag) \ + MCFG_PCI_DEVICE_ADD(_tag, ITEAGLE_FPGA, 0x55CC33AA, 0xAA, 0xAAAAAA, 0x00) + +#define MCFG_ITEAGLE_EEPROM_ADD(_tag) \ + MCFG_PCI_DEVICE_ADD(_tag, ITEAGLE_EEPROM, 0xAABBCCDD, 0x00, 0x088000, 0x00) + +#define MCFG_ITEAGLE_IDE_ADD(_tag) \ + MCFG_PCI_DEVICE_ADD(_tag, ITEAGLE_IDE, 0x11223344, 0x00, 0x010100, 0x00) + +class iteagle_fpga_device : public pci_device { +public: + iteagle_fpga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + + UINT32 m_ctrl_regs[0x30]; + UINT32 m_fpga_regs[0x20]; + UINT32 m_rtc_regs[0x800]; + UINT32 m_prev_reg; + + DECLARE_ADDRESS_MAP(rtc_map, 32); + DECLARE_ADDRESS_MAP(fpga_map, 32); + DECLARE_ADDRESS_MAP(ctrl_map, 32); + + DECLARE_READ32_MEMBER( ctrl_r ); + DECLARE_WRITE32_MEMBER( ctrl_w ); + DECLARE_READ32_MEMBER( fpga_r ); + DECLARE_WRITE32_MEMBER( fpga_w ); + DECLARE_READ32_MEMBER( rtc_r ); + DECLARE_WRITE32_MEMBER( rtc_w ); +}; + +class iteagle_eeprom_device : public pci_device { +public: + iteagle_eeprom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + + required_device m_eeprom; + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + DECLARE_ADDRESS_MAP(eeprom_map, 32); + DECLARE_READ32_MEMBER( eeprom_r ); + DECLARE_WRITE32_MEMBER( eeprom_w ); +}; + +class iteagle_ide_device : public pci_device { +public: + iteagle_ide_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + + required_device m_ide; + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + DECLARE_ADDRESS_MAP(ide_map, 32); + DECLARE_ADDRESS_MAP(ide_ctrl_map, 32); + + DECLARE_READ32_MEMBER( ide_r ); + DECLARE_WRITE32_MEMBER( ide_w ); + DECLARE_READ32_MEMBER( ide_ctrl_r ); + DECLARE_WRITE32_MEMBER( ide_ctrl_w ); +}; + +extern const device_type ITEAGLE_FPGA; +extern const device_type ITEAGLE_EEPROM; +extern const device_type ITEAGLE_IDE; + +#endif From ec0457161f497080070eb342370fbd63794ce8a0 Mon Sep 17 00:00:00 2001 From: arbee Date: Sun, 22 Mar 2015 20:27:23 -0400 Subject: [PATCH 162/201] vrc4373: fix PCI target accesses. [Ted Green] --- src/emu/machine/vrc4373.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/emu/machine/vrc4373.c b/src/emu/machine/vrc4373.c index e1a3c7eac81..b1e5c6e8928 100644 --- a/src/emu/machine/vrc4373.c +++ b/src/emu/machine/vrc4373.c @@ -215,14 +215,14 @@ WRITE32_MEMBER (vrc4373_device::master_io_w) // PCI Target Window 1 READ32_MEMBER (vrc4373_device::target1_r) { - UINT32 result = this->space(AS_PROGRAM).read_dword(m_target1_laddr | (offset*4), mem_mask); + UINT32 result = m_cpu->space(AS_PROGRAM).read_dword(m_target1_laddr | (offset*4), mem_mask); if (LOG_NILE_TARGET) logerror("%06X:nile target1 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::target1_w) { - this->space(AS_PROGRAM).write_dword(m_target1_laddr | (offset*4), data, mem_mask); + m_cpu->space(AS_PROGRAM).write_dword(m_target1_laddr | (offset*4), data, mem_mask); if (LOG_NILE_TARGET) logerror("%06X:nile target1 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } @@ -230,14 +230,14 @@ WRITE32_MEMBER (vrc4373_device::target1_w) // PCI Target Window 2 READ32_MEMBER (vrc4373_device::target2_r) { - UINT32 result = this->space(AS_PROGRAM).read_dword(m_target2_laddr | (offset*4), mem_mask); + UINT32 result = m_cpu->space(AS_PROGRAM).read_dword(m_target2_laddr | (offset*4), mem_mask); if (LOG_NILE_TARGET) logerror("%06X:nile target2 read from offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, result, mem_mask); return result; } WRITE32_MEMBER (vrc4373_device::target2_w) { - this->space(AS_PROGRAM).write_dword(m_target2_laddr | (offset*4), data, mem_mask); + m_cpu->space(AS_PROGRAM).write_dword(m_target2_laddr | (offset*4), data, mem_mask); if (LOG_NILE_TARGET) logerror("%06X:nile target2 write to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); } From 72234733be4956faceabab04c04b5d713a3a0cdb Mon Sep 17 00:00:00 2001 From: arbee Date: Sun, 22 Mar 2015 20:36:52 -0400 Subject: [PATCH 163/201] atlantis: trivial conversion to real PCI + VR4373. no visible progress. (nw) --- src/mame/drivers/atlantis.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/mame/drivers/atlantis.c b/src/mame/drivers/atlantis.c index bf0971073aa..803270545b6 100644 --- a/src/mame/drivers/atlantis.c +++ b/src/mame/drivers/atlantis.c @@ -22,8 +22,6 @@ * Quantum Fireball CX 6.4GB IDE HDD (C/H/S 13328/15/63) TODO: - * Proper VR4373 implementation - * Proper PCI bus implementation * PCI peripherals NOTES: @@ -38,6 +36,8 @@ #include "machine/idectrl.h" #include "machine/midwayic.h" #include "audio/dcs.h" +#include "machine/pci.h" +#include "machine/vrc4373.h" class atlantis_state : public driver_device @@ -103,17 +103,6 @@ UINT32 atlantis_state::screen_update_mwskins(screen_device &screen, bitmap_ind16 * *************************************/ -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 32, atlantis_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000000, 0x007fffff) AM_RAM // 8 MB main RAM - // 04000000 - PCI slot (ActionTec modem, ROM dump TBD) - // 08000000 - PLX9050 chip (Zeus interface?) - // 0F000000 - VR4373 ("Nile 3") registers - AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_REGION("user1", 0) AM_SHARE("rombase") -ADDRESS_MAP_END - - - /************************************* * @@ -136,8 +125,9 @@ static MACHINE_CONFIG_START( mwskins, atlantis_state ) MCFG_CPU_ADD("maincpu", VR4310LE, 166666666) // clock is TRUSTED MCFG_MIPS3_ICACHE_SIZE(16384) MCFG_MIPS3_DCACHE_SIZE(16384) - MCFG_CPU_PROGRAM_MAP(main_map) + MCFG_PCI_ROOT_ADD( ":pci") + MCFG_VRC4373_ADD( ":pci:00.0", ":maincpu") MCFG_IDE_CONTROLLER_ADD("ide", ata_devices, "hdd", NULL, true) @@ -167,7 +157,7 @@ MACHINE_CONFIG_END *************************************/ ROM_START( mwskins ) - ROM_REGION32_LE( 0x80000, "user1", 0 ) /* 512k for R4310 code */ + ROM_REGION32_LE( 0x80000, ":pci:00.0", 0 ) /* 512k for R4310 code */ ROM_LOAD( "skins_game_u4_boot_1.00.u4", 0x000000, 0x080000, CRC(0fe87720) SHA1(4b24abbe662a2d7b61e6a3f079e28b73605ba19f) ) DISK_REGION( "ide:0:hdd:image" ) @@ -175,7 +165,7 @@ ROM_START( mwskins ) ROM_END ROM_START( mwskinsa ) - ROM_REGION32_LE( 0x80000, "user1", 0 ) /* 512k for R4310 code */ + ROM_REGION32_LE( 0x80000, ":pci:00.0", 0 ) /* 512k for R4310 code */ ROM_LOAD( "skins_game_u4_boot_1.00.u4", 0x000000, 0x080000, CRC(0fe87720) SHA1(4b24abbe662a2d7b61e6a3f079e28b73605ba19f) ) DISK_REGION( "ide:0:hdd:image" ) @@ -183,7 +173,7 @@ ROM_START( mwskinsa ) ROM_END ROM_START( mwskinso ) - ROM_REGION32_LE( 0x80000, "user1", 0 ) /* 512k for R4310 code */ + ROM_REGION32_LE( 0x80000, ":pci:00.0", 0 ) /* 512k for R4310 code */ ROM_LOAD( "skins_game_u4_boot_1.00.u4", 0x000000, 0x080000, CRC(0fe87720) SHA1(4b24abbe662a2d7b61e6a3f079e28b73605ba19f) ) DISK_REGION( "ide:0:hdd:image" ) From 7d34b95fdd822081f69e64f16d08121ffd1ec1db Mon Sep 17 00:00:00 2001 From: arbee Date: Sun, 22 Mar 2015 20:43:02 -0400 Subject: [PATCH 164/201] iteagle: restore FPGA/PAL bitstreams for board owners (nw) --- src/mame/drivers/iteagle.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mame/drivers/iteagle.c b/src/mame/drivers/iteagle.c index fdbbe6ad173..dfcf369441e 100644 --- a/src/mame/drivers/iteagle.c +++ b/src/mame/drivers/iteagle.c @@ -239,6 +239,15 @@ INPUT_PORTS_END ROMX_LOAD( "eagle102.u15", 0x000000, 0x100000, CRC(1fd39e73) SHA1(d1ac758f94defc5c55c62594b3999a406dd9ef1f), ROM_BIOS(10) ) \ ROM_SYSTEM_BIOS( 10, "101", "bootrom 1.01" ) \ ROMX_LOAD( "eagle101.u15", 0x000000, 0x100000, CRC(2600bc2b) SHA1(c4b89e69c51e4a3bb1874407c4d30b6caed4f396), ROM_BIOS(11) ) \ + ROM_REGION( 0x30000, "fpga", 0 ) \ + ROM_LOAD( "17s20lpc_sb4.u26", 0x000000, 0x008000, CRC(62c4af8a) SHA1(6eca277b9c66a401990599e98fdca64a9e38cc9a) ) \ + ROM_LOAD( "17s20lpc_sb5.u26", 0x008000, 0x008000, CRC(c88b9d42) SHA1(b912d0fc50ecdc6a198c626f6e1644e8405fac6e) ) \ + ROM_LOAD( "17s50a_red1.u26", 0x010000, 0x020000, CRC(f5cf3187) SHA1(83b4a14de9959e5a776d97d424945d43501bda7f) ) \ + ROM_REGION( 0x80, "eeprom", 0 ) \ + ROM_COPY( "fpga", 0x0, 0x0, 0x80 ) \ + ROM_REGION( 0x2000, "pals", 0 ) \ + ROM_LOAD( "e2-card1.u22.jed", 0x000000, 0x000bd1, CRC(9d1e1ace) SHA1(287d6a30e9f32137ef4eba54f0effa092c97a6eb) ) \ + ROM_LOAD( "e2-res3.u117.jed", 0x001000, 0x000bd1, CRC(4f1ff45a) SHA1(213cbdd6cd37ad9b5bfc9545084892a68d29f5ff) ) ROM_START( iteagle ) EAGLE_BIOS From ea9dfec21d668a6237622a22a568f93c450c372a Mon Sep 17 00:00:00 2001 From: Lord-Nightmare Date: Sun, 22 Mar 2015 20:51:09 -0400 Subject: [PATCH 165/201] preparations for dtc-03 driver, n/w --- src/mess/mess.lst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 54dd74e7e2e..845570d2549 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -1656,13 +1656,14 @@ vt320 // 1987 Digital Equipment Corporation vt520 // 1994 Digital Equipment Corporation //vt525 vk100 // 1980 Digital Equipment Corporation -dectalk // 1982 Digital Equipment Corporation +dectalk // 1983 Digital Equipment Corporation //vt240 // 1983 Digital Equipment Corporation //vt241 mc7105 // Elektronika MC7105 rainbow100a // 1982 DEC Rainbow 100-A rainbow // 1983 DEC Rainbow 100-B rainbow190 // 1985 DEC Rainbow 190 +//dtc03 // 1985 Digital Equipment Corporation // Memotech mtx512 // 1983 Memotech MTX 512 From b94942bbfa27b36cc919a0232c008486d3afdcc0 Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Mon, 23 Mar 2015 07:29:40 +0100 Subject: [PATCH 166/201] made the mandatory image menu a bit more foolproof, by not allowing a reset until a file has been selected. nw. --- src/emu/ui/filemngr.c | 8 +++++++- src/emu/ui/filemngr.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/emu/ui/filemngr.c b/src/emu/ui/filemngr.c index 2c4097f96b9..9b4cc42c4f4 100644 --- a/src/emu/ui/filemngr.c +++ b/src/emu/ui/filemngr.c @@ -33,6 +33,8 @@ ui_menu_file_manager::ui_menu_file_manager(running_machine &machine, render_cont m_warnings.cpy(warnings); else m_warnings.reset(); + + m_curr_selected = FALSE; } @@ -165,12 +167,16 @@ void ui_menu_file_manager::handle() if (event != NULL && event->itemref != NULL && event->iptkey == IPT_UI_SELECT) { if ((FPTR)event->itemref == 1) - machine().schedule_hard_reset(); + { + if (m_curr_selected) + machine().schedule_hard_reset(); + } else { selected_device = (device_image_interface *) event->itemref; if (selected_device != NULL) { + m_curr_selected = TRUE; ui_menu::stack_push(selected_device->get_selection_menu(machine(), container)); // reset the existing menu diff --git a/src/emu/ui/filemngr.h b/src/emu/ui/filemngr.h index 3bcdb28679b..a2d7fbca74f 100644 --- a/src/emu/ui/filemngr.h +++ b/src/emu/ui/filemngr.h @@ -32,6 +32,7 @@ public: private: astring m_warnings; + bool m_curr_selected; }; #endif /* __UI_FILEMNGR_H__ */ From abfefe3c3aecaa6634c21236a7cabaa121a4e9be Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Mon, 23 Mar 2015 07:37:23 +0100 Subject: [PATCH 167/201] (MESS) sms.c: added a new BIOS revision (v2.0) for the SMS 1 PAL and documented the actual chip markings for v1.3 [Fabio Priuli, SMSPower] --- src/mess/drivers/sms.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/mess/drivers/sms.c b/src/mess/drivers/sms.c index 4187054462c..a6c95158206 100644 --- a/src/mess/drivers/sms.c +++ b/src/mess/drivers/sms.c @@ -825,7 +825,7 @@ ROM_START(sms1) ROM_REGION(0x20000, "user1", 0) ROM_SYSTEM_BIOS( 0, "bios13", "US/European BIOS v1.3 (1986)" ) - ROMX_LOAD("bios13fx.rom", 0x0000, 0x2000, CRC(0072ed54) SHA1(c315672807d8ddb8d91443729405c766dd95cae7), ROM_BIOS(1)) + ROMX_LOAD("mpr-10052.rom", 0x0000, 0x2000, CRC(0072ed54) SHA1(c315672807d8ddb8d91443729405c766dd95cae7), ROM_BIOS(1)) ROM_SYSTEM_BIOS( 1, "hangonsh", "US/European BIOS v2.4 with Hang On and Safari Hunt (1988)" ) ROMX_LOAD("mpr-11459a.rom", 0x0000, 0x20000, CRC(91e93385) SHA1(9e179392cd416af14024d8f31c981d9ee9a64517), ROM_BIOS(2)) ROM_SYSTEM_BIOS( 2, "hangon", "US/European BIOS v3.4 with Hang On (1988)" ) @@ -864,13 +864,15 @@ ROM_START(sms1pal) ROM_REGION(0x20000, "user1", 0) ROM_SYSTEM_BIOS( 0, "bios13", "US/European BIOS v1.3 (1986)" ) - ROMX_LOAD("bios13fx.rom", 0x0000, 0x2000, CRC(0072ed54) SHA1(c315672807d8ddb8d91443729405c766dd95cae7), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "hangonsh", "US/European BIOS v2.4 with Hang On and Safari Hunt (1988)" ) - ROMX_LOAD("mpr-11459a.rom", 0x0000, 0x20000, CRC(91e93385) SHA1(9e179392cd416af14024d8f31c981d9ee9a64517), ROM_BIOS(2)) - ROM_SYSTEM_BIOS( 2, "hangon", "Sega Master System - US/European BIOS v3.4 with Hang On (1988)" ) - ROMX_LOAD("mpr-11458.rom", 0x0000, 0x20000, CRC(8edf7ac6) SHA1(51fd6d7990f62cd9d18c9ecfc62ed7936169107e), ROM_BIOS(3)) - ROM_SYSTEM_BIOS( 3, "missiled", "US/European BIOS v4.4 with Missile Defense 3D (1988)" ) - ROMX_LOAD("missiled.rom", 0x0000, 0x20000, CRC(e79bb689) SHA1(aa92ae576ca670b00855e278378d89e9f85e0351), ROM_BIOS(4)) + ROMX_LOAD("mpr-10052.rom", 0x0000, 0x2000, CRC(0072ed54) SHA1(c315672807d8ddb8d91443729405c766dd95cae7), ROM_BIOS(1)) + ROM_SYSTEM_BIOS( 1, "bios20", "European BIOS v2.0 (198?)" ) + ROMX_LOAD("mpr-10883.rom", 0x0000, 0x2000, CRC(b3d854f8) SHA1(fc7eb9141f38c92bf98d9134816f64b45e811112), ROM_BIOS(2)) + ROM_SYSTEM_BIOS( 2, "hangonsh", "US/European BIOS v2.4 with Hang On and Safari Hunt (1988)" ) + ROMX_LOAD("mpr-11459a.rom", 0x0000, 0x20000, CRC(91e93385) SHA1(9e179392cd416af14024d8f31c981d9ee9a64517), ROM_BIOS(3)) + ROM_SYSTEM_BIOS( 3, "hangon", "Sega Master System - US/European BIOS v3.4 with Hang On (1988)" ) + ROMX_LOAD("mpr-11458.rom", 0x0000, 0x20000, CRC(8edf7ac6) SHA1(51fd6d7990f62cd9d18c9ecfc62ed7936169107e), ROM_BIOS(4)) + ROM_SYSTEM_BIOS( 4, "missiled", "US/European BIOS v4.4 with Missile Defense 3D (1988)" ) + ROMX_LOAD("missiled.rom", 0x0000, 0x20000, CRC(e79bb689) SHA1(aa92ae576ca670b00855e278378d89e9f85e0351), ROM_BIOS(5)) ROM_END ROM_START(smspal) From d0385f1671dc16f6be66740a3e832b42e5f81048 Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Mon, 23 Mar 2015 08:15:17 +0100 Subject: [PATCH 168/201] (MESS) pico.xml: A few more Japanese dumps added. [Team Europe] (MESS) gameking.xml: Three new dumps added. [Team Europe] --- hash/gameking.xml | 89 ++++++++++++++++++++++++++++++++--------------- hash/pico.xml | 47 +++++++++++++++++++++---- 2 files changed, 101 insertions(+), 35 deletions(-) diff --git a/hash/gameking.xml b/hash/gameking.xml index 5ab4e90c849..40814f502d0 100644 --- a/hash/gameking.xml +++ b/hash/gameking.xml @@ -10,8 +10,8 @@ 200? TimeTop - - + + @@ -21,8 +21,8 @@ 200? TimeTop - - + + @@ -32,8 +32,8 @@ 200? TimeTop - - + + @@ -43,8 +43,8 @@ 200? TimeTop - - + + @@ -54,8 +54,30 @@ 200? TimeTop - - + + + + + + + + F1-2004 Racing + 200? + TimeTop + + + + + + + + + Feichuan VII + 200? + TimeTop + + + @@ -65,8 +87,8 @@ 200? TimeTop - - + + @@ -76,8 +98,8 @@ 200? TimeTop - - + + @@ -87,8 +109,8 @@ 200? TimeTop - - + + @@ -98,8 +120,8 @@ 200? TimeTop - - + + @@ -109,19 +131,30 @@ 200? TimeTop - - + + - + + Soldier + 200? + TimeTop + + + + + + + + Street Hero 200? TimeTop - - + + @@ -131,8 +164,8 @@ 200? TimeTop - - + + @@ -142,12 +175,10 @@ 200? TimeTop - - + + - - diff --git a/hash/pico.xml b/hash/pico.xml index 189bb62d198..280ac0f6a81 100644 --- a/hash/pico.xml +++ b/hash/pico.xml @@ -25,8 +25,6 @@ Published by Sega/Sega Toys (HPC-6*** serial codes) * クッキングピコ セット - Cooking Pico Set (Sega Toys - 1999xxxx - HPC-6076) * スージーちゃんとマービー おてつだい だ~いすき! - Susie-chan to Mabi - Otetsudai Daisuki! (Sega Toys - 200010xx - HPC-6089) * パソコン接続キット ピコタウンにでかけよう! - Pasokon Setsuzoku Kit PicoTown ni Dekakeyou! (Sega Toys - 20010601 - HPC-6097) -* アンパンマンのはじめてマウスピコ アンパンマンとパソコンれんしゅう! <同梱> - Anpanman no Hajimete Mouse Pico with Anpanman to Pasokon renshuu! (Sega Toys - 20020124 - HPC-6102) -* ECCジュニアの はじめてえいご Vol.3 - Happy Birthday, Patty! パティちゃんのお誕生日 - ECC Junior no Hajimete Eigo Vol. 3 - Happy Birthday, Patty! - Patty-chan no Otanjoubi (Sega Toys - 20020307 - HPC-6105) * ECCジュニアの はじめてえいご Vol.4 - Patty Loves Animals 動物大好き、パティちゃん - ECC Junior no Hajimete Eigo Vol. 4 - Patty Loves Animals - Doubutsu Daisuki, Patty-chan (Sega Toys - 200207xx - HPC-6106) * ECCジュニアの はじめてえいご Vol.5 - Merry Christmas, Patty! メリークリスマス、パティちゃん - ECC Junior no Hajimete Eigo Vol. 5 - Merry Christmas, Patty! - Merry Christmas, Patty-chan (Sega Toys - 200207xx - HPC-6107) * ECCジュニアの はじめてえいご Vol.6 - Patty Goes to the Amusement Park パティちゃん遊園地に行く - ECC Junior no Hajimete Eigo Vol. 6 - Patty Goes to the Amusement Park - Patty-chan Yuuenchi ni Iku (Sega Toys - 200207xx - HPC-6108) @@ -440,6 +438,26 @@ Published by Others (T-yyy*** serial codes, for yyy depending on the publisher) + + Anpanman to Pasokon Renshuu! (Jpn) + 2002 + Sega Toys + + + + + + + + + + + + + + + + Ashita no Nadja (Jpn) 2003 @@ -1165,8 +1183,8 @@ Published by Others (T-yyy*** serial codes, for yyy depending on the publisher) - - + + @@ -1182,8 +1200,25 @@ Published by Others (T-yyy*** serial codes, for yyy depending on the publisher) - - + + + + + + + + ECC Junior no Hajimete Eigo Vol. 3 - Happy Birthday, Patty! - Patty-chan no o-Tanjoubi (Jpn) + 2002 + Sega Toys + + + + + + + + + From 7f23e92a76cdc9bcc01e73f39a87afdd106c7769 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 23 Mar 2015 08:14:38 +0100 Subject: [PATCH 169/201] darktower WIP --- src/mess/drivers/hh_tms1k.c | 85 +++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 39817dd91b6..0f8af1ff9bb 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -195,9 +195,13 @@ public: DECLARE_WRITE16_MEMBER(ssimon_write_o); DECLARE_READ8_MEMBER(ssimon_read_k); + bool m_dtower_motor_on; + bool m_dtower_sensor; + void mbdtower_display(); DECLARE_WRITE16_MEMBER(mbdtower_write_r); DECLARE_WRITE16_MEMBER(mbdtower_write_o); DECLARE_READ8_MEMBER(mbdtower_read_k); + DECLARE_MACHINE_START(mbdtower); DECLARE_WRITE16_MEMBER(cnsector_write_r); DECLARE_WRITE16_MEMBER(cnsector_write_o); @@ -1540,7 +1544,8 @@ MACHINE_CONFIG_END Milton Bradley Simon, created by Ralph Baer Revision A hardware: - * TMS1000 (die labeled MP3226), DS75494 lamp driver + * TMS1000 (die labeled MP3226) + * DS75494 lamp driver Newer revisions (also Pocket Simon) have a smaller 16-pin MB4850 chip instead of the TMS1000. This one has been decapped too, but we couldn't @@ -1684,30 +1689,102 @@ MACHINE_CONFIG_END /*************************************************************************** Milton Bradley Dark Tower - * TMS1400 MP7332-N2LL (die labeled MP7332) + * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C), die labeled MP7332 + * SN75494N MOS-to-LED digit driver x ***************************************************************************/ +void hh_tms1k_state::mbdtower_display() +{ +} + WRITE16_MEMBER(hh_tms1k_state::mbdtower_write_r) { + // R0-R2: input mux + m_inp_mux = data & 7; + + // R3: N/C + // R4: 75494 enable (speaker, lamps, digit select go through that IC) + // R5-R7: tower lamps + // R8: rotation sensor led + // R9: motor on + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); } WRITE16_MEMBER(hh_tms1k_state::mbdtower_write_o) { + // O0-O6: led segments A-G + // O7: digit select + m_o = data; } READ8_MEMBER(hh_tms1k_state::mbdtower_read_k) { - return 0; + // rotation sensor is on K8 + + return read_inputs(3); } +/* physical button layout and labels is like this: + + (green) (l.blue) (red) + [YES/ [REPEAT] [NO/ + BUY] END] + + (yellow) (blue) (white) + [HAGGLE] [BAZAAR] [CLEAR] + + (blue) (blue) (blue) + [TOMB/ [MOVE] [SANCTUARY/ + RUIN] CITADEL] + + (orange) (blue) (d.yellow) + [DARK [FRONTIER] [INVENTORY] + TOWER] +*/ + static INPUT_PORTS_START( mbdtower ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") INPUT_PORTS_END +/* tower motor simulation: + +*/ + +MACHINE_START_MEMBER(hh_tms1k_state, mbdtower) +{ + machine_start(); + + // zerofill/register for savestates + m_dtower_motor_on = false; + m_dtower_sensor = false; + + save_item(NAME(m_dtower_motor_on)); + save_item(NAME(m_dtower_sensor)); +} + static MACHINE_CONFIG_START( mbdtower, hh_tms1k_state ) /* basic machine hardware */ @@ -1719,6 +1796,8 @@ static MACHINE_CONFIG_START( mbdtower, hh_tms1k_state ) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_mbdtower) + MCFG_MACHINE_START_OVERRIDE(hh_tms1k_state, mbdtower) + /* no video! */ /* sound hardware */ From 8e0608371f8583a67ae118f174743dc35404b768 Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Mon, 23 Mar 2015 08:28:08 +0100 Subject: [PATCH 170/201] (MESS) misc round of new dump additions (from multiple sources) and consistency fixes. nw. --- hash/gamegear.xml | 4 +- hash/gbcolor.xml | 29 +- hash/megadriv.xml | 21 +- hash/nes.xml | 679 ++++++++++++++++++++--- hash/pc8801_flop.xml | 14 + hash/pc98.xml | 1032 ++++++++++++++++++++++++++++++++++- hash/sms.xml | 23 + hash/snes.xml | 58 +- src/emu/bus/nes/nes_pcb.inc | 1 + 9 files changed, 1737 insertions(+), 124 deletions(-) diff --git a/hash/gamegear.xml b/hash/gamegear.xml index ca0baf647d3..922f8cabdbc 100644 --- a/hash/gamegear.xml +++ b/hash/gamegear.xml @@ -648,7 +648,7 @@ A few games have been listed as rumored, but they might very well be fake (pleas - + Barbie Super Model (Prototype) 1993 Hi Tech Expressions @@ -3222,7 +3222,7 @@ a certain item) --> - Hyokkori Hyoutanjima - Hyoutanjima no Daikoukai (Jpn) + Hyokkori Hyoutan-jima - Hyoutan-jima no Daikoukai (Jpn) 1992 Sega diff --git a/hash/gbcolor.xml b/hash/gbcolor.xml index e3adff12197..b5b08df1930 100644 --- a/hash/gbcolor.xml +++ b/hash/gbcolor.xml @@ -23650,6 +23650,21 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design --> + + Emo Cheng DX (Chi) + 200? + Sintax + + + + + + + + + + + Shui Hu Shen Shou (Chi, Li Cheng) 200? @@ -24104,7 +24119,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - + @@ -24120,7 +24135,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - + @@ -24136,7 +24151,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - + @@ -24152,7 +24167,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - + @@ -24353,7 +24368,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - + Pian Wai Zhang Huang Jin no Taiyou - Feng Yin De Yuan Gu Lian Jin Shu (Chi) @@ -24370,7 +24385,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - + Yong Zhe Dou E Long VIII (Chi) 200? @@ -24607,7 +24622,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design - Tai Kong Bao Bei (Chi, Syntax) + Tai Kong Bao Bei (Chi, Sintax) 200? Sintax diff --git a/hash/megadriv.xml b/hash/megadriv.xml index 53778e75620..29d1e3ee77c 100644 --- a/hash/megadriv.xml +++ b/hash/megadriv.xml @@ -9583,7 +9583,7 @@ Info on Sega chip labels (from Sunbeam / Digital Corruption) - Skitchin (Euro, USA) + Skitchin' (Euro, USA) 1993 Electronic Arts @@ -9748,7 +9748,7 @@ but dumps still have to be confirmed. - AAAHH!!! Real Monsters (USA) + Aaahh!!! Real Monsters (USA) 1995 Viacom New Media @@ -9759,7 +9759,7 @@ but dumps still have to be confirmed. - AAAHH!!! Real Monsters (USA, Prototype 19950707) + Aaahh!!! Real Monsters (USA, Prototype 19950707) 1995 Viacom New Media @@ -10336,7 +10336,7 @@ but dumps still have to be confirmed. - Out of this World (Prototype) + Out of This World (Prototype) 1993 Virgin Games @@ -12991,6 +12991,17 @@ but dumps still have to be confirmed. + + Cross Fire (USA, Prototype) + 1991 + Kyugo Boueki + + + + + + + Super Airwolf (Jpn) 1991 @@ -16197,7 +16208,7 @@ but dumps still have to be confirmed. - Hyokkori Hyoutan Jima - Daitouryou o Mezase! (Jpn) + Hyokkori Hyoutan-jima - Daitouryou o Mezase! (Jpn) 1992 Sega diff --git a/hash/nes.xml b/hash/nes.xml index fedefc1e288..cac46e99d03 100644 --- a/hash/nes.xml +++ b/hash/nes.xml @@ -9553,7 +9553,7 @@ - + Dragon Ball 3 - Gokuu Den (Jpn) 1989 Bandai @@ -17078,7 +17078,7 @@ - Hyokkori Hyoutan Jima - Nazo no Kaizokusen (Jpn) + Hyokkori Hyoutan-jima - Nazo no Kaizokusen (Jpn) 1992 Yutaka @@ -45102,6 +45102,25 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Dragon Ball 3 - Gokuu Den (Jpn, Rev. A) + 1989 + Bandai + + + + + + + + + + + + + + + Dragon Ninja (Jpn, Rev. A) 1989 @@ -45822,7 +45841,7 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - GeGeGe no Kitarou - Youkai Dai Makyou (Jpn, Prototype) + GeGeGe no Kitarou - Youkai Daimakyou (Jpn, Prototype) 1986 Bandai @@ -50353,6 +50372,22 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Wang Pai Hai Zhan (Chi) + 19?? + TCL + + + + + + + + + + + + @@ -55148,6 +55183,27 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Kou Dai Guai Shou - Fei Cui Ban (Chi) + 19?? + Shenzen Jincota + + + + + + + + + + + + + + + + + Yong Zhe Hei An Shi Jie - Hun Dun De Shi Jie (Chi) 19?? @@ -55170,6 +55226,69 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Kou Dai Guai Shou - Zuan Shi Ban (KT-008 PCB) + 19?? + Shenzen Jincota + + + + + + + + + + + + + + + + + + + Kou Dai Guai Shou - Zhen Zhu Ban (KT-008 PCB, Alt) + 19?? + Shenzen Jincota + + + + + + + + + + + + + + + + + + + Kou Dai Guai Shou - Bai jin Ban (KT-008 PCB, Alt 2) + 19?? + Shenzen Jincota + + + + + + + + + + + + + + + + + @@ -55931,7 +56050,29 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - + + San Guo Zhi - Lv Bu Zhuan (Chi) + 19?? + Nanjing + + + + + + + + + + + + + + + + + + + @@ -56111,7 +56252,24 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - + + + Gardman (Chi) + 19?? + Nanjing + + + + + + + + + + + + + Primitive (Chi) @@ -56131,7 +56289,23 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - + + Primitive II (Chi) + 19?? + Nanjing + + + + + + + + + + + + + Zelda - Shen Qi De Mao Zi (Chi) @@ -56712,7 +56886,30 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - + + + Yong Zhe Chuan Shuo (Chi) + 19?? + Nanjing + + + + + + + + + + + + + + + + + + + @@ -56975,8 +57172,29 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx - - Kou Dai Guai Shou (Chi) + + Kou Dai Guai Shou (Chi, Pokemon Diamond, ABC-51PCB) + 19?? + HengGedianzi? + + + + + + + + + + + + + + + + + + + Kou Dai Guai Shou (Chi, Pokemon Diamond II) 19?? HengGedianzi? @@ -56996,6 +57214,90 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Kou Dai Guai Shou III (Chi, ABC-51PCB) + 19?? + HengGedianzi? + + + + + + + + + + + + + + + + + + + Kou Dai Guai Shou - Luye Ban (Chi, BBC-21 PCB) + 19?? + HengGedianzi? + + + + + + + + + + + + + + + + + + + Kou Dai Yao Guai - Luye Ban (Chi, BBC-2 PCB) + 19?? + HengGedianzi? + + + + + + + + + + + + + + + + + + + Kou Dai Guai Shou - Luye Ban (Chi, BBC-21 PCB, Alt Title) + 19?? + HengGedianzi? + + + + + + + + + + + + + + + + + @@ -57083,6 +57385,27 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Ying Tao Xiao Wan Zi (Asia) + 19?? + Union Bond + + + + + + + + + + + + + + + + + Yuefei Chuan (Asia, Hacked) 19?? @@ -63134,6 +63457,22 @@ from the NEStopia source, hence they would require confirmation. --> + + Desert Storm (Chi, Alt) + 19?? + <unknown> + + + + + + + + + + + + Dian Shi Ma Li (Chi) 19?? @@ -63424,6 +63763,22 @@ from the NEStopia source, hence they would require confirmation. --> + + Happy Biqi - The World Fighter (Chi, Alt) + 19?? + <unknown> + + + + + + + + + + + + + + 120 in 1 + 19?? + <unknown> + + + + + + + + + + + + 126 in 1 19?? @@ -75133,10 +75520,10 @@ be better to redump them properly. --> - + - + @@ -75149,10 +75536,10 @@ be better to redump them properly. --> - + - + @@ -75385,10 +75772,10 @@ be better to redump them properly. --> - + - + @@ -75401,10 +75788,10 @@ be better to redump them properly. --> - + - + @@ -75642,10 +76029,10 @@ be better to redump them properly. --> - + - + @@ -75661,10 +76048,10 @@ be better to redump them properly. --> - + - + @@ -75677,10 +76064,10 @@ be better to redump them properly. --> - + - + @@ -75696,10 +76083,10 @@ be better to redump them properly. --> - + - + @@ -75747,10 +76134,10 @@ be better to redump them properly. --> - + - + @@ -75847,10 +76234,10 @@ be better to redump them properly. --> - + - + @@ -76218,10 +76605,10 @@ be better to redump them properly. --> - + - + @@ -76234,10 +76621,10 @@ be better to redump them properly. --> - + - + @@ -76250,10 +76637,10 @@ be better to redump them properly. --> - + - + @@ -76266,10 +76653,10 @@ be better to redump them properly. --> - + - + @@ -76282,10 +76669,10 @@ be better to redump them properly. --> - + - + @@ -76346,10 +76733,10 @@ be better to redump them properly. --> - + - + @@ -76357,6 +76744,26 @@ be better to redump them properly. --> + + + 4 in 1 (YH-481) + 19?? + <unknown> + + + + + + + + + + + + + + + 4 in 1 1993 (CK-001) @@ -76681,10 +77088,10 @@ be better to redump them properly. --> - + - + @@ -76895,10 +77302,10 @@ be better to redump them properly. --> - + - + @@ -77045,10 +77452,10 @@ be better to redump them properly. --> - + - + @@ -77483,10 +77890,10 @@ be better to redump them properly. --> - + - + @@ -77734,10 +78141,10 @@ be better to redump them properly. --> - + - + @@ -77753,10 +78160,10 @@ be better to redump them properly. --> - + - + @@ -77788,10 +78195,10 @@ be better to redump them properly. --> - + - + @@ -77993,10 +78400,10 @@ to check why this is different --> - + - + @@ -78012,10 +78419,10 @@ to check why this is different --> - + - + @@ -78114,10 +78521,10 @@ to check why this is different --> - + - + @@ -78284,10 +78691,10 @@ to check why this is different --> - + - + @@ -78300,10 +78707,10 @@ to check why this is different --> - + - + @@ -78606,10 +79013,10 @@ to check why this is different --> - + - + @@ -78622,10 +79029,10 @@ to check why this is different --> - + - + @@ -79135,7 +79542,7 @@ that the real dumps might surface --> - + @@ -79151,7 +79558,7 @@ that the real dumps might surface --> - + @@ -79167,7 +79574,7 @@ that the real dumps might surface --> - + @@ -79241,14 +79648,78 @@ that the real dumps might surface --> + + 138-in-1 CoolBaby (CoolBoy RS-5, PCB060-10009011V1.3) + 19?? + <unknown> + + + + + + + + + + + + + + 777777-in-1 (8 bit Slim Station, NEWPXP-DVT22-A PCB)(Unl)[U][!] + 19?? + <unknown> + + + + + + + + + + + + + + 888888-in-1 (8 bit Slim Station, NEWPXP-DVT22-A PCB) + 19?? + <unknown> + + + + + + + + + + + + + + 999999-in-1 (8 bit Slim Station, NEWPXP-DVT22-A PCB) + 19?? + <unknown> + + + + + + + + + + + + CoolBoy 400 in 1 19?? <unknown> - - + + @@ -79258,6 +79729,39 @@ that the real dumps might surface --> + + CoolBoy 400-in-1 (Alt Version, 403 games) + 19?? + <unknown> + + + + + + + + + + + + + + Super Game 360-in-1 + 19?? + <unknown> + + + + + + + + + + + + + Games Xplosion 121 in 1 19?? @@ -79274,6 +79778,32 @@ that the real dumps might surface --> + + + + + Pokemon HeartGold (KT-008 PCB) + 19?? + Shenzen Jincota + + + + + + + + + + + + + + + + + + + Datach Joint ROM System @@ -79337,3 +79867,4 @@ that the real dumps might surface --> + diff --git a/hash/pc8801_flop.xml b/hash/pc8801_flop.xml index 59b9a311887..d4ccb8a7354 100644 --- a/hash/pc8801_flop.xml +++ b/hash/pc8801_flop.xml @@ -9657,6 +9657,20 @@ ExtractDisk [08]"下巻 ユーザー " -> "aaa_08.d88" + + Door Door mkII (Alt) + 1985 + エニックス (Enix) + + + + + + + + + + Dororo - Jigoku Emaki no Shou 1988 diff --git a/hash/pc98.xml b/hash/pc98.xml index b95ebc2c2ed..ffa860560f1 100644 --- a/hash/pc98.xml +++ b/hash/pc98.xml @@ -380,8 +380,8 @@ only have some part of Windows file and a Video driver(CLGD?). - - Windows 2.1 + + Windows 2.11 19?? <unknown> @@ -410,6 +410,36 @@ only have some part of Windows file and a Video driver(CLGD?). + + Windows 2.11 (Alt Disk 1) + 19?? + <unknown> + + + + + + + + + + + + + + + + + + + + + + + + + + EPSON Microsoft Windows 3.0 1991 @@ -739,6 +769,30 @@ only have some part of Windows file and a Video driver(CLGD?). + + Turbo C + 1989 + Borland + + + + + + + + + + + + + + + + + + + + Turbo C++ @@ -788,6 +842,30 @@ only have some part of Windows file and a Video driver(CLGD?). + + Turbo C++ (Alt Disk 1) + 1990 + Borland + + + + + + + + + + + + + + + + + + + + Microfocus Level II COBOL 19?? @@ -2458,6 +2536,32 @@ only have some part of Windows file and a Video driver(CLGD?). + + Abunai Tengu Densetsu - Yomigaetta Tengu ga Yozora o Mau + 1989 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + AcroJet 1988 @@ -3259,6 +3363,32 @@ only have some part of Windows file and a Video driver(CLGD?). + + Alantia + 1988 + ビクター音楽産業 (Victor Musical Industries) + + + + + + + + + + + + + + + + + + + + + + Albatross 2 - Masters' History 1989 @@ -8974,6 +9104,32 @@ only have some part of Windows file and a Video driver(CLGD?). + + Crescent Moon Girl (Alt Format) + 1989 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + Crimson 3 1990 @@ -9753,6 +9909,26 @@ only have some part of Windows file and a Video driver(CLGD?). + + D.P.S. - Dream Program System (Alt) + 1989 + アリスソフト (Alicesoft) + + + + + + + + + + + + + + + + D.P.S. SG - Dream Program System SG 1990 @@ -9817,6 +9993,38 @@ only have some part of Windows file and a Video driver(CLGD?). + + D.P.S. SG 3 - Dream Program System SG Set 3 + 1991 + アリスソフト (Alicesoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + D.Wars 1989 @@ -9972,6 +10180,50 @@ only have some part of Windows file and a Video driver(CLGD?). + + Daikaisen Solomon 1942-1943 + 1995 + システムソフト (SystemSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Daikoukai Jidai 1990 @@ -11171,6 +11423,38 @@ only have some part of Windows file and a Video driver(CLGD?). + + Derby Stallion Expert Kit + 1994 + アスキー (ASCII) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Derringer 1988 @@ -12781,6 +13065,25 @@ only have some part of Windows file and a Video driver(CLGD?). + + Dr. Stop! (Alt Format) + 1992 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + Dracula Hakushaku 1992 @@ -14499,6 +14802,31 @@ only have some part of Windows file and a Video driver(CLGD?). + + F-117A Nighthawk - Stealth Fighter 2.0 + 1995 + スペクトラムホロバイトジャパン (Spectrum HoloByte Japan) + + + + + + + + + + + + + + + + + + + + + F-14 Fleet Defender 1995 @@ -22740,6 +23068,19 @@ only have some part of Windows file and a Video driver(CLGD?). + + Lightning Bacchus - The Knight of Iron + 1989 + NCS + + + + + + + + + Like 1994 @@ -22889,6 +23230,26 @@ only have some part of Windows file and a Video driver(CLGD?). + + Little Vampire + 1988 + チャンピオンソフト (Champion Soft) + + + + + + + + + + + + + + + + Lodoss Tou Senki - Fukujinzuke 2 1992 @@ -23031,11 +23392,11 @@ only have some part of Windows file and a Video driver(CLGD?). - - LOGiN Disk & Book Series - SimAnt + + LOGiN Disk & Book Series - SimAnt (Alt) 1993 アスキー (ASCII) - + @@ -26524,6 +26885,44 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Mugen Houyou + 1995 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mugen Senshi Valis 1987 @@ -29745,6 +30144,32 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Popful Mail + 1992 + 日本ファルコム (Nihon Falcom) + + + + + + + + + + + + + + + + + + + + + + Populous 1990 @@ -31459,6 +31884,82 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Rance - Hikari o Motomete + 1989 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rance II - Hangyaku no Shoujo-tachi + 1990 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rance 3 Hint Disk 1992 @@ -31505,6 +32006,64 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Rance 4.1 - Okusuri Koujou o Sukue (Alt Format) + 1995 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + Rance 4.2 - Angel Gumi + 1995 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ranma½ - Ougi Jaanken 1995 @@ -34134,6 +34693,18 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Shin Best Nine Baseball + 1986 + アスキー (ASCII) + + + + + + + + Shin Kugyokuden 1988 @@ -35001,6 +35572,19 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Solitaire Royal + 1988 + ゲームアーツ (Game Arts) + + + + + + + + + Sorcerian 1988 @@ -35962,6 +36546,55 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Super D.P.S. + 1992 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Super Daisenryaku 98 1988 @@ -38650,7 +39283,57 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - + + Toushin Toshi + 1990 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Toushin Toshi Hint Disk 19?? アリスソフト (AliceSoft) @@ -38662,6 +39345,80 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Toushin Toshi II + 1994 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Tower? of Cabin - Cabin Panic 1992 @@ -39473,6 +40230,56 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + Uchuu Kaitou Funny Bee (Alt Format) + 1994 + アリスソフト (AliceSoft) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Uchuu Kakeru Businessman 1990 @@ -43723,8 +44530,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - - Abunai Tengu Densetsu - Yomigaetta Tengu ga Yozora o Mau + + Abunai Tengu Densetsu - Yomigaetta Tengu ga Yozora o Mau (Alt Format) 1989 アリスソフト (AliceSoft) @@ -43775,8 +44582,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - - Alantia + + Alantia (Alt Format) 1988 ビクター音楽産業 (Victor Musical Industries) @@ -44387,7 +45194,7 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - + D.P.S. - Dream Program System (Alt Format) 1989 アリスソフト (Alicesoft) @@ -46690,6 +47497,30 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + LOGiN Disk & Book Series - Polygon Modeling Tsukuuru (5"25 Disk) + 1992 + アスキー (ASCII) + + + + + + + + + + LOGiN Disk & Book Series - Polygon Modeling Tsukuuru (3"5 Disk) + 1992 + アスキー (ASCII) + + + + + + + + LOGiN Disk & Book Series - Polygon Shooting Tsukuuru (5"25 Disk) 1994 @@ -46785,6 +47616,32 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) + + LOGiN Disk & Book Series - SimAnt (5"25 Disks) + 1993 + アスキー (ASCII) + + + + + + + + + + + LOGiN Disk & Book Series - SimAnt (3"5 Disks) + 1993 + アスキー (ASCII) + + + + + + + + + Loopz 1991 @@ -47997,8 +48854,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - - Rance - Hikari o Motomete + + Rance - Hikari o Motomete (Alt Format) 1989 アリスソフト (AliceSoft) @@ -48689,8 +49546,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - - Solitaire Royale + + Solitaire Royale (Alt Format) 1988 ゲームアーツ (Game Arts) @@ -49351,8 +50208,8 @@ Requires MS-DOS 5.00H plus an unknown procedure (HDD install?) - - Vermilion (Fixed Disks?) + + Vermilion (Alt Format) 1990 グレイト (Great) @@ -55429,8 +56286,8 @@ SPACE EMPIRE - - Mugen Houyou + + Mugen Houyou (Alt Format) 1995 アリスソフト (AliceSoft) @@ -58241,6 +59098,25 @@ SPACE EMPIRE + + Login Super Omake Disk + 1994 + <coverdisc> + + + + + + + + + + + + + + + Gekkan Pasokon+ Disk Magazine 1 19?? @@ -59016,6 +59892,124 @@ SPACE EMPIRE + + + 100 Best Freeware Programs Part 2 + 19?? + <unknown> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 Best Freeware Programs Part 3 + 19?? + <unknown> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Free Soft Library - CG Collection 1 diff --git a/hash/sms.xml b/hash/sms.xml index b1a5020995f..39217697be6 100644 --- a/hash/sms.xml +++ b/hash/sms.xml @@ -3369,6 +3369,17 @@ + + Jang Pung II (Kor) + 1993 + Sieco + + + + + + + Jang Pung 3 (Kor) 1994 @@ -5432,6 +5443,18 @@ + + Sky Jaguar (Kor, Clover) + 199? + Clover + + + + + + + + Street Fighter II (Bra) 1997 diff --git a/hash/snes.xml b/hash/snes.xml index 2a197e1a665..31227844da0 100644 --- a/hash/snes.xml +++ b/hash/snes.xml @@ -627,7 +627,7 @@ Beyond that last category are the roms waiting to be classified. - + Batman Returns (Jpn, Prototype) 1993 @@ -6159,7 +6159,7 @@ more investigation needed... - Ardy Light Foot (USA) + Ardy Lightfoot (USA) 1996 Titus @@ -25753,7 +25753,7 @@ more investigation needed... - + Super Game Boy (Jpn) 1994 Nintendo @@ -25780,7 +25780,7 @@ more investigation needed... - + Super Game Boy (Jpn, Alt) 1994 Nintendo @@ -34600,7 +34600,7 @@ List of unclassified roms - + Barbie Vacation Adventure (USA, Prototype) 1994 Hi Tech Expressions @@ -34916,7 +34916,7 @@ List of unclassified roms - Beauty and the Beast (Euro, Prototype) + Disney's Beauty and the Beast (Euro, Prototype) 1994 Hudson @@ -34928,7 +34928,7 @@ List of unclassified roms - Beauty and the Beast (Euro) + Disney's Beauty and the Beast (Euro) 1994 Hudson @@ -43401,7 +43401,7 @@ List of unclassified roms - + Joe & Mac - Tatakae Genshijin (Jpn) 1991 Data East @@ -43636,7 +43636,7 @@ List of unclassified roms - + Jungle Strike (USA) 1995 Electronic Arts @@ -43649,7 +43649,7 @@ List of unclassified roms - + Jungle Strike - Uketsugareta Kyouki (Jpn) 1995 Electronic Arts Victor @@ -52093,6 +52093,18 @@ List of unclassified roms + + Targa (Prototype) + 1995 + Virgin Interactive + + + + + + + + Return of Double Dragon (Jpn) 1992 @@ -57680,7 +57692,7 @@ List of unclassified roms - + Super Pang (Jpn) 1992 Capcom @@ -62236,6 +62248,20 @@ List of unclassified roms + + Wolfenstein 3D (USA) + 1994 + Imagineer + + + + + + + + + + Wolfenstein 3D (USA, Prototype) 1994 @@ -62248,16 +62274,14 @@ List of unclassified roms - - Wolfenstein 3D (USA) + + Wolfenstein 3D (USA, Prototype 2) 1994 Imagineer - - - + @@ -63675,7 +63699,7 @@ List of unclassified roms - + Super Game Boy (Jpn, USA, Rev. A) 199? Nintendo diff --git a/src/emu/bus/nes/nes_pcb.inc b/src/emu/bus/nes/nes_pcb.inc index 5feb92384e1..748e865631c 100644 --- a/src/emu/bus/nes/nes_pcb.inc +++ b/src/emu/bus/nes/nes_pcb.inc @@ -312,6 +312,7 @@ static const nes_pcb pcb_list[] = { "unl_dance", UNSUPPORTED_BOARD }, { "bmc_hik_kof", UNSUPPORTED_BOARD }, { "onebus", UNSUPPORTED_BOARD }, + { "coolboy", UNSUPPORTED_BOARD }, { "a9746", UNSUPPORTED_BOARD }, { "dance2k", UNSUPPORTED_BOARD }, { "pec586", UNSUPPORTED_BOARD }, From a75a50cebe4265335745e02054af36bc9bc5ffff Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 23 Mar 2015 08:33:29 +0100 Subject: [PATCH 171/201] added hh_tms1k header file --- src/mess/drivers/elecbowl.c | 33 ++----- src/mess/drivers/hh_tms1k.c | 152 +------------------------------ src/mess/includes/hh_tms1k.h | 168 +++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 179 deletions(-) create mode 100644 src/mess/includes/hh_tms1k.h diff --git a/src/mess/drivers/elecbowl.c b/src/mess/drivers/elecbowl.c index 0ae06e2b3a8..da67a96c2ab 100644 --- a/src/mess/drivers/elecbowl.c +++ b/src/mess/drivers/elecbowl.c @@ -15,42 +15,27 @@ ***************************************************************************/ -#include "emu.h" -#include "cpu/tms0980/tms0980.h" -#include "sound/speaker.h" +#include "includes/hh_tms1k.h" -// internal artwork #include "elecbowl.lh" -class elecbowl_state : public driver_device +class elecbowl_state : public hh_tms1k_state { public: elecbowl_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN"), - m_speaker(*this, "speaker") + : hh_tms1k_state(mconfig, type, tag) { } - // devices - required_device m_maincpu; - required_ioport_array<4> m_inp_matrix; - required_device m_speaker; - - UINT16 m_r; - UINT16 m_o; - UINT16 m_inp_mux; - DECLARE_READ8_MEMBER(read_k); DECLARE_WRITE16_MEMBER(write_r); DECLARE_WRITE16_MEMBER(write_o); +protected: virtual void machine_start(); }; - /*************************************************************************** I/O @@ -130,15 +115,7 @@ INPUT_PORTS_END void elecbowl_state::machine_start() { - // zerofill - m_o = 0; - m_r = 0; - m_inp_mux = 0; - - // register for savestates - save_item(NAME(m_o)); - save_item(NAME(m_r)); - save_item(NAME(m_inp_mux)); + hh_tms1k_state::machine_start(); } diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 0f8af1ff9bb..6a2e1cb88b7 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -70,9 +70,7 @@ ***************************************************************************/ -#include "emu.h" -#include "cpu/tms0980/tms0980.h" -#include "sound/speaker.h" +#include "includes/hh_tms1k.h" // internal artwork #include "amaztron.lh" @@ -95,141 +93,6 @@ #include "tc4.lh" -class hh_tms1k_state : public driver_device -{ -public: - hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_inp_matrix(*this, "IN"), - m_speaker(*this, "speaker"), - m_display_wait(33), - m_display_maxy(1), - m_display_maxx(0) - { } - - // devices - required_device m_maincpu; - optional_ioport_array<7> m_inp_matrix; // max 7 - optional_device m_speaker; - - // misc common - UINT16 m_r; // MCU R-pins data - UINT16 m_o; // MCU O-pins data - UINT16 m_inp_mux; // multiplexed inputs mask - bool m_power_on; - - UINT8 read_inputs(int columns); - DECLARE_INPUT_CHANGED_MEMBER(power_button); - DECLARE_WRITE_LINE_MEMBER(auto_power_off); - - virtual void machine_start(); - virtual void machine_reset(); - - // display common - int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) - int m_display_maxy; // display matrix number of rows - int m_display_maxx; // display matrix number of columns - - UINT32 m_display_state[0x20]; // display matrix rows data - UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments - UINT32 m_display_cache[0x20]; // (internal use) - UINT8 m_display_decay[0x20][0x20]; // (internal use) - - TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); - void display_update(); - void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); - - // game-specific handlers - void mathmagi_display(); - DECLARE_WRITE16_MEMBER(mathmagi_write_r); - DECLARE_WRITE16_MEMBER(mathmagi_write_o); - DECLARE_READ8_MEMBER(mathmagi_read_k); - - void amaztron_display(); - DECLARE_WRITE16_MEMBER(amaztron_write_r); - DECLARE_WRITE16_MEMBER(amaztron_write_o); - DECLARE_READ8_MEMBER(amaztron_read_k); - - void tc4_display(); - DECLARE_WRITE16_MEMBER(tc4_write_r); - DECLARE_WRITE16_MEMBER(tc4_write_o); - DECLARE_READ8_MEMBER(tc4_read_k); - - void ebball_display(); - DECLARE_WRITE16_MEMBER(ebball_write_r); - DECLARE_WRITE16_MEMBER(ebball_write_o); - DECLARE_READ8_MEMBER(ebball_read_k); - - void ebball2_display(); - DECLARE_WRITE16_MEMBER(ebball2_write_r); - DECLARE_WRITE16_MEMBER(ebball2_write_o); - DECLARE_READ8_MEMBER(ebball2_read_k); - - void ebball3_display(); - DECLARE_WRITE16_MEMBER(ebball3_write_r); - DECLARE_WRITE16_MEMBER(ebball3_write_o); - DECLARE_READ8_MEMBER(ebball3_read_k); - void ebball3_set_clock(); - DECLARE_INPUT_CHANGED_MEMBER(ebball3_difficulty_switch); - DECLARE_MACHINE_RESET(ebball3); - - DECLARE_WRITE16_MEMBER(elecdet_write_r); - DECLARE_WRITE16_MEMBER(elecdet_write_o); - DECLARE_READ8_MEMBER(elecdet_read_k); - - void starwbc_display(); - DECLARE_WRITE16_MEMBER(starwbc_write_r); - DECLARE_WRITE16_MEMBER(starwbc_write_o); - DECLARE_READ8_MEMBER(starwbc_read_k); - - DECLARE_WRITE16_MEMBER(comp4_write_r); - DECLARE_WRITE16_MEMBER(comp4_write_o); - DECLARE_READ8_MEMBER(comp4_read_k); - - DECLARE_WRITE16_MEMBER(simon_write_r); - DECLARE_WRITE16_MEMBER(simon_write_o); - DECLARE_READ8_MEMBER(simon_read_k); - - DECLARE_WRITE16_MEMBER(ssimon_write_r); - DECLARE_WRITE16_MEMBER(ssimon_write_o); - DECLARE_READ8_MEMBER(ssimon_read_k); - - bool m_dtower_motor_on; - bool m_dtower_sensor; - void mbdtower_display(); - DECLARE_WRITE16_MEMBER(mbdtower_write_r); - DECLARE_WRITE16_MEMBER(mbdtower_write_o); - DECLARE_READ8_MEMBER(mbdtower_read_k); - DECLARE_MACHINE_START(mbdtower); - - DECLARE_WRITE16_MEMBER(cnsector_write_r); - DECLARE_WRITE16_MEMBER(cnsector_write_o); - DECLARE_READ8_MEMBER(cnsector_read_k); - - DECLARE_WRITE16_MEMBER(merlin_write_r); - DECLARE_WRITE16_MEMBER(merlin_write_o); - DECLARE_READ8_MEMBER(merlin_read_k); - - DECLARE_WRITE16_MEMBER(stopthief_write_r); - DECLARE_WRITE16_MEMBER(stopthief_write_o); - DECLARE_READ8_MEMBER(stopthief_read_k); - - DECLARE_WRITE16_MEMBER(bankshot_write_r); - DECLARE_WRITE16_MEMBER(bankshot_write_o); - DECLARE_READ8_MEMBER(bankshot_read_k); - - DECLARE_WRITE16_MEMBER(splitsec_write_r); - DECLARE_WRITE16_MEMBER(splitsec_write_o); - DECLARE_READ8_MEMBER(splitsec_read_k); - - void tandy12_display(); - DECLARE_WRITE16_MEMBER(tandy12_write_r); - DECLARE_WRITE16_MEMBER(tandy12_write_o); - DECLARE_READ8_MEMBER(tandy12_read_k); -}; - - // machine_start/reset void hh_tms1k_state::machine_start() @@ -274,19 +137,6 @@ void hh_tms1k_state::machine_reset() ***************************************************************************/ -// LED segments -enum -{ - lA = 0x01, - lB = 0x02, - lC = 0x04, - lD = 0x08, - lE = 0x10, - lF = 0x20, - lG = 0x40, - lDP = 0x80 -}; - // The device may strobe the outputs very fast, it is unnoticeable to the user. // To prevent flickering here, we need to simulate a decay. diff --git a/src/mess/includes/hh_tms1k.h b/src/mess/includes/hh_tms1k.h new file mode 100644 index 00000000000..e5969c48b20 --- /dev/null +++ b/src/mess/includes/hh_tms1k.h @@ -0,0 +1,168 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Sean Riddle, Kevin Horton +/* + + TMS1000 MCU series tabletops/handhelds or other simple devices. + +*/ + +#ifndef _HH_TMS1K_H_ +#define _HH_TMS1K_H_ + + +#include "emu.h" +#include "cpu/tms0980/tms0980.h" +#include "sound/speaker.h" + + +class hh_tms1k_state : public driver_device +{ +public: + hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_inp_matrix(*this, "IN"), + m_speaker(*this, "speaker"), + m_display_wait(33), + m_display_maxy(1), + m_display_maxx(0) + { } + + // devices + required_device m_maincpu; + optional_ioport_array<7> m_inp_matrix; // max 7 + optional_device m_speaker; + + // misc common + UINT16 m_r; // MCU R-pins data + UINT16 m_o; // MCU O-pins data + UINT16 m_inp_mux; // multiplexed inputs mask + bool m_power_on; + + UINT8 read_inputs(int columns); + DECLARE_INPUT_CHANGED_MEMBER(power_button); + DECLARE_WRITE_LINE_MEMBER(auto_power_off); + + // display common + int m_display_wait; // led/lamp off-delay in microseconds (default 33ms) + int m_display_maxy; // display matrix number of rows + int m_display_maxx; // display matrix number of columns + + UINT32 m_display_state[0x20]; // display matrix rows data + UINT16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments + UINT32 m_display_cache[0x20]; // (internal use) + UINT8 m_display_decay[0x20][0x20]; // (internal use) + + TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick); + void display_update(); + void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); + + // game-specific handlers + void mathmagi_display(); + DECLARE_WRITE16_MEMBER(mathmagi_write_r); + DECLARE_WRITE16_MEMBER(mathmagi_write_o); + DECLARE_READ8_MEMBER(mathmagi_read_k); + + void amaztron_display(); + DECLARE_WRITE16_MEMBER(amaztron_write_r); + DECLARE_WRITE16_MEMBER(amaztron_write_o); + DECLARE_READ8_MEMBER(amaztron_read_k); + + void tc4_display(); + DECLARE_WRITE16_MEMBER(tc4_write_r); + DECLARE_WRITE16_MEMBER(tc4_write_o); + DECLARE_READ8_MEMBER(tc4_read_k); + + void ebball_display(); + DECLARE_WRITE16_MEMBER(ebball_write_r); + DECLARE_WRITE16_MEMBER(ebball_write_o); + DECLARE_READ8_MEMBER(ebball_read_k); + + void ebball2_display(); + DECLARE_WRITE16_MEMBER(ebball2_write_r); + DECLARE_WRITE16_MEMBER(ebball2_write_o); + DECLARE_READ8_MEMBER(ebball2_read_k); + + void ebball3_display(); + DECLARE_WRITE16_MEMBER(ebball3_write_r); + DECLARE_WRITE16_MEMBER(ebball3_write_o); + DECLARE_READ8_MEMBER(ebball3_read_k); + void ebball3_set_clock(); + DECLARE_INPUT_CHANGED_MEMBER(ebball3_difficulty_switch); + DECLARE_MACHINE_RESET(ebball3); + + DECLARE_WRITE16_MEMBER(elecdet_write_r); + DECLARE_WRITE16_MEMBER(elecdet_write_o); + DECLARE_READ8_MEMBER(elecdet_read_k); + + void starwbc_display(); + DECLARE_WRITE16_MEMBER(starwbc_write_r); + DECLARE_WRITE16_MEMBER(starwbc_write_o); + DECLARE_READ8_MEMBER(starwbc_read_k); + + DECLARE_WRITE16_MEMBER(comp4_write_r); + DECLARE_WRITE16_MEMBER(comp4_write_o); + DECLARE_READ8_MEMBER(comp4_read_k); + + DECLARE_WRITE16_MEMBER(simon_write_r); + DECLARE_WRITE16_MEMBER(simon_write_o); + DECLARE_READ8_MEMBER(simon_read_k); + + DECLARE_WRITE16_MEMBER(ssimon_write_r); + DECLARE_WRITE16_MEMBER(ssimon_write_o); + DECLARE_READ8_MEMBER(ssimon_read_k); + + bool m_dtower_motor_on; + bool m_dtower_sensor; + void mbdtower_display(); + DECLARE_WRITE16_MEMBER(mbdtower_write_r); + DECLARE_WRITE16_MEMBER(mbdtower_write_o); + DECLARE_READ8_MEMBER(mbdtower_read_k); + DECLARE_MACHINE_START(mbdtower); + + DECLARE_WRITE16_MEMBER(cnsector_write_r); + DECLARE_WRITE16_MEMBER(cnsector_write_o); + DECLARE_READ8_MEMBER(cnsector_read_k); + + DECLARE_WRITE16_MEMBER(merlin_write_r); + DECLARE_WRITE16_MEMBER(merlin_write_o); + DECLARE_READ8_MEMBER(merlin_read_k); + + DECLARE_WRITE16_MEMBER(stopthief_write_r); + DECLARE_WRITE16_MEMBER(stopthief_write_o); + DECLARE_READ8_MEMBER(stopthief_read_k); + + DECLARE_WRITE16_MEMBER(bankshot_write_r); + DECLARE_WRITE16_MEMBER(bankshot_write_o); + DECLARE_READ8_MEMBER(bankshot_read_k); + + DECLARE_WRITE16_MEMBER(splitsec_write_r); + DECLARE_WRITE16_MEMBER(splitsec_write_o); + DECLARE_READ8_MEMBER(splitsec_read_k); + + void tandy12_display(); + DECLARE_WRITE16_MEMBER(tandy12_write_r); + DECLARE_WRITE16_MEMBER(tandy12_write_o); + DECLARE_READ8_MEMBER(tandy12_read_k); + +protected: + virtual void machine_start(); + virtual void machine_reset(); +}; + + +// LED segments +enum +{ + lA = 0x01, + lB = 0x02, + lC = 0x04, + lD = 0x08, + lE = 0x10, + lF = 0x20, + lG = 0x40, + lDP = 0x80 +}; + + +#endif /* _HH_TMS1K_H_ */ From b56b22a055fae31eaf5df627bdaada8443de11c0 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 23 Mar 2015 08:50:42 +0100 Subject: [PATCH 172/201] moved dark tower to its own file --- src/mess/drivers/elecbowl.c | 20 ++-- src/mess/drivers/hh_tms1k.c | 139 +------------------------ src/mess/drivers/mbdtower.c | 190 +++++++++++++++++++++++++++++++++++ src/mess/includes/hh_tms1k.h | 8 -- src/mess/mess.lst | 5 +- src/mess/mess.mak | 3 +- 6 files changed, 202 insertions(+), 163 deletions(-) create mode 100644 src/mess/drivers/mbdtower.c diff --git a/src/mess/drivers/elecbowl.c b/src/mess/drivers/elecbowl.c index da67a96c2ab..c4be40e64e2 100644 --- a/src/mess/drivers/elecbowl.c +++ b/src/mess/drivers/elecbowl.c @@ -16,7 +16,6 @@ ***************************************************************************/ #include "includes/hh_tms1k.h" - #include "elecbowl.lh" @@ -27,9 +26,9 @@ public: : hh_tms1k_state(mconfig, type, tag) { } - DECLARE_READ8_MEMBER(read_k); DECLARE_WRITE16_MEMBER(write_r); DECLARE_WRITE16_MEMBER(write_o); + DECLARE_READ8_MEMBER(read_k); protected: virtual void machine_start(); @@ -42,18 +41,6 @@ protected: ***************************************************************************/ -READ8_MEMBER(elecbowl_state::read_k) -{ - UINT8 k = 0; - - // read selected input rows - for (int i = 0; i < 4; i++) - if (m_inp_mux >> i & 1) - k |= m_inp_matrix[i]->read(); - - return k; -} - WRITE16_MEMBER(elecbowl_state::write_r) { // R4-R7: input mux @@ -71,6 +58,11 @@ WRITE16_MEMBER(elecbowl_state::write_o) // ? } +READ8_MEMBER(elecbowl_state::read_k) +{ + return read_inputs(4); +} + /*************************************************************************** diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 6a2e1cb88b7..31f021c0dc8 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -48,7 +48,7 @@ *MP7303 TMS1400? 19??, Tiger 7-in-1 Sports Stadium @MP7313 TMS1400 1980, Parker Brothers Bank Shot @MP7314 TMS1400 1980, Parker Brothers Split Second - @MP7332 TMS1400 1981, Milton Bradley Dark Tower + MP7332 TMS1400 1981, Milton Bradley Dark Tower -> mbdtower.c @MP7334 TMS1400 1981, Coleco Total Control 4 inconsistent: @@ -82,7 +82,6 @@ #include "elecdet.lh" #include "comp4.lh" #include "mathmagi.lh" -#include "mbdtower.lh" #include "merlin.lh" // clickable #include "simon.lh" // clickable #include "ssimon.lh" @@ -1536,130 +1535,6 @@ MACHINE_CONFIG_END -/*************************************************************************** - - Milton Bradley Dark Tower - * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C), die labeled MP7332 - * SN75494N MOS-to-LED digit driver - - x - -***************************************************************************/ - -void hh_tms1k_state::mbdtower_display() -{ -} - -WRITE16_MEMBER(hh_tms1k_state::mbdtower_write_r) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R3: N/C - // R4: 75494 enable (speaker, lamps, digit select go through that IC) - // R5-R7: tower lamps - // R8: rotation sensor led - // R9: motor on - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); -} - -WRITE16_MEMBER(hh_tms1k_state::mbdtower_write_o) -{ - // O0-O6: led segments A-G - // O7: digit select - m_o = data; -} - -READ8_MEMBER(hh_tms1k_state::mbdtower_read_k) -{ - // rotation sensor is on K8 - - return read_inputs(3); -} - - -/* physical button layout and labels is like this: - - (green) (l.blue) (red) - [YES/ [REPEAT] [NO/ - BUY] END] - - (yellow) (blue) (white) - [HAGGLE] [BAZAAR] [CLEAR] - - (blue) (blue) (blue) - [TOMB/ [MOVE] [SANCTUARY/ - RUIN] CITADEL] - - (orange) (blue) (d.yellow) - [DARK [FRONTIER] [INVENTORY] - TOWER] -*/ - -static INPUT_PORTS_START( mbdtower ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") -INPUT_PORTS_END - - -/* tower motor simulation: - -*/ - -MACHINE_START_MEMBER(hh_tms1k_state, mbdtower) -{ - machine_start(); - - // zerofill/register for savestates - m_dtower_motor_on = false; - m_dtower_sensor = false; - - save_item(NAME(m_dtower_motor_on)); - save_item(NAME(m_dtower_sensor)); -} - -static MACHINE_CONFIG_START( mbdtower, hh_tms1k_state ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1400, 400000) // approximation - RC osc. R=43K, C=56pf, but unknown RC curve - MCFG_TMS1XXX_READ_K_CB(READ8(hh_tms1k_state, mbdtower_read_k)) - MCFG_TMS1XXX_WRITE_R_CB(WRITE16(hh_tms1k_state, mbdtower_write_r)) - MCFG_TMS1XXX_WRITE_O_CB(WRITE16(hh_tms1k_state, mbdtower_write_o)) - - MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) - MCFG_DEFAULT_LAYOUT(layout_mbdtower) - - MCFG_MACHINE_START_OVERRIDE(hh_tms1k_state, mbdtower) - - /* no video! */ - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) -MACHINE_CONFIG_END - - - - - /*************************************************************************** Parker Brothers Code Name: Sector, by Bob Doyle @@ -2439,17 +2314,6 @@ ROM_START( ssimon ) ROM_END -ROM_START( mbdtower ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_mbdtower_opla.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) -ROM_END - - ROM_START( cnsector ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) @@ -2557,7 +2421,6 @@ CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, driver_device, 0, "Ken CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) CONS( 1978, simon, 0, 0, simon, simon, driver_device, 0, "Milton Bradley", "Simon (Rev. A)", GAME_SUPPORTS_SAVE ) CONS( 1979, ssimon, 0, 0, ssimon, ssimon, driver_device, 0, "Milton Bradley", "Super Simon", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) -CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, driver_device, 0, "Milton Bradley", "Dark Tower (Milton Bradley)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) // *** CONS( 1977, cnsector, 0, 0, cnsector, cnsector, driver_device, 0, "Parker Brothers", "Code Name: Sector", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // *** CONS( 1978, merlin, 0, 0, merlin, merlin, driver_device, 0, "Parker Brothers", "Merlin - The Electronic Wizard", GAME_SUPPORTS_SAVE ) diff --git a/src/mess/drivers/mbdtower.c b/src/mess/drivers/mbdtower.c new file mode 100644 index 00000000000..c7c35a4ab75 --- /dev/null +++ b/src/mess/drivers/mbdtower.c @@ -0,0 +1,190 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Sean Riddle +/*************************************************************************** + + Milton Bradley Dark Tower + * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C), die labeled MP7332 + * SN75494N MOS-to-LED digit driver + + x + +***************************************************************************/ + +#include "includes/hh_tms1k.h" +#include "mbdtower.lh" + + +class mbdtower_state : public hh_tms1k_state +{ +public: + mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) + : hh_tms1k_state(mconfig, type, tag) + { } + + void mbdtower_display(); + DECLARE_WRITE16_MEMBER(write_r); + DECLARE_WRITE16_MEMBER(write_o); + DECLARE_READ8_MEMBER(read_k); + + bool m_motor_on; + bool m_sensor; + +protected: + virtual void machine_start(); +}; + + +/*************************************************************************** + + I/O + +***************************************************************************/ + +void mbdtower_state::mbdtower_display() +{ +} + +WRITE16_MEMBER(mbdtower_state::write_r) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R3: N/C + // R4: 75494 enable (speaker, lamps, digit select go through that IC) + // R5-R7: tower lamps + // R8: rotation sensor led + // R9: motor on + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); +} + +WRITE16_MEMBER(mbdtower_state::write_o) +{ + // O0-O6: led segments A-G + // O7: digit select + m_o = data; +} + + +READ8_MEMBER(mbdtower_state::read_k) +{ + // rotation sensor is on K8 + + return read_inputs(3); +} + + +/* tower motor simulation: + +*/ + + + +/*************************************************************************** + + Inputs + +***************************************************************************/ + +/* physical button layout and labels is like this: + + (green) (l.blue) (red) + [YES/ [REPEAT] [NO/ + BUY] END] + + (yellow) (blue) (white) + [HAGGLE] [BAZAAR] [CLEAR] + + (blue) (blue) (blue) + [TOMB/ [MOVE] [SANCTUARY/ + RUIN] CITADEL] + + (orange) (blue) (d.yellow) + [DARK [FRONTIER] [INVENTORY] + TOWER] +*/ + +static INPUT_PORTS_START( mbdtower ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") +INPUT_PORTS_END + + + +/*************************************************************************** + + Machine Config + +***************************************************************************/ + +void mbdtower_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // zerofill/register for savestates + m_motor_on = false; + m_sensor = false; + + save_item(NAME(m_motor_on)); + save_item(NAME(m_sensor)); +} + + + +static MACHINE_CONFIG_START( mbdtower, mbdtower_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS1400, 400000) // approximation - RC osc. R=43K, C=56pf, but unknown RC curve + MCFG_TMS1XXX_READ_K_CB(READ8(mbdtower_state, read_k)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mbdtower_state, write_r)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mbdtower_state, write_o)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_mbdtower) + + /* no video! */ + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( mbdtower ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_default_mpla.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_mbdtower_opla.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) +ROM_END + + +CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, driver_device, 0, "Milton Bradley", "Dark Tower (Milton Bradley)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) + diff --git a/src/mess/includes/hh_tms1k.h b/src/mess/includes/hh_tms1k.h index e5969c48b20..1e10012bce0 100644 --- a/src/mess/includes/hh_tms1k.h +++ b/src/mess/includes/hh_tms1k.h @@ -112,14 +112,6 @@ public: DECLARE_WRITE16_MEMBER(ssimon_write_o); DECLARE_READ8_MEMBER(ssimon_read_k); - bool m_dtower_motor_on; - bool m_dtower_sensor; - void mbdtower_display(); - DECLARE_WRITE16_MEMBER(mbdtower_write_r); - DECLARE_WRITE16_MEMBER(mbdtower_write_o); - DECLARE_READ8_MEMBER(mbdtower_read_k); - DECLARE_MACHINE_START(mbdtower); - DECLARE_WRITE16_MEMBER(cnsector_write_r); DECLARE_WRITE16_MEMBER(cnsector_write_o); DECLARE_READ8_MEMBER(cnsector_read_k); diff --git a/src/mess/mess.lst b/src/mess/mess.lst index fa70b5a4bf7..e1ee73cecc7 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2204,7 +2204,6 @@ starwbcp // Kenner (prototype) comp4 // Milton Bradley simon // Milton Bradley ssimon // Milton Bradley -mbdtower // Milton Bradley cnsector // Parker Bros merlin // Parker Bros stopthie // Parker Bros @@ -2213,6 +2212,9 @@ bankshot // Parker Bros splitsec // Parker Bros tandy12 // Tandy Radio Shack +elecbowl // Marx +mbdtower // Milton Bradley + ssfball // Bambino splasfgt // Bambino astrocmd // Epoch @@ -2221,7 +2223,6 @@ tmpacman // Tomy tmtennis // Tomy alnchase // Tomy -elecbowl // Marx wildfire // Parker Bros diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 46470db1236..10a8d65dc4e 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1383,6 +1383,7 @@ $(MESSOBJ)/matsushi.a: \ $(MESS_DRIVERS)/myb3k.o \ $(MESSOBJ)/mb.a: \ + $(MESS_DRIVERS)/mbdtower.o \ $(MESS_DRIVERS)/microvsn.o \ $(MESSOBJ)/mchester.a: \ @@ -2143,7 +2144,6 @@ $(MESS_DRIVERS)/hh_tms1k.o: $(MESS_LAYOUT)/amaztron.lh \ $(MESS_LAYOUT)/ebball3.lh \ $(MESS_LAYOUT)/elecdet.lh \ $(MESS_LAYOUT)/mathmagi.lh \ - $(MESS_LAYOUT)/mbdtower.lh \ $(MESS_LAYOUT)/merlin.lh \ $(MESS_LAYOUT)/simon.lh \ $(MESS_LAYOUT)/ssimon.lh \ @@ -2162,6 +2162,7 @@ $(MESS_DRIVERS)/lc80.o: $(MESS_LAYOUT)/lc80.lh $(MESS_DRIVERS)/llc.o: $(MESS_LAYOUT)/llc1.lh $(MESS_DRIVERS)/lynx.o: $(MESS_LAYOUT)/lynx.lh $(MESS_DRIVERS)/mac.o: $(MESS_LAYOUT)/mac.lh +$(MESS_DRIVERS)/mbdtower.o: $(MESS_LAYOUT)/mbdtower.lh $(MESS_MACHINE)/megacd.o: $(MESS_LAYOUT)/megacd.lh $(MESS_DRIVERS)/mekd2.o: $(MESS_LAYOUT)/mekd2.lh $(MESS_DRIVERS)/mephisto.o: $(MESS_LAYOUT)/mephisto.lh From 2f5c5f8e2118c7eb5466fc4d25ef24027c08b267 Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Mon, 23 Mar 2015 10:15:02 +0100 Subject: [PATCH 173/201] temp workaround for the MESS crash due to SNES trying to access a cart even if none is available (emulation should not crash even if carts are mandatory). nw. a better solution will be added in next dev cycle, by moving the memory handlers to the cart side as it is being done in most systems. --- src/mess/drivers/snes.c | 237 ++++++++++++++++++++-------------------- 1 file changed, 121 insertions(+), 116 deletions(-) diff --git a/src/mess/drivers/snes.c b/src/mess/drivers/snes.c index 8697bb35d85..aff5e20e5f0 100644 --- a/src/mess/drivers/snes.c +++ b/src/mess/drivers/snes.c @@ -1005,9 +1005,9 @@ WRITE8_MEMBER( snes_console_state::pfest94_lo_w ) *************************************/ static ADDRESS_MAP_START( snes_map, AS_PROGRAM, 8, snes_console_state ) - AM_RANGE(0x000000, 0x7dffff) AM_READWRITE(snes20_lo_r, snes20_lo_w) +// AM_RANGE(0x000000, 0x7dffff) AM_READWRITE(snes20_lo_r, snes20_lo_w) AM_RANGE(0x7e0000, 0x7fffff) AM_RAM /* 8KB Low RAM, 24KB High RAM, 96KB Expanded RAM */ - AM_RANGE(0x800000, 0xffffff) AM_READWRITE(snes20_hi_r, snes20_hi_w) +// AM_RANGE(0x800000, 0xffffff) AM_READWRITE(snes20_hi_r, snes20_hi_w) ADDRESS_MAP_END static ADDRESS_MAP_START( spc_map, AS_PROGRAM, 8, snes_console_state ) @@ -1191,123 +1191,128 @@ void snes_console_state::machine_start() { snes_state::machine_start(); - m_type = m_cartslot->get_type(); - - switch (m_type) + if (m_cartslot && m_cartslot->exists()) { - // LoROM & LoROM + addons - case SNES_MODE20: - case SNES_BSXLO: - case SNES_SUFAMITURBO: - case SNES_CX4: // this still uses the old simulation instead of emulating the CPU - case SNES_ST010: // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w - case SNES_ST011: // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w - case SNES_ST018: // still unemulated - break; - case SNES_Z80GB: // skeleton support - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessgb_lo_r),this), write8_delegate(FUNC(snes_console_state::snessgb_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessgb_hi_r),this), write8_delegate(FUNC(snes_console_state::snessgb_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - case SNES_SA1: // skeleton support - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessa1_lo_r),this), write8_delegate(FUNC(snes_console_state::snessa1_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessa1_hi_r),this), write8_delegate(FUNC(snes_console_state::snessa1_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - case SNES_DSP: - m_maincpu->space(AS_PROGRAM).install_read_handler(0x208000, 0x20ffff, 0, 0x9f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x208000, 0x20ffff, 0, 0x9f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_DSP_2MB: - m_maincpu->space(AS_PROGRAM).install_read_handler(0x600000, 0x607fff, 0, 0x8f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x600000, 0x607fff, 0, 0x8f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_DSP4: - m_maincpu->space(AS_PROGRAM).install_read_handler(0x308000, 0x30ffff, 0, 0x8f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x308000, 0x30ffff, 0, 0x8f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_OBC1: - m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0xbf0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0xbf0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_SFX: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessfx_lo_r),this), write8_delegate(FUNC(snes_console_state::snessfx_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessfx_hi_r),this), write8_delegate(FUNC(snes_console_state::snessfx_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - case SNES_SDD1: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessdd1_lo_r),this), write8_delegate(FUNC(snes_console_state::snessdd1_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessdd1_hi_r),this), write8_delegate(FUNC(snes_console_state::snessdd1_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - case SNES_BSX: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snesbsx_lo_r),this), write8_delegate(FUNC(snes_console_state::snesbsx_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snesbsx_hi_r),this), write8_delegate(FUNC(snes_console_state::snesbsx_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - // HiROM & HiROM + addons - case SNES_MODE21: - case SNES_BSXHI: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - case SNES_DSP_MODE21: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0x9f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0x9f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->set_5a22_map(); - break; - case SNES_SRTC: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x002800, 0x002800, 0, 0xbf0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x002801, 0x002801, 0, 0xbf0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->set_5a22_map(); - break; - case SNES_SPC7110: - case SNES_SPC7110_RTC: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes7110_lo_r),this), write8_delegate(FUNC(snes_console_state::snes7110_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes7110_hi_r),this), write8_delegate(FUNC(snes_console_state::snes7110_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - case SNES_PFEST94: - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::pfest94_lo_r),this), write8_delegate(FUNC(snes_console_state::pfest94_lo_w),this)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::pfest94_hi_r),this), write8_delegate(FUNC(snes_console_state::pfest94_hi_w),this)); - m_maincpu->set_5a22_map(); - break; - // pirate 'mappers' - case SNES_POKEMON: - m_maincpu->space(AS_PROGRAM).install_read_handler(0x800000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x800000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_TEKKEN2: - m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x8087ff, 0, 0x3f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x8087ff, 0, 0x3f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_MCPIR1: - case SNES_MCPIR2: - m_maincpu->space(AS_PROGRAM).install_write_handler(0xffff00, 0xffffff, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_20COL: - m_maincpu->space(AS_PROGRAM).install_write_handler(0x008000, 0x008fff, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); - break; - case SNES_SOULBLAD: - // reads from xxx0-xxx3in range [80-bf] return a fixed sequence of 4bits; reads in range [c0-ff] return open bus - m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x808003, 0, 0x3f7ff0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); - m_maincpu->space(AS_PROGRAM).install_read_handler(0xc00000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes_open_bus_r),this)); - break; - case SNES_BUGS: - case SNES_BANANA: -// m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); -// m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); -// m_maincpu->set_5a22_map(); - break; - } + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes20_lo_r),this), write8_delegate(FUNC(snes_console_state::snes20_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes20_hi_r),this), write8_delegate(FUNC(snes_console_state::snes20_hi_w),this)); + m_maincpu->set_5a22_map(); + + m_type = m_cartslot->get_type(); - if (m_cartslot) + switch (m_type) + { + // LoROM & LoROM + addons + case SNES_MODE20: + case SNES_BSXLO: + case SNES_SUFAMITURBO: + case SNES_CX4: // this still uses the old simulation instead of emulating the CPU + case SNES_ST010: // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w + case SNES_ST011: // this requires two diff kinds of chip access, so we handle it in snes20_lo/hi_r/w + case SNES_ST018: // still unemulated + break; + case SNES_Z80GB: // skeleton support + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessgb_lo_r),this), write8_delegate(FUNC(snes_console_state::snessgb_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessgb_hi_r),this), write8_delegate(FUNC(snes_console_state::snessgb_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + case SNES_SA1: // skeleton support + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessa1_lo_r),this), write8_delegate(FUNC(snes_console_state::snessa1_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessa1_hi_r),this), write8_delegate(FUNC(snes_console_state::snessa1_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + case SNES_DSP: + m_maincpu->space(AS_PROGRAM).install_read_handler(0x208000, 0x20ffff, 0, 0x9f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x208000, 0x20ffff, 0, 0x9f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_DSP_2MB: + m_maincpu->space(AS_PROGRAM).install_read_handler(0x600000, 0x607fff, 0, 0x8f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x600000, 0x607fff, 0, 0x8f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_DSP4: + m_maincpu->space(AS_PROGRAM).install_read_handler(0x308000, 0x30ffff, 0, 0x8f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x308000, 0x30ffff, 0, 0x8f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_OBC1: + m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0xbf0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0xbf0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_SFX: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessfx_lo_r),this), write8_delegate(FUNC(snes_console_state::snessfx_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessfx_hi_r),this), write8_delegate(FUNC(snes_console_state::snessfx_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + case SNES_SDD1: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snessdd1_lo_r),this), write8_delegate(FUNC(snes_console_state::snessdd1_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snessdd1_hi_r),this), write8_delegate(FUNC(snes_console_state::snessdd1_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + case SNES_BSX: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snesbsx_lo_r),this), write8_delegate(FUNC(snes_console_state::snesbsx_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snesbsx_hi_r),this), write8_delegate(FUNC(snes_console_state::snesbsx_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + // HiROM & HiROM + addons + case SNES_MODE21: + case SNES_BSXHI: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + case SNES_DSP_MODE21: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x006000, 0x007fff, 0, 0x9f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x006000, 0x007fff, 0, 0x9f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->set_5a22_map(); + break; + case SNES_SRTC: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes21_lo_r),this), write8_delegate(FUNC(snes_console_state::snes21_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes21_hi_r),this), write8_delegate(FUNC(snes_console_state::snes21_hi_w),this)); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x002800, 0x002800, 0, 0xbf0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x002801, 0x002801, 0, 0xbf0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->set_5a22_map(); + break; + case SNES_SPC7110: + case SNES_SPC7110_RTC: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::snes7110_lo_r),this), write8_delegate(FUNC(snes_console_state::snes7110_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes7110_hi_r),this), write8_delegate(FUNC(snes_console_state::snes7110_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + case SNES_PFEST94: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7dffff, read8_delegate(FUNC(snes_console_state::pfest94_lo_r),this), write8_delegate(FUNC(snes_console_state::pfest94_lo_w),this)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x800000, 0xffffff, read8_delegate(FUNC(snes_console_state::pfest94_hi_r),this), write8_delegate(FUNC(snes_console_state::pfest94_hi_w),this)); + m_maincpu->set_5a22_map(); + break; + // pirate 'mappers' + case SNES_POKEMON: + m_maincpu->space(AS_PROGRAM).install_read_handler(0x800000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x800000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_TEKKEN2: + m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x8087ff, 0, 0x3f0000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x8087ff, 0, 0x3f0000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_MCPIR1: + case SNES_MCPIR2: + m_maincpu->space(AS_PROGRAM).install_write_handler(0xffff00, 0xffffff, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_20COL: + m_maincpu->space(AS_PROGRAM).install_write_handler(0x008000, 0x008fff, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); + break; + case SNES_SOULBLAD: + // reads from xxx0-xxx3in range [80-bf] return a fixed sequence of 4bits; reads in range [c0-ff] return open bus + m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x808003, 0, 0x3f7ff0, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); + m_maincpu->space(AS_PROGRAM).install_read_handler(0xc00000, 0xffffff, read8_delegate(FUNC(snes_console_state::snes_open_bus_r),this)); + break; + case SNES_BUGS: + case SNES_BANANA: +// m_maincpu->space(AS_PROGRAM).install_read_handler(0x808000, 0x80ffff, 0, 0x780000, read8_delegate(FUNC(base_sns_cart_slot_device::chip_read),(base_sns_cart_slot_device*)m_cartslot)); +// m_maincpu->space(AS_PROGRAM).install_write_handler(0x808000, 0x80ffff, 0, 0x780000, write8_delegate(FUNC(base_sns_cart_slot_device::chip_write),(base_sns_cart_slot_device*)m_cartslot)); +// m_maincpu->set_5a22_map(); + break; + } m_cartslot->save_ram(); + } } void snes_console_state::machine_reset() From efc7dedb573108f49876ee79459bce43d429f3c0 Mon Sep 17 00:00:00 2001 From: Cesare Falco Date: Mon, 23 Mar 2015 12:57:46 +0100 Subject: [PATCH 174/201] Updated *nix manpages to forthcoming 0.160 --- src/osd/sdl/man/castool.1 | 2 +- src/osd/sdl/man/chdman.1 | 2 +- src/osd/sdl/man/floptool.1 | 2 +- src/osd/sdl/man/imgtool.1 | 2 +- src/osd/sdl/man/jedutil.1 | 2 +- src/osd/sdl/man/ldresample.1 | 2 +- src/osd/sdl/man/ldverify.1 | 2 +- src/osd/sdl/man/mame.6 | 9 +++++---- src/osd/sdl/man/mess.6 | 10 +++++----- src/osd/sdl/man/romcmp.1 | 2 +- src/osd/sdl/man/testkeys.1 | 2 +- 11 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/osd/sdl/man/castool.1 b/src/osd/sdl/man/castool.1 index 09c56270c1b..56ef844e08f 100644 --- a/src/osd/sdl/man/castool.1 +++ b/src/osd/sdl/man/castool.1 @@ -6,7 +6,7 @@ .\" Cesare Falco , February 2011 .\" .\" -.TH CASTOOL 1 2015-01-18 0.158 "MESS Generic cassette manipulation tool" +.TH CASTOOL 1 2015-03-23 0.160 "MESS Generic cassette manipulation tool" .\" .\" .\" NAME chapter diff --git a/src/osd/sdl/man/chdman.1 b/src/osd/sdl/man/chdman.1 index d95e6e2ba24..dfa9440428d 100644 --- a/src/osd/sdl/man/chdman.1 +++ b/src/osd/sdl/man/chdman.1 @@ -6,7 +6,7 @@ .\" Ashley T. Howes , February 2005 .\" updated by Cesare Falco , February 2007 .\" -.TH CHDMAN 1 2015-01-18 0.158 "MAME Compressed Hunks of Data (CHD) manager" +.TH CHDMAN 1 2015-03-23 0.160 "MAME Compressed Hunks of Data (CHD) manager" .\" .\" NAME chapter .SH NAME diff --git a/src/osd/sdl/man/floptool.1 b/src/osd/sdl/man/floptool.1 index c3cb1b0fbef..338bf9b6b3b 100644 --- a/src/osd/sdl/man/floptool.1 +++ b/src/osd/sdl/man/floptool.1 @@ -6,7 +6,7 @@ .\" Cesare Falco , April 2014 .\" .\" -.TH FLOPTOOL 1 2015-01-18 0.158 "MESS Generic floppy manipulation tool" +.TH FLOPTOOL 1 2015-03-23 0.160 "MESS Generic floppy manipulation tool" .\" .\" .\" NAME chapter diff --git a/src/osd/sdl/man/imgtool.1 b/src/osd/sdl/man/imgtool.1 index 03be2b86515..392a767c166 100644 --- a/src/osd/sdl/man/imgtool.1 +++ b/src/osd/sdl/man/imgtool.1 @@ -6,7 +6,7 @@ .\" Cesare Falco , February 2011 .\" .\" -.TH IMGTOOL 1 2015-01-18 0.158 "MESS media image manipulation tool" +.TH IMGTOOL 1 2015-03-23 0.160 "MESS media image manipulation tool" .\" .\" .\" NAME chapter diff --git a/src/osd/sdl/man/jedutil.1 b/src/osd/sdl/man/jedutil.1 index 84ec4fc2efb..f85a5a3d620 100644 --- a/src/osd/sdl/man/jedutil.1 +++ b/src/osd/sdl/man/jedutil.1 @@ -8,7 +8,7 @@ .\" References .\" http://aarongiles.com/?p=159 .\" -.TH JEDUTIL 1 2015-01-18 0.158 "MAME JEDEC file utilities" +.TH JEDUTIL 1 2015-03-23 0.160 "MAME JEDEC file utilities" .\" .\" NAME chapter .SH NAME diff --git a/src/osd/sdl/man/ldresample.1 b/src/osd/sdl/man/ldresample.1 index d84f8c1d529..cf719c41ac9 100644 --- a/src/osd/sdl/man/ldresample.1 +++ b/src/osd/sdl/man/ldresample.1 @@ -3,7 +3,7 @@ .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" -.TH LDRESAMPLE 1 2015-01-18 0.158 "MAME laserdisc audio manipulation tool" +.TH LDRESAMPLE 1 2015-03-23 0.160 "MAME laserdisc audio manipulation tool" .\" .\" Please adjust this date whenever revising the manpage. .\" diff --git a/src/osd/sdl/man/ldverify.1 b/src/osd/sdl/man/ldverify.1 index 7dc1162d7ae..83b43efe118 100644 --- a/src/osd/sdl/man/ldverify.1 +++ b/src/osd/sdl/man/ldverify.1 @@ -5,7 +5,7 @@ .\" Man page created from source and usage information by .\" Cesare Falco , August 2008 .\" -.TH LDVERIFY 1 2015-01-18 0.158 "MAME laserdisc data checker" +.TH LDVERIFY 1 2015-03-23 0.160 "MAME laserdisc data checker" .\" .\" NAME chapter .SH NAME diff --git a/src/osd/sdl/man/mame.6 b/src/osd/sdl/man/mame.6 index b378266a421..20862922792 100644 --- a/src/osd/sdl/man/mame.6 +++ b/src/osd/sdl/man/mame.6 @@ -13,7 +13,7 @@ .\" and updated by Andrew Burton , July 2003 .\" .\" -.TH MAME 6 2015-01-18 0.158 "MAME \- The Multiple Arcade Machine Emulator" +.TH MAME 6 2015-03-23 0.160 "MAME \- The Multiple Arcade Machine Emulator" .\" .\" .\" NAME chapter @@ -448,6 +448,9 @@ The intention is that this PNG can be loaded via an artwork file with a low alpha (e.g, 0.1\-0.2 seems to work well) and blended over the entire screen. The PNG files are saved in the snap directory under the gamename\\burnin\-.png. The default is OFF (\-noburnin). +.TP +.B \-[no]dummywrite +Indicates whether a snapshot should be created with each frame. .\" .\" ******************************************************* .SS Performance options @@ -646,7 +649,7 @@ needs adjustment. This option requires a float argument in the range of .\" SDL specific .\" +++++++++++++++++++++++++++++++++++++++++++++++++++++++ .TP -.B \-video\fR [\fIsoft\fR|\fIopengl\fR|\fIopengl16\fR|\fInone\fR] +.B \-video\fR [\fIsoft\fR|\fIopengl\fR|\fInone\fR] Specifies which video subsystem to use for drawing: .br \fBsoft\fR uses software rendering, which is slower but more compatible. @@ -654,8 +657,6 @@ Specifies which video subsystem to use for drawing: \fBopengl\fR uses OpenGL and your graphics accelerator to speed up many aspects of drawing MAME including compositing artwork, overlays, and bezels, as well as stretching the image to fit your screen. -.br -\fBopengl16\fR uses alternate OpenGL code, which should provide faster output on some cards. .br \fBnone\fR does no drawing and is intended for CPU benchmarking. diff --git a/src/osd/sdl/man/mess.6 b/src/osd/sdl/man/mess.6 index 999494192df..d3fb2875db4 100644 --- a/src/osd/sdl/man/mess.6 +++ b/src/osd/sdl/man/mess.6 @@ -16,7 +16,7 @@ .\" http://www.mess.org/ .\" .\" -.TH MESS 6 2015-01-18 0.158 "The Multiple Emulator Super System (MESS)" +.TH MESS 6 2015-03-23 0.160 "The Multiple Emulator Super System (MESS)" .\" .\" .\" NAME chapter @@ -463,6 +463,9 @@ The intention is that this PNG can be loaded via an artwork file with a low alpha (e.g, 0.1\-0.2 seems to work well) and blended over the entire screen. The PNG files are saved in the snap directory under the system/burnin\-.png. The default is OFF (\-noburnin). +.TP +.B \-[no]dummywrite +Indicates whether a snapshot should be created with each frame. .\" .\" ******************************************************* .SS Performance options @@ -661,7 +664,7 @@ needs adjustment. This option requires a float argument in the range of .\" SDL specific .\" +++++++++++++++++++++++++++++++++++++++++++++++++++++++ .TP -.B \-video\fR [\fIsoft\fR|\fIopengl\fR|\fIopengl16\fR|\fInone\fR] +.B \-video\fR [\fIsoft\fR|\fIopengl\fR|\fInone\fR] Specifies which video subsystem to use for drawing: .br \fBsoft\fR uses software rendering, which is slower but more compatible. @@ -670,9 +673,6 @@ Specifies which video subsystem to use for drawing: aspects of drawing MESS including compositing artwork, overlays, and bezels, as well as stretching the image to fit your screen. .br -\fBopengl16\fR uses alternate OpenGL code, which should provide faster -output on some cards. -.br \fBnone\fR does no drawing and is intended for CPU benchmarking. .br Default is SOFT. diff --git a/src/osd/sdl/man/romcmp.1 b/src/osd/sdl/man/romcmp.1 index 766dac20a41..a52c2a1b472 100644 --- a/src/osd/sdl/man/romcmp.1 +++ b/src/osd/sdl/man/romcmp.1 @@ -9,7 +9,7 @@ .\" References .\" http://www.mame.net/mamefaq.html .\" -.TH ROMCMP 1 2015-01-18 0.158 "MAME romset checking tool" +.TH ROMCMP 1 2015-03-23 0.160 "MAME romset checking tool" .\" .\" NAME chapter .SH NAME diff --git a/src/osd/sdl/man/testkeys.1 b/src/osd/sdl/man/testkeys.1 index d253f3cbb2b..4ef207a35b6 100644 --- a/src/osd/sdl/man/testkeys.1 +++ b/src/osd/sdl/man/testkeys.1 @@ -5,7 +5,7 @@ .\" Man page created from source and usage information .\" Cesare Falco , February 2007 .\" -.TH TESTKEYS 1 2015-01-18 0.158 "MAME SDL keycode scanner" +.TH TESTKEYS 1 2015-03-23 0.160 "MAME SDL keycode scanner" .\" .\" NAME chapter .SH NAME From d1e1dda76db02c8d70a885b0e1e95a1d0da50c36 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Mon, 23 Mar 2015 13:50:28 +0000 Subject: [PATCH 175/201] new clones Golden Axe II (Mega Play) (original rev) [Jets and Layer] This is the original release, the set we had was Rev B, so I've marked it as such. --- src/mame/drivers/megaplay.c | 18 ++++++++++++++++-- src/mame/mame.lst | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/megaplay.c b/src/mame/drivers/megaplay.c index 86dae7f694d..cd4b74fc988 100644 --- a/src/mame/drivers/megaplay.c +++ b/src/mame/drivers/megaplay.c @@ -742,7 +742,7 @@ ROM_START( mp_col3 ) /* Columns 3 */ MEGAPLAY_BIOS ROM_END -ROM_START( mp_gaxe2 ) /* Golden Axe 2 */ +ROM_START( mp_gaxe2 ) /* Golden Axe 2, revision B */ ROM_REGION( 0x400000, "maincpu", 0 ) ROM_LOAD16_BYTE( "ep15179b.ic2", 0x000000, 0x040000, CRC(00d97b84) SHA1(914bbf566ddf940aab67b92af237d251650ddadf) ) ROM_LOAD16_BYTE( "ep15178b.ic1", 0x000001, 0x040000, CRC(2ea576db) SHA1(6d96b948243533de1f488b1f80e0d5431a4f1f53) ) @@ -755,6 +755,19 @@ ROM_START( mp_gaxe2 ) /* Golden Axe 2 */ MEGAPLAY_BIOS ROM_END +ROM_START( mp_gaxe2a ) /* Golden Axe 2 */ + ROM_REGION( 0x400000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "epr-15179.ic2", 0x000000, 0x040000, CRC(d35f1a35) SHA1(3105cd3b55f65337863703db04527fe298fc04e0) ) + ROM_LOAD16_BYTE( "epr-15178.ic1", 0x000001, 0x040000, CRC(2c6b6b76) SHA1(25577f49ecad451c217da9cacbd78ffca9dca24e) ) + /* Game Instruction rom copied to 0x300000 - 0x310000 (odd / even bytes equal) */ + + ROM_REGION( 0x8000, "user1", 0 ) /* Game Instructions */ + ROM_LOAD( "epr-15175-02.ic3", 0x000000, 0x08000, CRC(cfc87f91) SHA1(110609094aa6d848bec613faa0558db7ad272b77) ) + + ROM_REGION( 0x20000, "mtbios", 0 ) /* Bios */ + MEGAPLAY_BIOS +ROM_END + ROM_START( mp_gslam ) /* Grand Slam */ ROM_REGION( 0x400000, "maincpu", 0 ) ROM_LOAD16_BYTE( "epr-15181.ic2", 0x000000, 0x040000, CRC(642437c1) SHA1(cbf88e196c04b6d886bf9642b69bf165045510fe) ) @@ -928,7 +941,8 @@ didn't have original Sega part numbers it's probably a converted TWC cart /* -- */ GAME( 1993, megaplay, 0, megaplay, megaplay, mplay_state, megaplay, ROT0, "Sega", "Mega Play BIOS", GAME_IS_BIOS_ROOT ) /* 01 */ GAME( 1993, mp_sonic, megaplay, megaplay, mp_sonic, mplay_state, megaplay, ROT0, "Sega", "Sonic The Hedgehog (Mega Play)" , 0 ) -/* 02 */ GAME( 1993, mp_gaxe2, megaplay, megaplay, mp_gaxe2, mplay_state, megaplay, ROT0, "Sega", "Golden Axe II (Mega Play)" , 0 ) +/* 02 */ GAME( 1993, mp_gaxe2, megaplay, megaplay, mp_gaxe2, mplay_state, megaplay, ROT0, "Sega", "Golden Axe II (Mega Play) (Rev B)" , 0 ) +/* 02 */ GAME( 1993, mp_gaxe2a,mp_gaxe2, megaplay, mp_gaxe2, mplay_state, megaplay, ROT0, "Sega", "Golden Axe II (Mega Play)" , 0 ) /* 03 */ GAME( 1993, mp_gslam, megaplay, megaplay, mp_gslam, mplay_state, megaplay, ROT0, "Sega", "Grand Slam (Mega Play)",0 ) /* 04 */ GAME( 1993, mp_twc, megaplay, megaplay, mp_twc, mplay_state, megaplay, ROT0, "Sega", "Tecmo World Cup (Mega Play)" , 0 ) /* 05 */ GAME( 1993, mp_sor2, megaplay, megaplay, mp_sor2, mplay_state, megaplay, ROT0, "Sega", "Streets of Rage II (Mega Play)" , 0 ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ffd1409ea42..78fb22ae122 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -5284,6 +5284,7 @@ mt_soni2 // 62 megaplay mp_sonic // 01 mp_gaxe2 // 02 +mp_gaxe2a // 02 mp_gslam // 03 mp_twc // 04 mp_sor2 // 05 From 1aca10780c7762e770100742ead61dda48b0a0d4 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Mon, 23 Mar 2015 14:11:24 +0000 Subject: [PATCH 176/201] works well enough to mark it as working (nw) --- src/mame/drivers/twins.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/mame/drivers/twins.c b/src/mame/drivers/twins.c index b663bc6b7db..6ee893004dc 100644 --- a/src/mame/drivers/twins.c +++ b/src/mame/drivers/twins.c @@ -39,17 +39,18 @@ video is not banked in this case instead palette data is sent to the ports strange palette format. todo: -hook up eeprom -takes a long time to boot (eeprom?) - +hook up eeprom (doesn't seem to work when hooked up??) +Twins set 1 takes a long time to boot (eeprom?) +Improve blitter / clear logic for Spider. Electronic Devices was printed on rom labels 1994 date string is in ROM -Spider seems to have some kind of sprites / blitter that works the same as as Table Tennis Champ (ttchamp.c) -Spider must also have some ROM banking, or the blitter must be able to access non-cpu visible space, the title logo is at 0x00000 in ROM +Spider PCB appears almost identical but uses additional 'blitter' features. +It is possible the Twins PCB has them too and doesn't use them. -Twins (set 2) is significantly changed hardware. + +Twins (set 2) is significantly changed hardware, uses a regular RAMDAC hookup for plaette etc. */ @@ -281,9 +282,19 @@ ADDRESS_MAP_END VIDEO_START_MEMBER(twins_state,twins) { save_item(NAME(m_paloff)); - m_paloff = 0; + + save_item(NAME(m_spritesinit)); + save_item(NAME(m_spriteswidth)); + save_item(NAME(m_spritesaddr)); + save_item(NAME(m_mainram)); + save_item(NAME(m_videoram)); + save_item(NAME(m_videoram2)); + save_item(NAME(m_videorambank)); } + + + UINT32 twins_state::screen_update_twins(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int y,x,count; @@ -401,6 +412,7 @@ VIDEO_START_MEMBER(twins_state,twinsa) } + static ADDRESS_MAP_START( twinsa_io, AS_IO, 16, twins_state ) AM_RANGE(0x0000, 0x0001) AM_DEVWRITE8("ramdac",ramdac_device,index_w,0x00ff) AM_RANGE(0x0002, 0x0003) AM_DEVWRITE8("ramdac",ramdac_device,mask_w,0x00ff) @@ -616,4 +628,4 @@ ROM_END GAME( 1994, twins, 0, twins, twins, driver_device, 0, ROT0, "Electronic Devices", "Twins (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1994, twinsa, twins, twinsa, twins, driver_device, 0, ROT0, "Electronic Devices", "Twins (set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1994, spider, 0, spider, twins, driver_device, 0, ROT0, "Buena Vision", "Spider", GAME_NOT_WORKING ) +GAME( 1994, spider, 0, spider, twins, driver_device, 0, ROT0, "Buena Vision", "Spider", GAME_IMPERFECT_GRAPHICS ) From 7ea90b986d7be32c897e7ec9074363fda8c653e5 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 24 Mar 2015 02:53:25 +1100 Subject: [PATCH 177/201] megasys1.c: fix status read for second OKI sound chip [Mamesick] --- src/mame/drivers/megasys1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/drivers/megasys1.c b/src/mame/drivers/megasys1.c index 0da05bb5416..f31aad63bc7 100644 --- a/src/mame/drivers/megasys1.c +++ b/src/mame/drivers/megasys1.c @@ -398,7 +398,7 @@ READ8_MEMBER(megasys1_state::oki_status_2_r) if (m_ignore_oki_status == 1) return 0; else - return m_oki1->read_status(); + return m_oki2->read_status(); } /*************************************************************************** [ Sound CPU - System A ] From 277cb84661e0628121fff3ec0082cfddf5a4ca92 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Mon, 23 Mar 2015 16:05:27 +0000 Subject: [PATCH 178/201] use existing sprite device for 'thedeep' (thanks to Osso for pointing it out) --- src/mame/drivers/thedeep.c | 5 ++ src/mame/includes/thedeep.h | 9 +++- src/mame/video/decmxc06.c | 35 +++++++++----- src/mame/video/decmxc06.h | 10 ++++ src/mame/video/thedeep.c | 92 +------------------------------------ 5 files changed, 47 insertions(+), 104 deletions(-) diff --git a/src/mame/drivers/thedeep.c b/src/mame/drivers/thedeep.c index cc3db30a16d..b28bb92237d 100644 --- a/src/mame/drivers/thedeep.c +++ b/src/mame/drivers/thedeep.c @@ -436,6 +436,11 @@ static MACHINE_CONFIG_START( thedeep, thedeep_state ) MCFG_PALETTE_ADD("palette", 512) MCFG_PALETTE_INIT_OWNER(thedeep_state, thedeep) + MCFG_DEVICE_ADD("spritegen", DECO_MXC06, 0) + deco_mxc06_device::set_gfx_region(*device, 0); + MCFG_DECO_MXC06_GFXDECODE("gfxdecode") + MCFG_DECO_MXC06_PALETTE("palette") + MCFG_DECO_MXC06_RAMSIZE(0x400) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/includes/thedeep.h b/src/mame/includes/thedeep.h index 301bb0c8b0d..948f278ac60 100644 --- a/src/mame/includes/thedeep.h +++ b/src/mame/includes/thedeep.h @@ -1,3 +1,6 @@ +#include "video/decmxc06.h" + + class thedeep_state : public driver_device { public: @@ -12,7 +15,9 @@ public: m_vram_0(*this, "vram_0"), m_vram_1(*this, "vram_1"), m_scroll(*this, "scroll"), - m_scroll2(*this, "scroll2") { } + m_scroll2(*this, "scroll2"), + m_spritegen(*this, "spritegen") + { } required_device m_maincpu; required_device m_audiocpu; @@ -25,6 +30,7 @@ public: required_shared_ptr m_vram_1; required_shared_ptr m_scroll; required_shared_ptr m_scroll2; + required_device m_spritegen; int m_nmi_enable; UINT8 m_protection_command; @@ -59,7 +65,6 @@ public: DECLARE_PALETTE_INIT(thedeep); UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(mcu_irq); TIMER_DEVICE_CALLBACK_MEMBER(interrupt); diff --git a/src/mame/video/decmxc06.c b/src/mame/video/decmxc06.c index 3b908b6df80..61cc9d03d93 100644 --- a/src/mame/video/decmxc06.c +++ b/src/mame/video/decmxc06.c @@ -51,6 +51,7 @@ deco_mxc06_device::deco_mxc06_device(const machine_config &mconfig, const char * : device_t(mconfig, DECO_MXC06, "DECO MXC06 Sprite", tag, owner, clock, "deco_mxc06", __FILE__), device_video_interface(mconfig, *this), m_gfxregion(0), + m_ramsize(0x800), m_gfxdecode(*this), m_palette(*this) { @@ -73,7 +74,7 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli int offs; offs = 0; - while (offs < 0x800 / 2) + while (offs < m_ramsize / 2) { int sx, sy, code, color, w, h, flipx, flipy, incy, flash, mult, x, y; @@ -109,36 +110,44 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli else mult = -16; + + // thedeep strongly suggests that this check goes here, otherwise the radar breaks + if (!(spriteram[offs] & 0x8000)) + { + offs += 4; + continue; + } + + for (x = 0; x < w; x++) { // maybe, birdie try appears to specify the base code for each part.. code = spriteram[offs + 1] & 0x1fff; - code &= ~(h-1); + code &= ~(h - 1); if (flipy) incy = -1; else { - code += h-1; + code += h - 1; incy = 1; } for (y = 0; y < h; y++) { - if (spriteram[offs] & 0x8000) { int draw = 0; if (!flash || (m_screen->frame_number() & 1)) { - if (m_priority_type==0) // most cases + if (m_priority_type == 0) // most cases { if ((color & pri_mask) == pri_val) { draw = 1; } } - else if (m_priority_type==1) // vaportra + else if (m_priority_type == 1) // vaportra { if (pri_mask && (color >= pri_val)) continue; @@ -152,18 +161,20 @@ void deco_mxc06_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cli if (draw) { - m_gfxdecode->gfx(m_gfxregion)->transpen(bitmap,cliprect, + m_gfxdecode->gfx(m_gfxregion)->transpen(bitmap, cliprect, code - y * incy, color & col_mask, - flipx,flipy, - sx + (mult * x),sy + (mult * y),0); + flipx, flipy, + sx + (mult * x), sy + (mult * y), 0); } } } offs += 4; - if (offs >= 0x800 / 2) - return; + if (offs >= m_ramsize / 2) + return; + + } } } @@ -175,7 +186,7 @@ void deco_mxc06_device::draw_sprites_bootleg( bitmap_ind16 &bitmap, const rectan int offs; offs = 0; - while (offs < 0x800 / 2) + while (offs < m_ramsize / 2) { int sx, sy, code, color, flipx, flipy; diff --git a/src/mame/video/decmxc06.h b/src/mame/video/decmxc06.h index e7d5013b03f..114ffd865d6 100644 --- a/src/mame/video/decmxc06.h +++ b/src/mame/video/decmxc06.h @@ -11,6 +11,12 @@ public: static void static_set_gfxdecode_tag(device_t &device, const char *tag); static void static_set_palette_tag(device_t &device, const char *tag); static void set_gfx_region(device_t &device, int region); + static void set_ram_size(device_t &device, int size) + { + deco_mxc06_device &dev = downcast(device); + dev.m_ramsize = size; + } + void set_gfxregion(int region) { m_gfxregion = region; }; void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram16, int pri_mask, int pri_val, int col_mask ); @@ -23,6 +29,7 @@ protected: UINT8 m_gfxregion; int m_priority_type; // just so we can support the existing drivers without converting everything to pdrawgfx just yet + int m_ramsize; private: required_device m_gfxdecode; @@ -36,3 +43,6 @@ extern const device_type DECO_MXC06; #define MCFG_DECO_MXC06_PALETTE(_palette_tag) \ deco_mxc06_device::static_set_palette_tag(*device, "^" _palette_tag); + +#define MCFG_DECO_MXC06_RAMSIZE(_size) \ + deco_mxc06_device::set_ram_size(*device, _size); diff --git a/src/mame/video/thedeep.c b/src/mame/video/thedeep.c index f810cb7da58..2c081a9a05b 100644 --- a/src/mame/video/thedeep.c +++ b/src/mame/video/thedeep.c @@ -107,95 +107,6 @@ void thedeep_state::video_start() m_tilemap_0->set_scroll_cols(0x20); // column scroll for the background } -/*************************************************************************** - - Sprites Drawing - -Offset: Bits: Value: - - 0 Y (low bits, 0 is bottom) - - 1 7------- Enable - -6------ Flip Y - --5----- Flip X ? (unused) - ---43--- Height: 1,2,4 or 8 tiles - -----21- Width: 1,2,4 or 8 tiles* - -------0 Y (High bit) - - 2 Code (low bits) - - 3 Code (high bits) - - 4 X (low bits, 0 is right) - - 5 7654---- Color - ----321- - -------0 X (High bit) - - 6 Unused - - 7 Unused - -* a sprite of width N uses N consecutive sprites. The first one specifies - all the data, the following ones only the tile code and color. - -***************************************************************************/ - -void thedeep_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - UINT8 *s = m_spriteram, *end = s + m_spriteram.bytes(); - - while (s < end) - { - int code,color,sx,sy,flipx,flipy,nx,ny,x,y,attr; - - attr = s[1]; - if (!(attr & 0x80)) { s+=8; continue; } - - sx = s[4]; - sy = s[0]; - - color = s[5]; - - flipx = attr & 0x00; // ? - flipy = attr & 0x40; - - nx = 1 << ((attr & 0x06) >> 1); - ny = 1 << ((attr & 0x18) >> 3); - - if (color & 1) sx -= 256; - if (attr & 1) sy -= 256; - - if (flip_screen()) - { - flipx = !flipx; - flipy = !flipy; - sy = sy - 8; - } - else - { - sx = 240 - sx; - sy = 240 - sy - ny * 16 + 16; - } - - for (x = 0; (x < nx) && (s < end); x++,s+=8) - { - code = s[2] + (s[3] << 8); - color = s[5] >> 4; - - for (y = 0; y < ny; y++) - { - m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, - code + (flipy ? (ny - y - 1) : y), - color, - flipx,flipy, - sx + x * (flipx ? 16 : -16), sy + y * 16,0 ); - } - } - } -} - - /*************************************************************************** Screen Drawing @@ -219,7 +130,8 @@ UINT32 thedeep_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, bitmap.fill(m_palette->black_pen(), cliprect); m_tilemap_0->draw(screen, bitmap, cliprect, 0,0); - draw_sprites(bitmap,cliprect); + m_spritegen->draw_sprites(bitmap, cliprect, reinterpret_cast(m_spriteram.target()), 0x00, 0x00, 0x0f); m_tilemap_1->draw(screen, bitmap, cliprect, 0,0); return 0; } + From 8533f2617b4029663366ffe3fa0403e9c17a5db8 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 23 Mar 2015 19:16:12 +0100 Subject: [PATCH 179/201] tmp68301_device: initialized variables (nw) --- src/emu/machine/tmp68301.c | 7 +++++++ src/mame/includes/seta2.h | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/emu/machine/tmp68301.c b/src/emu/machine/tmp68301.c index d9793f0fefd..9795e075b4a 100644 --- a/src/emu/machine/tmp68301.c +++ b/src/emu/machine/tmp68301.c @@ -99,8 +99,15 @@ tmp68301_device::tmp68301_device(const machine_config &mconfig, const char *tag, device_memory_interface(mconfig, *this), m_in_parallel_cb(*this), m_out_parallel_cb(*this), + m_imr(0), + m_iisr(0), + m_scr(0), + m_pdir(0), m_space_config("regs", ENDIANNESS_LITTLE, 16, 10, 0, NULL, *ADDRESS_MAP_NAME(tmp68301_regs)) { + memset(m_regs, 0, sizeof(m_regs)); + memset(m_IE, 0, sizeof(m_IE)); + memset(m_irq_vector, 0, sizeof(m_irq_vector)); } diff --git a/src/mame/includes/seta2.h b/src/mame/includes/seta2.h index 5bfca4ffbad..31c86630548 100644 --- a/src/mame/includes/seta2.h +++ b/src/mame/includes/seta2.h @@ -10,7 +10,6 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this,"maincpu"), m_tmp68301(*this, "tmp68301"), - m_x1(*this, "x1snd"), m_oki(*this, "oki"), m_eeprom(*this, "eeprom"), m_gfxdecode(*this, "gfxdecode"), @@ -24,7 +23,6 @@ public: required_device m_maincpu; optional_device m_tmp68301; - optional_device m_x1; optional_device m_oki; optional_device m_eeprom; required_device m_gfxdecode; From f517793c420ddc7ef6cad299546872e781d67ba3 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 23 Mar 2015 19:17:48 +0100 Subject: [PATCH 180/201] re900.c, ssrj.c, sstrangr.c: added save state support (nw) --- src/mame/drivers/re900.c | 40 +++++++++++++++++++++--------------- src/mame/drivers/ssrj.c | 25 +++++++++++++--------- src/mame/drivers/sstrangr.c | 22 ++++++++++++++------ src/mame/includes/ssrj.h | 41 ++++++++++++++++++++++--------------- src/mame/video/ssrj.c | 12 +++++------ 5 files changed, 85 insertions(+), 55 deletions(-) diff --git a/src/mame/drivers/re900.c b/src/mame/drivers/re900.c index 748c27d9c62..1c2cb63a56b 100644 --- a/src/mame/drivers/re900.c +++ b/src/mame/drivers/re900.c @@ -87,26 +87,33 @@ class re900_state : public driver_device public: re900_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_rom(*this, "rom"), - m_maincpu(*this, "maincpu") { } + m_maincpu(*this, "maincpu"), + m_rom(*this, "rom") { } + + required_device m_maincpu; required_shared_ptr m_rom; + + // re900 specific UINT8 m_psg_pa; UINT8 m_psg_pb; UINT8 m_mux_data; UINT8 m_ledant; UINT8 m_player; UINT8 m_stat_a; + + // common DECLARE_READ8_MEMBER(rom_r); DECLARE_WRITE8_MEMBER(cpu_port_0_w); - DECLARE_WRITE8_MEMBER(re900_watchdog_reset_w); + DECLARE_WRITE8_MEMBER(watchdog_reset_w); + + // re900 specific DECLARE_READ8_MEMBER(re_psg_portA_r); DECLARE_READ8_MEMBER(re_psg_portB_r); DECLARE_WRITE8_MEMBER(re_mux_port_A_w); DECLARE_WRITE8_MEMBER(re_mux_port_B_w); - DECLARE_WRITE_LINE_MEMBER(vdp_interrupt); + DECLARE_DRIVER_INIT(re900); - required_device m_maincpu; }; @@ -219,7 +226,7 @@ WRITE8_MEMBER(re900_state::cpu_port_0_w) // output_set_lamp_value(8,1 ^ ( (data >> 5) & 1)); /* Cont. Ent */ } -WRITE8_MEMBER(re900_state::re900_watchdog_reset_w) +WRITE8_MEMBER(re900_state::watchdog_reset_w) { //watchdog_reset_w(space,0,0); /* To do! */ } @@ -240,19 +247,13 @@ static ADDRESS_MAP_START( mem_io, AS_IO, 8, re900_state ) AM_RANGE(0xe001, 0xe001) AM_DEVWRITE("tms9128", tms9928a_device, register_write) AM_RANGE(0xe800, 0xe801) AM_DEVWRITE("ay_re900", ay8910_device, address_data_w) AM_RANGE(0xe802, 0xe802) AM_DEVREAD("ay_re900", ay8910_device, data_r) - AM_RANGE(0xe000, 0xefff) AM_WRITE(re900_watchdog_reset_w) + AM_RANGE(0xe000, 0xefff) AM_WRITE(watchdog_reset_w) AM_RANGE(MCS51_PORT_P0, MCS51_PORT_P0) AM_WRITE(cpu_port_0_w) AM_RANGE(MCS51_PORT_P2, MCS51_PORT_P2) AM_NOP AM_RANGE(MCS51_PORT_P3, MCS51_PORT_P3) AM_NOP ADDRESS_MAP_END -WRITE_LINE_MEMBER(re900_state::vdp_interrupt) -{ - m_maincpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE ); -} - - /************************ * Input ports * ************************/ @@ -380,7 +381,7 @@ static MACHINE_CONFIG_START( re900, re900_state ) /* video hardware */ MCFG_DEVICE_ADD( "tms9128", TMS9128, XTAL_10_738635MHz / 2 ) /* TMS9128NL on the board */ MCFG_TMS9928A_VRAM_SIZE(0x4000) - MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(re900_state, vdp_interrupt)) + MCFG_TMS9928A_OUT_INT_LINE_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) MCFG_SCREEN_UPDATE_DEVICE( "tms9128", tms9128_device, screen_update ) @@ -431,6 +432,13 @@ DRIVER_INIT_MEMBER(re900_state,re900) m_player = 1; m_stat_a = 1; m_psg_pa = m_psg_pb = m_mux_data = m_ledant = 0; + + save_item(NAME(m_psg_pa)); + save_item(NAME(m_psg_pb)); + save_item(NAME(m_mux_data)); + save_item(NAME(m_ledant)); + save_item(NAME(m_player)); + save_item(NAME(m_stat_a)); } @@ -439,5 +447,5 @@ DRIVER_INIT_MEMBER(re900_state,re900) *************************/ /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS LAYOUT */ -GAMEL( 1993, re900, 0, re900, re900, re900_state, re900, ROT90, "Entretenimientos GEMINIS", "Ruleta RE-900", 0, layout_re900) -GAME ( 1994, bs94 , 0, bs94, bs94 , re900_state, re900, ROT0, "Entretenimientos GEMINIS", "Buena Suerte '94", 0) +GAMEL( 1993, re900, 0, re900, re900, re900_state, re900, ROT90, "Entretenimientos GEMINIS", "Ruleta RE-900", GAME_SUPPORTS_SAVE, layout_re900) +GAME ( 1994, bs94 , 0, bs94, bs94 , driver_device, 0, ROT0, "Entretenimientos GEMINIS", "Buena Suerte '94", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/ssrj.c b/src/mame/drivers/ssrj.c index 24c4a937063..b4282c1b9a2 100644 --- a/src/mame/drivers/ssrj.c +++ b/src/mame/drivers/ssrj.c @@ -21,8 +21,8 @@ HW info : f800 ?? Scroll RAM contains x and y offsets for each tileline, - as well as other data (priroities ? additional flags ?) - All moving obejcts (cars, etc) are displayed on tilemap 3. + as well as other data (priorities ? additional flags ?) + All moving objects (cars, etc) are displayed on tilemap 3. ------------------------------------ Cheat : $e210 - timer @@ -34,6 +34,11 @@ HW info : #include "sound/ay8910.h" #include "includes/ssrj.h" +void ssrj_state::machine_start() +{ + save_item(NAME(m_oldport)); +} + void ssrj_state::machine_reset() { UINT8 *rom = memregion("maincpu")->base(); @@ -42,7 +47,7 @@ void ssrj_state::machine_reset() m_oldport = 0x80; } -READ8_MEMBER(ssrj_state::ssrj_wheel_r) +READ8_MEMBER(ssrj_state::wheel_r) { int port = ioport("IN1")->read() - 0x80; int retval = port - m_oldport; @@ -53,14 +58,14 @@ READ8_MEMBER(ssrj_state::ssrj_wheel_r) static ADDRESS_MAP_START( ssrj_map, AS_PROGRAM, 8, ssrj_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(ssrj_vram1_w) AM_SHARE("vram1") - AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(ssrj_vram2_w) AM_SHARE("vram2") + AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(vram1_w) AM_SHARE("vram1") + AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(vram2_w) AM_SHARE("vram2") AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_SHARE("vram3") - AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(ssrj_vram4_w) AM_SHARE("vram4") + AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(vram4_w) AM_SHARE("vram4") AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_RANGE(0xe800, 0xefff) AM_RAM AM_SHARE("scrollram") AM_RANGE(0xf000, 0xf000) AM_READ_PORT("IN0") - AM_RANGE(0xf001, 0xf001) AM_READ(ssrj_wheel_r) + AM_RANGE(0xf001, 0xf001) AM_READ(wheel_r) AM_RANGE(0xf002, 0xf002) AM_READ_PORT("IN2") AM_RANGE(0xf003, 0xf003) AM_WRITENOP /* unknown */ AM_RANGE(0xf401, 0xf401) AM_DEVREAD("aysnd", ay8910_device, data_r) @@ -141,8 +146,8 @@ static MACHINE_CONFIG_START( ssrj, ssrj_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 1*8, 31*8-1) // unknown res - MCFG_SCREEN_UPDATE_DRIVER(ssrj_state, screen_update_ssrj) - MCFG_SCREEN_VBLANK_DRIVER(ssrj_state, screen_eof_ssrj) + MCFG_SCREEN_UPDATE_DRIVER(ssrj_state, screen_update) + MCFG_SCREEN_VBLANK_DRIVER(ssrj_state, screen_eof) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", ssrj) @@ -179,4 +184,4 @@ ROM_START( ssrj ) ROM_END -GAME( 1985, ssrj, 0, ssrj, ssrj, driver_device, 0, ROT90, "Taito Corporation", "Super Speed Race Junior (Japan)",GAME_WRONG_COLORS|GAME_IMPERFECT_GRAPHICS ) +GAME( 1985, ssrj, 0, ssrj, ssrj, driver_device, 0, ROT90, "Taito Corporation", "Super Speed Race Junior (Japan)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/sstrangr.c b/src/mame/drivers/sstrangr.c index bd2158535c0..e30b534f7ad 100644 --- a/src/mame/drivers/sstrangr.c +++ b/src/mame/drivers/sstrangr.c @@ -18,16 +18,21 @@ class sstrangr_state : public driver_device public: sstrangr_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_ram(*this, "ram"), - m_maincpu(*this, "maincpu") { } + m_maincpu(*this, "maincpu"), + m_ram(*this, "ram") { } + + required_device m_maincpu; required_shared_ptr m_ram; + UINT8 m_flip_screen; - UINT8 *m_proms; + DECLARE_WRITE8_MEMBER(port_w); + + virtual void video_start(); + UINT32 screen_update_sstrangr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_sstrngr2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - required_device m_maincpu; }; @@ -38,6 +43,11 @@ public: * *************************************/ +void sstrangr_state::video_start() +{ + save_item(NAME(m_flip_screen)); +} + UINT32 sstrangr_state::screen_update_sstrangr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { offs_t offs; @@ -296,5 +306,5 @@ ROM_START( sstrangr2 ) ROM_END -GAMEL( 1978, sstrangr, 0, sstrangr, sstrangr, driver_device, 0, ROT270, "Yachiyo Electronics, Ltd.", "Space Stranger", GAME_NO_SOUND, layout_sstrangr ) -GAME( 1979, sstrangr2,sstrangr, sstrngr2, sstrngr2, driver_device, 0, ROT270, "Yachiyo Electronics, Ltd.", "Space Stranger 2", GAME_NO_SOUND ) +GAMEL( 1978, sstrangr, 0, sstrangr, sstrangr, driver_device, 0, ROT270, "Yachiyo Electronics, Ltd.", "Space Stranger", GAME_NO_SOUND | GAME_SUPPORTS_SAVE, layout_sstrangr ) +GAME( 1979, sstrangr2,sstrangr, sstrngr2, sstrngr2, driver_device, 0, ROT270, "Yachiyo Electronics, Ltd.", "Space Stranger 2", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/ssrj.h b/src/mame/includes/ssrj.h index 724f5800477..b9175dcc172 100644 --- a/src/mame/includes/ssrj.h +++ b/src/mame/includes/ssrj.h @@ -3,39 +3,46 @@ class ssrj_state : public driver_device public: ssrj_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), m_vram1(*this, "vram1"), m_vram2(*this, "vram2"), m_vram3(*this, "vram3"), m_vram4(*this, "vram4"), - m_scrollram(*this, "scrollram"), - m_maincpu(*this, "maincpu"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_scrollram(*this, "scrollram") { } + + required_device m_maincpu; + required_device m_gfxdecode; + required_device m_palette; - int m_oldport; - tilemap_t *m_tilemap1; - tilemap_t *m_tilemap2; - tilemap_t *m_tilemap4; required_shared_ptr m_vram1; required_shared_ptr m_vram2; required_shared_ptr m_vram3; required_shared_ptr m_vram4; required_shared_ptr m_scrollram; + + int m_oldport; + tilemap_t *m_tilemap1; + tilemap_t *m_tilemap2; + tilemap_t *m_tilemap4; UINT8 *m_buffer_spriteram; - DECLARE_READ8_MEMBER(ssrj_wheel_r); - DECLARE_WRITE8_MEMBER(ssrj_vram1_w); - DECLARE_WRITE8_MEMBER(ssrj_vram2_w); - DECLARE_WRITE8_MEMBER(ssrj_vram4_w); + + DECLARE_READ8_MEMBER(wheel_r); + DECLARE_WRITE8_MEMBER(vram1_w); + DECLARE_WRITE8_MEMBER(vram2_w); + DECLARE_WRITE8_MEMBER(vram4_w); + TILE_GET_INFO_MEMBER(get_tile_info1); TILE_GET_INFO_MEMBER(get_tile_info2); TILE_GET_INFO_MEMBER(get_tile_info4); + + virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); DECLARE_PALETTE_INIT(ssrj); - UINT32 screen_update_ssrj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void screen_eof_ssrj(screen_device &screen, bool state); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void screen_eof(screen_device &screen, bool state); void draw_objects(bitmap_ind16 &bitmap, const rectangle &cliprect ); - required_device m_maincpu; - required_device m_gfxdecode; - required_device m_palette; }; diff --git a/src/mame/video/ssrj.c b/src/mame/video/ssrj.c index 91443bc80c2..0a227f6ecd5 100644 --- a/src/mame/video/ssrj.c +++ b/src/mame/video/ssrj.c @@ -3,7 +3,7 @@ /* tilemap 1 */ -WRITE8_MEMBER(ssrj_state::ssrj_vram1_w) +WRITE8_MEMBER(ssrj_state::vram1_w) { m_vram1[offset] = data; m_tilemap1->mark_tile_dirty(offset>>1); @@ -21,7 +21,7 @@ TILE_GET_INFO_MEMBER(ssrj_state::get_tile_info1) /* tilemap 2 */ -WRITE8_MEMBER(ssrj_state::ssrj_vram2_w) +WRITE8_MEMBER(ssrj_state::vram2_w) { m_vram2[offset] = data; m_tilemap2->mark_tile_dirty(offset>>1); @@ -39,7 +39,7 @@ TILE_GET_INFO_MEMBER(ssrj_state::get_tile_info2) /* tilemap 4 */ -WRITE8_MEMBER(ssrj_state::ssrj_vram4_w) +WRITE8_MEMBER(ssrj_state::vram4_w) { m_vram4[offset] = data; m_tilemap4->mark_tile_dirty(offset>>1); @@ -60,7 +60,7 @@ TILE_GET_INFO_MEMBER(ssrj_state::get_tile_info4) TODO: This table is nowhere near as accurate. If you bother, here's how colors should be: -"START" sign is red with dark blue background. -Sidewalk is yellow-ish. --first opponents have swapped colors (blue/yellow ?nstead of yellow/blue) +-first opponents have swapped colors (blue/yellow instead of yellow/blue) -after the first stage, houses have red/white colors. */ @@ -270,7 +270,7 @@ PALETTE_INIT_MEMBER(ssrj_state, ssrj) palette.set_pen_color(i*8+j, fakecols[i][j][0], fakecols[i][j][1], fakecols[i][j][2]); } -UINT32 ssrj_state::screen_update_ssrj(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 ssrj_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { m_tilemap1->set_scrollx(0, 0xff-m_scrollram[2] ); m_tilemap1->set_scrolly(0, m_scrollram[0] ); @@ -282,7 +282,7 @@ UINT32 ssrj_state::screen_update_ssrj(screen_device &screen, bitmap_ind16 &bitma return 0; } -void ssrj_state::screen_eof_ssrj(screen_device &screen, bool state) +void ssrj_state::screen_eof(screen_device &screen, bool state) { // rising edge if (state) From 38ddc8a6d7e412afc921d40e910f5e344341c713 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 23 Mar 2015 19:25:09 +0100 Subject: [PATCH 181/201] prepare for svg2lay --- src/mess/drivers/hh_hmcs40.c | 10 +++++++++- src/mess/drivers/hh_pic16.c | 10 +++++++++- src/mess/drivers/hh_tms1k.c | 10 +++++++++- src/mess/drivers/hh_ucom4.c | 10 +++++++++- src/mess/drivers/ticalc1x.c | 10 +++++++++- src/mess/drivers/tispeak.c | 10 +++++++++- 6 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/mess/drivers/hh_hmcs40.c b/src/mess/drivers/hh_hmcs40.c index 4052f128758..45bd3f76bc7 100644 --- a/src/mess/drivers/hh_hmcs40.c +++ b/src/mess/drivers/hh_hmcs40.c @@ -170,7 +170,15 @@ void hh_hmcs40_state::display_update() const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) - output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); + { + int state = active_state[y] >> x & 1; + output_set_lamp_value(y * mul + x, state); + + // bit coords for svg2lay + char buf[10]; + sprintf(buf, "%d.%d", y, x); + output_set_value(buf, state); + } } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); diff --git a/src/mess/drivers/hh_pic16.c b/src/mess/drivers/hh_pic16.c index 566c109ece2..b8281a737e0 100644 --- a/src/mess/drivers/hh_pic16.c +++ b/src/mess/drivers/hh_pic16.c @@ -137,7 +137,15 @@ void hh_pic16_state::display_update() const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) - output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); + { + int state = active_state[y] >> x & 1; + output_set_lamp_value(y * mul + x, state); + + // bit coords for svg2lay + char buf[10]; + sprintf(buf, "%d.%d", y, x); + output_set_value(buf, state); + } } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index 31f021c0dc8..c58cd7a1def 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -168,7 +168,15 @@ void hh_tms1k_state::display_update() const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) - output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); + { + int state = active_state[y] >> x & 1; + output_set_lamp_value(y * mul + x, state); + + // bit coords for svg2lay + char buf[10]; + sprintf(buf, "%d.%d", y, x); + output_set_value(buf, state); + } } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); diff --git a/src/mess/drivers/hh_ucom4.c b/src/mess/drivers/hh_ucom4.c index d274457bed2..b258c942942 100644 --- a/src/mess/drivers/hh_ucom4.c +++ b/src/mess/drivers/hh_ucom4.c @@ -182,7 +182,15 @@ void hh_ucom4_state::display_update() const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) - output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); + { + int state = active_state[y] >> x & 1; + output_set_lamp_value(y * mul + x, state); + + // bit coords for svg2lay + char buf[10]; + sprintf(buf, "%d.%d", y, x); + output_set_value(buf, state); + } } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index f5a948a58db..679d62d550e 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -169,7 +169,15 @@ void ticalc1x_state::display_update() const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) - output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); + { + int state = active_state[y] >> x & 1; + output_set_lamp_value(y * mul + x, state); + + // bit coords for svg2lay + char buf[10]; + sprintf(buf, "%d.%d", y, x); + output_set_value(buf, state); + } } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index 4c941d6cc23..8e84bf335dc 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -433,7 +433,15 @@ void tispeak_state::display_update() const int mul = (m_display_maxx <= 10) ? 10 : 100; for (int x = 0; x < m_display_maxx; x++) - output_set_lamp_value(y * mul + x, active_state[y] >> x & 1); + { + int state = active_state[y] >> x & 1; + output_set_lamp_value(y * mul + x, state); + + // bit coords for svg2lay + char buf[10]; + sprintf(buf, "%d.%d", y, x); + output_set_value(buf, state); + } } memcpy(m_display_cache, active_state, sizeof(m_display_cache)); From 61038a7b889cf200d4bad99081937272cd809421 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 23 Mar 2015 19:52:09 +0100 Subject: [PATCH 182/201] realbrk: added save state support (nw) --- src/mame/drivers/realbrk.c | 30 +++++++++++----------- src/mame/includes/realbrk.h | 50 +++++++++++++++++++++++-------------- src/mame/video/realbrk.c | 24 +++++++++--------- 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/mame/drivers/realbrk.c b/src/mame/drivers/realbrk.c index 9c0ef1a393e..3b8a0eb77f0 100644 --- a/src/mame/drivers/realbrk.c +++ b/src/mame/drivers/realbrk.c @@ -36,7 +36,7 @@ To Do: - Priorities (e.g during the intro, there are two black bands in the backround that should obscure sprites). -- Sometimes sprites are shrinked to end up overlapping the background image +- Sometimes sprites are shrunk to end up overlapping the background image in the tilemaps, but they are a few pixels off ***************************************************************************/ @@ -155,10 +155,10 @@ static ADDRESS_MAP_START( base_mem, AS_PROGRAM, 16, realbrk_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("spriteram") // Sprites AM_RANGE(0x400000, 0x40ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") // Palette - AM_RANGE(0x600000, 0x601fff) AM_RAM_WRITE(realbrk_vram_0_w) AM_SHARE("vram_0") // Background (0) - AM_RANGE(0x602000, 0x603fff) AM_RAM_WRITE(realbrk_vram_1_w) AM_SHARE("vram_1") // Background (1) - AM_RANGE(0x604000, 0x604fff) AM_RAM_WRITE(realbrk_vram_2_w) AM_SHARE("vram_2") // Text (2) - AM_RANGE(0x606000, 0x60600f) AM_RAM_WRITE(realbrk_vregs_w) AM_SHARE("vregs") // Scroll + Video Regs + AM_RANGE(0x600000, 0x601fff) AM_RAM_WRITE(vram_0_w) AM_SHARE("vram_0") // Background (0) + AM_RANGE(0x602000, 0x603fff) AM_RAM_WRITE(vram_1_w) AM_SHARE("vram_1") // Background (1) + AM_RANGE(0x604000, 0x604fff) AM_RAM_WRITE(vram_2_w) AM_SHARE("vram_2") // Text (2) + AM_RANGE(0x606000, 0x60600f) AM_RAM_WRITE(vregs_w) AM_SHARE("vregs") // Scroll + Video Regs AM_RANGE(0x605000, 0x61ffff) AM_RAM // AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xff00) // YMZ280 AM_RANGE(0xfe0000, 0xfeffff) AM_RAM // RAM @@ -744,7 +744,7 @@ GFXDECODE_END Billiard Academy Real Break ***************************************************************************/ -INTERRUPT_GEN_MEMBER(realbrk_state::realbrk_interrupt) +INTERRUPT_GEN_MEMBER(realbrk_state::interrupt) { /* VBlank is connected to INT1 (external interrupts pin 1) */ m_tmp68301->external_interrupt_1(); @@ -755,7 +755,7 @@ static MACHINE_CONFIG_START( realbrk, realbrk_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",M68000, XTAL_32MHz / 2) /* !! TMP68301 !! */ MCFG_CPU_PROGRAM_MAP(realbrk_mem) - MCFG_CPU_VBLANK_INT_DRIVER("screen", realbrk_state, realbrk_interrupt) + MCFG_CPU_VBLANK_INT_DRIVER("screen", realbrk_state, interrupt) MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("tmp68301",tmp68301_device,irq_callback) MCFG_DEVICE_ADD("tmp68301", TMP68301, 0) @@ -767,7 +767,7 @@ static MACHINE_CONFIG_START( realbrk, realbrk_state ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE_DRIVER(realbrk_state, screen_update_realbrk) + MCFG_SCREEN_UPDATE_DRIVER(realbrk_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", realbrk) @@ -1273,13 +1273,13 @@ ROM_START( dai2kaku_alt_rom_size ) ROM_END #endif -GAME( 1998, pkgnsh, 0, pkgnsh, pkgnsh, driver_device, 0, ROT0, "Nakanihon / Dynax", "Pachinko Gindama Shoubu (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, pkgnsh, 0, pkgnsh, pkgnsh, driver_device, 0, ROT0, "Nakanihon / Dynax", "Pachinko Gindama Shoubu (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) -GAME( 1998, pkgnshdx, 0, pkgnshdx, pkgnshdx, driver_device, 0, ROT0, "Nakanihon / Dynax", "Pachinko Gindama Shoubu DX (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, pkgnshdx, 0, pkgnshdx, pkgnshdx, driver_device, 0, ROT0, "Nakanihon / Dynax", "Pachinko Gindama Shoubu DX (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) -GAME( 1998, realbrk, 0, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Europe)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, realbrko, realbrk, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Europe, older)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, realbrkj, realbrk, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Japan)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, realbrkk, realbrk, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Korea)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, realbrk, 0, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Europe)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1998, realbrko, realbrk, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Europe, older)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1998, realbrkj, realbrk, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1998, realbrkk, realbrk, realbrk, realbrk, driver_device, 0, ROT0, "Nakanihon", "Billiard Academy Real Break (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) -GAME( 2004, dai2kaku, 0, dai2kaku, dai2kaku, driver_device, 0, ROT0, "SystemBit", "Dai-Dai-Kakumei (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 2004, dai2kaku, 0, dai2kaku, dai2kaku, driver_device, 0, ROT0, "SystemBit", "Dai-Dai-Kakumei (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/includes/realbrk.h b/src/mame/includes/realbrk.h index 8b3ccec5cfd..4adbdbfe9d0 100644 --- a/src/mame/includes/realbrk.h +++ b/src/mame/includes/realbrk.h @@ -5,6 +5,11 @@ class realbrk_state : public driver_device public: realbrk_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_tmp68301(*this, "tmp68301"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), m_spriteram(*this, "spriteram"), m_vram_0(*this, "vram_0"), m_vram_1(*this, "vram_1"), @@ -13,12 +18,13 @@ public: m_dsw_select(*this, "dsw_select"), m_backup_ram(*this, "backup_ram"), m_vram_0ras(*this, "vram_0ras"), - m_vram_1ras(*this, "vram_1ras"), - m_maincpu(*this, "maincpu"), - m_tmp68301(*this, "tmp68301"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette") { } + m_vram_1ras(*this, "vram_1ras") { } + + required_device m_maincpu; + required_device m_tmp68301; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; required_shared_ptr m_spriteram; required_shared_ptr m_vram_0; @@ -29,36 +35,42 @@ public: optional_shared_ptr m_backup_ram; optional_shared_ptr m_vram_0ras; optional_shared_ptr m_vram_1ras; + bitmap_ind16 *m_tmpbitmap0; bitmap_ind16 *m_tmpbitmap1; int m_disable_video; tilemap_t *m_tilemap_0; tilemap_t *m_tilemap_1; tilemap_t *m_tilemap_2; + + // common + DECLARE_WRITE16_MEMBER(vram_0_w); + DECLARE_WRITE16_MEMBER(vram_1_w); + DECLARE_WRITE16_MEMBER(vram_2_w); + DECLARE_WRITE16_MEMBER(vregs_w); + + // realbrk and/or dai2kaku DECLARE_READ16_MEMBER(realbrk_dsw_r); + DECLARE_WRITE16_MEMBER(realbrk_flipscreen_w); + DECLARE_WRITE16_MEMBER(dai2kaku_flipscreen_w); + + // pkgnsh and/or pkgnshdx DECLARE_READ16_MEMBER(pkgnsh_input_r); DECLARE_READ16_MEMBER(pkgnshdx_input_r); DECLARE_READ16_MEMBER(backup_ram_r); DECLARE_READ16_MEMBER(backup_ram_dx_r); DECLARE_WRITE16_MEMBER(backup_ram_w); - DECLARE_WRITE16_MEMBER(realbrk_flipscreen_w); - DECLARE_WRITE16_MEMBER(dai2kaku_flipscreen_w); - DECLARE_WRITE16_MEMBER(realbrk_vram_0_w); - DECLARE_WRITE16_MEMBER(realbrk_vram_1_w); - DECLARE_WRITE16_MEMBER(realbrk_vram_2_w); - DECLARE_WRITE16_MEMBER(realbrk_vregs_w); + TILE_GET_INFO_MEMBER(get_tile_info_0); TILE_GET_INFO_MEMBER(get_tile_info_1); TILE_GET_INFO_MEMBER(get_tile_info_2); + virtual void video_start(); - UINT32 screen_update_realbrk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_dai2kaku(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(realbrk_interrupt); void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect); void dai2kaku_draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect, int layer); - required_device m_maincpu; - required_device m_tmp68301; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; + + INTERRUPT_GEN_MEMBER(interrupt); }; diff --git a/src/mame/video/realbrk.c b/src/mame/video/realbrk.c index 3c793ac1c6e..0e17ba65769 100644 --- a/src/mame/video/realbrk.c +++ b/src/mame/video/realbrk.c @@ -88,13 +88,13 @@ TILE_GET_INFO_MEMBER(realbrk_state::get_tile_info_1) TILE_FLIPYX( attr >> 14 )); } -WRITE16_MEMBER(realbrk_state::realbrk_vram_0_w) +WRITE16_MEMBER(realbrk_state::vram_0_w) { COMBINE_DATA(&m_vram_0[offset]); m_tilemap_0->mark_tile_dirty(offset/2); } -WRITE16_MEMBER(realbrk_state::realbrk_vram_1_w) +WRITE16_MEMBER(realbrk_state::vram_1_w) { COMBINE_DATA(&m_vram_1[offset]); m_tilemap_1->mark_tile_dirty(offset/2); @@ -123,7 +123,7 @@ TILE_GET_INFO_MEMBER(realbrk_state::get_tile_info_2) 0); } -WRITE16_MEMBER(realbrk_state::realbrk_vram_2_w) +WRITE16_MEMBER(realbrk_state::vram_2_w) { COMBINE_DATA(&m_vram_2[offset]); m_tilemap_2->mark_tile_dirty(offset); @@ -154,6 +154,8 @@ void realbrk_state::video_start() m_tmpbitmap0 = auto_bitmap_ind16_alloc(machine(),32,32); m_tmpbitmap1 = auto_bitmap_ind16_alloc(machine(),32,32); + + save_item(NAME(m_disable_video)); } /*************************************************************************** @@ -167,7 +169,7 @@ void realbrk_state::video_start() of a sprite to be drawn. 0x300 items of the list seem to be used. Each sprite is made of several 16x16 tiles (from 1 to 32x32) and - can be zoomed / shrinked in size. + can be zoomed / shrunk in size. There are two set of tiles: with 256 or 16 colors. @@ -203,7 +205,6 @@ void realbrk_state::video_start() void realbrk_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) { - UINT16 *spriteram16 = m_spriteram; int offs; int max_x = m_screen->width(); @@ -220,9 +221,9 @@ void realbrk_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) UINT16 *s; - if (spriteram16[offs] & 0x8000) continue; + if (m_spriteram[offs] & 0x8000) continue; - s = &spriteram16[(spriteram16[offs] & 0x3ff) * 16/2]; + s = &m_spriteram[(m_spriteram[offs] & 0x3ff) * 16/2]; sy = s[ 0 ]; sx = s[ 1 ]; @@ -365,7 +366,6 @@ void realbrk_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect) /* layer : 0== bghighwidth(); @@ -380,9 +380,9 @@ void realbrk_state::dai2kaku_draw_sprites(bitmap_ind16 &bitmap,const rectangle & UINT16 *s; - if (spriteram16[offs] & 0x8000) continue; + if (m_spriteram[offs] & 0x8000) continue; - s = &spriteram16[(spriteram16[offs] & 0x3ff) * 16/2]; + s = &m_spriteram[(m_spriteram[offs] & 0x3ff) * 16/2]; sy = s[ 0 ]; sx = s[ 1 ]; @@ -467,7 +467,7 @@ void realbrk_state::dai2kaku_draw_sprites(bitmap_ind16 &bitmap,const rectangle & ***************************************************************************/ -WRITE16_MEMBER(realbrk_state::realbrk_vregs_w) +WRITE16_MEMBER(realbrk_state::vregs_w) { UINT16 old_data = m_vregs[offset]; UINT16 new_data = COMBINE_DATA(&m_vregs[offset]); @@ -478,7 +478,7 @@ WRITE16_MEMBER(realbrk_state::realbrk_vregs_w) } } -UINT32 realbrk_state::screen_update_realbrk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 realbrk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int layers_ctrl = -1; From 7066eb4f9f59fdccc8bce31288b9085c1c3f9c45 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Mon, 23 Mar 2015 21:08:48 +0000 Subject: [PATCH 183/201] new clones Thunder Deity Biography (Chinese hack of Battle Garegga) [caius] (correct text gfx rom still needs dumping for this set) --- src/mame/drivers/toaplan2.c | 28 +++++++++++++++++++++++++++- src/mame/mame.lst | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/mame/drivers/toaplan2.c b/src/mame/drivers/toaplan2.c index 67f321e0381..1bdc544e479 100644 --- a/src/mame/drivers/toaplan2.c +++ b/src/mame/drivers/toaplan2.c @@ -4876,7 +4876,32 @@ ROM_START( bgareggabl ) ROM_REGION( 0x010000, "text", 0 ) ROM_LOAD( "1#-256", 0x00000, 0x08000, CRC(760dcd14) SHA1(e151e5d7ca5557277f306b9484ec021f4edf1e07) ) - ROM_LOAD( "2#-256", 0x08000, 0x08000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) + + ROM_REGION( 0x010000, "user1", 0 ) // not graphics + ROM_LOAD( "2#-256", 0x00000, 0x08000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) + + ROM_REGION( 0x140000, "oki", 0 ) /* ADPCM Samples */ + ROM_LOAD( "rom5.bin", 0x040000, 0x100000, CRC(f6d49863) SHA1(3a3c354852adad06e8a051511abfab7606bce382) ) +ROM_END + +ROM_START( bgareggabla ) + ROM_REGION( 0x100000, "maincpu", 0 ) /* Main 68K code */ + ROM_LOAD16_WORD_SWAP( "27c8100.mon-sys", 0x000000, 0x100000, CRC(d334e5aa) SHA1(41607b5630d7b92a96607ea95c5b55ad43745857) ) + + ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound Z80 code + bank */ + ROM_LOAD( "snd.bin", 0x00000, 0x20000, CRC(68632952) SHA1(fb834db83157948e2b420b6051102a9c6ac3969b) ) + + ROM_REGION( 0x800000, "gp9001", 0 ) + ROM_LOAD( "rom4.bin", 0x000000, 0x200000, CRC(b333d81f) SHA1(5481465f1304334fd55798be2f44324c57c2dbcb) ) + ROM_LOAD( "rom3.bin", 0x200000, 0x200000, CRC(51b9ebfb) SHA1(30e0c326f5175aa436df8dba08f6f4e08130b92f) ) + ROM_LOAD( "rom2.bin", 0x400000, 0x200000, CRC(b330e5e2) SHA1(5d48e9d56f99d093b6390e0af1609fd796df2d35) ) + ROM_LOAD( "rom1.bin", 0x600000, 0x200000, CRC(7eafdd70) SHA1(7c8da8e86c3f9491719b1d7d5d285568d7614f38) ) + + ROM_REGION( 0x010000, "text", 0 ) + ROM_LOAD( "text.u81", 0x00000, 0x08000, BAD_DUMP CRC(e67fd534) SHA1(987d0edffc2c243a13d4567319ea3d185eaadbf8) ) // should contain different title logo for this game + + ROM_REGION( 0x010000, "user1", 0 ) // not graphics + ROM_LOAD( "2#-256", 0x00000, 0x08000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) ROM_REGION( 0x140000, "oki", 0 ) /* ADPCM Samples */ ROM_LOAD( "rom5.bin", 0x040000, 0x100000, CRC(f6d49863) SHA1(3a3c354852adad06e8a051511abfab7606bce382) ) @@ -5345,6 +5370,7 @@ GAME( 1996, bgaregganv, bgaregga, bgaregga, bgareggahk, toaplan2_state, bgaregga GAME( 1996, bgareggat2, bgaregga, bgaregga, bgaregga, toaplan2_state, bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - Type 2 (Europe / USA / Japan / Asia) (Sat Mar 2 1996)" , GAME_SUPPORTS_SAVE ) // displays Type 2 only when set to Europe GAME( 1996, bgareggacn, bgaregga, bgaregga, bgareggacn, toaplan2_state, bgaregga, ROT270, "Raizing / Eighting", "Battle Garegga - Type 2 (Denmark / China) (Tue Apr 2 1996)", GAME_SUPPORTS_SAVE ) // displays Type 2 only when set to Denmark GAME( 1996, bgareggabl, bgaregga, bgareggabl,bgareggacn, toaplan2_state,bgaregga, ROT270, "bootleg", "1945 Part-2 (Chinese hack of Battle Garegga)", GAME_SUPPORTS_SAVE ) +GAME( 1996, bgareggabla,bgaregga, bgareggabl,bgareggacn, toaplan2_state,bgaregga, ROT270, "bootleg", "Thunder Deity Biography (Chinese hack of Battle Garegga)", GAME_SUPPORTS_SAVE ) // these are all based on Version B, even if only the Japan version states 'version B' GAME( 1998, batrider, 0, batrider, batrider, toaplan2_state, batrider, ROT270, "Raizing / Eighting", "Armed Police Batrider (Europe) (Fri Feb 13 1998)", GAME_SUPPORTS_SAVE ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 78fb22ae122..cc31e505792 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -2757,6 +2757,7 @@ bgaregganv // (c) 1996 Raizing/8ing bgareggat2 // (c) 1996 Raizing/8ing bgareggacn // (c) 1996 Raizing/8ing bgareggabl // hack +bgareggabla // hack batrider // (c) 1998 Raizing/8ing batrideru // (c) 1998 Raizing/8ing batriderc // (c) 1998 Raizing/8ing From fb6880dcbc5068a5644eb78fa9d2ca85025ca492 Mon Sep 17 00:00:00 2001 From: Mike Naberezny Date: Mon, 23 Mar 2015 16:43:45 -0700 Subject: [PATCH 184/201] (MESS) pet_rom.xml: Added McTerm 0.95. [Mike Naberezny] --- hash/pet_rom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/hash/pet_rom.xml b/hash/pet_rom.xml index 082bb6cb5c8..2f7cf099a17 100644 --- a/hash/pet_rom.xml +++ b/hash/pet_rom.xml @@ -92,6 +92,18 @@ + + McTerm 0.95 + 1980 + Madison Computer + + + + + + + + McTerm 1.20 1981 From eb48fea5e220e70f63d03a1f905615b628bb4a10 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Tue, 24 Mar 2015 01:01:24 +0000 Subject: [PATCH 185/201] ttchamp PIC doesn't seem to be for sound either? (nw) --- src/mame/drivers/ttchamp.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/mame/drivers/ttchamp.c b/src/mame/drivers/ttchamp.c index 3ce64987e4a..b93e5c0b4f2 100644 --- a/src/mame/drivers/ttchamp.c +++ b/src/mame/drivers/ttchamp.c @@ -62,7 +62,7 @@ Dumped by tirino73 >isolani (at) interfree.it< #include "emu.h" #include "cpu/nec/nec.h" - +#include "sound/okim6295.h" class ttchamp_state : public driver_device { @@ -95,6 +95,7 @@ public: + UINT16 m_mainram[0x10000 / 2]; int m_spritesinit; @@ -193,7 +194,6 @@ WRITE16_MEMBER(ttchamp_state::paldat_w) } - READ16_MEMBER(ttchamp_state::ttchamp_mem_r) { // bits 0xf0 are used too, so this is likely wrong. @@ -338,6 +338,7 @@ static ADDRESS_MAP_START( ttchamp_io, AS_IO, 16, ttchamp_state ) AM_RANGE(0x0002, 0x0003) AM_READ_PORT("SYSTEM") AM_RANGE(0x0004, 0x0005) AM_READ_PORT("P1_P2") + AM_RANGE(0x0006, 0x0007) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) AM_RANGE(0x0018, 0x0019) AM_READ(ttchamp_blit_start_r) AM_RANGE(0x001e, 0x001f) AM_READNOP // read before each line is blit @@ -442,6 +443,11 @@ static MACHINE_CONFIG_START( ttchamp, ttchamp_state ) MCFG_PALETTE_ADD("palette", 0x8000) + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_OKIM6295_ADD("oki", 8000000/8, OKIM6295_PIN7_HIGH) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MACHINE_CONFIG_END ROM_START( ttchamp ) @@ -451,10 +457,10 @@ ROM_START( ttchamp ) ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x080000, CRC(4388dead) SHA1(1965e4b84452b244e32c8d218aace8d287c67ec2) ) ROM_LOAD16_BYTE( "5.bin", 0x100001, 0x080000, CRC(fdbf9b28) SHA1(2d260555586097c8a396f65111f55ace801c7a5d) ) - ROM_REGION( 0x10000, "cpu1", 0 ) /* not verified if this is correct yet, seems very empty, maybe protected */ - ROM_LOAD( "pic16c84.rom", 0x000000, 0x4280, CRC(900f2ef8) SHA1(08f206fe52f413437436e4b0d2b4ec310767446c) ) + ROM_REGION( 0x10000, "cpu1", 0 ) // read protected, only half the data is valid + ROM_LOAD( "pic16c84.rom", 0x000000, 0x4280, BAD_DUMP CRC(900f2ef8) SHA1(08f206fe52f413437436e4b0d2b4ec310767446c) ) - ROM_REGION( 0x40000, "samples", 0 ) + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "27c020.1", 0x000000, 0x040000, CRC(e2c4fe95) SHA1(da349035cc348db220a1e12b4c2a6021e2168425) ) ROM_END @@ -465,10 +471,10 @@ ROM_START( ttchampa ) ROM_LOAD16_BYTE( "4.bin", 0x100000, 0x080000, CRC(4388dead) SHA1(1965e4b84452b244e32c8d218aace8d287c67ec2) ) ROM_LOAD16_BYTE( "5.bin", 0x100001, 0x080000, CRC(fdbf9b28) SHA1(2d260555586097c8a396f65111f55ace801c7a5d) ) - ROM_REGION( 0x10000, "cpu1", 0 ) /* not verified if this is correct yet, seems very empty, maybe protected */ - ROM_LOAD( "pic16c84.rom", 0x000000, 0x4280, CRC(900f2ef8) SHA1(08f206fe52f413437436e4b0d2b4ec310767446c) ) + ROM_REGION( 0x10000, "cpu1", 0 ) // read protected, only half the data is valid + ROM_LOAD( "pic16c84.rom", 0x000000, 0x4280, BAD_DUMP CRC(900f2ef8) SHA1(08f206fe52f413437436e4b0d2b4ec310767446c) ) - ROM_REGION( 0x40000, "samples", 0 ) + ROM_REGION( 0x40000, "oki", 0 ) ROM_LOAD( "27c020.1", 0x000000, 0x040000, CRC(e2c4fe95) SHA1(da349035cc348db220a1e12b4c2a6021e2168425) ) ROM_END @@ -479,5 +485,5 @@ DRIVER_INIT_MEMBER(ttchamp_state,ttchamp) // membank("bank2")->set_base(&ROM1[0x180000]); } -GAME( 1995, ttchamp, 0, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart", "Table Tennis Champions", GAME_NOT_WORKING|GAME_NO_SOUND ) // this has various advertising boards, including 'Electronic Devices' and 'Deniam' -GAME( 1995, ttchampa,ttchamp, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart (Palencia Elektronik license)", "Table Tennis Champions (Palencia Elektronik license)", GAME_NOT_WORKING|GAME_NO_SOUND ) // this only has Palencia Elektronik advertising boards +GAME( 1995, ttchamp, 0, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart", "Table Tennis Champions", GAME_NOT_WORKING ) // this has various advertising boards, including 'Electronic Devices' and 'Deniam' +GAME( 1995, ttchampa,ttchamp, ttchamp, ttchamp, ttchamp_state, ttchamp, ROT0, "Gamart (Palencia Elektronik license)", "Table Tennis Champions (Palencia Elektronik license)", GAME_NOT_WORKING ) // this only has Palencia Elektronik advertising boards From d044c6b161757d93eb9575774bd131b5bb2a8214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 24 Mar 2015 09:13:30 +0100 Subject: [PATCH 186/201] removed assert for now fixed bug from src/mame/drivers/queen.c (nw) --- src/mame/drivers/queen.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mame/drivers/queen.c b/src/mame/drivers/queen.c index 68d445f911a..2c723affe8d 100644 --- a/src/mame/drivers/queen.c +++ b/src/mame/drivers/queen.c @@ -158,7 +158,6 @@ static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, queen_state *state = busdevice->machine().driver_data(); // osd_printf_debug("PIIX4: read %d, %02X\n", function, reg); - assert(function >= 0 && function < ARRAY_LENGTH(state->m_piix4_config_reg)); return state->m_piix4_config_reg[function][reg]; } From 442aedc911ddf13c85e17ccb08387aa6204f8663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 24 Mar 2015 10:37:17 +0100 Subject: [PATCH 187/201] made -[no]dummywrite DEBUG only and removed it from the official documentation (nw) --- src/emu/emuopts.c | 4 +++- src/emu/emuopts.h | 4 ++++ src/emu/video.c | 2 ++ src/osd/sdl/man/mame.6 | 3 --- src/osd/sdl/man/mess.6 | 3 --- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/emu/emuopts.c b/src/emu/emuopts.c index 7c1bd9560cb..52ca361a7db 100644 --- a/src/emu/emuopts.c +++ b/src/emu/emuopts.c @@ -61,6 +61,9 @@ const options_entry emu_options::s_option_entries[] = { OPTION_RECORD ";rec", NULL, OPTION_STRING, "record an input file" }, { OPTION_MNGWRITE, NULL, OPTION_STRING, "optional filename to write a MNG movie of the current session" }, { OPTION_AVIWRITE, NULL, OPTION_STRING, "optional filename to write an AVI movie of the current session" }, +#ifdef MAME_DEBUG + { OPTION_DUMMYWRITE, "0", OPTION_BOOLEAN, "indicates if a snapshot should be created if each frame" }, +#endif { OPTION_WAVWRITE, NULL, OPTION_STRING, "optional filename to write a WAV file of the current session" }, { OPTION_SNAPNAME, "%g/%i", OPTION_STRING, "override of the default snapshot/movie naming; %g == gamename, %i == index" }, { OPTION_SNAPSIZE, "auto", OPTION_STRING, "specify snapshot/movie resolution (x) or 'auto' to use minimal size " }, @@ -68,7 +71,6 @@ const options_entry emu_options::s_option_entries[] = { OPTION_SNAPBILINEAR, "1", OPTION_BOOLEAN, "specify if the snapshot/movie should have bilinear filtering applied" }, { OPTION_STATENAME, "%g", OPTION_STRING, "override of the default state subfolder naming; %g == gamename" }, { OPTION_BURNIN, "0", OPTION_BOOLEAN, "create burn-in snapshots for each screen" }, - { OPTION_DUMMYWRITE, "0", OPTION_BOOLEAN, "indicates if a snapshot should be created if each frame" }, // performance options { NULL, NULL, OPTION_HEADER, "CORE PERFORMANCE OPTIONS" }, diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h index ece89e1d09f..aadb98a72c7 100644 --- a/src/emu/emuopts.h +++ b/src/emu/emuopts.h @@ -73,7 +73,9 @@ enum #define OPTION_RECORD "record" #define OPTION_MNGWRITE "mngwrite" #define OPTION_AVIWRITE "aviwrite" +#ifdef MAME_DEBUG #define OPTION_DUMMYWRITE "dummywrite" +#endif #define OPTION_WAVWRITE "wavwrite" #define OPTION_SNAPNAME "snapname" #define OPTION_SNAPSIZE "snapsize" @@ -242,7 +244,9 @@ public: const char *record() const { return value(OPTION_RECORD); } const char *mng_write() const { return value(OPTION_MNGWRITE); } const char *avi_write() const { return value(OPTION_AVIWRITE); } +#ifdef MAME_DEBUG bool dummy_write() const { return bool_value(OPTION_DUMMYWRITE); } +#endif const char *wav_write() const { return value(OPTION_WAVWRITE); } const char *snap_name() const { return value(OPTION_SNAPNAME); } const char *snap_size() const { return value(OPTION_SNAPSIZE); } diff --git a/src/emu/video.c b/src/emu/video.c index 7ec113b42d5..11dc4545540 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -154,7 +154,9 @@ video_manager::video_manager(running_machine &machine) if (filename[0] != 0) begin_recording(filename, MF_AVI); +#ifdef MAME_DEBUG m_dummy_recording = machine.options().dummy_write(); +#endif // if no screens, create a periodic timer to drive updates if (machine.first_screen() == NULL) diff --git a/src/osd/sdl/man/mame.6 b/src/osd/sdl/man/mame.6 index 20862922792..6d128814d66 100644 --- a/src/osd/sdl/man/mame.6 +++ b/src/osd/sdl/man/mame.6 @@ -448,9 +448,6 @@ The intention is that this PNG can be loaded via an artwork file with a low alpha (e.g, 0.1\-0.2 seems to work well) and blended over the entire screen. The PNG files are saved in the snap directory under the gamename\\burnin\-.png. The default is OFF (\-noburnin). -.TP -.B \-[no]dummywrite -Indicates whether a snapshot should be created with each frame. .\" .\" ******************************************************* .SS Performance options diff --git a/src/osd/sdl/man/mess.6 b/src/osd/sdl/man/mess.6 index d3fb2875db4..393943979e9 100644 --- a/src/osd/sdl/man/mess.6 +++ b/src/osd/sdl/man/mess.6 @@ -463,9 +463,6 @@ The intention is that this PNG can be loaded via an artwork file with a low alpha (e.g, 0.1\-0.2 seems to work well) and blended over the entire screen. The PNG files are saved in the snap directory under the system/burnin\-.png. The default is OFF (\-noburnin). -.TP -.B \-[no]dummywrite -Indicates whether a snapshot should be created with each frame. .\" .\" ******************************************************* .SS Performance options From adc1dcf6492872be304d6688b2a3871ea29a3023 Mon Sep 17 00:00:00 2001 From: mamehaze Date: Tue, 24 Mar 2015 10:35:25 +0000 Subject: [PATCH 188/201] correct text rom (nw) --- src/mame/drivers/toaplan2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/toaplan2.c b/src/mame/drivers/toaplan2.c index 1bdc544e479..5d7bf8b8c74 100644 --- a/src/mame/drivers/toaplan2.c +++ b/src/mame/drivers/toaplan2.c @@ -4898,10 +4898,10 @@ ROM_START( bgareggabla ) ROM_LOAD( "rom1.bin", 0x600000, 0x200000, CRC(7eafdd70) SHA1(7c8da8e86c3f9491719b1d7d5d285568d7614f38) ) ROM_REGION( 0x010000, "text", 0 ) - ROM_LOAD( "text.u81", 0x00000, 0x08000, BAD_DUMP CRC(e67fd534) SHA1(987d0edffc2c243a13d4567319ea3d185eaadbf8) ) // should contain different title logo for this game + ROM_LOAD( "text.bin", 0x00000, 0x08000, CRC(00d100bd) SHA1(fb6028e3519d6588a966d1b16d47453db2e51fd7)) ROM_REGION( 0x010000, "user1", 0 ) // not graphics - ROM_LOAD( "2#-256", 0x00000, 0x08000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) + ROM_LOAD( "base.bin", 0x00000, 0x08000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) ROM_REGION( 0x140000, "oki", 0 ) /* ADPCM Samples */ ROM_LOAD( "rom5.bin", 0x040000, 0x100000, CRC(f6d49863) SHA1(3a3c354852adad06e8a051511abfab7606bce382) ) From 02b72688b426cb8d2d6e4cfc1937eb5f10b6c668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 24 Mar 2015 15:31:35 +0100 Subject: [PATCH 189/201] reduced the image size of some chdman createhd tests (nw) --- .../chdman/input/createhd_4/in.params | 2 +- .../chdman/input/createhd_5/in.params | 2 +- src/regtests/chdman/output/createhd_4/out.chd | Bin 1048751 -> 10413 bytes src/regtests/chdman/output/createhd_5/out.chd | Bin 1048752 -> 10414 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/regtests/chdman/input/createhd_4/in.params b/src/regtests/chdman/input/createhd_4/in.params index 61dfdd4701b..51eee8734e1 100644 --- a/src/regtests/chdman/input/createhd_4/in.params +++ b/src/regtests/chdman/input/createhd_4/in.params @@ -1 +1 @@ --s 1073741824 \ No newline at end of file +-s 10485760 \ No newline at end of file diff --git a/src/regtests/chdman/input/createhd_5/in.params b/src/regtests/chdman/input/createhd_5/in.params index 614d2b26384..27e6fe0e955 100644 --- a/src/regtests/chdman/input/createhd_5/in.params +++ b/src/regtests/chdman/input/createhd_5/in.params @@ -1 +1 @@ --s 1073741824 -ss 1024 \ No newline at end of file +-s 10485760 -ss 1024 \ No newline at end of file diff --git a/src/regtests/chdman/output/createhd_4/out.chd b/src/regtests/chdman/output/createhd_4/out.chd index 8e565b3799372e20d44f7fb3f87536ab297f5584..93d60a121b77ea3e6c984b0e4ceedbb801dc4e90 100644 GIT binary patch delta 89 zcmZ4A=&&|$f{HZ50tOhUfiN_Hv;dIFw9(O4!_eKu#f6c9K@q0NInpQC%GgN9!`0Cx Z*vimMC)m|F*viB}$0;D#%GA(^0RXQ}53~RP delta 495 zcmZ1*xW3V0f{L^Q102+VSpp0|S^&so+URJlu`xhr6c4H}xTI$6?&9LY$iScsi#g{= lpI|E!14}a<4_8N*U@Jp2onTkzU@K!I9jAa`D^o)w1^`CNmf8RS diff --git a/src/regtests/chdman/output/createhd_5/out.chd b/src/regtests/chdman/output/createhd_5/out.chd index 825a3493d0b72ebba311b07e332a944d711ca470..19f9033124068d3e1a1a7d1ddec98a1f5835b6e4 100644 GIT binary patch delta 90 zcmdnc=&&wuf{HZ50tOhUfiN_Hv;dIFveD62!^qvm#f6c9K?$bFInpQC%Fs;5!`0CR V%m{XM4z@Be&~XX?at(}37y!Wr59w*TBex0RZJWmkIy? From 892eb27dd583ba73790e65af4147f8f95177e0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 24 Mar 2015 15:32:17 +0100 Subject: [PATCH 190/201] chdtest.py: added some disabled debug code (nw) --- src/regtests/chdman/chdtest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/regtests/chdman/chdtest.py b/src/regtests/chdman/chdtest.py index 2f9e4b04811..98f0a3886f9 100644 --- a/src/regtests/chdman/chdtest.py +++ b/src/regtests/chdman/chdtest.py @@ -5,12 +5,15 @@ import hashlib import shutil def runProcess(cmd): + #print " ".join(cmd) process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = process.communicate() if not isinstance(stdout, str): # python 3 stdout = stdout.decode('latin-1') if not isinstance(stderr, str): # python 3 stderr = stderr.decode('latin-1') + #if stderr: + # print stderr return process.returncode, stdout, stderr def compareInfo(info1, info2): From 3d2c821651816238f5a47afdf353cd6982d9795c Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Tue, 24 Mar 2015 16:04:15 +0100 Subject: [PATCH 191/201] one more dump, courtesy of Anna's reminder, and a small cmpro fix. nw. --- hash/gba.xml | 11 +++++++++++ hash/pc8801_flop.xml | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/hash/gba.xml b/hash/gba.xml index 4056ff8c2c4..2cc71b2965f 100644 --- a/hash/gba.xml +++ b/hash/gba.xml @@ -12294,6 +12294,17 @@ Note: In the AGB-E05-XX and AGB-E06-XX pcbs, the chip name is hidden under the b + + Frank Herbert's Dune - Ornithopter Assault (Prototype) + 200? + Cryo + + + + + + + Dungeons & Dragons - Eye of the Beholder (Euro) 2002 diff --git a/hash/pc8801_flop.xml b/hash/pc8801_flop.xml index d4ccb8a7354..cb6a34365c2 100644 --- a/hash/pc8801_flop.xml +++ b/hash/pc8801_flop.xml @@ -9666,7 +9666,7 @@ ExtractDisk [08]"下巻 ユーザー " -> "aaa_08.d88" - + From ddb6780c67a7c361ce0f11e9d33c3db1a253a315 Mon Sep 17 00:00:00 2001 From: fulivi Date: Tue, 24 Mar 2015 16:36:59 +0100 Subject: [PATCH 192/201] Added MESS driver for Intel MDS series-II --- src/emu/machine/i8257.c | 2 +- src/mess/drivers/imds2.c | 739 ++++++++++++++++++++++++++++++++++++++ src/mess/includes/imds2.h | 122 +++++++ 3 files changed, 862 insertions(+), 1 deletion(-) create mode 100644 src/mess/drivers/imds2.c create mode 100644 src/mess/includes/imds2.h diff --git a/src/emu/machine/i8257.c b/src/emu/machine/i8257.c index d46f9aa8ae7..791a040295f 100644 --- a/src/emu/machine/i8257.c +++ b/src/emu/machine/i8257.c @@ -79,7 +79,7 @@ inline void i8257_device::dma_request(int channel, int state) } else { - m_request &= ~1 << channel; + m_request &= ~(1 << channel); } trigger(1); } diff --git a/src/mess/drivers/imds2.c b/src/mess/drivers/imds2.c new file mode 100644 index 00000000000..ad34b6f0114 --- /dev/null +++ b/src/mess/drivers/imds2.c @@ -0,0 +1,739 @@ +// license:MAME +// copyright-holders:fulivi +// +// *************************************** +// Driver for Intel Intellec MDS series-II +// *************************************** +// +// Documentation used for this driver: +// [1] Intel, manual 9800554-04 rev. D - Intellec series II MDS - Schematic drawings +// [2] Intel, manual 9800556-02 rev. B - Intellec series II MDS - Hardware reference manual +// [3] Intel, manual 9800555-02 rev. B - Intellec series II MDS - Hardware interface manual +// [4] Intel, manual 9800605-02 rev. B - Intellec series II MDS - Boot/monitor listing +// +// All these manuals are available on http://www.bitsavers.org +// +// An Intellec MDS series-II is composed of the following boards: +// +// ********** +// Integrated Processor Card (IPC) or Integrated Processor Board (IPB) +// +// This is the board where the OS (ISIS-II) and the application software run. +// This driver emulates an IPC. +// IPC is composed as follows: +// A83 8085A-2 CPU @ 4 MHz +// 64k of DRAM +// A82 2732 EPROM with monitor & boot firmware (assembly source of this ROM is in [4]) +// A66 8259A System PIC +// A89 8259A Local PIC +//*A86 8253 PIT +//*A91 8251A Serial channel #0 +//*A90 8251A Serial channel #1 +// +// ********** +// I/O Controller (IOC) +// +// This board acts as a controller for all I/O of the system. +// It is structured as if it were 2 boards in one: +// One part (around 8080) controls Keyboard, CRT & floppy, the other part (around PIO 8741) controls all parallel I/Os +// (Line printer, Paper tape puncher, Paper tape reader, I/O to PROM programmer). +// Both parts are interfaced to IPC through a bidirectional 8-bit bus. +// IOC is composed of these parts: +// A69 8080A-2 CPU @ 2.448 MHz +// 8k of DRAM +// A50 2716 +// A51 2716 +// A52 2716 +// A53 2716 EPROMs with IOC firmware +// A58 8257 DMA controller +// A35 8253 PIT +// A1 8271 Floppy controller +// A20 8275 CRT controller +// A19 2708 Character generator ROM +// LS1 3.3 kHz beeper +//*A72 8741-4 CPU @ 6 MHz (PIO: parallel I/O) +// +// ********** +// Keyboard controller +// +// Keyboard is controlled by a 8741 CPU that scans the key matrix and sends key codes to IOC through a 8-bit bus. +// +// A3 8741 CPU @ 3.58 MHz +// +// ICs that are not emulated yet are marked with "*" +// +// TODO: +// - Improve keyboard mapping +// - Emulate PIO. No known dumps of its ROM are available, though. +// - Emulate line printer output on PIO +// - Emulate serial channels on IPC +// - Emulate PIT on IPC +// - Adjust speed of processors. Wait states are not accounted for yet. +// +// Huge thanks to Dave Mabry for dumping IOC firmware, KB firmware and character generator. This driver would not +// exist without his dumps. +// (https://web.archive.org/web/20080509062332/http://www.s100-manuals.com/intel/IOC_iMDX_511_Upgrade.zip) + +#include "includes/imds2.h" + +// CPU oscillator of IPC board: 8 MHz +#define IPC_XTAL_Y2 XTAL_8MHz + +// Main oscillator of IOC board: 22.032 MHz +#define IOC_XTAL_Y2 22032000 + +// FDC oscillator of IOC board: 8 MHz +#define IOC_XTAL_Y1 XTAL_8MHz + +// Frequency of beeper +#define IOC_BEEP_FREQ 3300 + +static ADDRESS_MAP_START(ipc_mem_map , AS_PROGRAM , 8 , imds2_state) + AM_RANGE(0x0000 , 0xffff) AM_READWRITE(ipc_mem_read, ipc_mem_write) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(ipc_io_map , AS_IO , 8 , imds2_state) + ADDRESS_MAP_UNMAP_LOW + AM_RANGE(0xc0 , 0xc0) AM_READWRITE(imds2_ipc_dbbout_r , imds2_ipc_dbbin_data_w) + AM_RANGE(0xc1 , 0xc1) AM_READWRITE(imds2_ipc_status_r , imds2_ipc_dbbin_cmd_w) + AM_RANGE(0xfa , 0xfb) AM_READWRITE(imds2_ipclocpic_r , imds2_ipclocpic_w) + AM_RANGE(0xfc , 0xfd) AM_READWRITE(imds2_ipcsyspic_r , imds2_ipcsyspic_w) + AM_RANGE(0xff , 0xff) AM_WRITE(imds2_ipc_control_w) +ADDRESS_MAP_END + + static ADDRESS_MAP_START(ioc_mem_map , AS_PROGRAM , 8 , imds2_state) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x0000 , 0x1fff) AM_ROM + AM_RANGE(0x4000 , 0x5fff) AM_RAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START(ioc_io_map , AS_IO , 8 , imds2_state) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0x00 , 0x0f) AM_WRITE(imds2_ioc_dbbout_w) + AM_RANGE(0x20 , 0x2f) AM_WRITE(imds2_ioc_f0_w) + AM_RANGE(0x30 , 0x3f) AM_WRITE(imds2_ioc_set_f1_w) + AM_RANGE(0x40 , 0x4f) AM_WRITE(imds2_ioc_reset_f1_w) + AM_RANGE(0x50 , 0x5f) AM_WRITE(imds2_start_timer_w) + AM_RANGE(0x60 , 0x6f) AM_WRITE(imds2_miscout_w) + AM_RANGE(0x80 , 0x8f) AM_READ(imds2_miscin_r) + AM_RANGE(0x90 , 0x9f) AM_READ(imds2_kb_read) + AM_RANGE(0xa0 , 0xaf) AM_READ(imds2_ioc_status_r) + AM_RANGE(0xb0 , 0xbf) AM_READ(imds2_ioc_dbbin_r) + AM_RANGE(0xc0 , 0xcf) AM_DEVREADWRITE("iocfdc" , i8271_device , read , write) + AM_RANGE(0xd0 , 0xdf) AM_DEVREADWRITE("ioccrtc" , i8275_device , read , write) + AM_RANGE(0xe0 , 0xef) AM_DEVREADWRITE("ioctimer" , pit8253_device , read , write); +// DMA controller range doesn't extend to 0xff because register 0xfd needs to be read as 0xff +// This register is used by IOC firmware to detect DMA controller model (either 8237 or 8257) + AM_RANGE(0xf0 , 0xf8) AM_DEVREADWRITE("iocdma" , i8257_device , read , write) +ADDRESS_MAP_END + +static ADDRESS_MAP_START(kb_io_map , AS_IO , 8 , imds2_state) + AM_RANGE(MCS48_PORT_P1 , MCS48_PORT_P1) AM_WRITE(imds2_state::imds2_kb_port_p1_w) + AM_RANGE(MCS48_PORT_P2 , MCS48_PORT_P2) AM_READ(imds2_state::imds2_kb_port_p2_r) + AM_RANGE(MCS48_PORT_T0 , MCS48_PORT_T0) AM_READ(imds2_state::imds2_kb_port_t0_r) + AM_RANGE(MCS48_PORT_T1 , MCS48_PORT_T1) AM_READ(imds2_state::imds2_kb_port_t1_r) +ADDRESS_MAP_END + +imds2_state::imds2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig , type , tag), + m_ipccpu(*this , "ipccpu"), + m_ipcsyspic(*this , "ipcsyspic"), + m_ipclocpic(*this , "ipclocpic"), + m_ioccpu(*this , "ioccpu"), + m_iocdma(*this , "iocdma"), + m_ioccrtc(*this , "ioccrtc"), + m_iocbeep(*this , "iocbeep"), + m_ioctimer(*this , "ioctimer"), + m_iocfdc(*this , "iocfdc"), + m_kbcpu(*this , "kbcpu"), + m_palette(*this , "palette"), + m_gfxdecode(*this, "gfxdecode"), + m_floppy0(*this , FLOPPY_0), + m_io_key0(*this , "KEY0"), + m_io_key1(*this , "KEY1"), + m_io_key2(*this , "KEY2"), + m_io_key3(*this , "KEY3"), + m_io_key4(*this , "KEY4"), + m_io_key5(*this , "KEY5"), + m_io_key6(*this , "KEY6"), + m_io_key7(*this , "KEY7"), + m_ioc_options(*this , "IOC_OPTS") +{ +} + +READ8_MEMBER(imds2_state::ipc_mem_read) +{ + if (imds2_in_ipc_rom(offset)) { + return m_ipc_rom[ (offset & 0x07ff) | ((offset & 0x1000) >> 1) ]; + } else { + return m_ipc_ram[ offset ]; + } +} + +WRITE8_MEMBER(imds2_state::ipc_mem_write) +{ + if (!imds2_in_ipc_rom(offset)) { + m_ipc_ram[ offset ] = data; + } +} + +WRITE8_MEMBER(imds2_state::imds2_ipc_control_w) +{ + // See A84, pg 28 of [1] + // b3 is ~(bit to be written) + // b2-b0 is ~(no. of bit to be written) + UINT8 mask = (1U << (~data & 0x07)); + + if (BIT(data , 3)) { + m_ipc_control &= ~mask; + } else { + m_ipc_control |= mask; + } +} + +WRITE_LINE_MEMBER(imds2_state::imds2_ipc_intr) +{ + m_ipccpu->set_input_line(I8085_INTR_LINE , (state != 0) && BIT(m_ipc_control , 2)); +} + +READ8_MEMBER(imds2_state::imds2_ipcsyspic_r) +{ + return m_ipcsyspic->read(space , offset == 0); +} + +READ8_MEMBER(imds2_state::imds2_ipclocpic_r) +{ + return m_ipclocpic->read(space , offset == 0); +} + +WRITE8_MEMBER(imds2_state::imds2_ipcsyspic_w) +{ + m_ipcsyspic->write(space , offset == 0 , data); +} + +WRITE8_MEMBER(imds2_state::imds2_ipclocpic_w) +{ + m_ipclocpic->write(space , offset == 0 , data); +} + +WRITE8_MEMBER(imds2_state::imds2_miscout_w) +{ + m_miscout = data; + imds2_update_beeper(); + // Send INTR to IPC + m_ipclocpic->ir6_w(BIT(m_miscout , 1)); +} + +READ8_MEMBER(imds2_state::imds2_miscin_r) +{ + UINT8 res = m_ioc_options->read(); + return res | ((m_beeper_timer == 0) << 2); +} + +WRITE_LINE_MEMBER(imds2_state::imds2_beep_timer_w) +{ + m_beeper_timer = state; + imds2_update_beeper(); +} + +WRITE8_MEMBER(imds2_state::imds2_start_timer_w) +{ + // Trigger timer 2 of ioctimer + m_ioctimer->write_gate2(0); + m_ioctimer->write_gate2(1); +} + +READ8_MEMBER(imds2_state::imds2_kb_read) +{ + return m_kbcpu->upi41_master_r(space , (offset & 2) >> 1); +} + +READ8_MEMBER(imds2_state::imds2_kb_port_p2_r) +{ + if ((m_kb_p1 & 3) == 0) { + // Row selected + // Row number is encoded on bits P15..P12, they are "backwards" (P15 is LSB) and keyboard rows are encoded starting with value 2 on these bits (see A4, pg 56 of [1]) + unsigned row = (m_kb_p1 >> 2) & 0x0f; + ioport_value data; + + switch (row) { + case 4: + // Row 0 + data = m_io_key0->read(); + break; + + case 12: + // Row 1 + data = m_io_key1->read(); + break; + + case 2: + // Row 2 + data = m_io_key2->read(); + break; + + case 10: + // Row 3 + data = m_io_key3->read(); + break; + + case 6: + // Row 4 + data = m_io_key4->read(); + break; + + case 14: + // Row 5 + data = m_io_key5->read(); + break; + + case 1: + // Row 6 + data = m_io_key6->read(); + break; + + case 9: + // Row 7 + data = m_io_key7->read(); + break; + + default: + data = 0xff; + break; + } + return data & 0xff; + } else { + // No row selected + return 0xff; + } +} + +WRITE8_MEMBER(imds2_state::imds2_kb_port_p1_w) +{ + m_kb_p1 = data; +} + +READ8_MEMBER(imds2_state::imds2_kb_port_t0_r) +{ + // T0 tied low + // It appears to be some kind of strapping option on kb hw + return 0; +} + +READ8_MEMBER(imds2_state::imds2_kb_port_t1_r) +{ + // T1 tied low + // It appears to be some kind of strapping option on kb hw + return 0; +} + +WRITE8_MEMBER(imds2_state::imds2_ioc_dbbout_w) +{ + m_ioc_obf = ~data; + // Set/reset OBF flag (b0) + m_ipc_ioc_status = ((offset & 1) == 0) | (m_ipc_ioc_status & ~0x01); +} + +WRITE8_MEMBER(imds2_state::imds2_ioc_f0_w) +{ + // Set/reset F0 flag (b2) + m_ipc_ioc_status = ((offset & 1) << 2) | (m_ipc_ioc_status & ~0x04); +} + +WRITE8_MEMBER(imds2_state::imds2_ioc_set_f1_w) +{ + // Set F1 flag (b3) + m_ipc_ioc_status |= 0x08; +} + +WRITE8_MEMBER(imds2_state::imds2_ioc_reset_f1_w) +{ + // Reset F1 flag (b3) + m_ipc_ioc_status &= ~0x08; +} + +READ8_MEMBER(imds2_state::imds2_ioc_status_r) +{ + return (~m_ipc_ioc_status & 0x0f) | 0xf0; +} + +READ8_MEMBER(imds2_state::imds2_ioc_dbbin_r) +{ + // Reset IBF flag (b1) + m_ipc_ioc_status &= ~0x02; + return ~m_ioc_ibf; +} + +READ8_MEMBER(imds2_state::imds2_ipc_dbbout_r) +{ + // Reset OBF flag (b0) + m_ipc_ioc_status &= ~0x01; + return m_ioc_obf; +} + +READ8_MEMBER(imds2_state::imds2_ipc_status_r) +{ + return m_ipc_ioc_status; +} + +WRITE8_MEMBER(imds2_state::imds2_ipc_dbbin_data_w) +{ + // Set IBF flag (b1) + m_ipc_ioc_status |= 0x02; + // Reset F1 flag (b3) + m_ipc_ioc_status &= ~0x08; + m_ioc_ibf = data; +} + +WRITE8_MEMBER(imds2_state::imds2_ipc_dbbin_cmd_w) +{ + // Set IBF flag (b1) + m_ipc_ioc_status |= 0x02; + // Set F1 flag (b3) + m_ipc_ioc_status |= 0x08; + m_ioc_ibf = data; +} + +WRITE_LINE_MEMBER(imds2_state::imds2_hrq_w) +{ + // Should be propagated to HOLD input of IOC CPU + m_iocdma->hlda_w(state); +} + +READ8_MEMBER(imds2_state::imds2_ioc_mem_r) +{ + address_space& prog_space = m_ioccpu->space(AS_PROGRAM); + return prog_space.read_byte(offset); +} + +WRITE8_MEMBER(imds2_state::imds2_ioc_mem_w) +{ + address_space& prog_space = m_ioccpu->space(AS_PROGRAM); + return prog_space.write_byte(offset , data); +} + +I8275_DRAW_CHARACTER_MEMBER(imds2_state::crtc_display_pixels) +{ + unsigned i; + const rgb_t *palette = m_palette->palette()->entry_list_raw(); + UINT8 chargen_byte = m_chargen[ (linecount & 7) | ((unsigned)charcode << 3) ]; + UINT16 pixels; + + if (lten) { + pixels = ~0; + } else if (vsp != 0 || (linecount & 8) != 0) { + pixels = 0; + } else { + // See [2], pg 58 for the very peculiar way of generating character images + // Here each half-pixel is translated into a full pixel + UINT16 exp_pix_l; + UINT16 exp_pix_r; + + exp_pix_l = (UINT16)chargen_byte; + exp_pix_l = ((exp_pix_l & 0x80) << 5) | + ((exp_pix_l & 0x40) << 4) | + ((exp_pix_l & 0x20) << 3) | + ((exp_pix_l & 0x10) << 2) | + ((exp_pix_l & 0x08) << 1) | + (exp_pix_l & 0x04); + exp_pix_l |= (exp_pix_l << 1); + exp_pix_r = exp_pix_l; + + // Layout of exp_pix_l/r: + // Bit # : F E D C B A 9 8 7 6 5 4 3 2 1 0 + // Bit of chargen_byte: 0 0 b7 b7 b6 b6 b5 b5 b4 b4 b3 b3 b2 b2 0 0 + if ((chargen_byte & 2) == 0) { + exp_pix_l >>= 1; + } + exp_pix_l &= 0x3fc0; + + if ((chargen_byte & 1) == 0) { + exp_pix_r >>= 1; + } + exp_pix_r &= 0x003e; + + pixels = exp_pix_l | exp_pix_r; + } + + if (rvv) { + pixels = ~pixels; + } + + for (i = 0; i < 14; i++) { + bitmap.pix32(y, x + i) = palette[ (pixels & (1U << (13 - i))) != 0 ]; + } +} + +void imds2_state::driver_start() +{ + // Allocate 64k for IPC RAM + m_ipc_ram.resize(0x10000); + + memory_region *ipcrom = memregion("ipcrom"); + if (ipcrom == NULL) { + fatalerror("Unable to find IPC ROM region\n"); + } else { + m_ipc_rom = ipcrom->base(); + } +} + +void imds2_state::machine_start() +{ + m_floppy0->floppy_mon_w(0); + m_floppy0->floppy_drive_set_ready_state(1 , 0); +} + +void imds2_state::video_start() +{ + m_chargen = memregion("gfx1")->base(); +} + +void imds2_state::machine_reset() +{ + m_iocbeep->set_frequency(IOC_BEEP_FREQ); + m_ipc_control = 0x00; + m_ipc_ioc_status = 0x0f; +} + +bool imds2_state::imds2_in_ipc_rom(offs_t offset) const +{ + offs_t masked_offset = offset & 0xf800; + + // Region 0000-07ff is in ROM when START_UP/ == 0 && SEL_BOOT/ == 0 + if (masked_offset == 0x0000 && (m_ipc_control & 0x28) == 0) { + return true; + } + + // Region e800-efff is in ROM when SEL_BOOT/ == 0 + if (masked_offset == 0xe800 && (m_ipc_control & 0x08) == 0) { + return true; + } + + // Region f800-ffff is always in ROM + if (masked_offset == 0xf800) { + return true; + } + + return false; +} + +void imds2_state::imds2_update_beeper(void) +{ + m_iocbeep->set_state(m_beeper_timer == 0 && BIT(m_miscout , 0) == 0); +} + +static INPUT_PORTS_START(imds2) + // See [1], pg 56 for key matrix layout + // See [1], pg 57 for keyboard layout + PORT_START("KEY0") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('`') + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') // ' + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') // . + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + + PORT_START("KEY1") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') // OK + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_UNUSED) + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') // OK + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') // OK + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') // OK + + PORT_START("KEY2") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('~') // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') // OK + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') // OK + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') // OK + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') + + PORT_START("KEY3") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') // OK + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') // OK + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') // OK + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') // OK + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') // OK + + PORT_START("KEY4") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') // OK + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') // OK + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') // OK + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') // OK + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') // OK + + PORT_START("KEY5") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') // OK + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') // OK + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') // OK + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') // OK + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') // OK + + PORT_START("KEY6") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) // BS + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(HOME)) // OK + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') // OK + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) // OK + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) // OK + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) // OK + + PORT_START("KEY7") + PORT_BIT(0x01 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) // OK + PORT_BIT(0x02 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) // OK + PORT_BIT(0x04 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('_') PORT_CHAR('^') + PORT_BIT(0x08 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // OK + PORT_BIT(0x10 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) // OK + PORT_BIT(0x20 , IP_ACTIVE_LOW , IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT(0x40 , IP_ACTIVE_LOW , IPT_UNUSED) + PORT_BIT(0x80 , IP_ACTIVE_LOW , IPT_UNUSED) + + // Options on IOC: see [1], pg 40 + PORT_START("IOC_OPTS") + PORT_DIPNAME(0x80 , 0x80 , "Keyboard present") + PORT_DIPSETTING(0x80 , DEF_STR(Yes)) + PORT_DIPSETTING(0x00 , DEF_STR(No)) + PORT_DIPNAME(0x28 , 0x00 , "IOC mode") + PORT_DIPSETTING(0x00 , "On line") + PORT_DIPSETTING(0x08 , "Local") + PORT_DIPSETTING(0x20 , "Diagnostic") + PORT_DIPNAME(0x02 , 0x00 , "Floppy present") + PORT_DIPSETTING(0x02 , DEF_STR(Yes)) + PORT_DIPSETTING(0x00 , DEF_STR(No)) + PORT_DIPNAME(0x01 , 0x01 , "CRT frame frequency") + PORT_DIPSETTING(0x01 , "50 Hz") + PORT_DIPSETTING(0x00 , "60 Hz") +INPUT_PORTS_END + +static GFXLAYOUT_RAW(imds2_charlayout , 8 , 8 , 8 , 64) + +static GFXDECODE_START(imds2) + GFXDECODE_ENTRY("gfx1" , 0x0000 , imds2_charlayout , 0 , 1) +GFXDECODE_END + +static LEGACY_FLOPPY_OPTIONS_START(imds2) +LEGACY_FLOPPY_OPTIONS_END + +static const floppy_interface imds2_floppy_interface = +{ + FLOPPY_STANDARD_8_SSSD, + LEGACY_FLOPPY_OPTIONS_NAME(imds2), + "floppy_8" +}; + +static MACHINE_CONFIG_START(imds2 , imds2_state) + MCFG_CPU_ADD("ipccpu" , I8085A , IPC_XTAL_Y2 / 2) // 4 MHz + MCFG_CPU_PROGRAM_MAP(ipc_mem_map) + MCFG_CPU_IO_MAP(ipc_io_map) + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("ipcsyspic" , pic8259_device , inta_cb) + MCFG_QUANTUM_TIME(attotime::from_hz(100)) + + MCFG_PIC8259_ADD("ipcsyspic" , WRITELINE(imds2_state , imds2_ipc_intr) , VCC , NULL) + MCFG_PIC8259_ADD("ipclocpic" , DEVWRITELINE("ipcsyspic" , pic8259_device , ir7_w) , VCC , NULL) + + MCFG_CPU_ADD("ioccpu" , I8080A , IOC_XTAL_Y2 / 9) // 2.448 MHz + MCFG_CPU_PROGRAM_MAP(ioc_mem_map) + MCFG_CPU_IO_MAP(ioc_io_map) + MCFG_QUANTUM_TIME(attotime::from_hz(100)) + + // The IOC CRT hw is a bit complex, as the character clock (CCLK) to i8275 + // is varied according to the part of the video frame being scanned and according to + // the 50/60 Hz option jumper (W8). + // The basic clock (BCLK) runs at 22.032 MHz. + // CCLK = BCLK / 14 when in the active region of video + // CCLK = BCLK / 12 when in horizontal retrace (HRTC=1) + // CCLK = BCLK / 10 when in horizontal retrace of "short scan lines" (50 Hz only) + // + // ***** 50 Hz timings ***** + // 80 chars/row, 26 chars/h. retrace, 11 scan lines/row, 25 active rows, 3 vertical retrace rows + // Scan line: 80 chars * 14 BCLK + 26 chars * 12 BCLK = 1432 BCLK (64.996 usec) + // Scan row: 11 * scan lines = 15752 BCLK (714.960 usec) + // "Short" scan line: 80 chars * 14 BCLK + 26 chars * 10 BCLK = 1380 BCLK (62.636 usec) + // Frame: 28 scan rows (8 scan lines of 27th row are short): 27 * scan row + 3 * scan line + 8 * short scan line: 440640 BCLK (20 msec) + // + // ***** 60 Hz timings ***** + // 80 chars/row, 20 chars/h. retrace, 10 scan lines/row, 25 active rows, 2 vertical retrace rows + // Scan line: 80 chars * 14 BCLK + 20 chars * 12 BCLK = 1360 BCLK (61.728 usec) + // Scan row: 10 * scan lines = 13600 BCLK (617.284 usec) + // Frame: 27 scan rows : 367200 BCLK (16.667 msec) + // + // Clock here is semi-bogus: it gives the correct frame frequency at 50 Hz (with the incorrect + // assumption that CCLK is fixed at BCLK / 14) + MCFG_DEVICE_ADD("ioccrtc" , I8275 , 22853600 / 14) + MCFG_I8275_CHARACTER_WIDTH(14) + MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(imds2_state , crtc_display_pixels) + MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("iocdma" , i8257_device , dreq2_w)) + MCFG_I8275_IRQ_CALLBACK(INPUTLINE("ioccpu" , I8085_INTR_LINE)) + + MCFG_SCREEN_ADD("screen" , RASTER) + MCFG_SCREEN_UPDATE_DEVICE("ioccrtc" , i8275_device , screen_update) + MCFG_SCREEN_REFRESH_RATE(50) + MCFG_GFXDECODE_ADD("gfxdecode" , "palette" , imds2) + MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") + + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("iocbeep" , BEEP , 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS , "mono" , 1.00) + + MCFG_DEVICE_ADD("iocdma" , I8257 , IOC_XTAL_Y2 / 9) + MCFG_I8257_OUT_HRQ_CB(WRITELINE(imds2_state, imds2_hrq_w)) + MCFG_I8257_IN_MEMR_CB(READ8(imds2_state , imds2_ioc_mem_r)) + MCFG_I8257_OUT_MEMW_CB(WRITE8(imds2_state , imds2_ioc_mem_w)) + MCFG_I8257_IN_IOR_1_CB(DEVREAD8("iocfdc" , i8271_device , dack_r)) + MCFG_I8257_OUT_IOW_1_CB(DEVWRITE8("iocfdc" , i8271_device , dack_w)) + MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("ioccrtc" , i8275_device , dack_w)) + + MCFG_DEVICE_ADD("ioctimer" , PIT8253 , 0) + MCFG_PIT8253_CLK0(IOC_XTAL_Y1 / 4) + MCFG_PIT8253_OUT0_HANDLER(DEVWRITELINE("ioctimer" , pit8253_device , write_clk2)); + MCFG_PIT8253_OUT2_HANDLER(WRITELINE(imds2_state , imds2_beep_timer_w)); + + MCFG_DEVICE_ADD("iocfdc" , I8271 , IOC_XTAL_Y1 / 2) + MCFG_I8271_DRQ_CALLBACK(DEVWRITELINE("iocdma" , i8257_device , dreq1_w)) + MCFG_I8271_FLOPPIES(FLOPPY_0 , FLOPPY_1) + + MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, imds2_floppy_interface) + + MCFG_CPU_ADD("kbcpu", I8741, XTAL_3_579545MHz) /* 3.579545 MHz */ + MCFG_CPU_IO_MAP(kb_io_map) + MCFG_QUANTUM_TIME(attotime::from_hz(100)) +MACHINE_CONFIG_END + +ROM_START(imds2) + // ROM definition of IPC cpu (8085A) + ROM_REGION(0x1000 , "ipcrom" , 0) + ROM_LOAD("ipc_a82.bin" , 0x0000 , 0x1000 , CRC(0889394f) SHA1(b7525baf1884a7d67402dea4b5566016a9861ef2)) + + // ROM definition of IOC cpu (8080A) + ROM_REGION(0x2000 , "ioccpu" , 0) + ROM_LOAD("ioc_a50.bin" , 0x0000 , 0x0800 , CRC(d9f926a1) SHA1(bd9d0f7458acc2806120a6dbaab9c48be315b060)) + ROM_LOAD("ioc_a51.bin" , 0x0800 , 0x0800 , CRC(6aa2f86c) SHA1(d3a5314d86e3366545b4c97b29e323dfab383d5f)) + ROM_LOAD("ioc_a52.bin" , 0x1000 , 0x0800 , CRC(b88a38d5) SHA1(934716a1daec852f4d1f846510f42408df0c9584)) + ROM_LOAD("ioc_a53.bin" , 0x1800 , 0x0800 , CRC(c8df4bb9) SHA1(2dfb921e94ae7033a7182457b2f00657674d1b77)) + // ROM definition of keyboard controller (8741) + ROM_REGION(0x400 , "kbcpu" , 0) + ROM_LOAD("kbd511.bin" , 0 , 0x400 , CRC(ba7c4303) SHA1(19899af732d0ae1247bfc79979b1ee5f339ee5cf)) + // ROM definition of character generator (2708, A19 on IOC) + ROM_REGION(0x400 , "gfx1" , 0) + ROM_LOAD ("ioc_a19.bin" , 0x0000 , 0x0400 , CRC(47487d0f) SHA1(0ed98f9f06622949ee3cc2ffc572fb9702db0f81)) +ROM_END + +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ +COMP( 1979, imds2, 0, 0, imds2, imds2, driver_device, 0, "Intel", "Intellec MDS-II" , 0) diff --git a/src/mess/includes/imds2.h b/src/mess/includes/imds2.h new file mode 100644 index 00000000000..62887b4b34e --- /dev/null +++ b/src/mess/includes/imds2.h @@ -0,0 +1,122 @@ +// license:MAME +// copyright-holders:fulivi +// Driver for Intel Intellec MDS series-II + +#ifndef _IMDS2_H_ +#define _IMDS2_H_ + +#include "emu.h" +#include "cpu/i8085/i8085.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/i8257.h" +#include "video/i8275.h" +#include "sound/beep.h" +#include "machine/pit8253.h" +#include "machine/pic8259.h" +#include "machine/i8271.h" +#include "imagedev/flopdrv.h" + +class imds2_state : public driver_device +{ + public: + imds2_state(const machine_config &mconfig, device_type type, const char *tag); + + DECLARE_READ8_MEMBER(ipc_mem_read); + DECLARE_WRITE8_MEMBER(ipc_mem_write); + DECLARE_WRITE8_MEMBER(imds2_ipc_control_w); + DECLARE_WRITE_LINE_MEMBER(imds2_ipc_intr); + DECLARE_READ8_MEMBER(imds2_ipcsyspic_r); + DECLARE_READ8_MEMBER(imds2_ipclocpic_r); + DECLARE_WRITE8_MEMBER(imds2_ipcsyspic_w); + DECLARE_WRITE8_MEMBER(imds2_ipclocpic_w); + + DECLARE_WRITE8_MEMBER(imds2_miscout_w); + DECLARE_READ8_MEMBER(imds2_miscin_r); + DECLARE_WRITE_LINE_MEMBER(imds2_beep_timer_w); + DECLARE_WRITE8_MEMBER(imds2_start_timer_w); + DECLARE_READ8_MEMBER(imds2_kb_read); + DECLARE_READ8_MEMBER(imds2_kb_port_p2_r); + DECLARE_WRITE8_MEMBER(imds2_kb_port_p1_w); + DECLARE_READ8_MEMBER(imds2_kb_port_t0_r); + DECLARE_READ8_MEMBER(imds2_kb_port_t1_r); + DECLARE_WRITE8_MEMBER(imds2_ioc_dbbout_w); + DECLARE_WRITE8_MEMBER(imds2_ioc_f0_w); + DECLARE_WRITE8_MEMBER(imds2_ioc_set_f1_w); + DECLARE_WRITE8_MEMBER(imds2_ioc_reset_f1_w); + DECLARE_READ8_MEMBER(imds2_ioc_status_r); + DECLARE_READ8_MEMBER(imds2_ioc_dbbin_r); + DECLARE_READ8_MEMBER(imds2_ipc_dbbout_r); + DECLARE_READ8_MEMBER(imds2_ipc_status_r); + DECLARE_WRITE8_MEMBER(imds2_ipc_dbbin_data_w); + DECLARE_WRITE8_MEMBER(imds2_ipc_dbbin_cmd_w); + DECLARE_WRITE_LINE_MEMBER(imds2_hrq_w); + + DECLARE_READ8_MEMBER(imds2_ioc_mem_r); + DECLARE_WRITE8_MEMBER(imds2_ioc_mem_w); + + I8275_DRAW_CHARACTER_MEMBER(crtc_display_pixels); + + virtual void driver_start(); + virtual void machine_start(); + virtual void video_start(); + virtual void machine_reset(); + + private: + required_device m_ipccpu; + required_device m_ipcsyspic; + required_device m_ipclocpic; + required_device m_ioccpu; + required_device m_iocdma; + required_device m_ioccrtc; + required_device m_iocbeep; + required_device m_ioctimer; + required_device m_iocfdc; + required_device m_kbcpu; + required_device m_palette; + required_device m_gfxdecode; + required_device m_floppy0; + required_ioport m_io_key0; + required_ioport m_io_key1; + required_ioport m_io_key2; + required_ioport m_io_key3; + required_ioport m_io_key4; + required_ioport m_io_key5; + required_ioport m_io_key6; + required_ioport m_io_key7; + required_ioport m_ioc_options; + + dynamic_array m_ipc_ram; + + bool imds2_in_ipc_rom(offs_t offset) const; + + void imds2_update_beeper(void); + + // IPC control port + UINT8 m_ipc_control; + + // IPC ROM content + const UINT8 *m_ipc_rom; + + // Character generator + const UINT8 *m_chargen; + + // MISCOUT state + UINT8 m_miscout; + + // Beeper timer line + int m_beeper_timer; + + // Keyboard state + UINT8 m_kb_p1; + + // IPC to IOC buffer + UINT8 m_ioc_ibf; + + // IOC to IPC buffer + UINT8 m_ioc_obf; + + // IPC/IOC status + UINT8 m_ipc_ioc_status; +}; + +#endif /* _IMDS2_H_ */ From 6dc4835957326e5c86c45908c53062b28c4e4d0c Mon Sep 17 00:00:00 2001 From: mamehaze Date: Tue, 24 Mar 2015 15:41:00 +0000 Subject: [PATCH 193/201] notes (nw) --- src/mame/drivers/ttchamp.c | 76 +++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/src/mame/drivers/ttchamp.c b/src/mame/drivers/ttchamp.c index b93e5c0b4f2..7d9311e0556 100644 --- a/src/mame/drivers/ttchamp.c +++ b/src/mame/drivers/ttchamp.c @@ -1,4 +1,5 @@ -/* Table Tennis Champions ? +/* Table Tennis Champions + (c) 1995 Gamart ___________________________________________________ | __ _________ __________ __________ | @@ -45,7 +46,7 @@ ttennis1 adpcm data ttennis4/5 graphics *there is a pic16c84 that i cannot dump because my programmer doesn't support it. -Dumped by tirino73 >isolani (at) interfree.it< +Dumped by tirino73 @@ -54,7 +55,8 @@ Dumped by tirino73 >isolani (at) interfree.it< including the blitter (seems to be doubled up hardware tho, twice as many layers?) - need to work out how it selects between upper/lower program roms as blitter source -- PIC is probably for sound +- PIC is not for sound, what is is for? +- eeprom? (I don't see one, maybe PIC is used for settings?) - more than one layer - layer clearing @@ -80,6 +82,13 @@ public: DECLARE_WRITE16_MEMBER(paldat_w); DECLARE_WRITE16_MEMBER(port10_w); + + DECLARE_WRITE16_MEMBER(port20_w); + DECLARE_WRITE16_MEMBER(port62_w); + + DECLARE_READ16_MEMBER(port1e_r); + + UINT16 m_port10; DECLARE_DRIVER_INIT(ttchamp); @@ -190,7 +199,12 @@ WRITE16_MEMBER(ttchamp_state::paloff_w) WRITE16_MEMBER(ttchamp_state::paldat_w) { - m_palette->set_pen_color(m_paloff & 0x7fff,pal5bit(data>>0),pal5bit(data>>5),pal5bit(data>>10)); + // maybe 4 layers of 0x100 each? + // middle palettes seem to have special meaning tho, maybe blending? it's a darker copy ingame, and red/blue shades on char select + // based on screenshot references the highlighted player portraits should be appear in shades of red/blue + + // 0x8000 of offset is sometimes set + m_palette->set_pen_color(m_paloff & 0x3ff,pal5bit(data>>0),pal5bit(data>>5),pal5bit(data>>10)); } @@ -249,14 +263,14 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) if (m_spritesinit == 1) { - // printf("spider_blitter_w %08x %04x %04x (init?) (base?)\n", offset * 2, data, mem_mask); + // printf("%06x: spider_blitter_w %08x %04x %04x (init?) (base?)\n", space.device().safe_pc(), offset * 2, data, mem_mask); m_spritesinit = 2; m_spritesaddr = offset; } else if (m_spritesinit == 2) { - // printf("spider_blitter_w %08x %04x %04x (init2) (width?)\n", offset * 2, data, mem_mask); + // printf("%06x: spider_blitter_w %08x %04x %04x (init2) (width?)\n", space.device().safe_pc(), offset * 2, data, mem_mask); m_spriteswidth = offset & 0xff; if (m_spriteswidth == 0) m_spriteswidth = 80; @@ -274,9 +288,9 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) { COMBINE_DATA(&vram[offset&0x7fff]); } - else if (offset < 0x40000 / 2) + else if ((offset >= 0x30000 / 2) && (offset < 0x40000 / 2)) { - // 0x30000-0x3ffff and 0x40000-0x4ffff seem to be used here? + // 0x30000-0x3ffff used, on Spider it's 0x20000-0x2ffff offset &= 0x7fff; UINT8 *src = m_rom8; @@ -284,7 +298,7 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) if (m_port10 & 2) // NO, wrong for the portraits src += 0x100000; - // printf("spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); + // printf("%06x: spider_blitter_w %08x %04x %04x (previous data width %d address %08x)\n", space.device().safe_pc(), offset * 2, data, mem_mask, m_spriteswidth, m_spritesaddr); offset &= 0x7fff; for (int i = 0; i < m_spriteswidth; i++) @@ -311,46 +325,66 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) } else { - logerror("spider_blitter_w unhandled RAM access %08x %04x %04x\n", offset * 2, data, mem_mask); + // sometimes happens, why? special meanings? wrong interpretation of something else? + printf("%06x: spider_blitter_w unhandled RAM access %08x %04x %04x\n", space.device().safe_pc(), offset * 2, data, mem_mask); } } } + + +static ADDRESS_MAP_START( ttchamp_map, AS_PROGRAM, 16, ttchamp_state ) + AM_RANGE(0x00000, 0xfffff) AM_READWRITE(ttchamp_mem_r, ttchamp_mem_w) +ADDRESS_MAP_END + +READ16_MEMBER(ttchamp_state::port1e_r) +{ + return 0xff; +} + READ16_MEMBER(ttchamp_state::ttchamp_blit_start_r) { m_spritesinit = 1; return 0xff; } -static ADDRESS_MAP_START( ttchamp_map, AS_PROGRAM, 16, ttchamp_state ) - AM_RANGE(0x00000, 0xfffff) AM_READWRITE(ttchamp_mem_r, ttchamp_mem_w) -ADDRESS_MAP_END - WRITE16_MEMBER(ttchamp_state::port10_w) { COMBINE_DATA(&m_port10); } +WRITE16_MEMBER(ttchamp_state::port20_w) +{ + printf("%06x: port20_w %04x %04x\n", space.device().safe_pc(), data, mem_mask); +} + +WRITE16_MEMBER(ttchamp_state::port62_w) +{ + printf("%06x: port62_w %04x %04x\n", space.device().safe_pc(), data, mem_mask); +} static ADDRESS_MAP_START( ttchamp_io, AS_IO, 16, ttchamp_state ) -// AM_RANGE(0x0000, 0x0001) AM_WRITENOP + AM_RANGE(0x0000, 0x0001) AM_WRITENOP // startup only AM_RANGE(0x0002, 0x0003) AM_READ_PORT("SYSTEM") AM_RANGE(0x0004, 0x0005) AM_READ_PORT("P1_P2") AM_RANGE(0x0006, 0x0007) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) - AM_RANGE(0x0018, 0x0019) AM_READ(ttchamp_blit_start_r) - AM_RANGE(0x001e, 0x001f) AM_READNOP // read before each line is blit + AM_RANGE(0x0018, 0x0019) AM_READ(ttchamp_blit_start_r) // read before using bus write offset as blit parameters + AM_RANGE(0x001e, 0x001f) AM_READ(port1e_r) // read before some blit operations (but not all) AM_RANGE(0x0008, 0x0009) AM_WRITE(paldat_w) - AM_RANGE(0x000a, 0x000b) AM_WRITE(paloff_w) + AM_RANGE(0x000a, 0x000b) AM_WRITE(paloff_w) // bit 0x8000 sometimes gets set, why? AM_RANGE(0x0010, 0x0011) AM_WRITE(port10_w) -// AM_RANGE(0x0020, 0x0021) AM_WRITENOP + AM_RANGE(0x0020, 0x0021) AM_WRITE(port20_w) + +// AM_RANGE(0x0034, 0x0035) AM_READ(peno_rand) AM_WRITENOP // eeprom (PIC?) / settings? + + AM_RANGE(0x0062, 0x0063) AM_WRITE(port62_w) -// AM_RANGE(0x0034, 0x0035) AM_READ(peno_rand) AM_WRITENOP ADDRESS_MAP_END @@ -441,7 +475,7 @@ static MACHINE_CONFIG_START( ttchamp, ttchamp_state ) MCFG_SCREEN_UPDATE_DRIVER(ttchamp_state, screen_update_ttchamp) MCFG_SCREEN_PALETTE("palette") - MCFG_PALETTE_ADD("palette", 0x8000) + MCFG_PALETTE_ADD("palette", 0x400) MCFG_SPEAKER_STANDARD_MONO("mono") From c75c981c057d0b3577a25c7bafaa709f07d44d5f Mon Sep 17 00:00:00 2001 From: mamehaze Date: Tue, 24 Mar 2015 16:22:00 +0000 Subject: [PATCH 194/201] hmm pen based blending too.. ok ... (nw) --- src/mame/drivers/ttchamp.c | 101 +++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 31 deletions(-) diff --git a/src/mame/drivers/ttchamp.c b/src/mame/drivers/ttchamp.c index 7d9311e0556..9e97e878c6f 100644 --- a/src/mame/drivers/ttchamp.c +++ b/src/mame/drivers/ttchamp.c @@ -99,7 +99,7 @@ public: DECLARE_WRITE16_MEMBER(ttchamp_mem_w); UINT16 m_videoram0[0x10000 / 2]; - UINT16 m_videoram1[0x10000 / 2]; +// UINT16 m_videoram1[0x10000 / 2]; UINT16 m_videoram2[0x10000 / 2]; @@ -141,18 +141,23 @@ UINT32 ttchamp_state::screen_update_ttchamp(screen_device &screen, bitmap_ind16 static const int xxx=320,yyy=204; bitmap.fill(m_palette->black_pen()); - + UINT8 *videoramfg; + UINT8* videorambg; + count=0; - UINT8 *videoram = (UINT8*)m_videoram0; + videorambg = (UINT8*)m_videoram0; + videoramfg = (UINT8*)m_videoram2; + for (y=0;yset_pen_color(m_paloff & 0x3ff,pal5bit(data>>0),pal5bit(data>>5),pal5bit(data>>10)); } @@ -216,7 +241,7 @@ READ16_MEMBER(ttchamp_state::ttchamp_mem_r) if ((m_port10&0xf) == 0x00) vram = m_videoram0; else if ((m_port10&0xf) == 0x01) - vram = m_videoram1; + vram = m_videoram2; else if ((m_port10&0xf) == 0x03) vram = m_videoram2; else @@ -251,7 +276,7 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) if ((m_port10&0xf) == 0x00) vram = m_videoram0; else if ((m_port10&0xf) == 0x01) - vram = m_videoram1; + vram = m_videoram2; else if ((m_port10&0xf) == 0x03) vram = m_videoram2; else @@ -272,8 +297,6 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) { // printf("%06x: spider_blitter_w %08x %04x %04x (init2) (width?)\n", space.device().safe_pc(), offset * 2, data, mem_mask); m_spriteswidth = offset & 0xff; - if (m_spriteswidth == 0) - m_spriteswidth = 80; m_spritesinit = 0; @@ -303,22 +326,30 @@ WRITE16_MEMBER(ttchamp_state::ttchamp_mem_w) for (int i = 0; i < m_spriteswidth; i++) { - UINT8 data; - - data = (src[(m_spritesaddr * 2) + 1]); - - if (data) - vram[offset] = (vram[offset] & 0x00ff) | data << 8; + if ((m_port10 & 0xf) == 0x01) // this is set when moving objects are cleared, although not screen clears? + { + vram[offset] = 0x0000; + offset++; + } + else + { + UINT8 data; + + data = (src[(m_spritesaddr * 2) + 1]); + + if (data) + vram[offset] = (vram[offset] & 0x00ff) | data << 8; - data = src[(m_spritesaddr*2)]; - - if (data) - vram[offset] = (vram[offset] & 0xff00) | data; + data = src[(m_spritesaddr * 2)]; + + if (data) + vram[offset] = (vram[offset] & 0xff00) | data; - m_spritesaddr ++; - offset++; + m_spritesaddr++; + offset++; + } offset &= 0x7fff; } @@ -356,6 +387,14 @@ WRITE16_MEMBER(ttchamp_state::port10_w) WRITE16_MEMBER(ttchamp_state::port20_w) { printf("%06x: port20_w %04x %04x\n", space.device().safe_pc(), data, mem_mask); + // seems to somehow be tied to layer clear + // might also depend on layer selected with 0x10 tho? written after it + for (int i = 0; i < 0x8000; i++) + { + // m_videoram0[i] = 0x0000; + m_videoram2[i] = 0x0000; + } + } WRITE16_MEMBER(ttchamp_state::port62_w) From 3a42abc7a78b68d3a978cb615b567f4289d985a8 Mon Sep 17 00:00:00 2001 From: fulivi Date: Tue, 24 Mar 2015 17:35:09 +0100 Subject: [PATCH 195/201] Added imds2 to list file & mess makefile --- src/mess/mess.lst | 2 ++ src/mess/mess.mak | 1 + 2 files changed, 3 insertions(+) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index dde03cb7447..d27d039b024 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2103,6 +2103,8 @@ swtpc09i // S09, DC4 Floppy + PIA IDE SBUG rom - FLEX swtpc09u // S09, DMF2 Floppy UNIBUG rom - UniFLEX swtpc09d3 // S09, DMF3 Floppy UNIBUG U3 rom - UniFLEX U3 +// Intel +imds2 // Intellec MDS series-II //***************Games****************************************************** // Computer Electronic diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 1841a33be75..ff2c0f07c84 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1334,6 +1334,7 @@ $(MESSOBJ)/intel.a: \ $(MESS_DRIVERS)/rex6000.o \ $(MESS_DRIVERS)/sdk85.o \ $(MESS_DRIVERS)/sdk86.o \ + $(MESS_DRIVERS)/imds2.o \ $(MESSOBJ)/ideal.a: \ $(MESS_DRIVERS)/elecdet.o \ From fa50b1e3b27b28f49cad8a57d7f4f185b44277a6 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 24 Mar 2015 19:44:12 +0100 Subject: [PATCH 196/201] i can probably finish dark tower, but ssimon can wait until post-release --- src/mess/mess.lst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index f056548879a..35b59572ef8 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2205,7 +2205,7 @@ starwbc // Kenner starwbcp // Kenner (prototype) comp4 // Milton Bradley simon // Milton Bradley -ssimon // Milton Bradley +//ssimon // Milton Bradley cnsector // Parker Bros merlin // Parker Bros stopthie // Parker Bros From 7237f125a9fa86899d22067fae9e7f8b2ce95a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Tue, 24 Mar 2015 19:54:11 +0100 Subject: [PATCH 197/201] fixed Visual Studio compilation (nw) --- src/mess/drivers/imds2.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mess/drivers/imds2.c b/src/mess/drivers/imds2.c index ad34b6f0114..cf192dd63e8 100644 --- a/src/mess/drivers/imds2.c +++ b/src/mess/drivers/imds2.c @@ -128,10 +128,10 @@ static ADDRESS_MAP_START(ioc_io_map , AS_IO , 8 , imds2_state) ADDRESS_MAP_END static ADDRESS_MAP_START(kb_io_map , AS_IO , 8 , imds2_state) - AM_RANGE(MCS48_PORT_P1 , MCS48_PORT_P1) AM_WRITE(imds2_state::imds2_kb_port_p1_w) - AM_RANGE(MCS48_PORT_P2 , MCS48_PORT_P2) AM_READ(imds2_state::imds2_kb_port_p2_r) - AM_RANGE(MCS48_PORT_T0 , MCS48_PORT_T0) AM_READ(imds2_state::imds2_kb_port_t0_r) - AM_RANGE(MCS48_PORT_T1 , MCS48_PORT_T1) AM_READ(imds2_state::imds2_kb_port_t1_r) + AM_RANGE(MCS48_PORT_P1 , MCS48_PORT_P1) AM_WRITE(imds2_kb_port_p1_w) + AM_RANGE(MCS48_PORT_P2 , MCS48_PORT_P2) AM_READ(imds2_kb_port_p2_r) + AM_RANGE(MCS48_PORT_T0 , MCS48_PORT_T0) AM_READ(imds2_kb_port_t0_r) + AM_RANGE(MCS48_PORT_T1 , MCS48_PORT_T1) AM_READ(imds2_kb_port_t1_r) ADDRESS_MAP_END imds2_state::imds2_state(const machine_config &mconfig, device_type type, const char *tag) From a09a8fcbc8cc5500112521e5a569ce9f472a5d88 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 24 Mar 2015 20:17:31 +0100 Subject: [PATCH 198/201] darktower motor simulation --- src/mess/drivers/hh_tms1k.c | 11 ++-- src/mess/drivers/mbdtower.c | 124 +++++++++++++++++++++++++++++------ src/mess/layout/mbdtower.lay | 7 ++ 3 files changed, 117 insertions(+), 25 deletions(-) diff --git a/src/mess/drivers/hh_tms1k.c b/src/mess/drivers/hh_tms1k.c index c58cd7a1def..83d83023ef0 100644 --- a/src/mess/drivers/hh_tms1k.c +++ b/src/mess/drivers/hh_tms1k.c @@ -24,6 +24,7 @@ *MP2139 ? 1982, Gakken Galaxy Invader 1000 *MP2788 ? 1980, Bandai Flight Time @MP3226 TMS1000 1978, Milton Bradley Simon + *MP3301 TMS1000 1979, Milton Bradley Bigtrak *MP3320A TMS1000 1979, Coleco Head to Head Basketball MP3403 TMS1100 1978, Marx Electronic Bowling -> elecbowl.c @MP3404 TMS1100 1978, Parker Brothers Merlin @@ -730,7 +731,7 @@ void hh_tms1k_state::ebball_display() // R8 is a 7seg m_display_segmask[8] = 0x7f; - display_matrix(7, 9, m_o, m_r); + display_matrix(7, 9, ~m_o, m_r); } WRITE16_MEMBER(hh_tms1k_state::ebball_write_r) @@ -750,7 +751,7 @@ WRITE16_MEMBER(hh_tms1k_state::ebball_write_o) { // O0-O6: led row // O7: N/C - m_o = ~data; + m_o = data; ebball_display(); } @@ -848,7 +849,7 @@ void hh_tms1k_state::ebball2_display() for (int y = 0; y < 3; y++) m_display_segmask[y] = 0x7f; - display_matrix(8, 10, m_o, m_r); + display_matrix(8, 10, ~m_o, m_r ^ 0x7f); } WRITE16_MEMBER(hh_tms1k_state::ebball2_write_r) @@ -860,14 +861,14 @@ WRITE16_MEMBER(hh_tms1k_state::ebball2_write_r) m_speaker->level_w(data >> 10 & 1); // R0-R9: led columns - m_r = data ^ 0x7f; + m_r = data; ebball2_display(); } WRITE16_MEMBER(hh_tms1k_state::ebball2_write_o) { // O0-O7: led row/segment - m_o = ~data; + m_o = data; ebball2_display(); } diff --git a/src/mess/drivers/mbdtower.c b/src/mess/drivers/mbdtower.c index c7c35a4ab75..b591dc81ec4 100644 --- a/src/mess/drivers/mbdtower.c +++ b/src/mess/drivers/mbdtower.c @@ -4,7 +4,9 @@ Milton Bradley Dark Tower * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C), die labeled MP7332 + (assume same ROM contents between revisions) * SN75494N MOS-to-LED digit driver + * rotating reel + lightsensor x @@ -22,13 +24,20 @@ public: { } void mbdtower_display(); + bool sensor_led_on() { return m_display_decay[0][0] != 0; } + + int m_motor_pos; + int m_motor_pos_prev; + int m_motor_decay; + bool m_motor_on; + bool m_sensor_blind; + + TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); + DECLARE_WRITE16_MEMBER(write_r); DECLARE_WRITE16_MEMBER(write_o); DECLARE_READ8_MEMBER(read_k); - bool m_motor_on; - bool m_sensor; - protected: virtual void machine_start(); }; @@ -36,27 +45,104 @@ protected: /*************************************************************************** - I/O + Display, Motor ***************************************************************************/ void mbdtower_state::mbdtower_display() { + // declare display matrix size and the 2 7segs + m_display_maxx = 7; + m_display_maxy = 3; + m_display_segmask[1] = m_display_segmask[2] = 0x7f; + + // update current state + if (~m_r & 0x10) + { + UINT8 o = BITSWAP8(m_o,7,0,4,3,2,1,6,5) & 0x7f; + m_display_state[2] = (m_o & 0x80) ? o : 0; + m_display_state[1] = (m_o & 0x80) ? 0 : o; + m_display_state[0] = (m_r >> 8 & 1) | (m_r >> 4 & 0xe); + + display_update(); + } + else + { + // display items turned off + display_matrix(7, 3, 0, 0); + } } +TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) +{ + // it rotates counter-clockwise (when viewed from above) + if (m_motor_on) + { + m_motor_pos = (m_motor_pos - 1) & 0x7f; + + // give it some time to spin out when it's turned off + if (m_r & 0x200) + m_motor_decay += (m_motor_decay < 6); + else if (m_motor_decay > 0) + m_motor_decay--; + else + m_motor_on = false; + } + + // 8 evenly spaced holes in the rotation disc for the sensor to 'see' through. + // The first hole is much bigger, enabling the game to determine the position. + if ((m_motor_pos & 0xf) < 4 || m_motor_pos < 0xc) + m_sensor_blind = false; + else + m_sensor_blind = true; + + // on change, output info + if (m_motor_pos != m_motor_pos_prev) + output_set_value("motor_pos", 100 * (m_motor_pos / (float)0x80)); + + /* 3 display cards per hole, like this: + + (0) <---- display increments this way <---- (7) + + VICTORY WIZARD DRAGON GOLD KEY SCOUT WARRIOR (void) CURSED + WARRIORS BAZAAR CLOSED SWORD SILVER KEY HEALER FOOD (void) LOST + BRIGANDS KEY MISSING PEGASUS BRASS KEY GOLD BEAST (void) PLAGUE + */ + int card_pos = m_motor_pos >> 4 & 7; + if (card_pos != (m_motor_pos_prev >> 4 & 7)) + output_set_value("card_pos", card_pos); + + m_motor_pos_prev = m_motor_pos; +} + + + +/*************************************************************************** + + I/O + +***************************************************************************/ + WRITE16_MEMBER(mbdtower_state::write_r) { // R0-R2: input mux m_inp_mux = data & 7; + // R9: motor on + if ((m_r ^ data) & 0x200) + output_set_value("motor_on", data >> 9 & 1); + if (data & 0x200) + m_motor_on = true; + // R3: N/C - // R4: 75494 enable (speaker, lamps, digit select go through that IC) + // R4: 75494 /EN (speaker, lamps, digit select go through that IC) // R5-R7: tower lamps // R8: rotation sensor led - // R9: motor on + m_r = data; + mbdtower_display(); // R10: speaker out - m_speaker->level_w(data >> 10 & 1); + m_speaker->level_w(~data >> 4 & data >> 10 & 1); } WRITE16_MEMBER(mbdtower_state::write_o) @@ -64,22 +150,16 @@ WRITE16_MEMBER(mbdtower_state::write_o) // O0-O6: led segments A-G // O7: digit select m_o = data; + mbdtower_display(); } - READ8_MEMBER(mbdtower_state::read_k) { // rotation sensor is on K8 - - return read_inputs(3); + return read_inputs(3) | ((!m_sensor_blind && sensor_led_on()) ? 8 : 0); } -/* tower motor simulation: - -*/ - - /*************************************************************************** @@ -138,15 +218,20 @@ void mbdtower_state::machine_start() hh_tms1k_state::machine_start(); // zerofill/register for savestates + m_motor_pos = 0; + m_motor_pos_prev = -1; + m_motor_decay = 0; m_motor_on = false; - m_sensor = false; + m_sensor_blind = false; + save_item(NAME(m_motor_pos)); + /* save_item(NAME(m_motor_pos_prev)); */ // don't save! + save_item(NAME(m_motor_decay)); save_item(NAME(m_motor_on)); - save_item(NAME(m_sensor)); + save_item(NAME(m_sensor_blind)); } - static MACHINE_CONFIG_START( mbdtower, mbdtower_state ) /* basic machine hardware */ @@ -155,6 +240,7 @@ static MACHINE_CONFIG_START( mbdtower, mbdtower_state ) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mbdtower_state, write_r)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mbdtower_state, write_o)) + MCFG_TIMER_DRIVER_ADD_PERIODIC("tower_motor", mbdtower_state, motor_sim_tick, attotime::from_msec(3500/0x80)) // ~3.5sec for a full rotation MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_mbdtower) @@ -168,7 +254,6 @@ MACHINE_CONFIG_END - /*************************************************************************** Game driver(s) @@ -187,4 +272,3 @@ ROM_END CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, driver_device, 0, "Milton Bradley", "Dark Tower (Milton Bradley)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) - diff --git a/src/mess/layout/mbdtower.lay b/src/mess/layout/mbdtower.lay index 940ef1a955e..aff46ef4eff 100644 --- a/src/mess/layout/mbdtower.lay +++ b/src/mess/layout/mbdtower.lay @@ -5,6 +5,10 @@ + + + + @@ -14,6 +18,9 @@ + + + From 971e1cdd86385b2030bf4b85068674e37398cf5f Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 24 Mar 2015 20:52:04 +0100 Subject: [PATCH 199/201] notes --- src/mess/drivers/elecbowl.c | 4 +++- src/mess/drivers/mbdtower.c | 16 +++++++++++++--- src/mess/drivers/tispeak.c | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/mess/drivers/elecbowl.c b/src/mess/drivers/elecbowl.c index c4be40e64e2..ae1e750924a 100644 --- a/src/mess/drivers/elecbowl.c +++ b/src/mess/drivers/elecbowl.c @@ -2,6 +2,8 @@ // copyright-holders:hap, Kevin Horton /*************************************************************************** + ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.c) ** + Marx Series 300 Electronic Bowling Game * TMS1100NLL MP3403 DBS 7836 SINGAPORE @@ -158,4 +160,4 @@ ROM_START( elecbowl ) ROM_END -CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, driver_device, 0, "Marx", "Electronic Bowling", GAME_SUPPORTS_SAVE | GAME_MECHANICAL | GAME_NOT_WORKING ) +CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, driver_device, 0, "Marx", "Electronic Bowling (Marx)", GAME_SUPPORTS_SAVE | GAME_MECHANICAL | GAME_NOT_WORKING ) diff --git a/src/mess/drivers/mbdtower.c b/src/mess/drivers/mbdtower.c index b591dc81ec4..802db8e59dd 100644 --- a/src/mess/drivers/mbdtower.c +++ b/src/mess/drivers/mbdtower.c @@ -2,13 +2,22 @@ // copyright-holders:hap, Sean Riddle /*************************************************************************** + ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.c) ** + Milton Bradley Dark Tower * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C), die labeled MP7332 (assume same ROM contents between revisions) * SN75494N MOS-to-LED digit driver * rotating reel + lightsensor - x + This is a board game, it obviously requires game pieces and the board. + The emulated part is the centerpiece, a black tower with a rotating card + panel and LED digits for displaying health, amount of gold, etc. As far + as MESS is concerned, the game works fine. + + To start up the game, first press [MOVE], the machine now does a self-test. + Then select level and number of players and the game will start. Read the + official manual on how to play the game. ***************************************************************************/ @@ -73,6 +82,7 @@ void mbdtower_state::mbdtower_display() } } + TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) { // it rotates counter-clockwise (when viewed from above) @@ -235,7 +245,7 @@ void mbdtower_state::machine_start() static MACHINE_CONFIG_START( mbdtower, mbdtower_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1400, 400000) // approximation - RC osc. R=43K, C=56pf, but unknown RC curve + MCFG_CPU_ADD("maincpu", TMS1400, 425000) // approximation - RC osc. R=43K, C=56pf, but unknown RC curve MCFG_TMS1XXX_READ_K_CB(READ8(mbdtower_state, read_k)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mbdtower_state, write_r)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mbdtower_state, write_o)) @@ -271,4 +281,4 @@ ROM_START( mbdtower ) ROM_END -CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, driver_device, 0, "Milton Bradley", "Dark Tower (Milton Bradley)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) +CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, driver_device, 0, "Milton Bradley", "Dark Tower (Milton Bradley)", GAME_SUPPORTS_SAVE | GAME_MECHANICAL | GAME_NOT_WORKING ) diff --git a/src/mess/drivers/tispeak.c b/src/mess/drivers/tispeak.c index 8e84bf335dc..cc2b432106f 100644 --- a/src/mess/drivers/tispeak.c +++ b/src/mess/drivers/tispeak.c @@ -801,7 +801,7 @@ static MACHINE_CONFIG_START( snmath, tispeak_state ) MCFG_TMS5110_ADDR_CB(DEVWRITE8("tms6100", tms6100_device, tms6100_addr_w)) MCFG_TMS5110_DATA_CB(DEVREADLINE("tms6100", tms6100_device, tms6100_data_r)) MCFG_TMS5110_ROMCLK_CB(DEVWRITELINE("tms6100", tms6100_device, tms6100_romclock_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( snspell, snmath ) From a22a633e23de825b804d3782effe38ea037f566f Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Tue, 24 Mar 2015 23:57:37 +0100 Subject: [PATCH 200/201] Global layer clearance is at 0x10 bits 4-5 (nw) --- src/mame/drivers/ttchamp.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/ttchamp.c b/src/mame/drivers/ttchamp.c index 9e97e878c6f..1566f15d97b 100644 --- a/src/mame/drivers/ttchamp.c +++ b/src/mame/drivers/ttchamp.c @@ -205,7 +205,7 @@ UINT32 ttchamp_state::screen_update_ttchamp(screen_device &screen, bitmap_ind16 } } - +#if 0 for (int i = 0; i < 0x8000; i++) { // how are layers cleared? @@ -215,7 +215,8 @@ UINT32 ttchamp_state::screen_update_ttchamp(screen_device &screen, bitmap_ind16 // m_videoram1[i] = 0x0000; // m_videoram2[i] = 0x0000; } - +#endif + return 0; } @@ -381,7 +382,21 @@ READ16_MEMBER(ttchamp_state::ttchamp_blit_start_r) WRITE16_MEMBER(ttchamp_state::port10_w) { + UINT8 res; COMBINE_DATA(&m_port10); + + res = m_port10 & 0xf0; + /* Assume that both bits clears layers. */ + if(res == 0x30) + { + for (int i = 0; i < 0x8000; i++) + { + m_videoram0[i] = 0x0000; + m_videoram2[i] = 0x0000; + } + } + else if(res != 0) + printf("Check me, i/o 0x10 used with %02x\n",res); } WRITE16_MEMBER(ttchamp_state::port20_w) @@ -389,11 +404,11 @@ WRITE16_MEMBER(ttchamp_state::port20_w) printf("%06x: port20_w %04x %04x\n", space.device().safe_pc(), data, mem_mask); // seems to somehow be tied to layer clear // might also depend on layer selected with 0x10 tho? written after it - for (int i = 0; i < 0x8000; i++) + /*for (int i = 0; i < 0x8000; i++) { // m_videoram0[i] = 0x0000; m_videoram2[i] = 0x0000; - } + }*/ } From 159a234e0ec661f2c4859095e43c5fd6663b197d Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 25 Mar 2015 00:09:57 +0100 Subject: [PATCH 201/201] first rename lilprof to lilprof78 added Little Professor (1976 ver) --- src/mess/drivers/ticalc1x.c | 134 +++++++++++++++++++++++++++++------- src/mess/mess.lst | 1 + 2 files changed, 110 insertions(+), 25 deletions(-) diff --git a/src/mess/drivers/ticalc1x.c b/src/mess/drivers/ticalc1x.c index 679d62d550e..37d90600162 100644 --- a/src/mess/drivers/ticalc1x.c +++ b/src/mess/drivers/ticalc1x.c @@ -8,8 +8,8 @@ TODO: - - MCU clocks are unknown - - lilprof equals-sign is always on + - MCU clocks are unknown where noted + - lilprof78 equals-sign is always on ***************************************************************************/ @@ -70,7 +70,7 @@ public: void display_matrix_seg(int maxx, int maxy, UINT32 setx, UINT32 sety, UINT16 segmask); // calculator-specific handlers - void tisr16_display_update(); + void tisr16_display(); DECLARE_WRITE16_MEMBER(tisr16_write_o); DECLARE_WRITE16_MEMBER(tisr16_write_r); DECLARE_READ8_MEMBER(tisr16_read_k); @@ -84,9 +84,12 @@ public: DECLARE_READ8_MEMBER(wizatron_read_k); DECLARE_WRITE16_MEMBER(lilprof_write_o); - DECLARE_WRITE16_MEMBER(lilprof_write_r); DECLARE_READ8_MEMBER(lilprof_read_k); + DECLARE_WRITE16_MEMBER(lilprof78_write_o); + DECLARE_WRITE16_MEMBER(lilprof78_write_r); + DECLARE_READ8_MEMBER(lilprof78_read_k); + DECLARE_WRITE16_MEMBER(ti30_write_o); DECLARE_WRITE16_MEMBER(ti30_write_r); DECLARE_READ8_MEMBER(ti30_read_k); @@ -256,7 +259,7 @@ INPUT_CHANGED_MEMBER(ticalc1x_state::power_button) ***************************************************************************/ -void ticalc1x_state::tisr16_display_update() +void ticalc1x_state::tisr16_display() { // update leds state for (int y = 0; y < 11; y++) @@ -275,14 +278,14 @@ WRITE16_MEMBER(ticalc1x_state::tisr16_write_r) // R0-R10: input mux // R0-R10: select digit (right-to-left) m_r = m_inp_mux = data; - tisr16_display_update(); + tisr16_display(); } WRITE16_MEMBER(ticalc1x_state::tisr16_write_o) { // O0-O7: digit segments m_o = data; - tisr16_display_update(); + tisr16_display(); } READ8_MEMBER(ticalc1x_state::tisr16_read_k) @@ -475,12 +478,17 @@ MACHINE_CONFIG_END WRITE16_MEMBER(ticalc1x_state::wizatron_write_r) { - // note: 6th digit is custom(not 7seg), for math symbols, and 3rd digit - // only has A and G for =, though some newer revisions use a custom digit too. + // 6th digit is custom(not 7seg), for math symbols, like this: + // \./ GAB + // --- F + // /.\ EDC + + // 3rd digit only has A and G for =, though some newer hardware revisions + // (goes for both wizatron and lilprof) use a custom equals-sign digit here m_display_segmask[3] = 0x41; // R0-R8: select digit (right-to-left) - display_matrix_seg(8, 9, m_o, data, 0x7f); + display_matrix_seg(7, 9, m_o, data, 0x7f); } WRITE16_MEMBER(ticalc1x_state::wizatron_write_o) @@ -500,7 +508,7 @@ READ8_MEMBER(ticalc1x_state::wizatron_read_k) static INPUT_PORTS_START( wizatron ) PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("CLEAR") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") @@ -547,12 +555,72 @@ MACHINE_CONFIG_END /*************************************************************************** - TI Little Professor '78 + TI Little Professor (1976 version) + * TMS0970 MCU labeled TMS0975NL ZA0356, GP0975CS. die labeled 0970D-75C + + The hardware is nearly identical to Wiz-A-Tron (or vice versa, since this + one is older). + +***************************************************************************/ + +WRITE16_MEMBER(ticalc1x_state::lilprof_write_o) +{ + // O1-O4,O7: input mux + // O0-O6: digit segments A-G + m_inp_mux = (data >> 1 & 0xf) | (data >> 3 & 0x10); + m_o = data; +} + +READ8_MEMBER(ticalc1x_state::lilprof_read_k) +{ + return read_inputs(5); +} + + +static INPUT_PORTS_START( lilprof ) + PORT_INCLUDE( wizatron ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.4") // O7 + PORT_CONFNAME( 0x0f, 0x01, "Level") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( lilprof, ticalc1x_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", TMS0970, 250000) // guessed + MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, wizatron_write_r)) + + MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) + MCFG_DEFAULT_LAYOUT(layout_wizatron) + + /* no video! */ + + /* no sound! */ +MACHINE_CONFIG_END + + + + + +/*************************************************************************** + + TI Little Professor (1978 version, same as 1980 version) * TMS1990 MCU labeled TMC1993NL. die labeled 1990C-c3C ***************************************************************************/ -WRITE16_MEMBER(ticalc1x_state::lilprof_write_r) +WRITE16_MEMBER(ticalc1x_state::lilprof78_write_r) { // update leds state UINT8 o = BITSWAP8(m_o,7,4,3,2,1,0,6,5) & 0x7f; @@ -564,15 +632,15 @@ WRITE16_MEMBER(ticalc1x_state::lilprof_write_r) // 3rd digit A/G(equals sign) is from O7 m_display_state[3] = (m_o & 0x80) ? 0x41 : 0; - // 6th digit is a custom 7seg for math symbols + // 6th digit is a custom 7seg for math symbols (see wizatron_write_r) m_display_state[6] = BITSWAP8(m_display_state[6],7,6,1,4,2,3,5,0); - m_display_maxx = 8; + m_display_maxx = 7; m_display_maxy = 9; display_update(); } -WRITE16_MEMBER(ticalc1x_state::lilprof_write_o) +WRITE16_MEMBER(ticalc1x_state::lilprof78_write_o) { // O0-O3,O5: input mux // O0-O6: digit segments A-G @@ -581,13 +649,13 @@ WRITE16_MEMBER(ticalc1x_state::lilprof_write_o) m_o = data; } -READ8_MEMBER(ticalc1x_state::lilprof_read_k) +READ8_MEMBER(ticalc1x_state::lilprof78_read_k) { return read_inputs(5); } -static INPUT_PORTS_START( lilprof ) +static INPUT_PORTS_START( lilprof78 ) PORT_START("IN.0") // O0 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") @@ -621,13 +689,13 @@ static INPUT_PORTS_START( lilprof ) INPUT_PORTS_END -static MACHINE_CONFIG_START( lilprof, ticalc1x_state ) +static MACHINE_CONFIG_START( lilprof78, ticalc1x_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", TMS1990, 250000) // guessed - MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof_read_k)) - MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof_write_o)) - MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof_write_r)) + MCFG_TMS1XXX_READ_K_CB(READ8(ticalc1x_state, lilprof78_read_k)) + MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ticalc1x_state, lilprof78_write_o)) + MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ticalc1x_state, lilprof78_write_r)) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", ticalc1x_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_wizatron) @@ -895,7 +963,7 @@ ROM_END ROM_START( ti1270 ) ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms0974nl", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) + ROM_LOAD( "za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) ROM_REGION( 782, "maincpu:ipla", 0 ) ROM_LOAD( "tms0970_ti1270_ipla.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) @@ -910,7 +978,7 @@ ROM_END ROM_START( wizatron ) ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "dp0907bs", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) + ROM_LOAD( "za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) ROM_REGION( 782, "maincpu:ipla", 0 ) ROM_LOAD( "tms0970_wizatron_ipla.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) @@ -924,6 +992,21 @@ ROM_END ROM_START( lilprof ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_lilprof_ipla.pla", 0, 782, BAD_DUMP CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) // not verified + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_lilprof_mpla.pla", 0, 860, BAD_DUMP CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) // not verified + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0970_lilprof_opla.pla", 0, 352, BAD_DUMP CRC(c74daf97) SHA1(c4948000196171b34d4fe9cdd2962a945da9883d) ) // not verified + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0970_lilprof_spla.pla", 0, 157, CRC(56c37a4f) SHA1(18ecc20d2666e89673739056483aed5a261ae927) ) +ROM_END + + +ROM_START( lilprof78 ) ROM_REGION( 0x0400, "maincpu", 0 ) ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) @@ -989,7 +1072,8 @@ COMP( 1974, tisr16, 0, 0, tisr16, tisr16, driver_device, 0, "Tex COMP( 1976, ti1270, 0, 0, ti1270, ti1270, driver_device, 0, "Texas Instruments", "TI-1270", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, wizatron, 0, 0, wizatron, wizatron, driver_device, 0, "Texas Instruments", "Wiz-A-Tron", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) -COMP( 1978, lilprof, 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor (1978 version)", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) // original is from 1976 +COMP( 1976, lilprof, 0, 0, lilprof, lilprof, driver_device, 0, "Texas Instruments", "Little Professor (1976 version)", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) +COMP( 1978, lilprof78, lilprof, 0, lilprof78, lilprof78, driver_device, 0, "Texas Instruments", "Little Professor (1978 version)", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1976, ti30, 0, 0, ti30, ti30, driver_device, 0, "Texas Instruments", "TI-30", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) COMP( 1977, tiprog, 0, 0, ti30, tiprog, driver_device, 0, "Texas Instruments", "TI Programmer", GAME_SUPPORTS_SAVE | GAME_NO_SOUND_HW ) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 35b59572ef8..643bd5452b8 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -1086,6 +1086,7 @@ tiprog tibusan1 wizatron lilprof +lilprof78 ti73 // 1990 TI-73 ti74 // 1985 TI-74 ti95 // 1986 TI-95