// license:BSD-3-Clause // copyright-holders:Ville Linde /* Konami Hornet System Driver by Ville Linde Konami 'Hornet' Hardware Konami, 1997-2000 f Known games on this hardware include.... Game (C) Year ---------------------------------------------- Gradius 4 : Fukkatsu Konami 1998 NBA Play by Play Konami 1998 Teraburst Konami 1998 Silent Scope Konami 1999 Silent Scope 2 Konami 2000 Hardware overview: GN715 CPU Board: ---------------- IBM PowerPC 403GA at 32MHz (main CPU) Motorola MC68EC000 at 16MHz (sound CPU) Konami K056800 (MIRAC), sound system interface Ricoh RF5c400 sound chip GN715 GFX Board: ---------------- Analog Devices ADSP-21062 SHARC DSP at 36MHz Konami 0000037122 (2D Tilemap) Konami 0000033906 (PCI bridge) 3DFX 500-0003-03 (Voodoo) FBI with 2MB RAM 3DFX 500-0004-02 (Voodoo) TMU with 4MB RAM GQ871 GFX Board: ---------------- Analog Devices ADSP-21062 SHARC DSP at 36MHz Konami 0000037122 (2D Tilemap) Konami 0000033906 (PCI bridge) 3DFX 500-0009-01 (Voodoo 2) FBI with 2MB RAM 3DFX 500-0010-01 (Voodoo 2) TMU with 4MB RAM Hardware configurations: ------------------------ Game KONAMI ID CPU PCB GFX Board(s) notes ---------------------------------------------------------------------- Gradius 4 GX837 GN715(A) GN715(B) NBA Play By Play GX778 GN715(A) GN715(B) Teraburst GX715 GN715(A) GN715(B) GN680(E) I/O board Silent Scope GQ830 GN715(A) 2x GN715(B) Silent Scope 2 GQ931 GN715(A) 2x GQ871(B) GQ931(H) LAN PCB PCB Layouts ----------- Top Board GN715 PWB(A)A |--------------------------------------------------------------| | SP485CS CN10 CN11 CN9 JP8 JP9 JP10 JP11| |CN19 PAL1 | |CN21 JP13 PAL2 68EC000 EPROM.7S | | NE5532 PAL3 CN12| | JP12 JP16 DRM1M4SJ8 CN13| | NE5532 MASKROM.9P MASKROM.9T | | SM5877 JP15 RF5C400 | |CN18 MASKROM.12P MASKROM.12T| | SM5877 16.9344MHz | |CN14 SRAM256K MASKROM.14P MASKROM.14T| | | |CN16 SRAM256K MASKROM.16P MASKROM.16T| | ADC12138 | | 056800 JP5 | | JP4 | | MACH111 JP3 |---------| | | TEST_SW EPROM.22P | | | |CN1 DRAM16X16 |PPC403GA | | | EPROM.25P | | | | | | | | DRAM16X16 EPROM.27P |---------| | | 4AK16 JP6| | | |CN3 | | 0038323 PAL4 7.3728MHz| | E9825 058232 CN2 | | 50.000MHz| | RESET_SW CN5 JP1 JP2 | |M48T58Y-70PC1 CN4 CN6 64.000MHz| |--------------------------------------------------------------| Notes: DRM1M4SJ8 - Fujitsu 81C4256 256Kx4 DRAM (SOJ24) SRAM256K - Cypress CY7C199 32kx8 SRAM (SOJ28) DRAM16X16 - Fujitsu 8118160A-60 16megx16 DRAM (SOJ42) 0038323 E9825 - SOIC8 (Secured PIC?). I've seen a similar chip in the security cart of System573 M48T58Y-70PC1 - ST Timekeeper RAM RF5C400 - Ricoh RF5C400 PCM 32Ch, 44.1 kHz Stereo, 3D Effect Spatializer, clock input 16.9344MHz 056800 - Konami Custom (QFP80) 058232 - Konami Custom Ceramic Package (SIL14) ADC12138 - National Semiconductor ADC12138 A/D Converter, 12-bit + Serial I/O With MUX (SOP28) MACH111 - AMD MACH111 CPLD (Stamped 'N676A1', PLCC44) 68EC000 - Motorola MC68EC000, running at 16.0MHz (64/4) PPC403GA - IBM PowerPC 403GA CPU, clock input 32.0MHz (QFP160) SM5877AM - Nippon Precision Circuits 3rd Order 2-Channel D/A Converter (SOIC24) 4AK16 - Hitachi 4AK16 Silicon N-Channel Power MOS FET Array (SIL10) NE5532AN - Philips, Dual Low-Noise High-Speed Audio OP Amp (DIP8) SP485CS - Sipex SP485CS Low Power Half Duplex RS485 Transceiver (DIP8) PAL1 - AMD PALCE16V8 (stamped 'N676A4', DIP20) PAL2 - AMD PALCE16V8 (stamped 'N676A2', DIP20) PAL3 - AMD PALCE16V8 (stamped 'N676A3', DIP20) PAL4 - AMD PALCE16V8 (stamped 'N676A5', DIP20) JP1 - 25M O O-O 32M JP2 - 25M O O-O 32M JP3 - RW O O O RO JP4 - PROG 32M O O-O 16M JP5 - DATA 32M O-O O 16M JP6 - BOOT 16 O-O O 32 JP7 - SRC DOUT2 O O-O 0 JP8 - 64M&32M O-O O 16M JP9 - 64M O O-O 32M&16M JP10 - 64M&32M O-O O 16M JP11 - 64M O O-O 32M&16M JP12 - through O-O O SP JP13 - through O-O O SP JP14 - WDT O O JP15 - MONO O-O O SURR JP16 - HIGH O O O MID (N/C LOW) CN1 to CN3 - Multi-pin Flat Cable Connector CN4 - Multi-pin Connector for Network PCB CN5 - Multi-pin Flat Cable Connector CN6 - 96-Pin To Lower PCB, Joining Connector CN7 to CN8 - Not used CN9 to CN11 - 6-Pin Power Connectors CN19 - USB Connector CN21 - 5-Pin Analog Controls Connector (Tied to USB Connector via the Filter Board) CN18 - RCA Mono Audio OUT CN14 & CN16 - RCA Stereo Audio OUT ROM Usage --------- |------------------------------- ROM Locations ---------------------------------------| Game 27P 25P 22P 16P 14P 12P 9P 16T 14T 12T 9T 7S ---------------------------------------------------------------------------------------------------- Gradius 4 837C01 - - 837A09 837A10 - 778A12 837A04 837A05 - - 837A08 NBA P/Play 778A01 - - 778A09 778A10 778A11 778A12 778A04 778A05 - - 778A08 Teraburst - 715l02 715l03 715A09 715A10 - 778A12 715A04 715A05 - - 715A08 S/Scope 830B01 - - 830A09 830A10 - - - - - - 830A08 S/Scope 2 931D01 - - 931A09 931A10 931A11 - 931A04 - - - 931A08 Bottom Board GN715 PWB(B)A |--------------------------------------------------------------| |CN4 CN2 CN8 CN6 CN5| |JP1 |---------| 4M_EDO 4M_EDO | | | | |----------| | | 4M_EDO 4M_EDO | TEXELFX | | | | | | | | PIXELFX | 4M_EDO | | 4M_EDO 4M_EDO | | | | 4M_EDO | | |---------| | | |--------| | | 4M_EDO 4M_EDO |----------| |KONAMI | | |CN3 50MHz JP7 |33906 | | | 4M_EDO 4M_EDO JP6 | | | | 256KSRAM 256KSRAM |--------| | |CN7 | | AV9170 1MSRAM 1MSRAM | | MC44200 | | 256KSRAM 256KSRAM | | 1MSRAM 1MSRAM | | |-------| MASKROM.24U | | |KONAMI | MACH111 |-------------| MASKROM.24V| | |37122 | |ANALOG | 1MSRAM 1MSRAM | | | | |DEVICES | | | |-------| JP5 |ADSP-21062 | 36.00MHz | |1MSRAM |SHARC | 1MSRAM 1MSRAM | | | | | |1MSRAM | | | | 256KSRAM |-------------| MASKROM.32U | |1MSRAM 256KSRAM MASKROM.32V| | 256KSRAM PAL1 PAL2 JP4 | |1MSRAM | | JP2 CN1 JP3 | |--------------------------------------------------------------| Notes: 4M_EDO - Silicon Magic SM81C256K16CJ-35 EDO DRAM 66MHz (SOJ40) 1MSRAM - Cypress CY7C109-25VC 1Meg SRAM (SOJ32) 256KSRAM - Winbond W24257AJ-15 256K SRAM (SOJ28) TEXELFX - 3DFX 500-0004-02 BD0665.1 TMU (QFP208) PIXELFX - 3DFX 500-0003-03 F001701.1 FBI (QFP240) 0000037122 - Konami Custom (QFP208) MC44200FT - Motorola MC44200FT 3 Channel Video D/A Converter (QFP44) MACH111 - AMD MACH111 CPLD (Stamped 'N715B1', PLCC44) AV9170 - Integrated Circuit Systems Inc. Clock Multiplier (SOIC8) PAL1 - AMD PALCE16V8 (stamped 'N676B4', DIP20) PAL2 - AMD PALCE16V8 (stamped 'N676B5', DIP20) JP1 - SCR O O-O TWN JP2 - MASTER O-O O SLAVE JP3 - 16M O O-O 32M JP4 - 32M O-O O 16M JP5 - ASYNC O O-O SYNC JP6 - DSP O O-O ADCK JP7 - MCK O-O O SCK CN1 - 96 Pin To Lower PCB, Joining Connector CN2 - 8-Pin RGB OUT CN3 - 15-Pin DSUB VGA Video MAIN OUT CN4 - 6-Pin Power Connector CN5 - 4-Pin Power Connector CN6 - 2-Pin Connector (Not Used) CN7 - 15-Pin DSUB VGA Video MAIN OUT CN8 - 6-Pin Connector (Not Used) ROM Usage --------- |------ ROM Locations -------| Game 24U 24V 32U 32V ------------------------------------------- Gradius 4 837A13 837A15 837A14 837A16 NBA P/Play 778A13 778A15 778A14 778A16 Teraburst 715A13 715A15 778A14 715A16 S/Scope 830A13 - 830A14 - S/Scope 2 - - - - (no ROMs, not used) Teraburst uses a different variation of the I/O board used in Operation: Thunder Hurricane (see gticlub.cpp). Analog inputs are controlled by two CCD cameras, one from each gun. This specific variation uses a K056800 which normally acts as a sound interface controller. Perhaps this either sends analog inputs to the main pcb or isn't used at all. No network connection is involved in this setup as this board directly connects to the main pcb via joining connector. GN680 PWB(E)403381B |------------------------------------------| |CN11 CN12 CN8 CN9 CN10 DSW(4)| | NRPS11 NRPS11 | | | | LM1881 LM1881 | | | |LED(x4) | | | | 68EC000FN16 8464 | | RESET_SW 8464 | |32MHz 715A17.20K| |8464 PAL(002962) | | 056800 PAL(002961) | | PAL(056787A) PAL(002960) | | CN1 | |------------------------------------------| Notes: 68EC000 @ 16MHz (32/2) CN11/12 - Power connectors CN8/9 - 6-pin analog control connectors (to CCD cameras) CN1 - Lower joining connector to main pcb NRPS11 - Idec NRPS11 PC Board circuit protector LM1881 - Video sync separator (DIP8) 056800 - Konami Custom (QFP80) LAN PCB: GQ931 PWB(H) (C) 1999 Konami ------------------------------------------ 2 x LAN ports, LANC(1) & LANC(2) 1 x 32.0000MHz Oscillator HYC2485S SMC ARCNET Media Transceiver, RS485 5Mbps-2.5Mbps 8E 931A19 Konami 32meg masked ROM, ROM0 (compressed GFX data) 6E 931A20 Konami 32meg masked ROM, ROM1 (compressed GFX data) 12F XC9536 Xilinx CPLD, 44 pin PLCC, Konami no. Q931H1 12C XCS10XL Xilinx FPGA, 100 pin PQFP, Konami no. 4C 12B CY7C199 Cypress 32kx8 SRAM 8B AT93C46 Atmel 1K serial EEPROM, 8 pin SOP 16G DS2401 Dallas Silicon Serial Number IC, 6 pin SOP Note: This PCB does more than just networking. The serial eeprom is used as a means to prevent region change. The timekeeper region has to match the serial eeprom. The two mask roms serve as GFX roms as the game "downloads" the data from those two roms. GFX PCB: GQ871 PWB(B)A (C) 1999 Konami ------------------------------------------ There are no ROMs on the two GFX PCBs, all sockets are empty. They are loacted on the LAN PCB. Prior to the game starting there is a message saying downloading data. Jumpers set on GFX PCB to main monitor: 4A set to TWN (twin GFX PCBs) 37D set to Master Jumpers set on GFX PCB to scope monitor: 4A set to TWN (twin GFX PCBs) 37D set to Slave 1 x 64.0000MHz 1 x 36.0000MHz (to 27L, ADSP) 21E AV9170 ICS, Clock synchroniser and multiplier 27L ADSP-21062 Analog Devices SHARC ADSP, 512k flash, Konami no. 022M16C 15T 0000033906 Konami Custom, 160 pin PQFP 19R W241024AI-20 Winbond, 1Meg SRAM 22R W241024AI-20 Winbond, 1Meg SRAM 25R W241024AI-20 Winbond, 1Meg SRAM 29R W241024AI-20 Winbond, 1Meg SRAM 19P W241024AI-20 Winbond, 1Meg SRAM 22P W241024AI-20 Winbond, 1Meg SRAM 25P W241024AI-20 Winbond, 1Meg SRAM 29P W241024AI-20 Winbond, 1Meg SRAM 18N W24257AJ-15 Winbond, 256K SRAM 14N W24257AJ-15 Winbond, 256K SRAM 18M W24257AJ-15 Winbond, 256K SRAM 14M W24257AJ-15 Winbond, 256K SRAM 28D 000037122 Konami Custom, 208 pin PQFP 33E W24257AJ-15 Winbond, 256K SRAM 33D W24257AJ-15 Winbond, 256K SRAM 33C W24257AJ-15 Winbond, 256K SRAM 27A W241024AI-20 Winbond, 1Meg SRAM 30A W241024AI-20 Winbond, 1Meg SRAM 32A W241024AI-20 Winbond, 1Meg SRAM 35A W241024AI-20 Winbond, 1Meg SRAM 7K 500-0010-01 3DFX, Texture processor 16F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 13F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 9F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 5F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 16D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 13D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 9D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 5D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 9P 500-0009-01 3DFX, Pixel processor 10U SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 7U SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 3S SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 3R SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg 27G XC9536 Xilinx, CPLD, Konami no. Q830B1 21C MC44200FT Motorola, 3 Channel video D/A converter */ #include "emu.h" #include "cpu/m68000/m68000.h" #include "cpu/powerpc/ppc.h" #include "cpu/sharc/sharc.h" #include "machine/adc1213x.h" #include "machine/eepromser.h" #include "machine/k033906.h" #include "machine/konppc.h" #include "machine/timekpr.h" #include "machine/ds2401.h" #include "machine/watchdog.h" #include "sound/rf5c400.h" #include "sound/k056800.h" #include "video/voodoo.h" #include "video/k037122.h" #include "emupal.h" #include "rendlay.h" #include "screen.h" #include "speaker.h" class hornet_state : public driver_device { public: hornet_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_workram(*this, "workram"), m_sharc_dataram0(*this, "sharc_dataram0"), m_sharc_dataram1(*this, "sharc_dataram1"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_k056800(*this, "k056800"), m_gn680(*this, "gn680"), m_dsp(*this, "dsp"), m_dsp2(*this, "dsp2"), m_k037122_1(*this, "k037122_1"), m_k037122_2(*this, "k037122_2"), m_adc12138(*this, "adc12138"), m_konppc(*this, "konppc"), m_lan_eeprom(*this, "lan_eeprom"), m_voodoo(*this, "voodoo%u", 0U), m_in0(*this, "IN0"), m_in1(*this, "IN1"), m_in2(*this, "IN2"), m_dsw(*this, "DSW"), m_eepromout(*this, "EEPROMOUT"), m_analog1(*this, "ANALOG1"), m_analog2(*this, "ANALOG2"), m_user3_ptr(*this, "user3"), m_user5_ptr(*this, "user5"), m_lan_ds2401(*this, "lan_serial_id"), m_watchdog(*this, "watchdog") { } void hornet(machine_config &config); void terabrst(machine_config &config); void sscope(machine_config &config); void sscope2(machine_config &config); void init_hornet(); void init_gradius4(); void init_nbapbp(); void init_terabrst(); void init_sscope(); void init_sscope2(); private: // TODO: Needs verification on real hardware static const int m_sound_timer_usec = 2800; required_shared_ptr m_workram; required_shared_ptr m_sharc_dataram0; optional_shared_ptr m_sharc_dataram1; required_device m_maincpu; required_device m_audiocpu; required_device m_k056800; optional_device m_gn680; required_device m_dsp; optional_device m_dsp2; optional_device m_k037122_1; optional_device m_k037122_2; required_device m_adc12138; required_device m_konppc; optional_device m_lan_eeprom; optional_device_array m_voodoo; required_ioport m_in0, m_in1, m_in2, m_dsw; optional_ioport m_eepromout, m_analog1, m_analog2; optional_region_ptr m_user3_ptr; optional_region_ptr m_user5_ptr; optional_device m_lan_ds2401; required_device m_watchdog; emu_timer *m_sound_irq_timer; uint8_t m_led_reg0; uint8_t m_led_reg1; std::unique_ptr m_jvs_sdata; uint32_t m_jvs_sdata_ptr; uint16_t m_gn680_latch; uint16_t m_gn680_ret0; uint16_t m_gn680_ret1; DECLARE_READ32_MEMBER(hornet_k037122_sram_r); DECLARE_WRITE32_MEMBER(hornet_k037122_sram_w); DECLARE_READ32_MEMBER(hornet_k037122_char_r); DECLARE_WRITE32_MEMBER(hornet_k037122_char_w); DECLARE_READ32_MEMBER(hornet_k037122_reg_r); DECLARE_WRITE32_MEMBER(hornet_k037122_reg_w); DECLARE_READ8_MEMBER(sysreg_r); DECLARE_WRITE8_MEMBER(sysreg_w); DECLARE_WRITE32_MEMBER(comm1_w); DECLARE_WRITE32_MEMBER(comm_rombank_w); DECLARE_READ32_MEMBER(comm0_unk_r); DECLARE_READ32_MEMBER(gun_r); DECLARE_WRITE32_MEMBER(gun_w); DECLARE_WRITE16_MEMBER(gn680_sysctrl); DECLARE_READ16_MEMBER(gn680_latch_r); DECLARE_WRITE16_MEMBER(gn680_latch_w); DECLARE_READ32_MEMBER(dsp_dataram0_r); DECLARE_WRITE32_MEMBER(dsp_dataram0_w); DECLARE_READ32_MEMBER(dsp_dataram1_r); DECLARE_WRITE32_MEMBER(dsp_dataram1_w); DECLARE_WRITE_LINE_MEMBER(voodoo_vblank_0); DECLARE_WRITE_LINE_MEMBER(voodoo_vblank_1); DECLARE_WRITE16_MEMBER(soundtimer_en_w); DECLARE_WRITE16_MEMBER(soundtimer_count_w); double adc12138_input_callback(uint8_t input); DECLARE_WRITE8_MEMBER(jamma_jvs_w); DECLARE_READ8_MEMBER(comm_eeprom_r); DECLARE_WRITE8_MEMBER(comm_eeprom_w); virtual void machine_start() override; virtual void machine_reset() override; DECLARE_MACHINE_RESET(hornet_2board); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_rscreen(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(sound_irq); int jvs_encode_data(uint8_t *in, int length); int jvs_decode_data(uint8_t *in, uint8_t *out, int length); void jamma_jvs_cmd_exec(); void hornet_map(address_map &map); void terabrst_map(address_map &map); void sscope_map(address_map &map); void sscope2_map(address_map &map); void gn680_memmap(address_map &map); void sharc0_map(address_map &map); void sharc1_map(address_map &map); void sound_memmap(address_map &map); }; READ32_MEMBER(hornet_state::hornet_k037122_sram_r) { k037122_device *k037122 = m_konppc->get_cgboard_id() ? m_k037122_2 : m_k037122_1; return k037122->sram_r(space, offset, mem_mask); } WRITE32_MEMBER(hornet_state::hornet_k037122_sram_w) { k037122_device *k037122 = m_konppc->get_cgboard_id() ? m_k037122_2 : m_k037122_1; k037122->sram_w(space, offset, data, mem_mask); } READ32_MEMBER(hornet_state::hornet_k037122_char_r) { k037122_device *k037122 = m_konppc->get_cgboard_id() ? m_k037122_2 : m_k037122_1; return k037122->char_r(space, offset, mem_mask); } WRITE32_MEMBER(hornet_state::hornet_k037122_char_w) { k037122_device *k037122 = m_konppc->get_cgboard_id() ? m_k037122_2 : m_k037122_1; k037122->char_w(space, offset, data, mem_mask); } READ32_MEMBER(hornet_state::hornet_k037122_reg_r) { k037122_device *k037122 = m_konppc->get_cgboard_id() ? m_k037122_2 : m_k037122_1; return k037122->reg_r(space, offset, mem_mask); } WRITE32_MEMBER(hornet_state::hornet_k037122_reg_w) { k037122_device *k037122 = m_konppc->get_cgboard_id() ? m_k037122_2 : m_k037122_1; k037122->reg_w(space, offset, data, mem_mask); } WRITE_LINE_MEMBER(hornet_state::voodoo_vblank_0) { m_maincpu->set_input_line(INPUT_LINE_IRQ0, state); } WRITE_LINE_MEMBER(hornet_state::voodoo_vblank_1) { m_maincpu->set_input_line(INPUT_LINE_IRQ1, state); } uint32_t hornet_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { m_voodoo[0]->voodoo_update(bitmap, cliprect); m_k037122_1->tile_draw(screen, bitmap, cliprect); draw_7segment_led(bitmap, 3, 3, m_led_reg0); draw_7segment_led(bitmap, 9, 3, m_led_reg1); return 0; } uint32_t hornet_state::screen_update_rscreen(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { m_voodoo[1]->voodoo_update(bitmap, cliprect); m_k037122_2->tile_draw(screen, bitmap, cliprect); draw_7segment_led(bitmap, 3, 3, m_led_reg0); draw_7segment_led(bitmap, 9, 3, m_led_reg1); return 0; } /*****************************************************************************/ READ8_MEMBER(hornet_state::sysreg_r) { uint8_t r = 0; switch (offset) { case 0: /* I/O port 0 */ r = m_in0->read(); break; case 1: /* I/O port 1 */ r = m_in1->read(); break; case 2: /* I/O port 2 */ r = m_in2->read(); break; case 3: /* I/O port 3 */ /* 0x80 = JVSINIT (JAMMA I/F SENSE) 0x40 = COMMST 0x20 = GSENSE 0x08 = EEPDO (EEPROM DO) 0x04 = ADEOC (ADC EOC) 0x02 = ADDOR (ADC DOR) 0x01 = ADDO (ADC DO) */ r = 0xf0; r |= m_adc12138->do_r() | (m_adc12138->eoc_r() << 2); break; case 4: /* I/O port 4 - DIP switches */ r = m_dsw->read(); break; } return r; } WRITE8_MEMBER(hornet_state::sysreg_w) { switch (offset) { case 0: /* LED Register 0 */ m_led_reg0 = data; break; case 1: /* LED Register 1 */ m_led_reg1 = data; break; case 2: /* Parallel data register */ osd_printf_debug("Parallel data = %02X\n", data); break; case 3: /* System Register 0 */ /* 0x80 = EEPWEN (EEPROM write enable) 0x40 = EEPCS (EEPROM CS) 0x20 = EEPSCL (EEPROM SCL?) 0x10 = EEPDT (EEPROM data) 0x08 = JVSTXEN / LAMP3 (something about JAMMA interface) 0x04 = LAMP2 0x02 = LAMP1 0x01 = LAMP0 */ osd_printf_debug("System register 0 = %02X\n", data); break; case 4: /* System Register 1 */ /* 0x80 = SNDRES (sound reset) 0x40 = COMRES (COM reset) 0x20 = COINRQ2 (EEPROM SCL?) 0x10 = COINRQ1 (EEPROM data) 0x08 = ADCS (ADC CS) 0x04 = ADCONV (ADC CONV) 0x02 = ADDI (ADC DI) 0x01 = ADDSCLK (ADC SCLK) */ m_adc12138->cs_w((data >> 3) & 0x1); m_adc12138->conv_w((data >> 2) & 0x1); m_adc12138->di_w((data >> 1) & 0x1); m_adc12138->sclk_w(data & 0x1); m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); osd_printf_debug("System register 1 = %02X\n", data); break; case 5: /* Sound Control Register */ /* 0x80 = MODE1 0x40 = MUTE1 0x20 = DEEN1 0x10 = ATCK1 0x08 = MODE0 0x04 = MUTE0 0x02 = DEEN0 0x01 = ATCK0 */ osd_printf_debug("Sound control register = %02X\n", data); break; case 6: /* WDT Register */ /* 0x80 = WDTCLK */ if (data & 0x80) m_watchdog->watchdog_reset(); break; case 7: /* CG Control Register */ /* 0x80 = EXRES1 0x40 = EXRES0 0x20 = EXID1 0x10 = EXID0 0x01 = EXRGB */ if (data & 0x80) m_maincpu->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE); if (data & 0x40) m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); m_konppc->set_cgboard_id((data >> 4) & 3); break; } } /*****************************************************************************/ READ8_MEMBER(hornet_state::comm_eeprom_r) { uint8_t r = 0; r |= (m_lan_eeprom->do_read() & 1) << 1; r |= m_lan_ds2401->read() & 1; return r; } WRITE8_MEMBER(hornet_state::comm_eeprom_w) { m_eepromout->write(data, 0xff); m_lan_ds2401->write((data >> 4) & 1); } WRITE32_MEMBER(hornet_state::comm1_w) { printf("comm1_w: %08X, %08X, %08X\n", offset, data, mem_mask); } WRITE32_MEMBER(hornet_state::comm_rombank_w) { int bank = data >> 24; uint8_t *usr3 = memregion("user3")->base(); if (usr3 != nullptr) membank("bank1")->set_entry(bank & 0x7f); } READ32_MEMBER(hornet_state::comm0_unk_r) { // printf("comm0_unk_r: %08X, %08X\n", offset, mem_mask); return 0xffffffff; } READ32_MEMBER(hornet_state::gun_r) { return m_gn680_ret0<<16 | m_gn680_ret1; } WRITE32_MEMBER(hornet_state::gun_w) { if (mem_mask == 0xffff0000) { m_gn680_latch = data>>16; m_gn680->set_input_line(M68K_IRQ_6, HOLD_LINE); } } /******************************************************************/ TIMER_CALLBACK_MEMBER(hornet_state::sound_irq) { m_audiocpu->set_input_line(M68K_IRQ_1, ASSERT_LINE); } WRITE16_MEMBER(hornet_state::soundtimer_en_w) { if (data & 1) { // Reset and disable timer m_sound_irq_timer->adjust(attotime::from_usec(m_sound_timer_usec)); m_sound_irq_timer->enable(false); } else { // Enable timer m_sound_irq_timer->enable(true); } } WRITE16_MEMBER(hornet_state::soundtimer_count_w) { // Reset the count m_sound_irq_timer->adjust(attotime::from_usec(m_sound_timer_usec)); m_audiocpu->set_input_line(M68K_IRQ_1, CLEAR_LINE); } /*****************************************************************************/ void hornet_state::hornet_map(address_map &map) { map(0x00000000, 0x003fffff).ram().share("workram"); /* Work RAM */ map(0x74000000, 0x740000ff).rw(FUNC(hornet_state::hornet_k037122_reg_r), FUNC(hornet_state::hornet_k037122_reg_w)); map(0x74020000, 0x7403ffff).rw(FUNC(hornet_state::hornet_k037122_sram_r), FUNC(hornet_state::hornet_k037122_sram_w)); map(0x74040000, 0x7407ffff).rw(FUNC(hornet_state::hornet_k037122_char_r), FUNC(hornet_state::hornet_k037122_char_w)); map(0x78000000, 0x7800ffff).rw(m_konppc, FUNC(konppc_device::cgboard_dsp_shared_r_ppc), FUNC(konppc_device::cgboard_dsp_shared_w_ppc)); map(0x780c0000, 0x780c0003).rw(m_konppc, FUNC(konppc_device::cgboard_dsp_comm_r_ppc), FUNC(konppc_device::cgboard_dsp_comm_w_ppc)); map(0x7d000000, 0x7d00ffff).r(FUNC(hornet_state::sysreg_r)); map(0x7d010000, 0x7d01ffff).w(FUNC(hornet_state::sysreg_w)); map(0x7d020000, 0x7d021fff).rw("m48t58", FUNC(timekeeper_device::read), FUNC(timekeeper_device::write)); /* M48T58Y RTC/NVRAM */ map(0x7d030000, 0x7d03000f).rw(m_k056800, FUNC(k056800_device::host_r), FUNC(k056800_device::host_w)); map(0x7e000000, 0x7e7fffff).rom().region("user2", 0); /* Data ROM */ map(0x7f000000, 0x7f3fffff).rom().share("share2"); map(0x7fc00000, 0x7fffffff).rom().region("user1", 0).share("share2"); /* Program ROM */ } void hornet_state::terabrst_map(address_map &map) { hornet_map(map); map(0x74080000, 0x7408000f).rw(FUNC(hornet_state::gun_r), FUNC(hornet_state::gun_w)); } void hornet_state::sscope_map(address_map &map) //placeholder; may remove if mapping the second ADC12138 isn't necessary { hornet_map(map); } void hornet_state::sscope2_map(address_map &map) { sscope_map(map); map(0x7d040004, 0x7d040007).rw(FUNC(hornet_state::comm_eeprom_r), FUNC(hornet_state::comm_eeprom_w)); map(0x7d042000, 0x7d043fff).ram(); /* COMM BOARD 0 */ map(0x7d044000, 0x7d044007).r(FUNC(hornet_state::comm0_unk_r)); map(0x7d048000, 0x7d048003).w(FUNC(hornet_state::comm1_w)); map(0x7d04a000, 0x7d04a003).w(FUNC(hornet_state::comm_rombank_w)); map(0x7d050000, 0x7d05ffff).bankr("bank1"); /* COMM BOARD 1 */ } /*****************************************************************************/ void hornet_state::sound_memmap(address_map &map) { map(0x000000, 0x07ffff).rom(); map(0x100000, 0x10ffff).ram(); /* Work RAM */ map(0x200000, 0x200fff).rw("rfsnd", FUNC(rf5c400_device::rf5c400_r), FUNC(rf5c400_device::rf5c400_w)); /* Ricoh RF5C400 */ map(0x300000, 0x30001f).rw(m_k056800, FUNC(k056800_device::sound_r), FUNC(k056800_device::sound_w)).umask16(0x00ff); map(0x480000, 0x480001).nopw(); map(0x4c0000, 0x4c0001).nopw(); map(0x500000, 0x500001).w(FUNC(hornet_state::soundtimer_en_w)).nopr(); map(0x600000, 0x600001).w(FUNC(hornet_state::soundtimer_count_w)).nopr(); } /*****************************************************************************/ WRITE16_MEMBER(hornet_state::gn680_sysctrl) { // bit 15 = watchdog toggle // lower 4 bits = LEDs? } READ16_MEMBER(hornet_state::gn680_latch_r) { m_gn680->set_input_line(M68K_IRQ_6, CLEAR_LINE); return m_gn680_latch; } WRITE16_MEMBER(hornet_state::gn680_latch_w) { if (offset) { m_gn680_ret1 = data; } else { m_gn680_ret0 = data; } } // WORD at 30000e: IRQ 4 tests bits 6 and 7, IRQ5 tests bits 4 and 5 // (vsync and hsync status for each of the two screens?) void hornet_state::gn680_memmap(address_map &map) { map(0x000000, 0x01ffff).rom(); map(0x200000, 0x203fff).ram(); map(0x300000, 0x300001).w(FUNC(hornet_state::gn680_sysctrl)); map(0x314000, 0x317fff).ram(); map(0x400000, 0x400003).rw(FUNC(hornet_state::gn680_latch_r), FUNC(hornet_state::gn680_latch_w)); map(0x400008, 0x400009).nopw(); // writes 0001 00fe each time IRQ 6 triggers } /*****************************************************************************/ READ32_MEMBER(hornet_state::dsp_dataram0_r) { return m_sharc_dataram0[offset] & 0xffff; } WRITE32_MEMBER(hornet_state::dsp_dataram0_w) { m_sharc_dataram0[offset] = data; } READ32_MEMBER(hornet_state::dsp_dataram1_r) { return m_sharc_dataram1[offset] & 0xffff; } WRITE32_MEMBER(hornet_state::dsp_dataram1_w) { m_sharc_dataram1[offset] = data; } void hornet_state::sharc0_map(address_map &map) { map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_0_shared_sharc_r), FUNC(konppc_device::cgboard_0_shared_sharc_w)); map(0x0500000, 0x05fffff).rw(FUNC(hornet_state::dsp_dataram0_r), FUNC(hornet_state::dsp_dataram0_w)).share("sharc_dataram0"); map(0x1400000, 0x14fffff).ram(); map(0x2400000, 0x27fffff).rw("voodoo0", FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w)); map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_0_comm_sharc_r), FUNC(konppc_device::cgboard_0_comm_sharc_w)); map(0x3500000, 0x35000ff).rw(m_konppc, FUNC(konppc_device::K033906_0_r), FUNC(konppc_device::K033906_0_w)); map(0x3600000, 0x37fffff).bankr("bank5"); } void hornet_state::sharc1_map(address_map &map) { map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_1_shared_sharc_r), FUNC(konppc_device::cgboard_1_shared_sharc_w)); map(0x0500000, 0x05fffff).rw(FUNC(hornet_state::dsp_dataram1_r), FUNC(hornet_state::dsp_dataram1_w)).share("sharc_dataram1"); map(0x1400000, 0x14fffff).ram(); map(0x2400000, 0x27fffff).rw("voodoo1", FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w)); map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_1_comm_sharc_r), FUNC(konppc_device::cgboard_1_comm_sharc_w)); map(0x3500000, 0x35000ff).rw(m_konppc, FUNC(konppc_device::K033906_1_r), FUNC(konppc_device::K033906_1_w)); map(0x3600000, 0x37fffff).bankr("bank6"); } /*****************************************************************************/ static INPUT_PORTS_START( hornet ) PORT_START("IN0") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_START("IN1") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_START("IN2") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_SERVICE_NO_TOGGLE( 0x10, IP_ACTIVE_LOW ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 ) // greyed out in gradius4 test mode, but does work PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("DSW") PORT_DIPNAME( 0x80, 0x00, "Skip Post" ) PORT_DIPLOCATION("SW:1") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x00, "Disable Machine Init" ) PORT_DIPLOCATION("SW:2") // Having this on disables the analog controls in terabrst, sscope and sscope2 PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) //they instead make them usable with JAMMA inputs PORT_DIPNAME( 0x20, 0x20, "DIP3" ) PORT_DIPLOCATION("SW:3") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, "DIP4" ) PORT_DIPLOCATION("SW:4") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, "DIP5" ) PORT_DIPLOCATION("SW:5") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x04, 0x04, "DIP6" ) PORT_DIPLOCATION("SW:6") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x02, 0x02, "DIP7" ) PORT_DIPLOCATION("SW:7") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x01, 0x01, "DIP8" ) PORT_DIPLOCATION("SW:8") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END static INPUT_PORTS_START( gradius4 ) PORT_INCLUDE( hornet ) PORT_MODIFY("DSW") PORT_DIPNAME( 0x80, 0x00, "Skip Post" ) PORT_DIPLOCATION("SW:1") PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPNAME( 0x40, 0x40, "Screen Flip (H)" ) PORT_DIPLOCATION("SW:2") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x20, 0x20, "Screen Flip (V)" ) PORT_DIPLOCATION("SW:3") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, "DIP4" ) PORT_DIPLOCATION("SW:4") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, "DIP5" ) PORT_DIPLOCATION("SW:5") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x04, 0x00, "Harness" ) PORT_DIPLOCATION("SW:6") PORT_DIPSETTING( 0x04, "JVS" ) PORT_DIPSETTING( 0x00, "JAMMA" ) PORT_DIPNAME( 0x02, 0x02, "DIP7" ) PORT_DIPLOCATION("SW:7") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x01, 0x01, "Monitor Type" ) PORT_DIPLOCATION("SW:8") PORT_DIPSETTING( 0x01, "24KHz" ) PORT_DIPSETTING( 0x00, "15KHz" ) INPUT_PORTS_END static INPUT_PORTS_START(nbapbp) //Need to add inputs for player 3 and 4. PORT_INCLUDE(gradius4) PORT_MODIFY("DSW") PORT_DIPNAME(0x02, 0x02, "Cabinet Type") PORT_DIPLOCATION("SW:7") PORT_DIPSETTING(0x02, "2 Player") PORT_DIPSETTING(0x00, "4 Player") /* PORT_START("IN3") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START3 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) PORT_START("IN4") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START4 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(4) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4) */ INPUT_PORTS_END static INPUT_PORTS_START(terabrst) PORT_INCLUDE(hornet) PORT_MODIFY("IN0") PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) PORT_NAME("P1 Trigger") PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) PORT_NAME("P1 Bomb") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(1) PORT_NAME("P1 Temp Cursor Speedup") PORT_MODIFY("IN1") PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) PORT_NAME("P2 Trigger") PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(2) PORT_NAME("P2 Bomb") PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(2) PORT_NAME("P2 Temp Cursor Speedup") INPUT_PORTS_END static INPUT_PORTS_START( sscope ) PORT_INCLUDE( hornet ) PORT_MODIFY("IN0") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gun Trigger") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_MODIFY("IN1") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("ANALOG1") // Gun Yaw PORT_BIT( 0x7ff, 0x400, IPT_AD_STICK_X ) PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(35) PORT_KEYDELTA(20) PORT_START("ANALOG2") // Gun Pitch PORT_BIT( 0x7ff, 0x3ff, IPT_AD_STICK_Y ) PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(35) PORT_KEYDELTA(20) PORT_INVERT INPUT_PORTS_END static INPUT_PORTS_START( sscope2 ) PORT_INCLUDE( sscope ) // LAN board EEPROM PORT_START( "EEPROMOUT" ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("lan_eeprom", eeprom_serial_93cxx_device, di_write) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("lan_eeprom", eeprom_serial_93cxx_device, clk_write) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("lan_eeprom", eeprom_serial_93cxx_device, cs_write) INPUT_PORTS_END /* PowerPC interrupts IRQ0: Vblank CG Board 0 IRQ1: Vblank CG Board 1 IRQ2: LANC DMA0 NMI: SCI */ void hornet_state::machine_start() { m_jvs_sdata_ptr = 0; m_jvs_sdata = make_unique_clear(1024); /* set conservative DRC options */ m_maincpu->ppcdrc_set_options(PPCDRC_COMPATIBLE_OPTIONS); /* configure fast RAM regions for DRC */ m_maincpu->ppcdrc_add_fastram(0x00000000, 0x003fffff, false, m_workram); save_item(NAME(m_led_reg0)); save_item(NAME(m_led_reg1)); save_pointer(NAME(m_jvs_sdata), 1024); save_item(NAME(m_jvs_sdata_ptr)); m_sound_irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hornet_state::sound_irq), this)); } void hornet_state::machine_reset() { memory_region* comm_region = memregion("user3"); if (comm_region != nullptr) { uint8_t* comm_rom = comm_region->base(); membank("bank1")->configure_entries(0, comm_region->bytes() / 0x10000, comm_rom, 0x10000); membank("bank1")->set_entry(0); } m_dsp->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); if (m_dsp2 != nullptr) m_dsp2->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); if (m_user5_ptr) { membank("bank5")->set_base(m_user5_ptr); membank("bank6")->set_base(m_user5_ptr); } } double hornet_state::adc12138_input_callback(uint8_t input) { int value = 0; switch (input) { case 0: value = m_analog1.read_safe(0); break; case 1: value = m_analog2.read_safe(0); break; } return (double)(value) / 2047.0; } void hornet_state::hornet(machine_config &config) { /* basic machine hardware */ PPC403GA(config, m_maincpu, XTAL(64'000'000) / 2); /* PowerPC 403GA 32MHz */ m_maincpu->set_addrmap(AS_PROGRAM, &hornet_state::hornet_map); M68000(config, m_audiocpu, XTAL(64'000'000) / 4); /* 16MHz */ m_audiocpu->set_addrmap(AS_PROGRAM, &hornet_state::sound_memmap); ADSP21062(config, m_dsp, XTAL(36'000'000)); m_dsp->set_boot_mode(adsp21062_device::BOOT_MODE_EPROM); m_dsp->set_addrmap(AS_DATA, &hornet_state::sharc0_map); config.set_maximum_quantum(attotime::from_hz(6000)); WATCHDOG_TIMER(config, m_watchdog); // PCB description at top doesn't mention any EEPROM on the base board... // EEPROM_93C46_16BIT(config, "eeprom"); VOODOO_1(config, m_voodoo[0], STD_VOODOO_1_CLOCK); m_voodoo[0]->set_fbmem(2); m_voodoo[0]->set_tmumem(4,0); m_voodoo[0]->set_screen_tag("screen"); m_voodoo[0]->set_cpu_tag("dsp"); m_voodoo[0]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_0)); K033906(config, "k033906_1", 0, "voodoo0"); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // Screeen size and timing is re-calculated later in voodoo card screen.set_refresh_hz(60); screen.set_size(64 * 8, 48 * 8); screen.set_visarea(0, 64 * 8 - 1, 0, 48 * 8 - 1); screen.set_screen_update(FUNC(hornet_state::screen_update)); PALETTE(config, "palette").set_entries(65536); K037122(config, m_k037122_1, 0); m_k037122_1->set_screen("screen"); m_k037122_1->set_palette("palette"); K056800(config, m_k056800, XTAL(16'934'400)); m_k056800->int_callback().set_inputline(m_audiocpu, M68K_IRQ_2); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); RF5C400(config, "rfsnd", XTAL(16'934'400)) // value from Guru readme, gives 44100 Hz sample rate .add_route(0, "lspeaker", 1.0) .add_route(1, "rspeaker", 1.0); M48T58(config, "m48t58", 0); ADC12138(config, m_adc12138, 0); m_adc12138->set_ipt_convert_callback(FUNC(hornet_state::adc12138_input_callback)); KONPPC(config, m_konppc, 0); m_konppc->set_num_boards(1); m_konppc->set_cbboard_type(konppc_device::CGBOARD_TYPE_HORNET); } void hornet_state::terabrst(machine_config &config) //todo: add K056800 from I/O board { hornet(config); m_maincpu->set_addrmap(AS_PROGRAM, &hornet_state::terabrst_map); M68000(config, m_gn680, XTAL(32'000'000) / 2); /* 16MHz */ m_gn680->set_addrmap(AS_PROGRAM, &hornet_state::gn680_memmap); } void hornet_state::sscope(machine_config &config) { hornet(config); m_maincpu->set_addrmap(AS_PROGRAM, &hornet_state::sscope_map); ADSP21062(config, m_dsp2, XTAL(36'000'000)); m_dsp2->set_boot_mode(adsp21062_device::BOOT_MODE_EPROM); m_dsp2->set_addrmap(AS_DATA, &hornet_state::sharc1_map); m_k037122_1->set_screen("lscreen"); m_k037122_1->set_palette("palette"); K037122(config, m_k037122_2, 0); m_k037122_2->set_screen("rscreen"); m_k037122_2->set_palette("palette"); m_voodoo[0]->set_screen_tag("lscreen"); VOODOO_1(config, m_voodoo[1], STD_VOODOO_1_CLOCK); m_voodoo[1]->set_fbmem(2); m_voodoo[1]->set_tmumem(4, 0); m_voodoo[1]->set_screen_tag("rscreen"); m_voodoo[1]->set_cpu_tag("dsp2"); m_voodoo[1]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_1)); K033906(config, "k033906_2", 0, "voodoo1"); /* video hardware */ config.device_remove("screen"); screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); // Screeen size and timing is re-calculated later in voodoo card lscreen.set_refresh_hz(60); lscreen.set_size(512, 384); lscreen.set_visarea(0, 512 - 1, 0, 384 - 1); lscreen.set_screen_update(FUNC(hornet_state::screen_update)); screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); // Screeen size and timing is re-calculated later in voodoo card rscreen.set_refresh_hz(60); rscreen.set_size(512, 384); rscreen.set_visarea(0, 512 - 1, 0, 384 - 1); rscreen.set_screen_update(FUNC(hornet_state::screen_update_rscreen)); /* ADC12138(config, m_adc12138_2, 0); m_adc12138->set_ipt_convert_callback(FUNC(hornet_state::sscope_input_callback)); */ m_konppc->set_num_boards(2); } void hornet_state::sscope2(machine_config &config) { sscope(config); m_maincpu->set_addrmap(AS_PROGRAM, &hornet_state::sscope2_map); VOODOO_2(config.replace(), m_voodoo[0], STD_VOODOO_2_CLOCK); m_voodoo[0]->set_fbmem(2); m_voodoo[0]->set_tmumem(4,0); m_voodoo[0]->set_screen_tag("lscreen"); m_voodoo[0]->set_cpu_tag("dsp"); m_voodoo[0]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_0)); VOODOO_2(config.replace(), m_voodoo[1], STD_VOODOO_2_CLOCK); m_voodoo[1]->set_fbmem(2); m_voodoo[1]->set_tmumem(4,0); m_voodoo[1]->set_screen_tag("rscreen"); m_voodoo[1]->set_cpu_tag("dsp2"); m_voodoo[1]->vblank_callback().set(FUNC(hornet_state::voodoo_vblank_1)); DS2401(config, "lan_serial_id"); EEPROM_93C46_16BIT(config, "lan_eeprom"); } /*****************************************************************************/ WRITE8_MEMBER(hornet_state::jamma_jvs_w) { if (m_jvs_sdata_ptr == 0 && data != 0xe0) return; m_jvs_sdata[m_jvs_sdata_ptr] = data; m_jvs_sdata_ptr++; if (m_jvs_sdata_ptr >= 3 && m_jvs_sdata_ptr >= 3 + m_jvs_sdata[2]) jamma_jvs_cmd_exec(); } int hornet_state::jvs_encode_data(uint8_t *in, int length) { int inptr = 0; int sum = 0; while (inptr < length) { uint8_t b = in[inptr++]; if (b == 0xe0) { sum += 0xd0 + 0xdf; m_maincpu->ppc4xx_spu_receive_byte(0xd0); m_maincpu->ppc4xx_spu_receive_byte(0xdf); } else if (b == 0xd0) { sum += 0xd0 + 0xcf; m_maincpu->ppc4xx_spu_receive_byte(0xd0); m_maincpu->ppc4xx_spu_receive_byte(0xcf); } else { sum += b; m_maincpu->ppc4xx_spu_receive_byte(b); } } return sum; } int hornet_state::jvs_decode_data(uint8_t *in, uint8_t *out, int length) { int outptr = 0; int inptr = 0; while (inptr < length) { uint8_t b = in[inptr++]; if (b == 0xd0) { uint8_t b2 = in[inptr++]; out[outptr++] = b2 + 1; } else { out[outptr++] = b; } }; return outptr; } void hornet_state::jamma_jvs_cmd_exec() { uint8_t byte_num; uint8_t data[1024], rdata[1024]; #if 0 int length; #endif int rdata_ptr; int sum; // sync = m_jvs_sdata[0]; // node = m_jvs_sdata[1]; byte_num = m_jvs_sdata[2]; #if 0 length = #endif jvs_decode_data(&m_jvs_sdata[3], data, byte_num-1); #if 0 printf("jvs input data:\n"); for (i=0; i < byte_num; i++) { printf("%02X ", m_jvs_sdata[3+i]); } printf("\n"); printf("jvs data decoded to:\n"); for (i=0; i < length; i++) { printf("%02X ", data[i]); } printf("\n\n"); #endif // clear return data memset(rdata, 0, sizeof(rdata)); rdata_ptr = 0; // status rdata[rdata_ptr++] = 0x01; // normal // handle the command switch (data[0]) { case 0xf0: // Reset { break; } case 0xf1: // Address setting { rdata[rdata_ptr++] = 0x01; // report data (normal) break; } case 0xfa: { break; } default: { fatalerror("jamma_jvs_cmd_exec: unknown command %02X\n", data[0]); } } // write jvs return data sum = 0x00 + (rdata_ptr+1); m_maincpu->ppc4xx_spu_receive_byte(0xe0); // sync m_maincpu->ppc4xx_spu_receive_byte(0x00); // node m_maincpu->ppc4xx_spu_receive_byte(rdata_ptr + 1); // num of bytes sum += jvs_encode_data(rdata, rdata_ptr); m_maincpu->ppc4xx_spu_receive_byte(sum - 1); // checksum m_jvs_sdata_ptr = 0; } /*****************************************************************************/ void hornet_state::init_hornet() { m_konppc->set_cgboard_texture_bank(0, "bank5", memregion("user5")->base()); m_led_reg0 = m_led_reg1 = 0x7f; m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(*this, FUNC(hornet_state::jamma_jvs_w))); } void hornet_state::init_gradius4() { init_hornet(); m_dsp->enable_recompiler(); } void hornet_state::init_nbapbp() { init_hornet(); m_dsp->enable_recompiler(); } void hornet_state::init_terabrst() { init_hornet(); m_dsp->enable_recompiler(); } void hornet_state::init_sscope() { m_konppc->set_cgboard_texture_bank(0, "bank5", memregion("user5")->base()); m_konppc->set_cgboard_texture_bank(1, "bank6", memregion("user5")->base()); m_led_reg0 = m_led_reg1 = 0x7f; m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(*this, FUNC(hornet_state::jamma_jvs_w))); } void hornet_state::init_sscope2() //fixme: eventually set sscope2 to load gfx roms from the comm board { m_konppc->set_cgboard_texture_bank(0, "bank5", memregion("user5")->base()); m_konppc->set_cgboard_texture_bank(1, "bank6", memregion("user5")->base()); m_led_reg0 = m_led_reg1 = 0x7f; m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(*this, FUNC(hornet_state::jamma_jvs_w))); } /*****************************************************************************/ ROM_START(sscope) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP("830d01.27p", 0x200000, 0x200000, CRC(de9b3dfa) SHA1(660652a5f745cb04687481c3626d8a43cd169193) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", ROMREGION_ERASE00) /* Data roms */ ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP("830a08.7s", 0x000000, 0x80000, CRC(2805ea1d) SHA1(2556a51ee98cb8f59bf081e916c69a24532196f1) ) ROM_REGION(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD( "830a14.u32", 0x000000, 0x400000, CRC(335793e1) SHA1(d582b53c3853abd59bc728f619a30c27cfc9497c) ) ROM_LOAD32_WORD( "830a13.u24", 0x000002, 0x400000, CRC(d6e7877e) SHA1(b4d0e17ada7dd126ec564a20e7140775b4b3fdb7) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "830a09.16p", 0x000000, 0x400000, CRC(e4b9f305) SHA1(ce2c6f63bdc9374dde48d8359102b57e48b4fdeb) ) ROM_LOAD( "830a10.14p", 0x400000, 0x400000, CRC(8b8aaf7e) SHA1(49b694dc171c149056b87c15410a6bf37ff2987f) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y.35d", 0x000000, 0x002000, CRC(b077e262) SHA1(5cdcc1b742bf23562f4558216063fea903f045ab) ) // this is set to the JXD, I don't think it's valid. ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(ee815325) SHA1(91b10802791b68a8360c0cd6c376c0c4bbbc6fa0) ) // so just load over it with the US one, we know works. ROM_END ROM_START(sscopec) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP("830c01.27p", 0x200000, 0x200000, CRC(87682449) SHA1(6ccaa5bac86e947e01a6aae568a75f002421fe5b) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", ROMREGION_ERASE00) /* Data roms */ ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP("830a08.7s", 0x000000, 0x80000, CRC(2805ea1d) SHA1(2556a51ee98cb8f59bf081e916c69a24532196f1) ) ROM_REGION(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD( "830a14.u32", 0x000000, 0x400000, CRC(335793e1) SHA1(d582b53c3853abd59bc728f619a30c27cfc9497c) ) ROM_LOAD32_WORD( "830a13.u24", 0x000002, 0x400000, CRC(d6e7877e) SHA1(b4d0e17ada7dd126ec564a20e7140775b4b3fdb7) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "830a09.16p", 0x000000, 0x400000, CRC(e4b9f305) SHA1(ce2c6f63bdc9374dde48d8359102b57e48b4fdeb) ) ROM_LOAD( "830a10.14p", 0x400000, 0x400000, CRC(8b8aaf7e) SHA1(49b694dc171c149056b87c15410a6bf37ff2987f) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(ee815325) SHA1(91b10802791b68a8360c0cd6c376c0c4bbbc6fa0) ) ROM_END ROM_START(sscopeb) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP("830b01.27p", 0x200000, 0x200000, CRC(3b6bb075) SHA1(babc134c3a20c7cdcaa735d5f1fd5cab38667a14) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", ROMREGION_ERASE00) /* Data roms */ ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP("830a08.7s", 0x000000, 0x80000, CRC(2805ea1d) SHA1(2556a51ee98cb8f59bf081e916c69a24532196f1) ) ROM_REGION(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD( "830a14.u32", 0x000000, 0x400000, CRC(335793e1) SHA1(d582b53c3853abd59bc728f619a30c27cfc9497c) ) ROM_LOAD32_WORD( "830a13.u24", 0x000002, 0x400000, CRC(d6e7877e) SHA1(b4d0e17ada7dd126ec564a20e7140775b4b3fdb7) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "830a09.16p", 0x000000, 0x400000, CRC(e4b9f305) SHA1(ce2c6f63bdc9374dde48d8359102b57e48b4fdeb) ) ROM_LOAD( "830a10.14p", 0x400000, 0x400000, CRC(8b8aaf7e) SHA1(49b694dc171c149056b87c15410a6bf37ff2987f) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(ee815325) SHA1(91b10802791b68a8360c0cd6c376c0c4bbbc6fa0) ) ROM_END ROM_START(sscopea) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP("830a01.27p", 0x200000, 0x200000, CRC(39e353f1) SHA1(569b06969ae7a690f6d6e63cc3b5336061663a37) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", ROMREGION_ERASE00) /* Data roms */ ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP("830a08.7s", 0x000000, 0x80000, CRC(2805ea1d) SHA1(2556a51ee98cb8f59bf081e916c69a24532196f1) ) ROM_REGION(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD( "830a14.u32", 0x000000, 0x400000, CRC(335793e1) SHA1(d582b53c3853abd59bc728f619a30c27cfc9497c) ) ROM_LOAD32_WORD( "830a13.u24", 0x000002, 0x400000, CRC(d6e7877e) SHA1(b4d0e17ada7dd126ec564a20e7140775b4b3fdb7) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "830a09.16p", 0x000000, 0x400000, CRC(e4b9f305) SHA1(ce2c6f63bdc9374dde48d8359102b57e48b4fdeb) ) ROM_LOAD( "830a10.14p", 0x400000, 0x400000, CRC(8b8aaf7e) SHA1(49b694dc171c149056b87c15410a6bf37ff2987f) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(ee815325) SHA1(91b10802791b68a8360c0cd6c376c0c4bbbc6fa0) ) ROM_END ROM_START(sscope2) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP("931d01.bin", 0x200000, 0x200000, CRC(4065fde6) SHA1(84f2dedc3e8f61651b22c0a21433a64993e1b9e2) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", 0) /* Data roms */ ROM_LOAD32_WORD_SWAP("931a04.bin", 0x000000, 0x200000, CRC(4f5917e6) SHA1(a63a107f1d6d9756e4ab0965d72ea446f0692814) ) ROM_REGION32_BE(0x800000, "user3", 0) /* Comm board roms */ ROM_LOAD("931a19.bin", 0x000000, 0x400000, BAD_DUMP CRC(8b25a6f1) SHA1(41f9c2046a6aae1e9f5f3ffa3e0ffb15eba46211) ) ROM_LOAD("931a20.bin", 0x400000, 0x400000, BAD_DUMP CRC(ecf665f6) SHA1(5a73e87435560a7bb2d0f9be7fba12254b18708d) ) ROM_REGION(0x800000, "user5", ROMREGION_ERASE00) /* CG Board texture roms */ ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP("931a08.bin", 0x000000, 0x80000, CRC(1597d604) SHA1(a1eab4d25907930b59ea558b484c3b6ddcb9303c) ) ROM_REGION16_LE(0xc00000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "931a09.bin", 0x000000, 0x400000, CRC(694c354c) SHA1(42f54254a5959e1b341f2801f1ad032c4ed6f329) ) ROM_LOAD( "931a10.bin", 0x400000, 0x400000, CRC(78ceb519) SHA1(e61c0d21b6dc37a9293e72814474f5aee59115ad) ) ROM_LOAD( "931a11.bin", 0x800000, 0x400000, CRC(9c8362b2) SHA1(a8158c4db386e2bbd61dc9a600720f07a1eba294) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(d4e69d7a) SHA1(1e29eecf4886e5e098a388dedd5f3901c2bb65e5) ) ROM_REGION(0x8, "lan_serial_id", 0) /* LAN Board DS2401 */ ROM_LOAD( "ds2401.8b", 0x000000, 0x000008, BAD_DUMP CRC(bae36d0b) SHA1(4dd5915888d5718356b40bbe897f2470e410176a) ) // hand built ROM_REGION16_BE(0x80, "lan_eeprom", 0) /* LAN Board AT93C46 */ ROM_LOAD( "at93c46.16g", 0x000000, 0x000080, BAD_DUMP CRC(cc63c213) SHA1(fb20e56fb73a887dc7b6db49efd1f8a18b959152) ) // hand built ROM_END ROM_START(gradius4) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP( "837c01.27p", 0x200000, 0x200000, CRC(ce003123) SHA1(15e33997be2c1b3f71998627c540db378680a7a1) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", 0) /* Data roms */ ROM_LOAD32_WORD_SWAP( "837a04.16t", 0x000000, 0x200000, CRC(18453b59) SHA1(3c75a54d8c09c0796223b42d30fb3867a911a074) ) ROM_LOAD32_WORD_SWAP( "837a05.14t", 0x000002, 0x200000, CRC(77178633) SHA1(ececdd501d0692390325c8dad6dbb068808a8b26) ) ROM_REGION32_BE(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD_SWAP( "837a14.32u", 0x000002, 0x400000, CRC(ff1b5d18) SHA1(7a38362170133dcc6ea01eb62981845917b85c36) ) ROM_LOAD32_WORD_SWAP( "837a13.24u", 0x000000, 0x400000, CRC(d86e10ff) SHA1(6de1179d7081d9a93ab6df47692d3efc190c38ba) ) ROM_LOAD32_WORD_SWAP( "837a16.32v", 0x800002, 0x400000, CRC(bb7a7558) SHA1(8c8cc062793c2dcfa72657b6ea0813d7223a0b87) ) ROM_LOAD32_WORD_SWAP( "837a15.24v", 0x800000, 0x400000, CRC(e0620737) SHA1(c14078cdb44f75c7c956b3627045d8494941d6b4) ) ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "837a08.7s", 0x000000, 0x080000, CRC(c3a7ff56) SHA1(9d8d033277d560b58da151338d14b4758a9235ea) ) ROM_REGION16_LE(0x800000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "837a09.16p", 0x000000, 0x400000, CRC(fb8f3dc2) SHA1(69e314ac06308c5a24309abc3d7b05af6c0302a8) ) ROM_LOAD( "837a10.14p", 0x400000, 0x400000, CRC(1419cad2) SHA1(a6369a5c29813fa51e8246d0c091736f32994f3d) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(935f9d05) SHA1(c3a787dff1b2ac4942858ffa1574405db01292b6) ) ROM_END ROM_START(nbapbp) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP( "778a01.27p", 0x200000, 0x200000, CRC(e70019ce) SHA1(8b187b6e670fdc88771da08a56685cd621b139dc) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", 0) /* Data roms */ ROM_LOAD32_WORD_SWAP( "778a04.16t", 0x000000, 0x400000, CRC(62c70132) SHA1(405aed149fc51e0adfa3ace3c644e47d53cf1ee3) ) ROM_LOAD32_WORD_SWAP( "778a05.14t", 0x000002, 0x400000, CRC(03249803) SHA1(f632a5f1dfa0a8500407214df0ec8d98ce09bc2b) ) ROM_REGION32_BE(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD_SWAP( "778a14.32u", 0x000002, 0x400000, CRC(db0c278d) SHA1(bb9884b6cdcdb707fff7e56e92e2ede062abcfd3) ) ROM_LOAD32_WORD_SWAP( "778a13.24u", 0x000000, 0x400000, CRC(47fda9cc) SHA1(4aae01c1f1861b4b12a3f9de6b39eb4d11a9736b) ) ROM_LOAD32_WORD_SWAP( "778a16.32v", 0x800002, 0x400000, CRC(6c0f46ea) SHA1(c6b9fbe14e13114a91a5925a0b46496260539687) ) ROM_LOAD32_WORD_SWAP( "778a15.24v", 0x800000, 0x400000, CRC(d176ad0d) SHA1(2be755dfa3f60379d396734809bbaaaad49e0db5) ) ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "778a08.7s", 0x000000, 0x080000, CRC(6259b4bf) SHA1(d0c38870495c9a07984b4b85e736d6477dd44832) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "778a09.16p", 0x000000, 0x400000, CRC(e8c6fd93) SHA1(dd378b67b3b7dd932e4b39fbf4321e706522247f) ) ROM_LOAD( "778a10.14p", 0x400000, 0x400000, CRC(c6a0857b) SHA1(976734ba56460fcc090619fbba043a3d888c4f4e) ) ROM_LOAD( "778a11.12p", 0x800000, 0x400000, CRC(40199382) SHA1(bee268adf9b6634a4f6bb39278ecd02f2bdcb1f4) ) ROM_LOAD( "778a12.9p", 0xc00000, 0x400000, CRC(27d0c724) SHA1(48e48cbaea6db0de8c3471a2eda6faaa16eed46e) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(3cff1b1d) SHA1(bed0fc657a785be0c69bb21ad52365635c83d751) ) ROM_END ROM_START(nbapbpa) // only the PowerPC program rom present in the archive ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD16_WORD_SWAP( "778b01.27p", 0x200000, 0x200000, CRC(8dca96b5) SHA1(7dfa38c4be6c3547ee9c7ad104282510e205ab37) ) ROM_RELOAD(0x000000, 0x200000) ROM_REGION32_BE(0x800000, "user2", 0) /* Data roms */ ROM_LOAD32_WORD_SWAP( "778a04.16t", 0x000000, 0x400000, CRC(62c70132) SHA1(405aed149fc51e0adfa3ace3c644e47d53cf1ee3) ) ROM_LOAD32_WORD_SWAP( "778a05.14t", 0x000002, 0x400000, CRC(03249803) SHA1(f632a5f1dfa0a8500407214df0ec8d98ce09bc2b) ) ROM_REGION32_BE(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD_SWAP( "778a14.32u", 0x000002, 0x400000, CRC(db0c278d) SHA1(bb9884b6cdcdb707fff7e56e92e2ede062abcfd3) ) ROM_LOAD32_WORD_SWAP( "778a13.24u", 0x000000, 0x400000, CRC(47fda9cc) SHA1(4aae01c1f1861b4b12a3f9de6b39eb4d11a9736b) ) ROM_LOAD32_WORD_SWAP( "778a16.32v", 0x800002, 0x400000, CRC(6c0f46ea) SHA1(c6b9fbe14e13114a91a5925a0b46496260539687) ) ROM_LOAD32_WORD_SWAP( "778a15.24v", 0x800000, 0x400000, CRC(d176ad0d) SHA1(2be755dfa3f60379d396734809bbaaaad49e0db5) ) ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "778a08.7s", 0x000000, 0x080000, CRC(6259b4bf) SHA1(d0c38870495c9a07984b4b85e736d6477dd44832) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "778a09.16p", 0x000000, 0x400000, CRC(e8c6fd93) SHA1(dd378b67b3b7dd932e4b39fbf4321e706522247f) ) ROM_LOAD( "778a10.14p", 0x400000, 0x400000, CRC(c6a0857b) SHA1(976734ba56460fcc090619fbba043a3d888c4f4e) ) ROM_LOAD( "778a11.12p", 0x800000, 0x400000, CRC(40199382) SHA1(bee268adf9b6634a4f6bb39278ecd02f2bdcb1f4) ) ROM_LOAD( "778a12.9p", 0xc00000, 0x400000, CRC(27d0c724) SHA1(48e48cbaea6db0de8c3471a2eda6faaa16eed46e) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, BAD_DUMP CRC(3cff1b1d) SHA1(bed0fc657a785be0c69bb21ad52365635c83d751) ) ROM_END ROM_START(terabrst) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD32_WORD_SWAP( "715l02.25p", 0x000000, 0x200000, CRC(79586f19) SHA1(8dcfed5d101ebe49d958a7a38d5472323f75dd1d) ) ROM_LOAD32_WORD_SWAP( "715l03.22p", 0x000002, 0x200000, CRC(c193021e) SHA1(c934b7c4bdab0ceff0f1699fcf2fb7d90e2e8962) ) ROM_REGION32_BE(0x800000, "user2", 0) /* Data roms */ ROM_LOAD32_WORD_SWAP( "715a04.16t", 0x000000, 0x200000, CRC(00d9567e) SHA1(fe372399ad0ae89d557c93c3145b38e3ed0f714d) ) ROM_LOAD32_WORD_SWAP( "715a05.14t", 0x000002, 0x200000, CRC(462d53bf) SHA1(0216a84358571de6791365c69a1fa8fe2784148d) ) ROM_REGION32_BE(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD_SWAP( "715a14.32u", 0x000002, 0x400000, CRC(bbb36be3) SHA1(c828d0af0546db02e87afe68423b9447db7c7e51) ) ROM_LOAD32_WORD_SWAP( "715a13.24u", 0x000000, 0x400000, CRC(dbff58a1) SHA1(f0c60bb2cbf268cfcbdd65606ebb18f1b4839c0e) ) ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "715a08.7s", 0x000000, 0x080000, CRC(3aa2f4a5) SHA1(bb43e5f5ef4ac51f228d4d825be66d3c720d51ea) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "715a09.16p", 0x000000, 0x400000, CRC(65845866) SHA1(d2a63d0deef1901e6fa21b55c5f96e1f781dceda) ) ROM_LOAD( "715a10.14p", 0x400000, 0x400000, CRC(294fe71b) SHA1(ac5fff5627df1cee4f1e1867377f208b34334899) ) ROM_REGION(0x20000, "gn680", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "715a17.20k", 0x000000, 0x020000, CRC(f0b7ba0c) SHA1(863b260824b0ae2f890ba84d1c9a8f436891b1ff) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "715uel_m48t58y.35d", 0x000000, 0x002000, CRC(57322db4) SHA1(59cb8cd6ab446bf8781e3dddf902a4ff2484068e) ) ROM_END ROM_START(terabrsta) ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */ ROM_LOAD32_WORD_SWAP( "715a02.25p", 0x000000, 0x200000, CRC(070c48b3) SHA1(066cefbd34d8f6476083417471114f782bef97fb) ) ROM_LOAD32_WORD_SWAP( "715a03.22p", 0x000002, 0x200000, CRC(f77d242f) SHA1(7680e4abcccd549b3f6d1d245f64631fab57e80d) ) ROM_REGION32_BE(0x800000, "user2", 0) /* Data roms */ ROM_LOAD32_WORD_SWAP( "715a04.16t", 0x000000, 0x200000, CRC(00d9567e) SHA1(fe372399ad0ae89d557c93c3145b38e3ed0f714d) ) ROM_LOAD32_WORD_SWAP( "715a05.14t", 0x000002, 0x200000, CRC(462d53bf) SHA1(0216a84358571de6791365c69a1fa8fe2784148d) ) ROM_REGION32_BE(0x1000000, "user5", 0) /* CG Board texture roms */ ROM_LOAD32_WORD_SWAP( "715a14.32u", 0x000002, 0x400000, CRC(bbb36be3) SHA1(c828d0af0546db02e87afe68423b9447db7c7e51) ) ROM_LOAD32_WORD_SWAP( "715a13.24u", 0x000000, 0x400000, CRC(dbff58a1) SHA1(f0c60bb2cbf268cfcbdd65606ebb18f1b4839c0e) ) ROM_REGION(0x80000, "audiocpu", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "715a08.7s", 0x000000, 0x080000, CRC(3aa2f4a5) SHA1(bb43e5f5ef4ac51f228d4d825be66d3c720d51ea) ) ROM_REGION16_LE(0x1000000, "rfsnd", 0) /* PCM sample roms */ ROM_LOAD( "715a09.16p", 0x000000, 0x400000, CRC(65845866) SHA1(d2a63d0deef1901e6fa21b55c5f96e1f781dceda) ) ROM_LOAD( "715a10.14p", 0x400000, 0x400000, CRC(294fe71b) SHA1(ac5fff5627df1cee4f1e1867377f208b34334899) ) ROM_REGION(0x20000, "gn680", 0) /* 68K Program */ ROM_LOAD16_WORD_SWAP( "715a17.20k", 0x000000, 0x020000, CRC(f0b7ba0c) SHA1(863b260824b0ae2f890ba84d1c9a8f436891b1ff) ) ROM_REGION(0x2000, "m48t58",0) ROM_LOAD( "m48t58y-70pc1", 0x000000, 0x002000, CRC(62fecb78) SHA1(09509be8a947cf2d38e12a6ea755ec0de4aa9bd4) ) ROM_END /*************************************************************************/ GAME( 1998, gradius4, 0, hornet, gradius4, hornet_state, init_gradius4, ROT0, "Konami", "Gradius IV: Fukkatsu (ver JAC)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1998, nbapbp, 0, hornet, nbapbp, hornet_state, init_nbapbp, ROT0, "Konami", "NBA Play By Play (ver JAA)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1998, nbapbpa, nbapbp, hornet, nbapbp, hornet_state, init_nbapbp, ROT0, "Konami", "NBA Play By Play (ver AAB)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1998, terabrst, 0, terabrst, terabrst, hornet_state, init_terabrst, ROT0, "Konami", "Teraburst (1998/07/17 ver UEL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1998, terabrsta, terabrst, terabrst, terabrst, hornet_state, init_terabrst, ROT0, "Konami", "Teraburst (1998/02/25 ver AAA)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // The region comes from the Timekeeper NVRAM, without a valid default all sets except 'xxD, Ver 1.33' will init their NVRAM to UAx versions, the xxD set seems to incorrectly init it to JXD, which isn't a valid // version, and thus can't be booted. If you copy the NVRAM from another already initialized set, it will boot as UAD. // to get the actual game to boot you must calibrate the guns etc. GAMEL( 1999, sscope, 0, sscope, sscope, hornet_state, init_sscope, ROT0, "Konami", "Silent Scope (ver xxD, Ver 1.33)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_dualhsxs ) GAMEL( 1999, sscopec, sscope, sscope, sscope, hornet_state, init_sscope, ROT0, "Konami", "Silent Scope (ver xxC, Ver 1.30)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_dualhsxs ) GAMEL( 1999, sscopeb, sscope, sscope, sscope, hornet_state, init_sscope, ROT0, "Konami", "Silent Scope (ver xxB, Ver 1.20)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_dualhsxs ) GAMEL( 1999, sscopea, sscope, sscope, sscope, hornet_state, init_sscope, ROT0, "Konami", "Silent Scope (ver xxA, Ver 1.00)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE, layout_dualhsxs ) GAMEL( 2000, sscope2, 0, sscope2, sscope2, hornet_state, init_sscope2, ROT0, "Konami", "Silent Scope 2 : Dark Silhouette (ver UAD)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN , layout_dualhsxs ) //GAMEL( 2000, sscope2e, sscope2, sscope2, sscope2, hornet_state, init_sscope2, ROT0, "Konami", "Silent Scope 2 : Fatal Judgement (ver EAD)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN , layout_dualhsxs ) //GAMEL( 2000, sscope2j, sscope2 sscope2, sscope2, hornet_state, init_sscope2, ROT0, "Konami", "Silent Scope 2 : Innocent Sweeper (ver JAD)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_LAN , layout_dualhsxs )