summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/nss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/nss.cpp')
-rw-r--r--src/mame/drivers/nss.cpp1102
1 files changed, 0 insertions, 1102 deletions
diff --git a/src/mame/drivers/nss.cpp b/src/mame/drivers/nss.cpp
deleted file mode 100644
index 342521c4536..00000000000
--- a/src/mame/drivers/nss.cpp
+++ /dev/null
@@ -1,1102 +0,0 @@
-// 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_READ_LINE_MEMBER(game_over_flag_r);
-
-private:
- required_device<cpu_device> m_bioscpu;
- required_device<m50458_device> m_m50458;
- required_device<s3520cf_device> m_s3520cf;
- required_device<rp5h01_device> m_rp5h01;
- optional_device<palette_device> m_palette;
-
- uint8_t m_wram_wp_flag;
- std::unique_ptr<uint8_t[]> 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(offset + 0x100);
-}
-
-WRITE8_MEMBER(nss_state::spc_ram_100_w)
-{
- m_spc700->spc_ram_w(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<uint8_t[]>(0x1000);
-}
-
-
-READ_LINE_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_READ_LINE_MEMBER(nss_state, game_over_flag_r)
- 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;
-}
-
-void nss_state::nss(machine_config &config)
-{
- /* base snes hardware */
- _5A22(config, m_maincpu, MCLK_NTSC); /* 2.68Mhz, also 3.58Mhz */
- m_maincpu->set_addrmap(AS_PROGRAM, &nss_state::snes_map);
-
- // runs at 24.576 MHz / 12 = 2.048 MHz
- SPC700(config, m_soundcpu, XTAL(24'576'000) / 12);
- m_soundcpu->set_addrmap(AS_PROGRAM, &nss_state::spc_mem);
-
- config.set_perfect_quantum(m_maincpu);
-
- /* nss hardware */
- Z80(config, m_bioscpu, 4000000);
- m_bioscpu->set_addrmap(AS_PROGRAM, &nss_state::bios_map);
- m_bioscpu->set_addrmap(AS_IO, &nss_state::bios_io_map);
-
- M50458(config, m_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();
- SNES_SOUND(config, m_spc700, XTAL(24'576'000) / 12);
- m_spc700->add_route(0, "lspeaker", 1.00);
- m_spc700->add_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
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_raw(DOTCLK_NTSC * 2, SNES_HTOTAL * 2, 0, SNES_SCR_WIDTH * 2, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC);
- m_screen->set_video_attributes(VIDEO_VARIABLE_WIDTH);
- m_screen->set_screen_update(FUNC(snes_state::screen_update));
- m_screen->screen_vblank().set(FUNC(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
- screen_device &osd(SCREEN(config, "osd", SCREEN_TYPE_RASTER));
- osd.set_refresh_hz(60);
- osd.set_vblank_time(ATTOSECONDS_IN_USEC(2500));
- osd.set_size(288+22, 216+22);
- osd.set_visarea(0, 288-1, 0, 216-1);
- osd.set_screen_update(FUNC(nss_state::screen_update));
-}
-
-/***************************************************************************
-
- 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 )