// license:LGPL-2.1+ // copyright-holders:Angelo Salese /*************************************************************************** Nintendo Super System driver by Angelo Salese, based off info from Noca$h TODO: - EEPROM doesn't save? - Fix sound CPU halt / reset lines, particularly needed by this to work correctly; - Fix continue behaviour, might be the same issue as the one above. - Various M50458 bits - OSD should actually super-impose with the SNES video somehow; Notes: - Multi-Cart BIOS works only with F-Zero, Super Tennis and Super Mario World; *************************************************************************** Nintendo Super System Hardware Overview Nintendo, 1991/1992 This system is basically a Super Nintendo with a timer. The main board has 3 slots on it and can accept up to 3 plug-in carts. The player can choose to play any of the available games, although I'm not sure why anyone would have wanted to pay money to play these games when the home SNES was selling well and most kids had one.... possibly one of the reasons it failed in the arcades. The control panel was also just some SNES pads mounted into the arcade machine control panel.... not very usable as-is, very cheaply presented and probably another reason why it failed in the arcades. PCB Layouts ----------- NSS-01-CPU MADE IN JAPAN (C) 1991 Nintendo |----------------------------------------------------| | HA13001 AN5836 | | SL4 SL2 CL2 SL3 | |-| CL1 SL1 | | |--------------| | |-| 14.31818MHz | SL5 | | | M50458 | | | IR3P32A | | |-| |-| |-| | |J | VC1 | | | | | | | | |A | | | | | | | | | |M | CN6 | | | | | | | | |M |-------------21.4772MHz | | | | | | | |A |-------| |-------| | | | | | | | | 84256 |S-PPU1 | |S-CPU | | | | | | | | | |5C77-01| |5A22-02| | | | | | | | |-| |-------| |-------| | | | | | | | | | | | | | | | |-| |-------| |-------| | | | | | | | | 84256 |S-PPU2 | |S-WRAM | | | | | | | | |CN4 |5C78-01| |LH68120| | | | | | | | | |-------| |-------| | | | | | | | | | | | | | | | | | | | | | | | |CN3 | | | | | | | | | | | | | | | | 4MHz |-| |-| |-| | | CN11 CN12 CN13 | | Z84C0006 | |CN5 LH5168 | | | | M6M80011 | | | | S-3520 | |CN2 32.678kHz *MM1026 | | 5.5V NSS-C_IC14_02| |----------------------------------------------------| Notes: The main board has many surface mounted logic chips and transistors on the solder side of the PCB which are not documented here. The parts side comprises mainly RAM and custom Nintendo ICs IR3P32A - Sharp IR3P32A Special Function TV Interface Circuit, Conversion of color diff sig. & lumin. to RGB (NDIP30) M50458 - Mitsubishi M50458-001SP On-Screen Display (OSD) Chip (NDIP32). Clock signal 14.31818MHz on pins 28 and 29 VC1 - Potentiometer connected to M50458. Turning the pot changes the horizontal width of the OSD menu towards the right side only. The left edge of the OSD menu does not move. So this is a right horizontal stretch adjustment pot. HA13001 - Hitachi Dual 5.5W Power Amplifier IC AN5836 - Matsushita AN5836 DC Volume and Tone Control IC (SIL12) 84256 - Fujitsu MB84256-10L 32k x8 SRAM (SOP28) LH5168 - Sharp LH5168N-10L 8k x8 SRAM (SOP28) Z84C0006 - Zilog Z84C0006FEC Z80 CPU, clock input 4.000MHz (QFP44) M6M80011 - Mitsubishi M6M80011 64 x16 Serial EEPROM (DIP8). Pinout..... 1 CS, 2 CLK, 3 DATA IN, 4 DATA OUT, 5 VSS, 6 RESET, 7 RDY, 8 VCC S-3520 - Seiko Epson S-3520 Real Time Clock (SOIC14) 5.5V - 5.5 volt supercap MM1026 - Mitsumi Monolithic MM1026BF System Reset IC with Battery Backup (SOIC8) * This IC is located on the solder side of the PCB VSync - 60.0980Hz HSync - 15.3844kHz NSS-C_IC14_02 - 27C256 EPROM (BIOS, DIP28) CN11/12/13 - 50 pin connectors for game carts CN2 - 10 pin connector CN3 - 13 pin connector CN4 - 8 pin connector CN5 - 7 pin connector CN6 - 24 pin connector for plug in custom sound module Custom IC's - S-CPU (QFP100) S-PPU1 (QFP100) S-PPU2 (QFP100) S-WRAM (SOP64) SL* / CL* - Jumper pads SL1 open SL2 open SL3 open SL4 open SL5 shorted CL1 shorted CL2 shorted Custom Sound Module (plugs into CN6) ------------------------------------ Note - This board is encased in a metal shield which is soldered together. MITSUMI ELEC CO. LTD. (C) 1990 Nintendo Co. Ltd. |-----------------------| | CN1 | | JRC2904 |---| | |-------| | | |S-SMP | | | | | D6376 | | |-------| 51832 | | | | |-------| | | |S-DSP | | | | | 51832 | | |-------| | |---| | | | |-----------------------| Notes: Note: Without this PCB, the board will boot up and work, displaying the game selection menu, but once the game tries to load attract mode, the PCB resets. JRC2904 - Japan Radio Co. JRC2904 Dual Low Power Op Amp (SOIC8) D6376 - NEC D6376 Audio 2-Channel 16-Bit D/A Converter (SOIC16) 51832 - Toshiba TC51832FL-12 32k x8 SRAM (SOP28) CN1 - 24 pin connector to plug in custom sound module to main board S-SMP - Stamped 'Nintendo S-SMP (M) SONY (C) Nintendo '89' custom sound chip (QFP80) S-DSP - Stamped 'Nintendo S-DSP (M) (C) SONY '89' custom sound DSP (QFP80) Game Carts ---------- There are 3 types of carts. The carts have only a few components on them, including some ROMs/sockets, a few logic chips/resistors/caps, a DIPSW8 block, one unknown DIP8 chip (with it's surface scratched) and some solder-jumper pads to config the ROM types. The unknown DIP8 chip is different per game also. There is a sticker on top with a 2-digit game code (I.E. MW/AT/L3 etc). The unknown DIP8 chip is used for protection. NSS-01-ROM-A |-------------------------------------------------------| | SL3 CL1 | | CL3 SL1 IC1_PRG_ROM IC3_INST_ROM IC4 | |CL4 SL2 SL5 | |SL4 CL2 CL5 | |--| |--| |-------------------------------------------------| Notes: IC1 - Program ROM IC2 - Instruction ROM IC4 - Unknown DIP8 chip Game Name IC1 IC1 Type IC3 IC3 Type Jumpers ------------------------------------------------------------------------------------------------------- Super Mario World NSS-MW-0_PRG LH534J NSS-R_IC3_MW 27C256 CL1 CL2 CL3 CL4 CL5 - Short SL1 SL2 SL3 SL4 SL5 - Open Super Mario World NSS-R__IC1__MW ?LH534J? NSS-R_IC3_MW 27C256 CL1 CL2 CL3 CL4 CL5 - Short SL1 SL2 SL3 SL4 SL5 - Open Super Tennis NSS-ST-0 LH534J NSS-R_IC3_ST 27C256 CL1 CL2 CL3 CL4 CL5 - Short SL1 SL2 SL3 SL4 SL5 - Open Super Soccer NSS-R__IC1__FS TC574000 NSS-R_IC3_FS 27C256 CL1 CL2 CL3 CL4 CL5 - Open SL1 SL2 SL3 SL4 SL5 - Short ------------------------------------------------------------------------------------------------------- Note - By setting the jumpers to 'Super Soccer', the other 2 games can use standard EPROMs if required. LH534J is a 512k x 8-bit (4MBit) MaskROM with a non-standard pinout. An adapter can be made easily to read them as a 27C040. Sharp LH534J Common 27C040 +--\/--+ +--\/--+ A17 |1 32| +5V VPP |1 32| +5V A18 |2 31| /OE A16 |2 31| A18 A15 |3 30| NC A15 |3 30| A17 A12 |4 29| A14 A12 |4 29| A14 A7 |5 28| A13 A7 |5 28| A13 A6 |6 27| A8 A6 |6 27| A8 A5 |7 26| A9 A5 |7 26| A9 A4 |8 25| A11 A4 |8 25| A11 A3 |9 24| A16 A3 |9 24| OE/ A2 |10 23| A10 A2 |10 23| A10 A1 |11 22| /CE A1 |11 22| CE/,PGM/ A0 |12 21| D7 A0 |12 21| D7 D0 |13 20| D6 D0 |13 20| D6 D1 |14 19| D5 D1 |14 19| D5 D2 |15 18| D4 D2 |15 18| D4 GND |16 17| D3 GND |16 17| D3 +------+ +------+ NSS-01-ROM-B |-------------------------------------------------------| | BAT1 SL3 CL1 CL2 SL5 CL6 CL7 | | CL3 SL1 SL2 CL5 SL6 SL7 | | CL4 SL4 | | IC1 | | | | | | IC2_PRG_ROM IC7_INST_ROM IC9 | | | | | |--| |--| |-------------------------------------------------| Notes: Battery is populated on this board, type CR2032 3V coin battery IC1 - LH5168 8k x8 SRAM (DIP28) IC2 - Program ROM IC7 - Instruction ROM IC9 - Unknown DIP8 chip Game Name IC2 IC2 Type IC7 IC7 Type Jumpers --------------------------------------------------------------------------------------------------------------- F-Zero NSS-FZ-0 LH534J NSS-R_IC3_FZ 27C256 CL1 CL2 CL3 CL4 CL5 CL6 CL7 - Short SL1 SL2 SL3 SL4 SL5 SL6 SL7 - Open --------------------------------------------------------------------------------------------------------------- NSS-01-ROM-C |-------------------------------------------------------| | BAT1 CL19 SL22 IC1_SRAM DIPSW8 | | CL18 SL21 | | CL17 SL20 | | CL15 SL16 IC2_PRG_ROM-1 | | SL12 | | CL13 SL14 | | CL5 SL11 | | CL6 SL10 IC3_PRG_ROM-0 IC8_INST_ROM IC10 | | CL3 SL9 | | CL4 SL8 | | SL1 CL2 SL7 | |--| |--| |-------------------------------------------------| Notes: Battery is not populated on this board for any games IC1 - 6116 2k x8 SRAM, not populated (DIP24) IC2/3 - Program ROM IC8 - Instruction ROM IC10 - Unknown DIP8 chip Game Name IC2 IC2 Type IC3 IC3 Type IC8 IC8 Type Jumpers --------------------------------------------------------------------------------------------------------------------------------------------------------- Actraiser NSS-R_IC2_AR TC574000 NSS-R_IC3_AR TC574000 NSS-R_IC8_AR 27C256 CL2 CL3 CL4 CL5 CL6 CL12 CL13 CL15 CL17 CL18 CL19 - Short SL1 SL7 SL8 SL9 SL10 SL11 SL12 SL14 SL16 SL20 SL21 SL22 - Open Addams Family NSS-R_IC2_AF TC574000 NSS-R_IC3_AF TC574000 NSS-R_IC8_AF 27C256 All games use the above jumper configuration. Amazing Tennis NSS-R_IC2_AT TC574000 NSS-R_IC3_AT TC574000 NSS-R_IC8_AT 27C256 Irem Skins Game NSS-R_IC2_MT TC574000 NSS-R_IC3_MT TC574000 NSS-R_IC8_MT 27C256 Lethal Weapon NSS-R_IC2_L3 TC574000 NSS-R_IC3_L3 TC574000 NSS-R_IC8_L3 27C256 NCAA Basketball NSS-R_IC2_DU TC574000 NSS-R_IC3_DU TC574000 NSS-R_IC8_DU 27C256 Robocop 3 NSS-R_IC2_R3 TC574000 NSS-R_IC3_R3 TC574000 NSS-R_IC8_R3 27C256 --------------------------------------------------------------------------------------------------------------------------------------------------------- NSS-01-ROM-C Sticker - NSS-X1-ROM-C (this is just a ROM-C board with a sticker over the top) (the differences being the SRAM and battery are populated) |-------------------------------------------------------| | BAT1 CL19 SL22 IC1_SRAM DIPSW8 | | CL18 SL21 | | CL17 SL20 | | CL15 SL16 IC2_PRG_ROM-1 | | SL12 | | CL13 SL14 | | CL5 SL11 | | CL6 SL10 IC3_PRG_ROM-0 IC8_INST_ROM IC10 | | CL3 SL9 | | CL4 SL8 | | SL1 CL2 SL7 | |--| |--| |-------------------------------------------------| Notes: Battery is populated on this board, type CR2032 3V coin battery IC1 - 6116 2k x8 SRAM, populated (DIP24) IC2/3 - Program ROM IC8 - Instruction ROM IC10 - Unknown DIP8 chip Game Name IC2 IC2 Type IC3 IC3 Type IC8 IC8 Type Jumpers ----------------------------------------------------------------------------------------------------------------------------------------------------- Contra III CONTRA_III_1 TC574000 CONTRA_III_0 TC574000 GAME1_NSSU 27C256 CL2 CL3 CL4 CL5 CL6 CL12 CL13 CL15 CL17 CL18 CL19 - Short SL1 SL7 SL8 SL9 SL10 SL11 SL12 SL14 SL16 SL20 SL21 SL22 - Open ----------------------------------------------------------------------------------------------------------------------------------------------------- ***************************************************************************/ #include "emu.h" #include "includes/snes.h" #include "cpu/z80/z80.h" #include "machine/m6m80011ap.h" #include "machine/s3520cf.h" #include "machine/rp5h01.h" #include "video/m50458.h" #include "emupal.h" #include "rendlay.h" #include "speaker.h" class nss_state : public snes_state { public: nss_state(const machine_config &mconfig, device_type type, const char *tag) : snes_state(mconfig, type, tag) , m_bioscpu(*this, "bios") , m_m50458(*this, "m50458") , m_s3520cf(*this, "s3520cf") , m_rp5h01(*this, "rp5h01") , m_palette(*this, "palette") { } void nss(machine_config &config); void init_nss(); DECLARE_CUSTOM_INPUT_MEMBER(game_over_flag_r); private: required_device m_bioscpu; required_device m_m50458; required_device m_s3520cf; required_device m_rp5h01; optional_device m_palette; uint8_t m_wram_wp_flag; std::unique_ptr m_wram; bool m_nmi_enable; uint8_t m_cart_sel; uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECLARE_READ8_MEMBER(ram_wp_r); DECLARE_WRITE8_MEMBER(ram_wp_w); DECLARE_READ8_MEMBER(nss_prot_r); DECLARE_WRITE8_MEMBER(nss_prot_w); DECLARE_READ8_MEMBER(port_00_r); DECLARE_WRITE8_MEMBER(port_00_w); DECLARE_WRITE8_MEMBER(port_01_w); DECLARE_WRITE8_MEMBER(port_02_w); DECLARE_WRITE8_MEMBER(port_03_w); DECLARE_WRITE8_MEMBER(port_04_w); DECLARE_WRITE8_MEMBER(port_07_w); virtual void machine_start() override; virtual void machine_reset() override; DECLARE_WRITE_LINE_MEMBER(nss_vblank_irq); DECLARE_READ8_MEMBER(spc_ram_100_r); DECLARE_WRITE8_MEMBER(spc_ram_100_w); void bios_io_map(address_map &map); void bios_map(address_map &map); void snes_map(address_map &map); void spc_mem(address_map &map); }; uint32_t nss_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { m_m50458->screen_update(screen,bitmap,cliprect); return 0; } void nss_state::snes_map(address_map &map) { map(0x000000, 0x7dffff).rw(FUNC(nss_state::snes_r_bank1), FUNC(nss_state::snes_w_bank1)); map(0x7e0000, 0x7fffff).ram(); /* 8KB Low RAM, 24KB High RAM, 96KB Expanded RAM */ map(0x800000, 0xffffff).rw(FUNC(nss_state::snes_r_bank2), FUNC(nss_state::snes_w_bank2)); /* Mirror and ROM */ } READ8_MEMBER(nss_state::spc_ram_100_r) { return m_spc700->spc_ram_r(space, offset + 0x100); } WRITE8_MEMBER(nss_state::spc_ram_100_w) { m_spc700->spc_ram_w(space, offset + 0x100, data); } void nss_state::spc_mem(address_map &map) { map(0x0000, 0x00ef).rw(m_spc700, FUNC(snes_sound_device::spc_ram_r), FUNC(snes_sound_device::spc_ram_w)); /* lower 32k ram */ map(0x00f0, 0x00ff).rw(m_spc700, FUNC(snes_sound_device::spc_io_r), FUNC(snes_sound_device::spc_io_w)); /* spc io */ map(0x0100, 0xffff).rw(FUNC(nss_state::spc_ram_100_r), FUNC(nss_state::spc_ram_100_w)); } /* NSS specific */ /* Notes of interest: nss_smw bp 2914 onward is a crc check with the Instruction ROM c0fe - c0ff pointers to the checksum bp 6b9e EEPROM write bp 6bf9 EEPROM read 8080 - 8081 EEPROM checksummed value 8700 - 870c EEPROM2 checksummed value (0x8707 value and'ed with 0x03) bp 6f8d check the EEPROM2 results 870d EEPROM2 result of checksum New notes: 0x3a7 is the protection check 0x8000 work RAM is for cart 1 0x8100 work RAM is for cart 2 0x8200 work RAM is for cart 3 */ /* noca$h info @ nocash.emubase.de/fullsnes.htm map 0x0000 - 0x7fff BIOS 0x8000 - 0x8fff RAM 0x9000 - 0x9fff RAM with write protection 0xa000 EEPROM Read 0xc000 - 0xdfff instruction ROM 0xe000 EEPROM Write 0xe000 - 0xffff PROM Input & Output & Program Code (protection RP5H01, used also in earlier Nintendo systems) Data Write: 7-5 Unknown/unused 4 PROM Test Mode (0=Low=6bit Address, 1=High=7bit Address) 3 PROM Clock (0=Low, 1=High) ;increment address on 1-to-0 transition 2-1 Unknown/unused 0 PROM Address Reset (0=High=Reset to zero, 1=Low=No Change) Data Read and Opcode Fetch: 7-5 Always set (MSBs of RST Opcode) 4 PROM Counter Out (0=High=One, 1=Low=Zero) ;PROM Address Bit5 3 PROM Data Out (0=High=One, 1=Low=Zero) 2-0 Always set (LSBs of RST Opcode) i/o Input 0x00 Joypad 0x01 Front-Panel Buttons and Game Over Flag 7 From SNES Port 4016h.W.Bit2 (0=Game Over Flag, 1=Normal) (Inverted!) 0x02 Coin and Service Button Inputs 7-3 Unknown/unused (maybe the (unused) Test button hides here) 2 Service Button (1=Pressed: Add Credit; with INST button: Config) 1 Coin Input 2 (1=Coin inserted in coin-slot 2) 0 Coin Input 1 (1=Coin inserted in coin-slot 1) 0x03 RTC Output 0x00/0x80 NMI Control and RAM protect 0x01/0x81 Unknown and Slot Select 0x02/0x82 RTC and OSD 0x03/0x83 Unknown and LED control 0x84 Coin Counter Outputs 0x05 Unknown 0x07 SNES Watchdog / Acknowledge SNES Joypad Read Flag SNES part: 0x4100 DSW 0x4016 bit 0 Joypad Strobe? 0x4016 bit 2 Game Over Flag */ READ8_MEMBER(nss_state::ram_wp_r) { return m_wram[offset]; } WRITE8_MEMBER(nss_state::ram_wp_w) { if(m_wram_wp_flag) m_wram[offset] = data; } READ8_MEMBER(nss_state::nss_prot_r) { int data = 0xe7; if (m_cart_sel == 0) { data |= ((~m_rp5h01->counter_r()) << 4) & 0x10; /* D4 */ data |= (m_rp5h01->data_r() << 3) & 0x08; /* D3 */ } return data; } WRITE8_MEMBER(nss_state::nss_prot_w) { if (m_cart_sel == 0) { m_rp5h01->test_w(data & 0x10); /* D4 */ m_rp5h01->clock_w(data & 0x08); /* D3 */ m_rp5h01->cs_w(~data & 0x01); } ioport("EEPROMOUT")->write(data, 0xff); } void nss_state::bios_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0x8000, 0x8fff).ram(); map(0x9000, 0x9fff).rw(FUNC(nss_state::ram_wp_r), FUNC(nss_state::ram_wp_w)); map(0xa000, 0xa000).portr("EEPROMIN"); map(0xc000, 0xdfff).rom().region("ibios_rom", 0x6000); map(0xe000, 0xffff).rw(FUNC(nss_state::nss_prot_r), FUNC(nss_state::nss_prot_w)); } READ8_MEMBER(nss_state::port_00_r) { /* x--- ---- SNES Watchdog (0=SNES did read Joypads, 1=Didn't do so) (ack via 07h.W) -x-- ---- Vblank or Vsync or so (0=What, 1=What?) --x- ---- Button "Joypad Button B?" (0=Released, 1=Pressed) ---x ---- Button "Joypad Button A" (0=Released, 1=Pressed) ---- x--- Button "Joypad Down" (0=Released, 1=Pressed) ---- -x-- Button "Joypad Up" (0=Released, 1=Pressed) ---- --x- Button "Joypad Left" (0=Released, 1=Pressed) ---- ---x Button "Joypad Right" (0=Released, 1=Pressed) */ uint8_t res; res = (m_joy_flag) << 7; // TODO: reads from SNES screen output, correct? res|= (m_screen->vblank() & 1) << 6; res|= (BIT(ioport("SERIAL1_DATA1")->read(), 15) << 5); res|= (BIT(ioport("SERIAL1_DATA1")->read(), 7) << 4); res|= (BIT(ioport("SERIAL1_DATA1")->read(), 10) << 3); res|= (BIT(ioport("SERIAL1_DATA1")->read(), 11) << 2); res|= (BIT(ioport("SERIAL1_DATA1")->read(), 9) << 1); res|= (BIT(ioport("SERIAL1_DATA1")->read(), 8) << 0); return res; } WRITE8_MEMBER(nss_state::port_00_w) { /* xxxx ---- Unknown/unused (should be always 0) ---- x--- Maybe SNES CPU/PPU reset (usually same as Port 01h.W.Bit1) ---- -x-- RAM at 9000h-9FFFh (0=Disable/Protect, 1=Enable/Unlock) ---- --x- Looks like maybe somehow NMI Related ? ;\or one of these is PC10-style ---- ---x Looks like NMI Enable ;/hardware-watchdog reload? */ m_wram_wp_flag = (data & 4) >> 2; m_nmi_enable = data & 1; if (!m_nmi_enable) m_bioscpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); } WRITE8_MEMBER(nss_state::port_01_w) { /* x--- ---- Maybe SNES Joypad Enable? (0=Disable/Demo, 1=Enable/Game) -x-- ---- Unknown/unused (should be always 0) --x- ---- SNES Sound Mute (0=Normal, 1=Mute) (for optional mute in demo mode) ---x ---- Unknown ;from INST-ROM flag! (Lo/HiROM, 2-player, zapper, volume or so?) ---- xx-- Slot Select (0..2 for Slot 1..3) (mapping to both SNES and Z80) ---- --x- Maybe SNES CPU pause? (cleared on deposit coin to continue) (1=Run) ---- ---x Maybe SNES CPU/PPU reset? (0=Reset, 1=Run) */ m_input_disabled = BIT(data, 7) ^ 1; m_spc700->set_volume((data & 0x20) ? 0.0 : 100.0); m_cart_sel = (data & 0xc) >> 2; m_maincpu->set_input_line(INPUT_LINE_HALT, (data & 2) ? CLEAR_LINE : ASSERT_LINE); m_soundcpu->set_input_line(INPUT_LINE_HALT, (data & 2) ? CLEAR_LINE : ASSERT_LINE); m_maincpu->set_input_line(INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); m_soundcpu->set_input_line(INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); /* also reset the device */ if (!(data & 1)) m_spc700->reset(); } WRITE8_MEMBER(nss_state::port_02_w) { /* x--- ---- OSD Clock ? (usually same as Bit6) ;\Chip Select when Bit6=Bit7 ? -x-- ---- OSD Clock ? (usually same as Bit7) ;/ --x- ---- OSD Data Out (0=Low=Zero, 1=High=One) ---x ---- OSD Special (?) ... or just /CS ? (or software index DC3F/DD3F?) ---- x--- RTC /CLK (0=Low=Clock, 1=High=Idle) ;S-3520 ---- -x-- RTC Data Out (0=Low=Zero, 1=High=One) ---- --x- RTC Direction (0=Low=Write, 1=High=Read) ---- ---x RTC /CS (0=Low/Select, 1=High/No) */ // printf("%02x\n",data & 0xf); ioport("RTC_OSD")->write(data, 0xff); } WRITE8_MEMBER(nss_state::port_03_w) { /* x--- ---- Layer SNES Enable? (used by token proc, see 7A46h) SNES? -x-- ---- Layer OSD Enable? --xx ---- Unknown/unused (should be always 0) ---- x--- LED Instructions (0=Off, 1=On) ;-glows in demo (prompt for INST button) ---- -x-- LED Game 3 (0=Off, 1=On) ;\ ---- --x- LED Game 2 (0=Off, 1=On) ; blinked when enough credits inserted ---- ---x LED Game 1 (0=Off, 1=On) ;/ */ // popmessage("%02x",data); } WRITE8_MEMBER(nss_state::port_04_w) { machine().bookkeeping().coin_counter_w(0, (data >> 0) & 1); machine().bookkeeping().coin_counter_w(1, (data >> 1) & 1); } WRITE8_MEMBER(nss_state::port_07_w) { m_joy_flag = 1; } void nss_state::bios_io_map(address_map &map) { map.global_mask(0x7); map(0x00, 0x00).r(FUNC(nss_state::port_00_r)).w(FUNC(nss_state::port_00_w)); map(0x01, 0x01).portr("FP").w(FUNC(nss_state::port_01_w)); map(0x02, 0x02).portr("SYSTEM").w(FUNC(nss_state::port_02_w)); map(0x03, 0x03).portr("RTC").w(FUNC(nss_state::port_03_w)); map(0x04, 0x04).w(FUNC(nss_state::port_04_w)); map(0x07, 0x07).w(FUNC(nss_state::port_07_w)); } void nss_state::machine_start() { snes_state::machine_start(); m_is_nss = 1; m_wram = make_unique_clear(0x1000); } CUSTOM_INPUT_MEMBER(nss_state::game_over_flag_r) { return m_game_over_flag; } static INPUT_PORTS_START( snes ) PORT_START("SYSTEM") PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_START("FP") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, nss_state,game_over_flag_r, nullptr) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("Restart Button") PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Page Up Button") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Page Down Button") PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Instructions Button") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Game 3 Button") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Game 2 Button") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Game 1 Button") PORT_START("EEPROMIN") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("m6m80011ap", m6m80011ap_device, read_bit) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("m6m80011ap", m6m80011ap_device, ready_line ) PORT_BIT( 0x3f, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START("EEPROMOUT") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m6m80011ap", m6m80011ap_device, set_clock_line) PORT_BIT( 0x08, IP_ACTIVE_HIGH,IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m6m80011ap", m6m80011ap_device, write_bit) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m6m80011ap", m6m80011ap_device, set_cs_line) PORT_START("RTC_OSD") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, set_clock_line) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, write_bit) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("m50458", m50458_device, set_cs_line) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, set_clock_line) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, write_bit) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, set_dir_line) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, set_cs_line) PORT_START("RTC") PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("s3520cf", s3520cf_device, read_bit) PORT_START("SERIAL1_DATA1") PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Button B") PORT_PLAYER(1) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Button Y") PORT_PLAYER(1) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("P1 Select") PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Start") PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Button A") PORT_PLAYER(1) PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Button X") PORT_PLAYER(1) PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P1 Button L") PORT_PLAYER(1) PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Button R") PORT_PLAYER(1) PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("SERIAL2_DATA1") PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Button B") PORT_PLAYER(2) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P2 Button Y") PORT_PLAYER(2) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("P2 Select") PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Start") PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Button A") PORT_PLAYER(2) PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P2 Button X") PORT_PLAYER(2) PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P2 Button L") PORT_PLAYER(2) PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Button R") PORT_PLAYER(2) PORT_BIT( 0x000f, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("SERIAL1_DATA2") PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("SERIAL2_DATA2") PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START("DSW") PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x03, DEF_STR( Hard ) ) PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x0c, "2" ) PORT_DIPSETTING( 0x08, "3" ) PORT_DIPSETTING( 0x04, "4" ) PORT_DIPSETTING( 0x00, "5" ) PORT_DIPNAME( 0x30, 0x00, "Time limit per level?" ) // taken from the scan of nss_adam PORT_DIPSETTING( 0x10, "104 sec." ) PORT_DIPSETTING( 0x20, "112 sec." ) PORT_DIPSETTING( 0x00, "120 sec." ) PORT_DIPSETTING( 0x30, "? sec." ) PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) #if SNES_LAYER_DEBUG PORT_START("DEBUG1") PORT_CONFNAME( 0x03, 0x00, "Select BG1 priority" ) PORT_CONFSETTING( 0x00, "All" ) PORT_CONFSETTING( 0x01, "BG1B (lower) only" ) PORT_CONFSETTING( 0x02, "BG1A (higher) only" ) PORT_CONFNAME( 0x0c, 0x00, "Select BG2 priority" ) PORT_CONFSETTING( 0x00, "All" ) PORT_CONFSETTING( 0x04, "BG2B (lower) only" ) PORT_CONFSETTING( 0x08, "BG2A (higher) only" ) PORT_CONFNAME( 0x30, 0x00, "Select BG3 priority" ) PORT_CONFSETTING( 0x00, "All" ) PORT_CONFSETTING( 0x10, "BG3B (lower) only" ) PORT_CONFSETTING( 0x20, "BG3A (higher) only" ) PORT_CONFNAME( 0xc0, 0x00, "Select BG4 priority" ) PORT_CONFSETTING( 0x00, "All" ) PORT_CONFSETTING( 0x40, "BG4B (lower) only" ) PORT_CONFSETTING( 0x80, "BG4A (higher) only" ) PORT_START("DEBUG2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 1") PORT_CODE(KEYCODE_1_PAD) PORT_TOGGLE PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 2") PORT_CODE(KEYCODE_2_PAD) PORT_TOGGLE PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 3") PORT_CODE(KEYCODE_3_PAD) PORT_TOGGLE PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle BG 4") PORT_CODE(KEYCODE_4_PAD) PORT_TOGGLE PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Objects") PORT_CODE(KEYCODE_5_PAD) PORT_TOGGLE PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Main/Sub") PORT_CODE(KEYCODE_6_PAD) PORT_TOGGLE PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Color Math") PORT_CODE(KEYCODE_7_PAD) PORT_TOGGLE PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Windows") PORT_CODE(KEYCODE_8_PAD) PORT_TOGGLE PORT_START("DEBUG3") PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mosaic") PORT_CODE(KEYCODE_9_PAD) PORT_TOGGLE PORT_CONFNAME( 0x70, 0x00, "Select OAM priority" ) PORT_CONFSETTING( 0x00, "All" ) PORT_CONFSETTING( 0x10, "OAM0 only" ) PORT_CONFSETTING( 0x20, "OAM1 only" ) PORT_CONFSETTING( 0x30, "OAM2 only" ) PORT_CONFSETTING( 0x40, "OAM3 only" ) PORT_CONFNAME( 0x80, 0x00, "Draw sprite in reverse order" ) PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) PORT_CONFSETTING( 0x80, DEF_STR( On ) ) PORT_START("DEBUG4") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 0 draw") PORT_TOGGLE PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 1 draw") PORT_TOGGLE PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 2 draw") PORT_TOGGLE PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 3 draw") PORT_TOGGLE PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 4 draw") PORT_TOGGLE PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 5 draw") PORT_TOGGLE PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 6 draw") PORT_TOGGLE PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Toggle Mode 7 draw") PORT_TOGGLE #endif INPUT_PORTS_END WRITE_LINE_MEMBER(nss_state::nss_vblank_irq) { if (state && m_nmi_enable) m_bioscpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } void nss_state::machine_reset() { snes_state::machine_reset(); /* start with both CPUs disabled */ m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_soundcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); /* reset the security chip */ m_rp5h01->enable_w(1); m_rp5h01->enable_w(0); m_rp5h01->reset_w(0); m_rp5h01->reset_w(1); m_game_over_flag = 1; m_joy_flag = 1; } MACHINE_CONFIG_START(nss_state::nss) /* base snes hardware */ MCFG_DEVICE_ADD("maincpu", _5A22, MCLK_NTSC) /* 2.68Mhz, also 3.58Mhz */ MCFG_DEVICE_PROGRAM_MAP(snes_map) // runs at 24.576 MHz / 12 = 2.048 MHz MCFG_DEVICE_ADD("soundcpu", SPC700, XTAL(24'576'000) / 12) MCFG_DEVICE_PROGRAM_MAP(spc_mem) MCFG_QUANTUM_PERFECT_CPU("maincpu") /* nss hardware */ MCFG_DEVICE_ADD("bios", Z80, 4000000) MCFG_DEVICE_PROGRAM_MAP(bios_map) MCFG_DEVICE_IO_MAP(bios_io_map) MCFG_M50458_ADD("m50458", 4000000, "osd") /* TODO: correct clock */ S3520CF(config, m_s3520cf); /* RTC */ RP5H01(config, m_rp5h01, 0); M6M80011AP(config, "m6m80011ap"); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); MCFG_DEVICE_ADD("spc700", SNES_SOUND) MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) /* video hardware */ /* TODO: the screen should actually superimpose, but for the time being let's just separate outputs */ config.set_default_layout(layout_dualhsxs); // SNES PPU MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC) MCFG_SCREEN_UPDATE_DRIVER( snes_state, screen_update ) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, nss_state, nss_vblank_irq)) SNES_PPU(config, m_ppu, MCLK_NTSC); m_ppu->open_bus_callback().set([this] { return snes_open_bus_r(); }); // lambda because overloaded function name m_ppu->set_screen("screen"); // NSS MCFG_SCREEN_ADD("osd", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) MCFG_SCREEN_SIZE(288+22, 216+22) MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 216-1) MCFG_SCREEN_UPDATE_DRIVER(nss_state,screen_update) MACHINE_CONFIG_END /*************************************************************************** Game driver(s) ***************************************************************************/ #define NSS_BIOS \ ROM_REGION(0x100, "sound_ipl", 0) /* IPL ROM */ \ ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) \ ROM_REGION(0x8000, "bios", 0) /* Bios CPU */ \ ROM_SYSTEM_BIOS( 0, "single", "Nintendo Super System (Single Cart BIOS)" ) \ ROMX_LOAD("nss-ic14.02.ic14", 0x00000, 0x8000, CRC(e06cb58f) SHA1(62f507e91a2797919a78d627af53f029c7d81477), ROM_BIOS(0) ) /* bios */ \ ROM_SYSTEM_BIOS( 1, "multi", "Nintendo Super System (Multi Cart BIOS)" ) \ ROMX_LOAD("nss-c.ic14" , 0x00000, 0x8000, CRC(a8e202b3) SHA1(b7afcfe4f5cf15df53452dc04be81929ced1efb2), ROM_BIOS(1) ) /* bios */ \ ROM_SYSTEM_BIOS( 2, "single3", "Nintendo Super System (Single Cart BIOS v3, hack?)" ) \ ROMX_LOAD("nss-v3.ic14" , 0x00000, 0x8000, CRC(ac385b53) SHA1(e3942f9d508c3c8074c3c3941376c37ca68b8e54), ROM_BIOS(2) ) /* bios */ ROM_START( nss ) NSS_BIOS ROM_REGION( 0x100000, "user3", ROMREGION_ERASEFF ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", ROMREGION_ERASEFF ) ROM_END ROM_START( nss_actr ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "act-rais.ic3", 0x00000, 0x80000, CRC(c9f788c2) SHA1(fba2331fd5bcbe51d74115528fd3a9becf072e8d) ) ROM_LOAD( "act-rais.ic2", 0x80000, 0x80000, CRC(4df9cc63) SHA1(3e98d9693d60d125a1257ba79701f27bda688261) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "act-rais.ic8", 0x0000, 0x8000, CRC(08b38ce6) SHA1(4cbb7fd28d98ffef0f17747201625883af954e3a) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(4b74ac55) SHA1(51ea71b06367b4956a4b737385e2d4d15bd43980) ) ROM_END ROM_START( nss_con3 ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "contra3.ic3", 0x00000, 0x80000, CRC(33b03501) SHA1(c7f4835d5ec4983e487b00f0b4c49fede2f03b9c) ) ROM_LOAD( "contra3.ic2", 0x80000, 0x80000, CRC(2f3e3b5b) SHA1(0186b92f022701f6ae29984252e6d346acf6550b) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "contra3.ic8", 0x0000, 0x8000, CRC(0fbfa23b) SHA1(e7a1a78a58c64297e7b9623350ec57aed8035a4f) ) ROM_REGION( 0x10, "rp5h01", ROMREGION_ERASE00 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(e97e4b00) SHA1(70e8382a93137353f5d0b905db2e9af50c52ce0b) ) ROM_END ROM_START( nss_adam ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "addams.ic3", 0x00000, 0x80000, CRC(44643930) SHA1(a45204b2eb13c6befca30d130061b5b8ba054270) ) ROM_LOAD( "addams.ic2", 0x80000, 0x80000, CRC(6196adcf) SHA1(a450f278a37d5822f607aa3631831a461e8b147e) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "addams.ic8", 0x0000, 0x8000, CRC(57c7f72c) SHA1(2e3642b4b5438f6c535d6d1eb668e1663062cf78) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(154d10c2) SHA1(6829e149c341b753ee9bc72055c0634db4e81884) ) ROM_END ROM_START( nss_aten ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "amtennis.ic3", 0x00000, 0x80000, CRC(aeabaf2a) SHA1(b355e0a322b57454e767785a49c14d4c7f492488) ) ROM_LOAD( "amtennis.ic2", 0x80000, 0x80000, CRC(7738c5f2) SHA1(eb0089e9724c7b3834d9f6c47b92f5a1bb26fc77) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "amtennis.ic8", 0x0000, 0x8000, CRC(d2cd3926) SHA1(49fc253b1b9497ef1374c7db0bd72c163ffb07e7) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10,CRC(3e640fa2) SHA1(ac530610a9d4979f070d5f57dfd4886c530aa20f) ) ROM_END ROM_START( nss_rob3 ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "robocop3.ic3", 0x00000, 0x80000, CRC(60916c42) SHA1(462d9645210a58bfd5204bd209eae2cdadb4493e) ) ROM_LOAD( "robocop3.ic2", 0x80000, 0x80000, CRC(a94e1b56) SHA1(7403d70504310ad5949a3b45b4a1e71e7d2bce77) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "robocop3.ic8", 0x0000, 0x8000, CRC(90d13c51) SHA1(6751dab14b7d178350ac333f07dd2c3852e4ae23) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(eb9a75de) SHA1(58f028c3f28eb4155215f4e154323e01e0fd4297) ) ROM_END ROM_START( nss_ncaa ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "ncaa.ic3", 0x00000, 0x80000, CRC(ef49ad8c) SHA1(4c40f3746b995b53f006434b9ccec06d8fe16e1f) ) ROM_LOAD( "ncaa.ic2", 0x80000, 0x80000, CRC(83ef6936) SHA1(8e0f38c763861e33684c6ddb742385b0522af78a) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "ncaa.ic8", 0x0000, 0x8000, CRC(b9fa28d5) SHA1(bc538bcff5c19eae4becc6582b5c111d287b76fa) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(a2e9ad5b) SHA1(a41f82451fc185f8e989a0d4f38700dc7813bb50) ) ROM_END ROM_START( nss_skin ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "skins.ic3", 0x00000, 0x80000, CRC(ee1bb84d) SHA1(549ad9319e94a5d75cd4af017e63ea93ab407c87) ) ROM_LOAD( "skins.ic2", 0x80000, 0x80000, CRC(365fd19e) SHA1(f60d7ac39fe83fb98730e73fbef410c90a4ff35b) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "skins.ic8", 0x0000, 0x8000, CRC(9f33d5ce) SHA1(4d279ad3665bd94c7ca9cb2778572bed42c5b298) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(86f8cd1d) SHA1(d567d194058568f4ae32b7726e433918b06bca54) ) ROM_END ROM_START( nss_lwep ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "nss-lw.ic3", 0x00000, 0x80000, CRC(32564666) SHA1(bf371218fa303ce95eab09fb6017a522071dcd7e) ) ROM_LOAD( "nss-lw.ic2", 0x80000, 0x80000, CRC(86365042) SHA1(f818024c6f858fd2780396b6c83d3a37a97fa08a) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "nss-lw.ic8", 0x0000, 0x8000, CRC(1acc1d5d) SHA1(4c8b100ac5847915aaf3b5bfbcb4f632606c97de) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(e9755c14) SHA1(d8dbebf3536dcbd18c50ba11a6b729dc7085f74b) ) ROM_END ROM_START( nss_ssoc ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "s-soccer.ic1", 0x00000, 0x80000, CRC(70b7f50e) SHA1(92856118528995e3a0b7d22340d440bef5fd61ac) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "s-soccer.ic3", 0x0000, 0x8000, CRC(c09211c3) SHA1(b274a57f93ae0a8774664df3d3615fb7dbecfa2e) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(e41c4204) SHA1(529ca7df78ecf154a095dc1b627783c43c817a45) ) ROM_END ROM_START( nss_smw ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "nss-mw-0_prg.ic1", 0x000000, 0x80000, CRC(c46766f2) SHA1(06a6efc246c6fdb83efab1d402d61d2179a84494) ) // Note: this rom appears with 2 variations: LH534J mask rom with "NSS-MW-0 // PRG" silkscreen // or ?LH534J mask rom? with "NSS-R // IC1 // MW" label sticker /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "nss-r__ic3__mw.ic3", 0x0000, 0x8000, CRC(f2c5466e) SHA1(e116f01342fcf359498ed8750741c139093b1fb2) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(fd700dca) SHA1(6805cefb1856c3498b7a7a049c0d09858afac47c) ) // Labeled "MW" on yellow sticker ROM_END ROM_START( nss_fzer ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "nss-fz-0.ic2", 0x000000, 0x100000, CRC(e9b3cdf1) SHA1(ab616eecd292b94ca74c55446bddd23e9dc3e3bb) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "fz.ic7", 0x0000, 0x8000, CRC(48ae570d) SHA1(934f9fec47dcf9e49936388968d2db50c69950da) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(9650a7d0) SHA1(59d57ab2720cff3a24105a7250560c41def45acc) ) ROM_END ROM_START( nss_sten ) NSS_BIOS ROM_REGION( 0x100000, "user3", 0 ) ROM_LOAD( "nss-st-0.ic1", 0x000000, 0x100000, CRC(f131611f) SHA1(0797936e1fc9e705cd7e029097fc013a58e69002) ) /* instruction / data rom for bios */ ROM_REGION( 0x8000, "ibios_rom", 0 ) ROM_LOAD( "st.ic3", 0x0000, 0x8000, CRC(8880596e) SHA1(ec6d68fc2f51f7d94f496cd72cf898db65324542) ) ROM_REGION( 0x10, "rp5h01", 0 ) ROM_LOAD( "security.prm", 0x00, 0x10, CRC(2fd8475b) SHA1(38af97734649b90e0ea74cb1daeaa431e4295eb9) ) ROM_END void nss_state::init_nss() { uint8_t *PROM = memregion("rp5h01")->base(); for (int i = 0; i < 0x10; i++) PROM[i] = bitswap<8>(PROM[i],0,1,2,3,4,5,6,7) ^ 0xff; init_snes(); } GAME( 199?, nss, 0, nss, snes, nss_state, init_snes, ROT0, "Nintendo", "Nintendo Super System BIOS", MACHINE_IS_BIOS_ROOT ) GAME( 1992, nss_actr, nss, nss, snes, nss_state, init_nss, ROT0, "Enix", "Act Raiser (Nintendo Super System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) GAME( 1992, nss_adam, nss, nss, snes, nss_state, init_nss, ROT0, "Ocean", "The Addams Family (Nintendo Super System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) GAME( 1992, nss_aten, nss, nss, snes, nss_state, init_nss, ROT0, "Absolute Entertainment Inc.", "David Crane's Amazing Tennis (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1992, nss_con3, nss, nss, snes, nss_state, init_nss, ROT0, "Konami", "Contra 3: The Alien Wars (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1992, nss_lwep, nss, nss, snes, nss_state, init_nss, ROT0, "Ocean", "Lethal Weapon (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1992, nss_ncaa, nss, nss, snes, nss_state, init_nss, ROT0, "Sculptured Software Inc.", "NCAA Basketball (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1992, nss_rob3, nss, nss, snes, nss_state, init_nss, ROT0, "Ocean", "Robocop 3 (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1992, nss_skin, nss, nss, snes, nss_state, init_nss, ROT0, "Irem", "Skins Game (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // can't start GAME( 1992, nss_ssoc, nss, nss, snes, nss_state, init_nss, ROT0, "Human Inc.", "Super Soccer (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1991, nss_smw, nss, nss, snes, nss_state, init_nss, ROT0, "Nintendo", "Super Mario World (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1991, nss_fzer, nss, nss, snes, nss_state, init_nss, ROT0, "Nintendo", "F-Zero (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) GAME( 1991, nss_sten, nss, nss, snes, nss_state, init_nss, ROT0, "Nintendo", "Super Tennis (Nintendo Super System)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )