/*************************************************************************** New York! New York! hardware Games Supported: * New York! New York! (2 sets) * Waga Seishun no Arcadia Known issues/to-do's: * What does port A on IC37 AY8910 do? It looks like a DAC, but this is not supported by the writes to the port. All the writes are 0x9X, usually 0x9b or 0x9d. Note that this is incorrectly referred to as port B on the schematics, but the pin #'s confirm it is, in fact port A. * What is the main CPU clock? 11.2Mhz / 16 goes through a MC4044 and a MC4024 analog chips before going to the EXTAL pin of the M6809 Notes: * The Sigma set has Japanese voice samples, while the Gottlieb one is English * In cocktail mode New York! New York! programs the CRTC with an incorrect value. Interestingly, when the Flip Screen DIP is set, the value programmed is correct. This bug does not exist in Waga Seishun no Arcadia * The Crosshatch switch only works on the title screen * The Service Mode switch, which displays the total number of credits stored in the NVRAM, only works on the "Start Game" screen after a coin has been insered. Hold down the key to display the coin count * The schematics mixed up port A and B on both AY-8910 Memory map main cpu (m6809) fedcba98 -------- 000xxxxx we1 $0000 8k (bitmap) 100xxxxx we1 $8000 8k (ram) 010xxxxx we2 $4000 8k (bitmap) 110xxxxx we2 $C000 8k (ram) 001xxxxx we3 $2000 16k x 3bits (color) 011xxxxx we4 $6000 16k x 3bits (color) 10100000 SRAM $A000 (HB4334P 1024-byte SRAM, but A8/A9 are always 0) 10100001 CRTC $A100 10100010 PIA $A200 10100011 SOUND $A300 one latch for read one for write same address 10101xxx ROM7 $A800 10110xxx ROM6 $B000 10111xxx ROM5 $B800 11100xxx ROM4 $E000 11101xxx ROM3 $E800 11110xxx ROM2 $F000 11111xxx ROM1 $F800 ***************************************************************************/ #include "emu.h" #include "machine/rescap.h" #include "machine/6821pia.h" #include "machine/74123.h" #include "video/mc6845.h" #include "cpu/m6800/m6800.h" #include "cpu/m6809/m6809.h" #include "sound/ay8910.h" #include "sound/dac.h" #include "machine/nvram.h" #define MAIN_CPU_MASTER_CLOCK XTAL_11_2MHz #define PIXEL_CLOCK (MAIN_CPU_MASTER_CLOCK / 2) #define CRTC_CLOCK (MAIN_CPU_MASTER_CLOCK / 16) #define AUDIO_1_MASTER_CLOCK XTAL_4MHz #define AUDIO_CPU_1_CLOCK AUDIO_1_MASTER_CLOCK #define AUDIO_2_MASTER_CLOCK XTAL_4MHz #define AUDIO_CPU_2_CLOCK AUDIO_2_MASTER_CLOCK #define NUM_PENS 8 class nyny_state : public driver_device { public: nyny_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } /* memory pointers */ UINT8 * m_videoram1; UINT8 * m_videoram2; UINT8 * m_colorram1; UINT8 * m_colorram2; /* video-related */ int m_flipscreen; UINT8 m_star_enable; UINT16 m_star_delay_counter; UINT16 m_star_shift_reg; /* devices */ device_t *m_maincpu; device_t *m_audiocpu; device_t *m_audiocpu2; device_t *m_ic48_1; mc6845_device *m_mc6845; pia6821_device *m_pia1; pia6821_device *m_pia2; pen_t m_pens[NUM_PENS]; }; /************************************* * * Prototypes * *************************************/ static WRITE_LINE_DEVICE_HANDLER( flipscreen_w ); static WRITE8_HANDLER( audio_2_command_w ); /************************************* * * Interrupt generation * *************************************/ static WRITE_LINE_DEVICE_HANDLER( main_cpu_irq ) { nyny_state *driver_state = device->machine().driver_data(); int combined_state = driver_state->m_pia1->irq_a_state() | driver_state->m_pia1->irq_b_state() | driver_state->m_pia2->irq_b_state(); device_set_input_line(driver_state->m_maincpu, M6809_IRQ_LINE, combined_state ? ASSERT_LINE : CLEAR_LINE); } static WRITE_LINE_DEVICE_HANDLER( main_cpu_firq ) { nyny_state *driver_state = device->machine().driver_data(); device_set_input_line(driver_state->m_maincpu, M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); } /************************************* * * PIA1 * *************************************/ static INTERRUPT_GEN( update_pia_1 ) { nyny_state *state = device->machine().driver_data(); /* update the different PIA pins from the input ports */ /* CA1 - copy of PA0 (COIN1) */ state->m_pia1->ca1_w(input_port_read(device->machine(), "IN0") & 0x01); /* CA2 - copy of PA1 (SERVICE1) */ state->m_pia1->ca2_w(input_port_read(device->machine(), "IN0") & 0x02); /* CB1 - (crosshatch) */ state->m_pia1->cb1_w(input_port_read(device->machine(), "CROSS")); /* CB2 - NOT CONNECTED */ } static const pia6821_interface pia_1_intf = { DEVCB_INPUT_PORT("IN0"), /* port A in */ DEVCB_INPUT_PORT("IN1"), /* port B in */ DEVCB_NULL, /* line CA1 in */ DEVCB_NULL, /* line CB1 in */ DEVCB_NULL, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_NULL, /* port A out */ DEVCB_NULL, /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_NULL, /* port CB2 out */ DEVCB_LINE(main_cpu_irq), /* IRQA */ DEVCB_LINE(main_cpu_irq) /* IRQB */ }; /************************************* * * PIA2 * *************************************/ static WRITE8_DEVICE_HANDLER( pia_2_port_a_w ) { nyny_state *state = device->machine().driver_data(); state->m_star_delay_counter = (state->m_star_delay_counter & 0x0f00) | data; } static WRITE8_DEVICE_HANDLER( pia_2_port_b_w ) { nyny_state *state = device->machine().driver_data(); /* bits 0-3 go to bits 8-11 of the star delay counter */ state->m_star_delay_counter = (state->m_star_delay_counter & 0x00ff) | ((data & 0x0f) << 8); /* bit 4 is star field enable */ state->m_star_enable = data & 0x10; /* bits 5-7 go to the music board connector */ audio_2_command_w(state->m_maincpu->memory().space(AS_PROGRAM), 0, data & 0xe0); } static const pia6821_interface pia_2_intf = { DEVCB_NULL, /* port A in */ DEVCB_NULL, /* port B in */ DEVCB_NULL, /* line CA1 in */ DEVCB_NULL, /* line CB1 in */ DEVCB_NULL, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_HANDLER(pia_2_port_a_w), /* port A out */ DEVCB_HANDLER(pia_2_port_b_w), /* port B out */ DEVCB_LINE(flipscreen_w), /* line CA2 out */ DEVCB_NULL, /* port CB2 out */ DEVCB_LINE(main_cpu_firq), /* IRQA */ DEVCB_LINE(main_cpu_irq) /* IRQB */ }; /************************************* * * IC48 #1 - 74123 * * This timer is responsible for * delaying the setting of PIA2's * CA1 line. This delay ensures that * CA1 is only changed in the VBLANK * region, but not in HBLANK * *************************************/ static WRITE8_DEVICE_HANDLER( ic48_1_74123_output_changed ) { nyny_state *state = device->machine().driver_data(); state->m_pia2->ca1_w(data); } static const ttl74123_interface ic48_1_config = { TTL74123_GROUNDED, /* the hook up type */ RES_K(22), /* resistor connected to RCext */ CAP_U(0.01), /* capacitor connected to Cext and RCext */ 1, /* A pin - driven by the CRTC */ 1, /* B pin - pulled high */ 1, /* Clear pin - pulled high */ ic48_1_74123_output_changed }; /************************************* * * Video system * *************************************/ static WRITE_LINE_DEVICE_HANDLER( flipscreen_w ) { nyny_state *driver_state = device->machine().driver_data(); driver_state->m_flipscreen = state ? 0 : 1; } static MC6845_BEGIN_UPDATE( begin_update ) { nyny_state *state = device->machine().driver_data(); /* create the pens */ offs_t i; for (i = 0; i < NUM_PENS; i++) { state->m_pens[i] = MAKE_RGB(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2)); } return state->m_pens; } static MC6845_UPDATE_ROW( update_row ) { nyny_state *state = device->machine().driver_data(); UINT8 cx; pen_t *pens = (pen_t *)param; UINT8 x = 0; for (cx = 0; cx < x_count; cx++) { int i; UINT8 data1, data2, color1, color2; /* the memory is hooked up to the MA, RA lines this way */ offs_t offs = ((ma << 5) & 0x8000) | ((ma << 3) & 0x1f00) | ((ra << 5) & 0x00e0) | ((ma << 0) & 0x001f); if (state->m_flipscreen) offs = offs ^ 0x9fff; data1 = state->m_videoram1[offs]; data2 = state->m_videoram2[offs]; color1 = state->m_colorram1[offs] & 0x07; color2 = state->m_colorram2[offs] & 0x07; for (i = 0; i < 8; i++) { UINT8 bit1, bit2, color; if (state->m_flipscreen) { bit1 = BIT(data1, 7); bit2 = BIT(data2, 7); data1 = data1 << 1; data2 = data2 << 1; } else { bit1 = BIT(data1, 0); bit2 = BIT(data2, 0); data1 = data1 >> 1; data2 = data2 >> 1; } /* plane 1 has priority over plane 2 */ if (bit1) color = color1; else color = bit2 ? color2 : 0; *BITMAP_ADDR32(bitmap, y, x) = pens[color]; x += 1; } ma += 1; } } INLINE void shift_star_generator( running_machine &machine ) { nyny_state *state = machine.driver_data(); state->m_star_shift_reg = (state->m_star_shift_reg << 1) | (((~state->m_star_shift_reg >> 15) & 0x01) ^ ((state->m_star_shift_reg >> 2) & 0x01)); } static MC6845_END_UPDATE( end_update ) { nyny_state *state = device->machine().driver_data(); /* draw the star field into the bitmap */ int y; pen_t *pens = (pen_t *)param; UINT16 delay_counter = state->m_star_delay_counter; for (y = cliprect->min_y; y <= cliprect->max_y; y++) { int x; for (x = cliprect->min_x; x <= cliprect->max_x; x++) { /* check if the star status */ if (state->m_star_enable && (*BITMAP_ADDR32(bitmap, y, x) == pens[0]) && ((state->m_star_shift_reg & 0x80ff) == 0x00ff) && (((y & 0x01) ^ state->m_flipscreen) ^ (((x & 0x08) >> 3) ^ state->m_flipscreen))) { UINT8 color = ((state->m_star_shift_reg & 0x0100) >> 8) | /* R */ ((state->m_star_shift_reg & 0x0400) >> 9) | /* G */ ((state->m_star_shift_reg & 0x1000) >> 10); /* B */ *BITMAP_ADDR32(bitmap, y, x) = pens[color]; } if (delay_counter == 0) shift_star_generator(device->machine()); else delay_counter = delay_counter - 1; } } } static WRITE_LINE_DEVICE_HANDLER( display_enable_changed ) { nyny_state *driver_state = device->machine().driver_data(); ttl74123_a_w(driver_state->m_ic48_1, 0, state); } static const mc6845_interface mc6845_intf = { "screen", /* screen we are acting on */ 8, /* number of pixels per video memory address */ begin_update, /* before pixel update callback */ update_row, /* row update callback */ end_update, /* after pixel update callback */ DEVCB_LINE(display_enable_changed), /* callback for display state changes */ DEVCB_NULL, /* callback for cursor state changes */ DEVCB_NULL, /* HSYNC callback */ DEVCB_NULL, /* VSYNC callback */ NULL /* update address callback */ }; static SCREEN_UPDATE( nyny ) { nyny_state *state = screen->machine().driver_data(); state->m_mc6845->update(bitmap, cliprect); return 0; } /************************************* * * Audio system - CPU 1 * *************************************/ static WRITE8_HANDLER( audio_1_command_w ) { nyny_state *state = space->machine().driver_data(); soundlatch_w(space, 0, data); device_set_input_line(state->m_audiocpu, M6800_IRQ_LINE, HOLD_LINE); } static WRITE8_HANDLER( audio_1_answer_w ) { nyny_state *state = space->machine().driver_data(); soundlatch3_w(space, 0, data); device_set_input_line(state->m_maincpu, M6809_IRQ_LINE, HOLD_LINE); } static WRITE8_DEVICE_HANDLER( nyny_ay8910_37_port_a_w ) { /* not sure what this does */ /*logerror("%x PORT A write %x at Y=%x X=%x\n", cpu_get_pc(&space->device()), data, space->machine().primary_screen->vpos(), space->machine().primary_screen->hpos());*/ } static const ay8910_interface ay8910_37_interface = { AY8910_LEGACY_OUTPUT, AY8910_DEFAULT_LOADS, DEVCB_NULL, DEVCB_NULL, DEVCB_HANDLER(nyny_ay8910_37_port_a_w), DEVCB_DEVICE_HANDLER("dac", dac_w) }; static const ay8910_interface ay8910_64_interface = { AY8910_LEGACY_OUTPUT, AY8910_DEFAULT_LOADS, DEVCB_INPUT_PORT("SW2"), DEVCB_INPUT_PORT("SW1"), DEVCB_NULL, DEVCB_NULL }; /************************************* * * Audio system - CPU 2 * *************************************/ static WRITE8_HANDLER( audio_2_command_w ) { nyny_state *state = space->machine().driver_data(); soundlatch2_w(space, 0, (data & 0x60) >> 5); device_set_input_line(state->m_audiocpu2, M6800_IRQ_LINE, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); } /************************************* * * Memory handlers * *************************************/ static READ8_HANDLER( nyny_pia_1_2_r ) { nyny_state *state = space->machine().driver_data(); UINT8 ret = 0; /* the address bits are directly connected to the chip selects */ if (BIT(offset, 2)) ret = state->m_pia1->read(*memory_nonspecific_space(space->machine()), offset & 0x03); if (BIT(offset, 3)) ret = state->m_pia2->read_alt(*memory_nonspecific_space(space->machine()), offset & 0x03); return ret; } static WRITE8_HANDLER( nyny_pia_1_2_w ) { nyny_state *state = space->machine().driver_data(); /* the address bits are directly connected to the chip selects */ if (BIT(offset, 2)) state->m_pia1->write(*memory_nonspecific_space(space->machine()), offset & 0x03, data); if (BIT(offset, 3)) state->m_pia2->write_alt(*memory_nonspecific_space(space->machine()), offset & 0x03, data); } static ADDRESS_MAP_START( nyny_main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_RAM AM_BASE_MEMBER(nyny_state, m_videoram1) AM_RANGE(0x2000, 0x3fff) AM_RAM AM_BASE_MEMBER(nyny_state, m_colorram1) AM_RANGE(0x4000, 0x5fff) AM_RAM AM_BASE_MEMBER(nyny_state, m_videoram2) AM_RANGE(0x6000, 0x7fff) AM_RAM AM_BASE_MEMBER(nyny_state, m_colorram2) AM_RANGE(0x8000, 0x9fff) AM_RAM AM_RANGE(0xa000, 0xa0ff) AM_RAM AM_SHARE("nvram") /* SRAM (coin counter, shown when holding F2) */ AM_RANGE(0xa100, 0xa100) AM_MIRROR(0x00fe) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) AM_RANGE(0xa101, 0xa101) AM_MIRROR(0x00fe) AM_DEVWRITE_MODERN("crtc", mc6845_device, register_w) AM_RANGE(0xa200, 0xa20f) AM_MIRROR(0x00f0) AM_READWRITE(nyny_pia_1_2_r, nyny_pia_1_2_w) AM_RANGE(0xa300, 0xa300) AM_MIRROR(0x00ff) AM_READWRITE(soundlatch3_r, audio_1_command_w) AM_RANGE(0xa400, 0xa7ff) AM_NOP AM_RANGE(0xa800, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xdfff) AM_RAM AM_RANGE(0xe000, 0xffff) AM_ROM ADDRESS_MAP_END static ADDRESS_MAP_START( nyny_audio_1_map, AS_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x007f) AM_RAM /* internal RAM */ AM_RANGE(0x0080, 0x0fff) AM_NOP AM_RANGE(0x1000, 0x1000) AM_MIRROR(0x0fff) AM_READWRITE(soundlatch_r, audio_1_answer_w) AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x0fff) AM_READ_PORT("SW3") AM_RANGE(0x3000, 0x3000) AM_MIRROR(0x0ffc) AM_DEVREAD("ay1", ay8910_r) AM_RANGE(0x3000, 0x3001) AM_MIRROR(0x0ffc) AM_DEVWRITE("ay1", ay8910_data_address_w) AM_RANGE(0x3002, 0x3002) AM_MIRROR(0x0ffc) AM_DEVREAD("ay2", ay8910_r) AM_RANGE(0x3002, 0x3003) AM_MIRROR(0x0ffc) AM_DEVWRITE("ay2", ay8910_data_address_w) AM_RANGE(0x4000, 0x4fff) AM_NOP AM_RANGE(0x5000, 0x57ff) AM_MIRROR(0x0800) AM_ROM AM_RANGE(0x6000, 0x67ff) AM_MIRROR(0x0800) AM_ROM AM_RANGE(0x7000, 0x77ff) AM_MIRROR(0x0800) AM_ROM ADDRESS_MAP_END static ADDRESS_MAP_START( nyny_audio_2_map, AS_PROGRAM, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x007f) AM_RAM /* internal RAM */ AM_RANGE(0x0080, 0x0fff) AM_NOP AM_RANGE(0x1000, 0x1000) AM_MIRROR(0x0fff) AM_READ(soundlatch2_r) AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x0ffe) AM_DEVREAD("ay3", ay8910_r) AM_RANGE(0x2000, 0x2001) AM_MIRROR(0x0ffe) AM_DEVWRITE("ay3", ay8910_data_address_w) AM_RANGE(0x3000, 0x6fff) AM_NOP AM_RANGE(0x7000, 0x77ff) AM_MIRROR(0x0800) AM_ROM ADDRESS_MAP_END /************************************* * * Port definition * *************************************/ static INPUT_PORTS_START( nyny ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) /* PIA0 PA0 */ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 ) /* PIA0 PA1 */ PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_HIGH) /* PIA0 PA2 */ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) /* PIA0 PA3 */ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL /* PIA0 PA4 */ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) /* PIA0 PA5 */ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 ) /* PIA0 PA6 */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL /* PIA0 PB0 */ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_COCKTAIL /* PIA0 PB1 */ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY /* PIA0 PB2 */ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY /* PIA0 PB3 */ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("SW1") PORT_DIPNAME( 0x03, 0x03, "Bombs from UFO (Screens 3+)" ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x00, "6" ) PORT_DIPSETTING( 0x03, "9" ) PORT_DIPSETTING( 0x02, "12" ) PORT_DIPNAME( 0x04, 0x00, "Bombs from UFO (Screens 1 and 2)" ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x04, "6" ) PORT_DIPSETTING( 0x00, "9" ) PORT_DIPNAME( 0x80, 0x80, "Voice Volume" ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x00, DEF_STR( Low ) ) PORT_DIPSETTING( 0x80, DEF_STR( High ) ) PORT_START("SW2") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) PORT_DIPNAME( 0x18, 0x00, "Bonus Game" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "No Bonus Game" ) PORT_DIPSETTING( 0x10, "5000" ) PORT_DIPSETTING( 0x00, "10000" ) PORT_DIPSETTING( 0x08, "15000" ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x00, "3000" ) PORT_DIPSETTING( 0x40, "5000" ) PORT_DIPNAME( 0x80, 0x80, "Bonus Life Awarded" ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x80, DEF_STR( Yes ) ) PORT_START("SW3") PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) PORT_DIPNAME( 0x02, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x02, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x1c, 0x00, "Vertical Screen Position" ) PORT_DIPLOCATION("SW3:3,4,5") PORT_DIPSETTING( 0x1c, "-1" ) PORT_DIPSETTING( 0x18, "-2" ) PORT_DIPSETTING( 0x14, "-3" ) PORT_DIPSETTING( 0x00, "Neutral" ) PORT_DIPSETTING( 0x04, "+1" ) PORT_DIPSETTING( 0x08, "+2" ) PORT_DIPSETTING( 0x0c, "+3" ) PORT_DIPNAME( 0xe0, 0x00, "Horizontal Screen Position" ) PORT_DIPLOCATION("SW3:6,7,8") PORT_DIPSETTING( 0xe0, "-1" ) PORT_DIPSETTING( 0xc0, "-2" ) PORT_DIPSETTING( 0xa0, "-3" ) PORT_DIPSETTING( 0x00, "Neutral" ) PORT_DIPSETTING( 0x60, "+1" ) PORT_DIPSETTING( 0x40, "+2" ) PORT_DIPSETTING( 0x20, "+3" ) PORT_START("CROSS") /* connected to PIA1 CB1 input */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("PS1 (Crosshatch)") PORT_CODE(KEYCODE_F1) INPUT_PORTS_END /************************************* * * Machine start & reset * *************************************/ static MACHINE_START( nyny ) { nyny_state *state = machine.driver_data(); state->m_maincpu = machine.device("maincpu"); state->m_audiocpu = machine.device("audiocpu"); state->m_audiocpu2 = machine.device("audio2"); state->m_ic48_1 = machine.device("ic48_1"); state->m_mc6845 = machine.device("crtc"); state->m_pia1 = machine.device("pia1"); state->m_pia2 = machine.device("pia2"); /* setup for save states */ state->save_item(NAME(state->m_flipscreen)); state->save_item(NAME(state->m_star_enable)); state->save_item(NAME(state->m_star_delay_counter)); state->save_item(NAME(state->m_star_shift_reg)); } static MACHINE_RESET( nyny ) { nyny_state *state = machine.driver_data(); state->m_flipscreen = 0; state->m_star_enable = 0; state->m_star_delay_counter = 0; state->m_star_shift_reg = 0; } /************************************* * * Machine driver * *************************************/ static MACHINE_CONFIG_START( nyny, nyny_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 1400000) /* 1.40 MHz? The clock signal is generated by analog chips */ MCFG_CPU_PROGRAM_MAP(nyny_main_map) MCFG_CPU_PERIODIC_INT(update_pia_1, 25) MCFG_CPU_ADD("audiocpu", M6802, AUDIO_CPU_1_CLOCK) MCFG_CPU_PROGRAM_MAP(nyny_audio_1_map) MCFG_CPU_ADD("audio2", M6802, AUDIO_CPU_2_CLOCK) MCFG_CPU_PROGRAM_MAP(nyny_audio_2_map) MCFG_MACHINE_START(nyny) MCFG_MACHINE_RESET(nyny) MCFG_NVRAM_ADD_0FILL("nvram") /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */ MCFG_SCREEN_UPDATE(nyny) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) /* 74LS123 */ MCFG_TTL74123_ADD("ic48_1", ic48_1_config) MCFG_PIA6821_ADD("pia1", pia_1_intf) MCFG_PIA6821_ADD("pia2", pia_2_intf) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ay1", AY8910, AUDIO_CPU_1_CLOCK) MCFG_SOUND_CONFIG(ay8910_37_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SOUND_ADD("ay2", AY8910, AUDIO_CPU_1_CLOCK) MCFG_SOUND_CONFIG(ay8910_64_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SOUND_ADD("ay3", AY8910, AUDIO_CPU_2_CLOCK) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.03) MCFG_SOUND_ADD("dac", DAC, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END /************************************* * * ROM definitions * *************************************/ ROM_START( nyny ) ROM_REGION(0x10000, "maincpu", 0) /* main CPU */ ROM_LOAD( "nyny01s.100", 0xa800, 0x0800, CRC(a2b76eca) SHA1(e46717e6ad330be4c4e7d9fab4f055f89aa31bcc) ) ROM_LOAD( "nyny02s.099", 0xb000, 0x0800, CRC(ef2d4dae) SHA1(718c0ecf7770a780aebb1dc8bf4ca86ea0a5ea28) ) ROM_LOAD( "nyny03s.098", 0xb800, 0x0800, CRC(2734c229) SHA1(b028d057d26838bae50b8ddb90a3755b5315b4ee) ) ROM_LOAD( "nyny04s.097", 0xe000, 0x0800, CRC(bd94087f) SHA1(02dde604bb84097fcd95c434847c55198b4e4309) ) ROM_LOAD( "nyny05s.096", 0xe800, 0x0800, CRC(248b22c4) SHA1(d64d89bf78fa19d36e02720c296a60621ab8fe21) ) ROM_LOAD( "nyny06s.095", 0xf000, 0x0800, CRC(8c073052) SHA1(0ce103ac0e79124ac9f1e097dda1a0664b92b89b) ) ROM_LOAD( "nyny07s.094", 0xf800, 0x0800, CRC(d49d7429) SHA1(c12eaae7ba0b1d44c45a584232db03c5731c046a) ) ROM_REGION(0x10000, "audiocpu", 0) /* first audio CPU */ ROM_LOAD( "nyny08.093", 0x5000, 0x0800, CRC(19ddb6c3) SHA1(0097fad542f9a33849565093c2fb106d90007b1a) ) ROM_LOAD( "nyny09.092", 0x6000, 0x0800, CRC(a359c6f1) SHA1(1bc7b487581399908c3cec823733810fb6d944ce) ) ROM_LOAD( "nyny10.091", 0x7000, 0x0800, CRC(a72a70fa) SHA1(deed7dec9cc43fa1d6c4854ba18169c894c9a2f0) ) ROM_REGION(0x10000, "audio2", 0) /* second audio CPU */ ROM_LOAD( "nyny11.snd", 0x7000, 0x0800, CRC(650450fc) SHA1(214693df394ca05eff5dbe1e800107d326ba80f6) ) ROM_END ROM_START( nynyg ) ROM_REGION(0x10000, "maincpu", 0) /* main CPU */ ROM_LOAD( "gny1.cpu", 0xa800, 0x0800, CRC(fb5b8f17) SHA1(2202325451dfd4e7c16cba93f0fade46929ffa72) ) ROM_LOAD( "gny2.cpu", 0xb000, 0x0800, CRC(d248dd93) SHA1(0c4579698f8917332041c08af6902b8f8acd7d62) ) ROM_LOAD( "gny3.cpu", 0xb800, 0x0800, CRC(223a9d09) SHA1(c2b12270d375587489208d6a1b37a4e3ec87bc20) ) ROM_LOAD( "gny4.cpu", 0xe000, 0x0800, CRC(7964ec1f) SHA1(dba3dc2e928fb3fc04a9dca12951343669a4ecbe) ) ROM_LOAD( "gny5.cpu", 0xe800, 0x0800, CRC(4799dcfc) SHA1(13dcc4a58a029c14a4e9acd0bf584c71d5302c03) ) ROM_LOAD( "gny6.cpu", 0xf000, 0x0800, CRC(4839d4d2) SHA1(cfd6f2f252ee2f6a4d881496a017c02d7dd77944) ) ROM_LOAD( "gny7.cpu", 0xf800, 0x0800, CRC(b7564c5b) SHA1(e1d8fe7f37aa7aa98f18c538fe6e688675cc2de1) ) ROM_REGION(0x10000, "audiocpu", 0) /* first audio CPU */ ROM_LOAD( "gny8.cpu", 0x5000, 0x0800, CRC(e0bf7d00) SHA1(7afca3affa413179f4f59ce2cad89525cfa5efbc) ) ROM_LOAD( "gny9.cpu", 0x6000, 0x0800, CRC(639bc81a) SHA1(91819d49099e438ac8c70920a787aeaed3ed82e9) ) ROM_LOAD( "gny10.cpu", 0x7000, 0x0800, CRC(73764021) SHA1(bb2f62130142487afbd8d2540e2d4fe5bb67c4ee) ) ROM_REGION(0x10000, "audio2", 0) /* second audio CPU */ /* The original dump of this ROM was bad [FIXED BITS (x1xxxxxx)] */ /* Since what's left is identical to the Sigma version, I'm assuming it's the same. */ ROM_LOAD( "nyny11.snd", 0x7000, 0x0800, CRC(650450fc) SHA1(214693df394ca05eff5dbe1e800107d326ba80f6) ) ROM_END ROM_START( warcadia ) ROM_REGION(0x10000, "maincpu", 0) /* main CPU */ ROM_LOAD( "ar-01", 0xa800, 0x0800, CRC(7b7e8f27) SHA1(2bb1d07d87ad5b952de9460c840d7e8b59ed1b4a) ) ROM_LOAD( "ar-02", 0xb000, 0x0800, CRC(81d9e172) SHA1(4279582f1edf54f0974fa277565d8ade6d9faa50) ) ROM_LOAD( "ar-03", 0xb800, 0x0800, CRC(2c5feb05) SHA1(6f8952e7744ba7d7b8b345d67f546b504f7a3b30) ) ROM_LOAD( "ar-04", 0xe000, 0x0800, CRC(66fcbd7f) SHA1(7b8c09593b7d0d25cbe0b28097d58772c32f13bb) ) ROM_LOAD( "ar-05", 0xe800, 0x0800, CRC(b2320e20) SHA1(977afc2d26ef500eff4499e6bc61f14314b19130) ) ROM_LOAD( "ar-06", 0xf000, 0x0800, CRC(27b79cc0) SHA1(2c5c3a9a09069751c5e9c23d0840ee4996006c0b) ) ROM_LOAD( "ar-07", 0xf800, 0x0800, CRC(be77a477) SHA1(817c069855634dd844f0068d64bfbf1862980d6b) ) ROM_REGION(0x10000, "audiocpu", 0) /* first audio CPU */ ROM_LOAD( "ar-08", 0x5000, 0x0800, CRC(38569b25) SHA1(887a9afaa65d0961097f7fb5f1ae390d40e9c164) ) ROM_LOAD( "nyny09.092", 0x6000, 0x0800, CRC(a359c6f1) SHA1(1bc7b487581399908c3cec823733810fb6d944ce) ) ROM_LOAD( "nyny10.091", 0x7000, 0x0800, CRC(a72a70fa) SHA1(deed7dec9cc43fa1d6c4854ba18169c894c9a2f0) ) ROM_REGION(0x10000, "audio2", 0) /* second audio CPU */ ROM_LOAD( "ar-11", 0x7000, 0x0800, CRC(208f4488) SHA1(533f8942e1c964cc88253e9dc4ec711f77607e4c) ) ROM_END /************************************* * * Game drivers * *************************************/ GAME( 1980, nyny, 0, nyny, nyny, 0, ROT270, "Sigma Enterprises Inc.", "New York! New York!", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1980, nynyg, nyny, nyny, nyny, 0, ROT270, "Sigma Enterprises Inc. (Gottlieb license)", "New York! New York! (Gottlieb)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1980, warcadia,nyny, nyny, nyny, 0, ROT270, "Sigma Enterprises Inc.", "Waga Seishun no Arcadia", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )