summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/majorpkr.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/majorpkr.c')
-rw-r--r--trunk/src/mame/drivers/majorpkr.c1096
1 files changed, 1096 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/majorpkr.c b/trunk/src/mame/drivers/majorpkr.c
new file mode 100644
index 00000000000..0f3fc999bd3
--- /dev/null
+++ b/trunk/src/mame/drivers/majorpkr.c
@@ -0,0 +1,1096 @@
+/**********************************************************************************
+
+ Major Poker / Major Joker
+ 1994 PAL System.
+
+ Driver by Roberto Fresca.
+
+
+ Special thanks to Tomasz Slanina & Rob Ragon for their invaluable help.
+
+***********************************************************************************
+
+ Hardware Notes:
+ --------------
+
+ 1x Z80 @ 6 MHz. (main CPU)
+
+ 1x M6295 @ 1.5 MHz. (4 channel mixing ADPCM voice synthesis). Pin7 high.
+
+ 1x 6845 (CRT Controller) @ 750 kHz.
+ Hs 15625 Hz
+ Vs 52.786 Hz
+
+ 2x MB8464 (Video?)8kx8
+ 1x MB8416 (NVRAM) 2Kx8
+ 1x MB8464 (?) 8kx8
+
+ 2x 27C040 (Roms P1 & P2) (GFX ROMs).
+ 2x 27C010 (Roms 3 & 4) (GFX ROMs).
+ 1x 27C020 (Rom 5) (sound)
+ 1x 27C512 (Rom 6) (program)
+
+ 1x Xtal @ 12 MHz.
+
+ 4x 8 DIP switches banks.
+ 2x switches (SW1, SW2).
+
+ 1x 2x10-pin edge connector.
+ 1x 2x22-pin edge connector.
+
+
+***********************************************************************************
+
+ PORTS:
+ ------
+
+ 00 W ---> ROM bank.
+ 01 W ---> RAM bank.
+ 02 W ---> RAM bank.
+
+ 10 R ---> Regular inputs (holds) multiplexed with credits out.
+ 10 W ---> Writes a kind of watchdog (bit4) and mech counters pulses (bits 0-1-2-3).
+ 11 R ---> Read input port (remaining controls).
+ 11 W ---> Writes mux selector.
+ 12 R ---> Read coin/credits port.
+ 12 W ---> Video registers: Normal or Up Down screen (bit6 off/on). Also writes 0xFC & 0x11 at CRTC offsets 0x0C & 0x0D (0's if normal).
+ 13 R ---> Multiplexed port for DIP switches banks.
+ 13 W ---> Lamps out (array a)
+ 14 R ---> Freeze. Switch in bit0 that pause the game when active. Just once active, the code loops till the bit resets.
+ 14 W ---> Lamps out (array b).
+
+ 50 RW ---> OKI6295 (R/W)
+
+ 60 W ---> PSG SN76489/96 initialization routines. (Maybe a leftover for different hardware)
+ The offset is initialized with the following sequence: 0x9f, 0xbf, 0xdf, 0xff.
+
+
+ Pulses - Port 10h.
+ ------------------
+ - bits -
+ 7654 3210
+ ---- ---x Credits Out mech counter.
+ ---- --x- Credits 3 mech counter.
+ ---- -x-- Credits 1 mech counter.
+ ---- x--- Credits 2 mech counter.
+ ---x ---- Watchdog? (constant writes). (*)
+ xxx- ---- Unknown.
+
+ (*) Tied to a ULN Opto Triac (pin3 solder side edge connector - Lock Out (100V))
+
+
+ Lamps - Array A - Port 13h.
+ ---------------------------
+ - bits -
+ 7654 3210
+ ---- ---x Hold 1 lamp.
+ ---- --x- Hold 2 lamp.
+ ---- -x-- Hold 3 lamp.
+ ---- x--- Hold 4 lamp.
+ ---x ---- Hold 5 lamp.
+ --x- ---- Big lamp.
+ -x-- ---- Small lamp.
+ x--- ---- Unknown.
+
+
+ Lamps - Array B - Port 14h.
+ ---------------------------
+ - bits -
+ 7654 3210
+ ---- ---x Bet lamp.
+ ---- --x- Draw lamp.
+ ---- -x-- Cancel lamp.
+ ---- x--- Take lamp.
+ ---x ---- Double-Up lamp.
+ --x- ---- Fever lamp.
+ xx-- ---- Unknown.
+
+***********************************************************************************
+
+ Instructions...
+ (translated from a Japanese flyer)
+
+ Bonus stage:
+ - 10 fever awarded by three of a kind of 1, 3, or 7.
+ - 15 fever awarded by four of a kind.
+
+ Slot stage:
+ - 10 bonus stage awarded by three consecutive 1, 3, or 7.
+ - 5 bonus stage awarded by four consecutive numbers other than 1, 3, or 7.
+
+ If bonus is awarded while you are in bonus stage, odds will be x4.
+ Bonus stage & slot stage: You can get triple & fourth fever points, and you
+ can challenge 3 or 4 times of double-up game by this point.
+
+ ....
+
+ Service Mode:
+
+ F2 to enter the Book/Settings Mode.
+ HOLD1 to move UP.
+ HOLD2 to move DOWN.
+ HOLD3 to move LEFT.
+ HOLD4 to move RIGHT.
+ HOLD5 to move next screen / exit.
+
+ You can shortcut the DIP settings pressing "0" in Book Mode.
+ HOLD5 to exit.
+
+***********************************************************************************
+
+ Major Poker: Things that you should know!!! (from "engrish" manual)
+ -------------------------------------------------------------------
+
+ The game not stabilise until 10,000 games have been played. As a result, the
+ actual payout % may exceed the set payout % during this period. After the 10,000
+ games the machine will follow the set payout %.
+
+ Original game for your location.
+
+ Analyzer screen #1: Provides you with data regarding games played so far such as
+ numbers of games, number of fevers, etc...
+
+ Analyzer screen #2: Allows you to adjust various aspects of the game to suit your
+ location. For example you can increase the number of Fever (this does not affect
+ the payout %). Also you can make the dealing speed quicker or slower.
+
+ Even if you do not adjust the game it is ready to be played.
+
+
+ DIP Switches....
+
+ .-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----.
+ | DIP Switches #1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ | OFF Fixed | OFF | |
+ +-------------------------------+-----+-----+-----------------------------------+
+ | Screen Direction Normal | | OFF | |
+ | Up Down | | ON | |
+ +-------------------------------+-----+-----+-----+-----------------------------+
+ | Hopper No | | OFF | |
+ | Yes | | ON | |
+ +-------------------------------+-----------+-----+-----+-----------------------+
+ | Hopper SW Active High | | OFF | |
+ | Low | | ON | |
+ +-------------------------------+-----------------+-----+-----+-----------------+
+ | Coin Payout Payout SW | | OFF | |
+ | Automatic | | ON | |
+ +-------------------------------+-----------------------+-----+-----+-----------+
+ | Hold Cancel No | | OFF | |
+ | Yes | | ON | |
+ +-------------------------------+-----------------------------+-----+-----+-----+
+ | Auto Hold No | | OFF | |
+ | Yes | | ON | |
+ +-------------------------------+-----------------------------------+-----+-----+
+ | Fever Mode Yes | | OFF |
+ | No | | ON |
+ '-------------------------------+-----------------------------------------+-----'
+
+ .-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----.
+ | DIP Switches #2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ | Payout % 95% | OFF | OFF | OFF | |
+ | 90% | ON | OFF | OFF | |
+ | 85% | OFF | ON | OFF | |
+ | 80% | ON | ON | OFF | |
+ | 75% | OFF | OFF | ON | |
+ | 70% | ON | OFF | ON | |
+ | 65% | OFF | ON | ON | |
+ | 60% | ON | ON | ON | |
+ +-------------------------------+-----+-----+-----+-----+-----+-----------------+
+ | Min Bet size 1 | | OFF | OFF | |
+ | for Fever 3 | | ON | OFF | |
+ | 5 | | OFF | ON | |
+ | 10 | | ON | ON | |
+ +-------------------------------+-----------------+-----+-----+-----+-----+-----+
+ | Double-Up Weak | | OFF | OFF | |
+ | Game Difficulty ... | | ON | OFF | |
+ | ... | | OFF | ON | |
+ | Strong | | ON | ON | |
+ +-------------------------------+-----------------------------+-----+-----+-----+
+ | OFF Fixed | | OFF |
+ '-------------------------------+-----------------------------------------+-----'
+
+ .-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----.
+ | DIP Switches #3 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ | Key In 1 Coin - 50 Credits | OFF | OFF | OFF | |
+ | 1 Coin - 5 Credits | ON | OFF | OFF | |
+ | 1 Coin - 10 Credits | OFF | ON | OFF | |
+ | 1 Coin - 20 Credits | ON | ON | OFF | |
+ | 1 Coin - 25 Credits | OFF | OFF | ON | |
+ | 1 Coin - 40 Credits | ON | OFF | ON | |
+ | 1 Coin - 60 Credits | OFF | ON | ON | |
+ | 1 Coin - 100 Credits | ON | ON | ON | |
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----------+
+ | Coin-A 1 Coin - 5 Credits | | OFF | OFF | OFF | |
+ | 1 Coin - 1 Credit | | ON | OFF | OFF | |
+ | 1 Coin - 2 Credits | | OFF | ON | OFF | |
+ | 1 Coin - 10 Credits | | ON | ON | OFF | |
+ | 1 Coin - 20 Credits | | OFF | OFF | ON | |
+ | 1 Coin - 25 Credits | | ON | OFF | ON | |
+ | 1 Coin - 40 Credits | | OFF | ON | ON | |
+ | 1 Coin - 50 Credits | | ON | ON | ON | |
+ +-------------------------------+-----------------+-----+-----+-----+-----+-----+
+ | Credit Limit 5000 | | OFF | OFF |
+ | 10000 | | ON | OFF |
+ | 20000 | | OFF | ON |
+ | 30000 | | ON | ON |
+ '-------------------------------+-----------------------------------+-----+-----'
+
+ .-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----.
+ | DIP Switches #4 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
+ | Coin-B 1 Coin - 50 Credits | OFF | OFF | OFF | OFF | |
+ | 1 Coin - 1 Credit | ON | OFF | OFF | OFF | |
+ | 1 Coin - 2 Credits | OFF | ON | OFF | OFF | |
+ | 1 Coin - 4 Credits | ON | ON | OFF | OFF | |
+ | 1 Coin - 5 Credits | OFF | OFF | ON | OFF | |
+ | 1 Coin - 10 Credits | ON | OFF | ON | OFF | |
+ | 1 Coin - 20 Credits | OFF | ON | ON | OFF | |
+ | 1 Coin - 25 Credits | ON | ON | ON | OFF | |
+ | 1 Coin - 100 Credits | OFF | OFF | OFF | ON | |
+ | 2 Coins - 1 Credit | ON | OFF | OFF | ON | |
+ | 2 Coins - 5 Credits | OFF | ON | OFF | ON | |
+ | 4 Coins - 1 Credit | ON | ON | OFF | ON | |
+ | 5 Coins - 1 Credit | OFF | OFF | ON | ON | |
+ | 5 Coins - 2 Credits | ON | OFF | ON | ON | |
+ | 10 Coins - 1 Credit | OFF | ON | ON | ON | |
+ | 20 Coins - 1 Credit | ON | ON | ON | ON | |
+ +-------------------------------+-----+-----+-----+-----+-----+-----+-----------+
+ | Max Bet 20 | | OFF | OFF | |
+ | 10 | | ON | OFF | |
+ | 30 | | OFF | ON | |
+ | 50 | | ON | ON | |
+ +-------------------------------+-----------------------+-----+-----+-----+-----+
+ | Credit-In Limit No Limit | | OFF | OFF |
+ | 1000 | | ON | OFF |
+ | 2000 | | OFF | ON |
+ | 5000 | | ON | ON |
+ '-------------------------------+-----------------------------------+-----+-----'
+
+
+***********************************************************************************
+
+ Power Supply edge connector Layout...
+
+ .-----------------------+-+--+---------------------------.
+ | Components side |L|PN| Solder side |
+ +-----------------------+-+--+---------------------------+
+ | GND |A|01| GND |
+ | GND |B|02| GND |
+ | +5V |C|03| +5V |
+ | +5V |D|04| +5V |
+ | Lamp BET |E|05| Lamp HOLD 1 |
+ | +12V |F|06| +12V |
+ | Lamp DEAL |H|07| Lamp HOLD 2 |
+ | Lamp CANCEL |J|08| Lamp HOLD 3 |
+ | Lamp TAKE SCORE |K|09| Lamp HOLD 4 |
+ | Lamp DOUBLE UP |L|10| Lamp HOLD 5 |
+ '-----------------------+-+--+---------------------------'
+
+ Edge connector Layout...
+
+ .-----------------------+-+--+---------------------------.
+ | Components side |L|PN| Solder side |
+ +-----------------------+-+--+---------------------------+
+ | Out Counter |A|01| AC 100V In |
+ | Key In Counter |B|02| AC Out to Hopper |
+ | Coin In Counter A |C|03| Lock Out (100V) |
+ | Sound GND |D|04| Sound Out |
+ | HOLD 5 / SMALL |E|05| Payout |
+ | Key In |F|06| HOLD 2 |
+ | HOLD 3 |H|07| Coin B In |
+ | HOLD 4 |J|08| HOLD 1 / BIG |
+ | |K|09| RED (TV) |
+ | |L|10| GREEN (TV) |
+ | TAKE SCORE |M|11| Sync (TV) |
+ | DOUBLE UP |N|12| BLUE (TV) |
+ | Coin A In |P|13| DEAL |
+ | CANCEL |R|14| Analyzer (Books/Settings) |
+ | * SW2 (Clear Meters) |S|15| BET |
+ | Coin In Counter |T|16| Out of Fever Lamp |
+ | ** GND |U|17| GND ** |
+ | ** GND |V|18| GND ** |
+ | |W|19| GND |
+ | |X|20| |
+ | Hopper Limited SW |Y|21| Hopper Payout |
+ | |Z|22| |
+ '-----------------------+-+--+---------------------------'
+
+ * Soft SW2 Extension. Traced (undocumented).
+ ** Edge connector pins U, V, 17 and 18 (GND), are tied
+ to Power Supply edge connector pins A, B, 01 and 02.
+
+***********************************************************************************
+
+ Book / Settings Mode:
+ ---------------------
+
+ First Screen (Books & Meters):
+
+ 5C 0 F5C 0
+ RF 0 FRF 0
+ SF 0 FSF 0
+ 4C 0 F4C 0
+ FH 0 FFH 0
+ FL 0 FFL 0
+ ST 0 FST 0
+ 3C 0 F3C 0
+ 2P 0 F2P 0
+
+ MAIN GAMES 0
+ FEVER GAMES 0
+ FEVER OUT 0
+ S-FEVER GAMES 0
+ S-FEVER OUT 0
+ TOTAL BET 0
+ TOTAL SCORE 0
+ SCORE%BET 0%
+ W-UP IN 0
+ W-UP OUT 0
+ W-UP OUT%IN 0%
+ CREDIT IN 0
+ CREDIT OUT 0
+ CREDIT OUT%IN 0%
+ DOWN COUNT 0
+ TOTAL-CREDIT IN 0
+ TOTAL-CREDIT OUT 0
+ TOTAL-CREDIT IN/OUT 0
+
+ DATA RESET: In this first screen, press the SW2 to clear all data,
+ except for the Total Credits meters.
+
+
+ Second Screen (Settings):
+
+ MIN NTL MAX
+ FEVER --------------------*--------------------
+ 5 CARD --------------------*--------------------
+ ROYAL --------------------*--------------------
+ STR-FLUSH --------------------*--------------------
+ 4 CARD --------------------*--------------------
+ FULL HOUSE --------------------*--------------------
+ FLUSH --------------------*--------------------
+ STRAIGHT --------------------*--------------------
+ 3 CARD --------------------*--------------------
+ 2 PAIR --------------------*--------------------
+ NORMAL JKR --------------------*--------------------
+ FEVER JKR --------------------*--------------------
+ DEAL SPEED --------------------*--------------------
+ difficult appear easy appear
+
+ HOLD 1 (Up)
+ HOLD 2 (Down)
+ HOLD 3 (Left)
+ HOLD 4 (Right)
+ HOLD 5 (Next)
+
+
+ Third Screen (Settings):
+
+ Memory Switches...
+
+ DEALER OFF ON <--- Girl Dealer.
+ FVR-ANIMATION OFF ON <--- Fever Screen animation.
+ DUP-NUDE OFF ON <--- Double-Up Nude.
+ SLOW-ACTION OFF ON <--- Speed of Cards.
+ KEY-LOCK OFF ON <--- Lock settings leaving only Books. Other revisions may have "JQKA-1PAIR" (Jacks or Better).
+ FVR-SLOT OFF ON <--- Fever's number slot.
+ AMUSEMENT-MODE OFF ON <--- Self explanatory....
+
+ 1ST BET 1 5 10 20 30 <--- First Bet.
+ CNT BET 1 5 10 20 30 <--- Second Bet.
+
+ BACK-RGB R 0 1 2 3 4 5 6 7 <--- Background R component (0 = light, 7 = strong)
+ BACK-RGB G 0 1 2 3 4 5 6 7 <--- Background G component (0 = light, 7 = strong)
+ BACK-RGB B 0 1 2 3 4 5 6 7 <--- Background B component (0 = light, 7 = strong)
+
+ BACK-PATTERN 0 1 2 3 4 5 6 <--- Background Pattern (0 = None, 1-6 available when dealer is off)
+
+ HOLD 1 (Up)
+ HOLD 2 (Down)
+ HOLD 3 (Off)
+ HOLD 4 (On)
+ HOLD 5 (Exit)
+
+
+ Fourth Screen (DIP switches test):
+
+ DIP Switch test...
+
+ DIPSW-1 00000000 00000000
+ DIPSW-2 00000000 00000000
+ DIPSW-3 00000000 00000000
+ DIPSW-4 00000000 00000000
+
+ HOLD 5 (Exit)
+
+ Created of DIP Switch (Green) <--- ?????
+ Test Mode of DIP Switch (White) <--- Show on the fly each DIP switch state.
+
+***********************************************************************************
+
+ To Do:
+
+ - Workaround to hide the unused last column (16 pixels), but forced on the 6845.
+ - Find the input that unlocks the "KEY-LOCK" mode in the settings.
+ - Proper flip mode.
+ - Resistors Network.
+
+**********************************************************************************/
+
+#define MASTER_CLOCK XTAL_12MHz
+#define CPU_CLOCK (MASTER_CLOCK / 2) /* 6 MHz, measured */
+#define OKI_CLOCK (MASTER_CLOCK / 8) /* 1.5 MHz, measured */
+#define CRTC_CLOCK (MASTER_CLOCK / 16) /* 750 kHz, measured */
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "video/mc6845.h"
+#include "sound/okim6295.h"
+#include "machine/nvram.h"
+#include "majorpkr.lh"
+
+
+class majorpkr_state : public driver_device
+{
+public:
+ majorpkr_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), oki(*this, "oki") { }
+
+ int m_mux_data;
+ int m_palette_bank;
+ int m_vram_bank;
+ int m_flip_state;
+
+ tilemap_t *m_bg_tilemap, *m_fg_tilemap;
+
+ UINT8 m_videoram[0x1000];
+
+ required_device<okim6295_device> oki;
+
+ DECLARE_WRITE8_MEMBER(rom_bank_w);
+ DECLARE_WRITE8_MEMBER(palette_bank_w);
+ DECLARE_READ8_MEMBER(paletteram_r);
+ DECLARE_WRITE8_MEMBER(paletteram_w);
+ DECLARE_WRITE8_MEMBER(vram_bank_w);
+ DECLARE_READ8_MEMBER(vram_r);
+ DECLARE_WRITE8_MEMBER(vram_w);
+ DECLARE_WRITE8_MEMBER(vidreg_w);
+ DECLARE_READ8_MEMBER(mux_port_r);
+ DECLARE_READ8_MEMBER(mux_port2_r);
+ DECLARE_WRITE8_MEMBER(mux_sel_w);
+ DECLARE_WRITE8_MEMBER(lamps_a_w);
+ DECLARE_WRITE8_MEMBER(lamps_b_w);
+ DECLARE_WRITE8_MEMBER(pulses_w);
+};
+
+
+/*************************
+* Video Hardware *
+*************************/
+
+static TILE_GET_INFO( bg_get_tile_info )
+{
+ majorpkr_state *state = machine.driver_data<majorpkr_state>();
+
+ int code = state->m_videoram[0x800 + 2 * tile_index] + (state->m_videoram[0x800 + 2 * tile_index + 1] << 8);
+
+ SET_TILE_INFO(
+ 0,
+ (code & 0x1fff),
+ code >> 13,
+ 0);
+}
+
+static TILE_GET_INFO( fg_get_tile_info )
+{
+ majorpkr_state *state = machine.driver_data<majorpkr_state>();
+
+ int code = state->m_videoram[2 * tile_index] + (state->m_videoram[2 * tile_index + 1] << 8);
+
+ SET_TILE_INFO(
+ 1,
+ (code & 0x07ff),
+ code >> 13,
+ (code & (1 << 12)) ? (TILE_FLIPX|TILE_FLIPY) : 0);
+}
+
+
+static VIDEO_START(majorpkr)
+{
+ majorpkr_state *state = machine.driver_data<majorpkr_state>();
+
+ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info, tilemap_scan_rows, 16, 8, 36, 28);
+ state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info, tilemap_scan_rows, 16, 8, 36, 28);
+ state->m_fg_tilemap->set_transparent_pen(0);
+
+ state->m_generic_paletteram_8.allocate(4 * 0x800);
+}
+
+
+static SCREEN_UPDATE_IND16(majorpkr)
+{
+ majorpkr_state *state = screen.machine().driver_data<majorpkr_state>();
+
+ bitmap.fill(get_black_pen(screen.machine()), cliprect);
+
+ rectangle custom_clip;
+
+ /* The following custom_clip is to exclude the last char column (unused)
+ form the render. We need more proof about how the video is working.
+ */
+ custom_clip = cliprect;
+ custom_clip.max_x -= 16;
+
+ state->m_bg_tilemap->draw(bitmap, custom_clip, 0, 0);
+ state->m_fg_tilemap->draw(bitmap, custom_clip, 0, 0);
+
+ if (state->m_flip_state == 1)
+ {
+ state->m_bg_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY);
+ state->m_fg_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY);
+ }
+
+ return 0;
+}
+
+
+/******************************
+* R/W Handlers *
+******************************/
+
+WRITE8_MEMBER(majorpkr_state::rom_bank_w)
+{
+ membank("rom_bank")->set_entry(data & 0x3);
+}
+
+
+WRITE8_MEMBER(majorpkr_state::palette_bank_w)
+{
+
+ m_palette_bank=data;
+}
+
+
+READ8_MEMBER(majorpkr_state::paletteram_r)
+{
+ return m_generic_paletteram_8[m_palette_bank * 0x800 + offset];
+}
+
+WRITE8_MEMBER(majorpkr_state::paletteram_w)
+{
+ m_generic_paletteram_8[m_palette_bank * 0x800 + offset] = data;
+
+ offset >>= 1;
+ int color = m_generic_paletteram_8[m_palette_bank * 0x800 + offset * 2] + m_generic_paletteram_8[m_palette_bank * 0x800 + offset * 2 + 1] * 256;
+ palette_set_color(machine(), offset + m_palette_bank * 256 * 4, MAKE_RGB(pal5bit(color >> 5), pal5bit(color >> 10), pal5bit(color)));
+}
+
+
+WRITE8_MEMBER(majorpkr_state::vram_bank_w)
+{
+ m_vram_bank = data & 1;
+}
+
+READ8_MEMBER(majorpkr_state::vram_r)
+{
+ return m_videoram[m_vram_bank * 0x800 + offset];
+}
+
+WRITE8_MEMBER(majorpkr_state::vram_w)
+{
+ m_videoram[m_vram_bank * 0x800 + offset] = data;
+
+ if (m_vram_bank == 0)
+ {
+ m_fg_tilemap->mark_tile_dirty(offset >> 1);
+ }
+ else
+ {
+ if (m_vram_bank == 1)
+ {
+ m_bg_tilemap->mark_tile_dirty(offset >> 1);
+ }
+ else
+ {
+ //logerror("accessing vram bank %d (offset = %x , data = %x )\n", m_vram_bank, offset,data);
+ }
+ }
+}
+
+WRITE8_MEMBER(majorpkr_state::vidreg_w)
+{
+
+/* If bit6 is active, the screen is drawn upside down.
+ (also 0xfc and 0x11 are written to the CRTC registers 0xc0 and 0xd0)
+ So, the CRTC display start address = 0xfc11
+*/
+ if (data & 0x40)
+ {
+ /* upside down screen */
+ m_flip_state = 1;
+ }
+
+/* If bit6 is not active, the screen is drawn normally.
+ (also 0x00 is written to the CRTC registers 0xc0 and 0xd0)
+ So, the CRTC display start address = 0x0000
+*/
+ else
+ {
+ /* normal screen */
+ m_flip_state = 0;
+ }
+}
+
+
+/***** Multiplexed Ports *****/
+
+READ8_MEMBER(majorpkr_state::mux_port_r)
+{
+
+ switch( (m_mux_data & 0xf0) ) /* 00-10-20-30-0F-1F-2F-3F */
+ {
+ case 0x00: return ioport("DSW1")->read(); /* confirmed */
+ case 0x10: return ioport("DSW2")->read(); /* confirmed */
+ case 0x20: return ioport("DSW3")->read(); /* confirmed */
+ case 0x30: return ioport("DSW4")->read(); /* confirmed */
+ }
+
+ return 0xff;
+}
+
+READ8_MEMBER(majorpkr_state::mux_port2_r)
+{
+
+ if ((m_mux_data & 0x0f) == 4)
+ {
+ return ioport("IN0-1")->read();
+ }
+ else
+ {
+ return ioport("IN0-0")->read();
+ }
+}
+
+WRITE8_MEMBER(majorpkr_state::mux_sel_w)
+{
+
+ m_mux_data = data; /* 00-10-20-30-0F-1F-2F-3F */
+}
+
+
+/*************************
+* Lamps and Pulses *
+*************************/
+
+WRITE8_MEMBER(majorpkr_state::lamps_a_w)
+{
+/* Lamps - Array A.
+
+ - bits -
+ 7654 3210
+ ---- ---x Hold 1 lamp.
+ ---- --x- Hold 2 lamp.
+ ---- -x-- Hold 3 lamp.
+ ---- x--- Hold 4 lamp.
+ ---x ---- Hold 5 lamp.
+ --x- ---- Big lamp.
+ -x-- ---- Small lamp.
+ x--- ---- Unknown.
+*/
+ output_set_lamp_value(0, (data) & 1); /* Lamp 0: Hold 1 */
+ output_set_lamp_value(1, (data >> 1) & 1); /* Lamp 1: Hold 2 */
+ output_set_lamp_value(2, (data >> 2) & 1); /* Lamp 2: Hold 3 */
+ output_set_lamp_value(3, (data >> 3) & 1); /* Lamp 3: Hold 4 */
+ output_set_lamp_value(4, (data >> 4) & 1); /* Lamp 4: Hold 5 */
+ output_set_lamp_value(5, (data >> 5) & 1); /* Lamp 5: Big or Small (need identification) */
+ output_set_lamp_value(6, (data >> 6) & 1); /* Lamp 6: Big or Small (need identification) */
+
+ if (data & 0x80)
+ logerror("Lamps A: Write to 13h: %02x\n", data);
+}
+
+WRITE8_MEMBER(majorpkr_state::lamps_b_w)
+{
+/* Lamps - Array B.
+
+ - bits -
+ 7654 3210
+ ---- ---x Bet lamp.
+ ---- --x- Draw lamp.
+ ---- -x-- Cancel lamp.
+ ---- x--- Take lamp.
+ ---x ---- Double-Up lamp.
+ --x- ---- Fever lamp.
+ xx-- ---- Unknown.
+*/
+ output_set_lamp_value(7, (data) & 1); /* Lamp 7: Bet */
+ output_set_lamp_value(8, (data >> 1) & 1); /* Lamp 8: Draw */
+ output_set_lamp_value(9, (data >> 2) & 1); /* Lamp 9: Cancel */
+ output_set_lamp_value(10, (data >> 3) & 1); /* Lamp 10: Take */
+ output_set_lamp_value(11, (data >> 4) & 1); /* Lamp 11: D-UP */
+ output_set_lamp_value(12, (data >> 5) & 1); /* Lamp 12: Fever */
+
+ if (data & 0xc0)
+ logerror("Lamps B: Write to 14h: %02x\n", data);
+}
+
+WRITE8_MEMBER(majorpkr_state::pulses_w)
+{
+/* Pulses...
+
+ - bits -
+ 7654 3210
+ ---- ---x Credits Out mech counter.
+ ---- --x- Credits 3 mech counter.
+ ---- -x-- Credits 1 mech counter.
+ ---- x--- Credits 2 mech counter.
+ ---x ---- Watchdog? (constant writes).
+ xxx- ---- Unknown.
+*/
+ coin_counter_w(machine(), 3, data & 0x01); /* Credits Out (all) */
+ coin_counter_w(machine(), 2, data & 0x02); /* Credits 3 */
+ coin_counter_w(machine(), 0, data & 0x04); /* Credits 1 */
+ coin_counter_w(machine(), 1, data & 0x08); /* Credits 2 */
+
+ if (data & 0xe0)
+ logerror("Pulse: Write to 10h: %02x\n", data);
+}
+
+
+/*************************
+* Memory map information *
+*************************/
+
+static ADDRESS_MAP_START( map, AS_PROGRAM, 8, majorpkr_state )
+ AM_RANGE(0x0000, 0xdfff) AM_ROM
+ AM_RANGE(0xe000, 0xe7ff) AM_ROM AM_ROMBANK("rom_bank")
+ AM_RANGE(0xe800, 0xefff) AM_RAM AM_SHARE("nvram")
+ AM_RANGE(0xf000, 0xf7ff) AM_READWRITE(paletteram_r, paletteram_w) /* 4*4 palettes - 4 banks? */
+ AM_RANGE(0xf800, 0xffff) AM_READWRITE(vram_r, vram_w) /* two tilemaps - 2 banks? */
+ADDRESS_MAP_END
+
+/*
+ 00 W ---> ROM bank.
+ 01 W ---> RAM bank.
+ 02 W ---> RAM bank.
+
+ 10 R ---> Regular inputs (holds) multiplexed with credits out.
+ 10 W ---> Writes a kind of watchdog (bit4) and mech counters pulses (bits 0-1-2-3).
+ 11 R ---> Read input port (remaining controls).
+ 11 W ---> Writes mux selector.
+ 12 R ---> Read coin/credits port.
+ 12 W ---> Video registers: Normal or Up Down screen (bit6 off/on). Also writes 0xFC & 0x11 at CRTC offsets 0x0C & 0x0D (0's if normal).
+ 13 R ---> Multiplexed port for DIP switches banks.
+ 13 W ---> Lamps out (array a)
+ 14 R ---> Freeze. Switch in bit0 that pause the game when active. Just once active, the code loops till the bit resets.
+ 14 W ---> Lamps out (array b).
+
+ 50 RW ---> OKI6295 (RW)
+
+ 60 W ---> PSG SN76489/96 initialization routines.
+ (Maybe a leftover for different hardware).
+*/
+static ADDRESS_MAP_START( portmap, AS_IO, 8, majorpkr_state )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x00) AM_WRITE(rom_bank_w)
+ AM_RANGE(0x01, 0x01) AM_WRITE(palette_bank_w)
+ AM_RANGE(0x02, 0x02) AM_WRITE(vram_bank_w)
+
+ AM_RANGE(0x10, 0x10) AM_READ(mux_port2_r) /* muxed set of controls */
+ AM_RANGE(0x10, 0x10) AM_WRITE(pulses_w) /* kind of watchdog on bit4... mech counters on bits 0-1-2-3 */
+ AM_RANGE(0x11, 0x11) AM_READ_PORT("IN1")
+ AM_RANGE(0x11, 0x11) AM_WRITE(mux_sel_w) /* multiplexer selector */
+ AM_RANGE(0x12, 0x12) AM_READ_PORT("IN2")
+ AM_RANGE(0x12, 0x12) AM_WRITE(vidreg_w) /* video registers: normal or up down screen */
+ AM_RANGE(0x13, 0x13) AM_READ(mux_port_r) /* all 4 DIP switches banks multiplexed */
+ AM_RANGE(0x13, 0x13) AM_WRITE(lamps_a_w) /* lamps a out */
+ AM_RANGE(0x14, 0x14) AM_READ_PORT("TEST") /* "freeze" switch */
+ AM_RANGE(0x14, 0x14) AM_WRITE(lamps_b_w) /* lamps b out */
+
+ AM_RANGE(0x30, 0x30) AM_DEVWRITE("crtc", mc6845_device, address_w)
+ AM_RANGE(0x31, 0x31) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
+
+ AM_RANGE(0x50, 0x50) AM_DEVREADWRITE("oki", okim6295_device, read, write)
+ AM_RANGE(0x60, 0x60) AM_WRITENOP /* leftover from a PSG SN76489/96? */
+ADDRESS_MAP_END
+
+
+/*************************
+* Input ports *
+*************************/
+
+static INPUT_PORTS_START( majorpkr )
+ PORT_START("IN0-0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POKER_HOLD1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_POKER_HOLD2 ) /* muxed with Key Out */
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POKER_HOLD3 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_POKER_HOLD4 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POKER_HOLD5 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_POKER_CANCEL )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_GAMBLE_HIGH ) PORT_NAME("Big")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_GAMBLE_LOW ) PORT_NAME("Small / DIP Test (In Book Mode)")
+
+ PORT_START("IN0-1")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_GAMBLE_KEYOUT ) /* muxed with HOLD 2 */
+ PORT_BIT( 0xfd, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POKER_BET )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_GAMBLE_DEAL )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_GAMBLE_D_UP )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_GAMBLE_TAKE )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Book/Settings Mode")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_GAMBLE_PAYOUT )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("UNK 1-PAD")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("UNK 2-PAD")
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_GAMBLE_KEYIN)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_CODE(KEYCODE_0) PORT_NAME("SW2 (Clear Short-Term Meters)")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("UNK 4-PAD")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_CODE(KEYCODE_E) PORT_NAME("Manual Payout")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("UNK 5-PAD")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("UNK 6-PAD")
+
+ PORT_START("DSW1") /* multiplexed x4 & inverted */
+ PORT_DIPNAME( 0x01, 0x00, "OFF Fixed" ) PORT_DIPLOCATION("DSW1:1")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, "Screen Direction" ) PORT_DIPLOCATION("DSW1:2") /* Activates bit6 at port 0x10 & change CRTC registers */
+ PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x02, "Up Down" )
+ PORT_DIPNAME( 0x04, 0x00, "Payout" ) PORT_DIPLOCATION("DSW1:3") /* Hopper: No / Yes (in the manual) */
+ PORT_DIPSETTING( 0x00, "Automatic" )
+ PORT_DIPSETTING( 0x04, "Manual" )
+ PORT_DIPNAME( 0x08, 0x00, "Hopper SW Active" ) PORT_DIPLOCATION("DSW1:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( High ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Low ) )
+ PORT_DIPNAME( 0x10, 0x00, "Auto Max Bet" ) PORT_DIPLOCATION("DSW1:5") /* Coin Payout: Payout SW / Automatic (in the manual) */
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "Hold Cancel" ) PORT_DIPLOCATION("DSW1:6") /* Inverse from the manual */
+ PORT_DIPSETTING( 0x20, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x40, 0x40, "Auto Hold" ) PORT_DIPLOCATION("DSW1:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, "Fever Mode" ) PORT_DIPLOCATION("DSW1:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+
+ PORT_START("DSW2") /* multiplexed x4 & inverted */
+ PORT_DIPNAME( 0x07, 0x00, "Payout %" ) PORT_DIPLOCATION("DSW2:1,2,3")
+ PORT_DIPSETTING( 0x07, "60%" )
+ PORT_DIPSETTING( 0x06, "65%" )
+ PORT_DIPSETTING( 0x05, "70%" )
+ PORT_DIPSETTING( 0x04, "75%" )
+ PORT_DIPSETTING( 0x03, "80%" )
+ PORT_DIPSETTING( 0x02, "85%" )
+ PORT_DIPSETTING( 0x01, "90%" )
+ PORT_DIPSETTING( 0x00, "95%" )
+ PORT_DIPNAME( 0x18, 0x00, "Min Bet Size for Fever" ) PORT_DIPLOCATION("DSW2:4,5")
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPSETTING( 0x08, "3" )
+ PORT_DIPSETTING( 0x10, "5" )
+ PORT_DIPSETTING( 0x18, "10" )
+ PORT_DIPNAME( 0x60, 0x00, "D-UP Game Difficulty" ) PORT_DIPLOCATION("DSW2:6,7")
+ PORT_DIPSETTING( 0x00, "0 (Weak)" )
+ PORT_DIPSETTING( 0x20, "1" )
+ PORT_DIPSETTING( 0x40, "2" )
+ PORT_DIPSETTING( 0x60, "3 (Strong)" )
+ PORT_DIPNAME( 0x80, 0x00, "OFF Fixed" ) PORT_DIPLOCATION("DSW2:8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START("DSW3") /* multiplexed x4 & inverted */
+ PORT_DIPNAME( 0x07, 0x00, "Key In" ) PORT_DIPLOCATION("DSW3:1,2,3")
+ PORT_DIPSETTING( 0x01, "5 Credits / Pulse" )
+ PORT_DIPSETTING( 0x02, "10 Credits / Pulse" )
+ PORT_DIPSETTING( 0x03, "20 Credits / Pulse" )
+ PORT_DIPSETTING( 0x04, "25 Credits / Pulse" )
+ PORT_DIPSETTING( 0x05, "40 Credits / Pulse" )
+ PORT_DIPSETTING( 0x00, "50 Credits / Pulse" )
+ PORT_DIPSETTING( 0x06, "60 Credits / Pulse" )
+ PORT_DIPSETTING( 0x07, "100 Credits / Pulse" )
+ PORT_DIPNAME( 0x38, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DSW3:4,5,6")
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x18, "1 Coin/10 Credits" )
+ PORT_DIPSETTING( 0x20, "1 Coin/20 Credits" )
+ PORT_DIPSETTING( 0x28, "1 Coin/25 Credits" )
+ PORT_DIPSETTING( 0x30, "1 Coin/40 Credits" )
+ PORT_DIPSETTING( 0x38, "1 Coin/50 Credits" )
+ PORT_DIPNAME( 0xc0, 0x00, "Credit Limit" ) PORT_DIPLOCATION("DSW3:7,8")
+ PORT_DIPSETTING( 0x00, "5000" )
+ PORT_DIPSETTING( 0x40, "10000" )
+ PORT_DIPSETTING( 0x80, "20000" )
+ PORT_DIPSETTING( 0xc0, "30000" )
+
+ PORT_START("DSW4") /* multiplexed x4 & inverted */
+ PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DSW4:1,2,3,4")
+ PORT_DIPSETTING( 0x0f, "20 Coins/1 Credit" )
+ PORT_DIPSETTING( 0x0e, "10 Coins/1 Credit" )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x0b, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x0d, "5 Coins/2 Credits" )
+ PORT_DIPSETTING( 0x09, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0a, DEF_STR( 2C_5C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x05, "1 Coin/10 Credits" )
+ PORT_DIPSETTING( 0x06, "1 Coin/20 Credits" )
+ PORT_DIPSETTING( 0x07, "1 Coin/25 Credits" )
+ PORT_DIPSETTING( 0x00, "1 Coin/50 Credits" )
+ PORT_DIPSETTING( 0x08, "1 Coin/100 Credits" )
+ PORT_DIPNAME( 0x30, 0x00, "Max Bet" ) PORT_DIPLOCATION("DSW4:5,6")
+ PORT_DIPSETTING( 0x10, "10" )
+ PORT_DIPSETTING( 0x00, "20" )
+ PORT_DIPSETTING( 0x20, "30" )
+ PORT_DIPSETTING( 0x30, "50" )
+ PORT_DIPNAME( 0xc0, 0x00, "Credit-In Limit" ) PORT_DIPLOCATION("DSW4:7,8")
+ PORT_DIPSETTING( 0x00, "No Limit" )
+ PORT_DIPSETTING( 0x40, "1000" )
+ PORT_DIPSETTING( 0x80, "2000" )
+ PORT_DIPSETTING( 0xc0, "5000" )
+
+ PORT_START("TEST")
+ PORT_DIPNAME( 0x01, 0x00, "Freeze" ) /* Freeze the execution */
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+/*************************
+* Graphics Layouts *
+*************************/
+
+static const gfx_layout tilelayout =
+{
+ 16, 8,
+ RGN_FRAC(1,2),
+ 8,
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ {
+ 0*8, 0*8+RGN_FRAC(1,2), 1*8, 1*8+RGN_FRAC(1,2), 2*8, 2*8+RGN_FRAC(1,2), 3*8, 3*8+RGN_FRAC(1,2),
+ 4*8, 4*8+RGN_FRAC(1,2), 5*8, 5*8+RGN_FRAC(1,2), 6*8, 6*8+RGN_FRAC(1,2), 7*8, 7*8+RGN_FRAC(1,2)
+ },
+ { 0*8*8, 1*8*8, 2*8*8, 3*8*8, 4*8*8, 5*8*8, 6*8*8, 7*8*8 },
+ 8*8*8
+};
+
+
+/******************************
+* Graphics Decode Information *
+******************************/
+
+static GFXDECODE_START( majorpkr )
+ GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 8*256, 8 )
+ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 8 )
+GFXDECODE_END
+
+
+/***********************
+* CRTC Interface *
+***********************/
+
+static const mc6845_interface mc6845_intf =
+{
+ "screen", /* screen we are acting on */
+ 16, /* number of pixels per video memory address */
+ NULL, /* before pixel update callback */
+ NULL, /* row update callback */
+ NULL, /* after pixel update callback */
+ DEVCB_NULL, /* callback for display state changes */
+ DEVCB_NULL, /* callback for cursor state changes */
+ DEVCB_NULL, /* HSYNC callback */
+ DEVCB_NULL, /* VSYNC callback */
+ NULL /* update address callback */
+};
+
+
+/*************************
+* Machine Drivers *
+*************************/
+
+static MACHINE_CONFIG_START( majorpkr, majorpkr_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK) /* 6 MHz */
+ MCFG_CPU_PROGRAM_MAP(map)
+ MCFG_CPU_IO_MAP(portmap)
+ MCFG_CPU_VBLANK_INT("screen", irq0_line_hold)
+
+ MCFG_NVRAM_ADD_0FILL("nvram")
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(52.786)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE((47+1)*16, (36+1)*8) /* through CRTC registers: 768 x 296 */
+ MCFG_SCREEN_VISIBLE_AREA(0, (36*16)-1, 0, (28*8)-1) /* through CRTC registers: 560(+16) x 224 */
+
+ MCFG_GFXDECODE(majorpkr)
+ MCFG_PALETTE_LENGTH(0x100 * 16)
+
+ MCFG_VIDEO_START(majorpkr)
+ MCFG_SCREEN_UPDATE_STATIC(majorpkr)
+
+ MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) /* verified */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_OKIM6295_ADD("oki", OKI_CLOCK, OKIM6295_PIN7_HIGH) /* clock frequency & pin 7 verified */
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+/*************************
+* Rom Load *
+*************************/
+
+ROM_START( majorpkr )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "6_27c512_823b.bin", 0x00000, 0x0e000, CRC(a3d5475e) SHA1(cb41508b55da8b8c658a2f2ccc6ebda09db29040) )
+ ROM_CONTINUE(0x10000,0x2000)
+
+ ROM_REGION( 0x100000, "gfx1", 0 )
+ ROM_LOAD( "p1_27c040_7d3b.bin", 0x00000, 0x80000, CRC(67299eff) SHA1(34d3d8baf08dea495b699dd63272b445e2acb42d) )
+ ROM_LOAD( "p2_27c040_6039.bin", 0x80000, 0x80000, CRC(2d68b177) SHA1(01c934e0383991f2208b915cc5015463a8b6a8fd) )
+
+ ROM_REGION( 0x40000, "gfx2", 0 )
+ ROM_LOAD( "3_27c010_af18.bin", 0x00000, 0x20000, CRC(54452bb8) SHA1(9d13c17b85dd0185ba64fc6f90425e0c75363960) )
+ ROM_LOAD( "4_27c010_92d6.bin", 0x20000, 0x20000, CRC(2e1e0972) SHA1(729dba2ef6ae8a7299c7ceb38835bebb0c42d28e) )
+
+ ROM_REGION( 0x40000, "oki", 0 )
+ ROM_LOAD( "5_27c020_8630.bin", 0x00000, 0x40000, CRC(4843858e) SHA1(27629829cf7753d7801a6eb42bb77ca2a467bebd) )
+ROM_END
+
+
+/*************************
+* Driver Init *
+*************************/
+
+static DRIVER_INIT( majorpkr )
+{
+ UINT8 * ROM = (UINT8 *)machine.root_device().memregion("maincpu")->base();
+ machine.root_device().membank("rom_bank")->configure_entries(0, 4, &ROM[0x10000], 0x800);
+}
+
+
+/*************************
+* Game Drivers *
+*************************/
+
+/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS LAYOUT */
+GAMEL( 1994, majorpkr, 0, majorpkr, majorpkr, majorpkr, ROT0, "PAL System", "Major Poker (v2.0)", 0, layout_majorpkr )