summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/magicfly.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/magicfly.c')
-rw-r--r--trunk/src/mame/drivers/magicfly.c898
1 files changed, 898 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/magicfly.c b/trunk/src/mame/drivers/magicfly.c
new file mode 100644
index 00000000000..ff020b1c276
--- /dev/null
+++ b/trunk/src/mame/drivers/magicfly.c
@@ -0,0 +1,898 @@
+/******************************************************************************
+
+ MAGIC FLY
+ ---------
+
+ Driver by Roberto Fresca.
+
+
+ Games running on this hardware:
+
+ * Magic Fly (P&A Games), 198?
+ * 7 e Mezzo (Unknown), 198?
+
+
+ **** NOTE ****
+
+ This hardware was clearly designed for poker games.
+ You can find a complete hardware & software analysis here:
+ http://www.robertofresca.com.ar/
+
+
+ Special Thanks to...
+
+ - EMMA Italian Dumping Team for providing the board.
+ - Rob Ragon for the exhaustive hardware testing.
+ - Iris Falbala, that kindly offered herself as beta tester,
+ poppin' baloons since she was only 2 years old. :)
+
+
+*******************************************************************************
+
+
+ *** Hardware notes ***
+
+
+ - CPU: 1x R6502P.
+
+ - CRTC: 1x MC6845P.
+
+ - RAM: 1x MK48Z02B-20. CMOS 2K*8 zeropower SRAM (NVRAM).
+ 2x HM6116LP-4. 2K*8 SRAM (Video RAM, only 1st half used).
+
+ - CLK: 1x crystal @ 10.000 MHz.
+
+ - ROMs: 1x AM27128. (NS3.1)
+ 2x SEEQ DQ2764. (1, 2)
+ 1x SGS M2764. (NS1)
+
+ - PLDs: 1x PAL16R4A. (read protected)
+
+ - SOUND: 1x delta-sigma DAC (1-bit/Bitstream).
+ 1x TDA2002 (8W. car radio audio amplifier)
+
+
+ Other components:
+
+ - 3x OUAZ SS-112D (relay 1 pole 12v)
+ - 1x 4 DIP switches
+ - 1x 30x2 edge connector
+ - 1x 10 pins male connector
+ - 2x trimmer (audio?)
+
+
+ PCB Layout:
+ _________________________________________________________________
+ | |
+ | |
+ | _________ _________ |
+ | | 74LS08N | | 74LS32 | |
+ | |_________| |_________| |
+ | _________ _________ |
+ | | 74LS138 | | 74HC00 | |
+ | |_________| |_________| |
+ | ______________ ______________________ |
+ | | | | | ____|
+ | | MK48Z02B-20 | | R6502P | |
+ | |______________| |______________________| |
+ | ________________ _________ ______________________ |
+ | | | | 74LS157 | | | |____
+ | | AM27128 | |_________| | MC6845P | ____|
+ | |________________| _________ |______________________| ____|
+ | | 74LS157 | ________ _________ ____|
+ | |_________| | 74LS14 | | 74LS374 | ____|
+ | ____________ _________ |________| |_________| ____|
+ | | 74LS245 | | 74LS157 | _________ ____|
+ | |____________| |_________| | 74HC244 | ____|
+ | ____________ _________ |_________| ____|
+ | | 74LS245 | | 74LS32 | _______ ____| 30x2
+ | |____________| |_________| | | | | | ____| connector
+ | ______________ |4|3|2|1| ____|
+ | | HM6116 | |_|_|_|_| ____|
+ | | o MSM2128 | ____|
+ | |______________| DIP SW x4 ____|
+ | ______________ ____|
+ | | HM6116 | ________ _________ ____|
+ | | o MSM2128 | | 74LS08 | | 74LS174 | ____|
+ | |______________| |________| |_________| ____|
+ | ________________ __________ ______ ____|
+ | | | | PAL16R4A | | TDA |- ____|
+ | | 2764 | |__________| | 2002 |- ____|
+ | |________________| __________ |______|- ____|
+ | ________________ | 74LS166 | ____|
+ | | | |__________| _ |
+ | | 2764 | __________ / \ |
+ | |________________| | 74LS166 | | pot | |____
+ | ________________ |__________| \ _ / __|
+ | | | __________ _________ ______| |
+ | | 2764 | | 74LS166 | | 74LS05 | _ |ss112d|8 | 10
+ | |________________| |__________| |_________| / \ |______|8 | pins
+ | ________ ______ __________ _________ | pot ||ss112d|8 | male
+ | | 74LS04 || osc. | | 74LS193 | | 74LS86 | \ _ / |______|8 | connector
+ | |________||10 MHz| |__________| |_________| |ss112d|8 |
+ | |______| |______|__|
+ |_________________________________________________________________|
+
+
+ Pinouts (from 7mezzo pinout sheet)
+ ----------------------------------
+
+ *********** Edge connector ************
+
+ solder side connector parts side
+
+ GND 30 GND
+ +10v. 29 +10v.
+ +10v. 28 +10v.
+ unused 27 unused
+ unused 26 unused
+ GND 25 GND
+ +12v. 24 +12v.
+ +12v. 23 +12v.
+ unused 22 unused
+ common C (3) 21 common A (1)
+ common D (4) 20 common B (2)
+ DEAL 19 DOUBLE
+ HOLD 1 18 (unreadable)
+ HOLD 2 17 HOLD 5
+ HOLD 3 16 HOLD 4
+ METER 15 BET
+ COUPON 14
+ 13 COIN 1
+ (unreadable) 12 COIN 2
+ TAKE 11 PAY
+ SMALL (play1) 10 BIG (play3)
+ unused 09 unused
+ unused 08 unused
+ unused 07 unused
+ (unreadable) 06 (unreadable)
+ sync 05 (unreadable)
+ GND 04 GND
+ speaker+ 03 speaker+
+ speaker- (GND) 02 speaker- (GND)
+ +5v. 01 +5v.
+
+ (1) = DOUBLE, DEAL, (unreadable), BET, METER
+ (2) = TAKE, SMALL, BIG, PAY
+ (3) = HOLD 1, HOLD 2, HOLD 3, HOLD 4, HOLD 5
+ (4) = COIN 1, COIN 2, COUPON
+
+
+ **** Pins connector ****
+
+ pin 01: (soldered to pin 05)
+ pin 02:
+ pin 03:
+ pin 04:
+ pin 05: (soldered to pin 01)
+ pin 06: (unreadable)
+ pin 07: (unreadable)
+ pin 08: (unreadable)
+ pin 09: (unreadable)
+ pin 10: common (GND)
+
+
+*******************************************************************************
+
+
+ Memory Map (magicfly)
+ ---------------------
+
+ $0000 - $00FF RAM ; Zero page (pointers and registers) (NVRAM).
+
+ ($0D) ; Incremented each time a NMI is triggered.
+ ($1D) ; In case of 0x00, NMI do nothing and return.
+ ($11) ; Store lenghts for text handling.
+ ($12) ; Store values to be written in color RAM.
+ ($13 - $14) ; Pointer to text offset.
+ ($15 - $16) ; Pointer to video RAM.
+ ($17 - $18) ; Pointer to color RAM.
+ ($19) ; Program loops waiting for a value to be written here through NMI (see code at $CA71).
+ ($1E - $1F) ; Decrement. Looks as a sort of counter to temporary freeze graphics.
+ ($22 - $25) ; 4-bytes buffer to compare/operate with other segments.
+ ($2E - $31) ; 4-bytes buffer to compare/operate with other segments.
+ ($32 - $35) ; 4-bytes buffer to compare/operate with other segments.
+ ($39) ; Store bits 4, 5 and 6 of content to be ORed with $94 and written to input selector at $3000.
+ ($3A - $3D) ; Store new read values from $2800 (input port) through NMI.
+ ($3F - $42) ; Store old read values from $2800 (input port) through NMI.
+ ($56 - $58) ; Store credits value (shown in the game under "Secondi").
+ ($5A - $5C) ; Store bonus value (shown in the game under "Credits").
+ ($5E - $5F) ; Store values to be written in video and color ram, respectively.
+ ($63 - $63) ; Store position of marker/cursor (0-4).
+ ($66 - $66) ; Store number of baloon to be risen.
+ ($67 - $67) ; Program compare the content with 0x02, 0x03, 0x04, 0x05 and 0xE1.
+ ; If 0xE1 is found here, the machine hangs showing "I/O ERROR" (see code at $C1A2).
+ ($6A - $6B) ; Balloon #1 secondi (bet).
+ ($6C - $6D) ; Balloon #2 secondi (bet).
+ ($6E - $6F) ; Balloon #3 secondi (bet).
+ ($70 - $71) ; Balloon #4 secondi (bet).
+ ($72 - $73) ; Balloon #5 secondi (bet).
+ ($94) ; Store bit 7 of contents to be ORed with $39 and written to output port ($3000).
+ ($96 - $98) ; Store values from content of $2800 (input port) & 0x80, & 0x40, & 0x10.
+ ($9B - $A8) ; Text scroll buffer.
+
+ $0100 - $01FF RAM ; 6502 Stack Pointer (NVRAM).
+
+ $0200 - $07FF RAM ; General purpose RAM (NVRAM).
+
+ $0800 - $0801 MC6845 ; MC6845 use $0800 for register addressing and $0801 for register values (see code at $CE86).
+
+ *** MC6845 init ***
+
+ Register: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17
+ Value: 0x27 0x20 0x23 0x03 0x1F 0x04 0x1D 0x1E 0x00 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00.
+
+ $1000 - $13FF Video RAM ; Initialized in subroutine starting at $CF83, filled with value stored in $5E.
+
+ $1800 - $1BFF Color RAM ; Initialized in subroutine starting at $CF83, filled with value stored in $5F.
+ ; (In 7mezzo is located at $CB13 using $64 and $65 to store video and color ram values.)
+
+ $2800 - $2800 Input port ; Multiplexed input port (code at $CE96).
+ ; NMI routine read from here and store new values in $3A-$3D and copy old ones to $3F-$42.
+ ; Code accept only bits 0-1-2-3-5 as valid inputs. For DIP switches, only bits 4-6-7 are valid.
+ ; If an invalid bit is activated, it will produce an I/O error. (code at $CD0C)
+
+ $3000 - $3000 Output port:
+
+ Input selector, ; NMI writes the lower 4 bits to select input.
+ Counters. ; Bits 4-5-6 are used for Coin1, Coin2, and Payout counters.
+ Sound DAC, ; Bit 7 is used to transmit DAC data.
+
+ $C000 - $FFFF ROM space ; Program ROMs.
+
+
+*******************************************************************************
+
+
+ After check the last bit of $1800, code jump into a loop ($DA30)...
+
+ BEHAVIOUR OF BOOT CHECK (magicfly):
+
+ 1) Fill the video RAM with spaces (0x20), and color RAM with 0x15.
+ 2) Check bit 7 of $1800 (video RAM, 1st offset) if activated.
+ 3) If true, go to $DA30 (incremented fill infinite loop).
+ 4) If not, fill the video RAM with spaces (0x20), and color RAM with 0x1F.
+ 5) Check bit 7 of $1800 (video RAM, 1st offset) if activated.
+ 6) If not, go to $DA30 (incremented fill infinite loop).
+ 7) If true, returns and continue to NORMAL GAME.
+
+ Since bits 0-2 are for regular colors, seems that bit 3 in color RAM
+ (bit 2 for 7mezzo) is mirrored to bit 7 through a kind of device.
+
+ This is the only explanation I found to allow a normal boot, and seems to be
+ created as a protection method that don't allow owners to use a ROM-swap on
+ his boards, converting one game to another.
+
+
+*******************************************************************************
+
+
+ Game Notes
+ ----------
+
+ Settings (valid for both games):
+
+ Press F2 to enter the input test (game should be without credits).
+ In the input test, you can exit with BET + DEAL, or access the bookkeeping
+ mode pressing BET + DEAL again. In the bookkeping mode keep pressed the PAYOUT
+ key and press BET to change the percentage (all books will be erased). Press
+ again BET + DEAL to exit to a quick RAM & sound test, and then to game mode.
+
+
+ * Magic Fly
+
+ How to play...
+
+ Insert coins to get credits.
+ Choose a balloon to raise, and select it with SELECT button. Bet on other balloons
+ using the SELECT/BET key (to bet 1 credit) or BETx10 (to bet 10 credits). Once done,
+ press the DEAL/LAST BET key to start the game. All balloons will explode revealing
+ numbers. The last one to explode will be the raised one. If your number(s) are higher
+ than the one hidden in the raised balloon, you'll win!
+
+ You can repeat the last bet pressing the DEAL/LAST BET key.
+
+
+ * 7 e Mezzo
+
+ This game is a sort of blackjack, but using a spanish cards set. The objetive is
+ to get 7 and half points (as 21 in blackjack). If you got more than 7 and half,
+ you're busted.
+
+ All cards have their own value, except for 10, 11 and 12 that are half point.
+ Special hands have their own price.
+
+ Sun 7 + sun king = 100 (by credit).
+ Any 7 + any king = 16 (by credit).
+ Any 7 and half = 8 (by credit).
+ Pass = 2 (by credit).
+
+
+ How to play...
+
+ Insert coins to get credits.
+ Bet using the BET button. Press DEAL to get the cards.
+ You can hit a new card pressing DEAL, or stop pressing STAND. The dealer will hit
+ cards to the maximum allowed. If you beat the dealer, you'll be asked to enter the
+ double-up game. Press DOUBLE to go on, or TAKE to get the credits.
+
+ In the double-up game, a covered card should be shown. Press BIG or SMALL to get
+ your chance...
+
+
+
+*******************************************************************************
+
+
+ Driver updates:
+
+
+ [2006-07-07]
+ - Initial release.
+
+ [2006-07-11]
+ - Corrected the total number of chars to decode by rom.
+ - Fixed the graphics offset for the text layer.
+ - Adjusted the gfx rom region bounds properly.
+
+ [2006-07-21]
+ - Rewrote the technical info.
+ - Removed fuse maps and unaccurate things.
+ - Added new findings, pinouts, and pieces of code.
+ - Confirmed and partially mapped one input port.
+ - Added a little patch to pass over some checks (for debugging purposes).
+
+ [2006-07-26]
+ - Figured out the MC6845 (mapped at $0800-$0801).
+ - Fixed the screen size based on MC6845 registers.
+ - Fixed the visible area based on MC6845 registers.
+ - Corrected the gfx rom region.
+ - Solved the NMI/vblank issue. Now attract works.
+ - Changed CPU clock to 625 kHz. (text scroll looks so fast with the former value)
+ - Added new findings to the technical notes.
+ - Added version/revision number to magicfly.
+ - Marked magicfly PAL as NO_DUMP (read protected).
+ - Added flags GAME_IMPERFECT_GRAPHICS and GAME_WRONG_COLORS.
+
+ [2006-08-06]
+ - Figured out how the gfx banks works.
+ - Fixed the gfx layers.
+ - Fixed the gfx decode.
+ - Removed flag GAME_IMPERFECT_GRAPHICS.
+
+ [2007-05-12]
+ - Figured out how the protection works.
+ - Removed the hacks/patchs that formerly allow boot the games.
+ - Figured out how the buffered inputs works.
+ - Demuxed all inputs for both games.
+ - Unified the memory maps from both games.
+ - Added NVRAM support to both games.
+ - Crystal documented via #define.
+ - CPU clock derived from #defined crystal value.
+ - Changed CPU clock to 833 kHz.
+ - Mapped DIP switches.
+ - Found the maximum bet DIP switch in magicfly.
+ - Removed flag GAME_NOT_WORKING for both games.
+ - Managed the planes to get the 3bpp GFX colors accurate.
+ - Renamed the ROMs acording to pcb pictures and ROM contents.
+ - Cleaned up and optimized the driver.
+ - Reworked/updated technical notes.
+
+ [2008-03-14]
+ - Completed the component list & PCB layout.
+ - Added technical references to register $63 (magicfly).
+ - Switched crystal to new predefined format.
+
+ [2008-10-25]
+ - Added sound support to magicfly and 7mezzo.
+ - Hooked coin counters to magicfly and 7mezzo.
+ - Inverted the graphics banks to be straight with the hardware accesses.
+ - Updated the memory map description and technical notes.
+ - Added game notes and documented the test/settings/bookkeeping modes.
+
+ [2011-10-11]
+ - Confirmed and fixed CPU clock for magicfly and 7mezzo.
+ - Rearranged the graphic ROMs addressing. Splitted both gfx banks.
+ - Created and minimized the color palette for both gfx banks.
+ - Fixed colors for magicfly and 7mezzo.
+
+
+ TODO:
+
+ - Simplify the gfx banks to avoid a custom palette.
+ - Document the correct pinout.
+ - Analyze the PLD. Try to reconstruct.
+ - Split the driver.
+
+
+*******************************************************************************/
+
+
+#define MASTER_CLOCK XTAL_10MHz
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "video/mc6845.h"
+#include "sound/dac.h"
+#include "machine/nvram.h"
+
+
+class magicfly_state : public driver_device
+{
+public:
+ magicfly_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag) ,
+ m_videoram(*this, "videoram"),
+ m_colorram(*this, "colorram"){ }
+
+ required_shared_ptr<UINT8> m_videoram;
+ required_shared_ptr<UINT8> m_colorram;
+ tilemap_t *m_bg_tilemap;
+ int m_input_selector;
+ DECLARE_WRITE8_MEMBER(magicfly_videoram_w);
+ DECLARE_WRITE8_MEMBER(magicfly_colorram_w);
+ DECLARE_READ8_MEMBER(mux_port_r);
+ DECLARE_WRITE8_MEMBER(mux_port_w);
+};
+
+
+/*************************
+* Video Hardware *
+*************************/
+
+
+WRITE8_MEMBER(magicfly_state::magicfly_videoram_w)
+{
+ m_videoram[offset] = data;
+ m_bg_tilemap->mark_tile_dirty(offset);
+}
+
+WRITE8_MEMBER(magicfly_state::magicfly_colorram_w)
+{
+ m_colorram[offset] = data;
+ m_bg_tilemap->mark_tile_dirty(offset);
+}
+
+static TILE_GET_INFO( get_magicfly_tile_info )
+{
+ magicfly_state *state = machine.driver_data<magicfly_state>();
+/* - bits -
+ 7654 3210
+ ---- -xxx Tiles color.
+ ---- x--- Seems to be a kind of attribute (maybe related to color). Not totally understood yet.
+ ---x ---- Tiles bank.
+ -xx- ---- Apparently not used.
+ x--- ---- Mirrored from bit 3. The code check this one to boot the game.
+
+*/
+ int attr = state->m_colorram[tile_index];
+ int code = state->m_videoram[tile_index];
+ int bank = (attr & 0x10) >> 4; /* bit 4 switch the gfx banks */
+ int color = attr & 0x07; /* bits 0-2 for color */
+
+ /* Seems that bit 7 is mirrored from bit 3 to have a normal boot */
+ /* Boot only check the first color RAM offset */
+
+ state->m_colorram[0] = state->m_colorram[0] | ((state->m_colorram[0] & 0x08) << 4); /* only for 1st offset */
+ //state->m_colorram[tile_index] = attr | ((attr & 0x08) << 4); /* for the whole color RAM */
+
+ SET_TILE_INFO(bank, code, color, 0);
+}
+
+static VIDEO_START(magicfly)
+{
+ magicfly_state *state = machine.driver_data<magicfly_state>();
+ state->m_bg_tilemap = tilemap_create(machine, get_magicfly_tile_info, tilemap_scan_rows, 8, 8, 32, 29);
+}
+
+static TILE_GET_INFO( get_7mezzo_tile_info )
+{
+ magicfly_state *state = machine.driver_data<magicfly_state>();
+/* - bits -
+ 7654 3210
+ ---- -xxx Tiles color.
+ ---- x--- Seems to be a kind of attribute (maybe related to color). Not totally understood yet.
+ ---x ---- Tiles bank.
+ -xx- ---- Apparently not used.
+ x--- ---- Mirrored from bit 2. The code check this one to boot the game.
+
+*/
+ int attr = state->m_colorram[tile_index];
+ int code = state->m_videoram[tile_index];
+ int bank = (attr & 0x10) >> 4; /* bit 4 switch the gfx banks */
+ int color = attr & 0x07; /* bits 0-2 for color */
+
+ /* Seems that bit 7 is mirrored from bit 2 to have a normal boot */
+ /* Boot only check the first color RAM offset */
+
+ state->m_colorram[0] = state->m_colorram[0] | ((state->m_colorram[0] & 0x04) << 5); /* only for 1st offset */
+ //state->m_colorram[tile_index] = attr | ((attr & 0x04) << 5); /* for the whole color RAM */
+
+ SET_TILE_INFO(bank, code, color, 0);
+}
+
+static VIDEO_START( 7mezzo )
+{
+ magicfly_state *state = machine.driver_data<magicfly_state>();
+ state->m_bg_tilemap = tilemap_create(machine, get_7mezzo_tile_info, tilemap_scan_rows, 8, 8, 32, 29);
+}
+
+static SCREEN_UPDATE_IND16( magicfly )
+{
+ magicfly_state *state = screen.machine().driver_data<magicfly_state>();
+ state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0);
+ return 0;
+}
+
+static PALETTE_INIT( magicfly )
+{
+ int i;
+
+ for (i = 0x00; i < 0x10; i += 0x10)
+ {
+ /* 1st gfx bank */
+ palette_set_color(machine, i + 0, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 2, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 4, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 6, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 8, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 10, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 12, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 14, MAKE_RGB(0x00, 0x00, 0x00));
+
+ palette_set_color(machine, i + 1, MAKE_RGB(0x00, 0x00, 0x00));
+ palette_set_color(machine, i + 3, MAKE_RGB(0xff, 0x00, 0x00));
+ palette_set_color(machine, i + 5, MAKE_RGB(0x00, 0xff, 0x00));
+ palette_set_color(machine, i + 7, MAKE_RGB(0xff, 0xff, 0x00));
+ palette_set_color(machine, i + 9, MAKE_RGB(0x00, 0x00, 0xff));
+ palette_set_color(machine, i + 11, MAKE_RGB(0xff, 0x00, 0xff));
+ palette_set_color(machine, i + 13, MAKE_RGB(0x00, 0xff, 0xff));
+ palette_set_color(machine, i + 15, MAKE_RGB(0xff, 0xff, 0xff));
+ }
+}
+
+
+/******************************
+* R/W Handlers *
+******************************/
+
+
+READ8_MEMBER(magicfly_state::mux_port_r)
+{
+ switch( m_input_selector )
+ {
+ case 0x01: return ioport("IN0-0")->read();
+ case 0x02: return ioport("IN0-1")->read();
+ case 0x04: return ioport("IN0-2")->read();
+ case 0x08: return ioport("IN0-3")->read();
+ case 0x00: return ioport("DSW0")->read();
+ }
+ return 0xff;
+}
+
+WRITE8_MEMBER(magicfly_state::mux_port_w)
+{
+/* - bits -
+ 7654 3210
+ ---- xxxx Input selector.
+ ---x ---- Coin 2.
+ --x- ---- Payout.
+ -x-- ---- Coin 1.
+ x--- ---- Sound DAC.
+
+*/
+ m_input_selector = data & 0x0f; /* Input Selector */
+
+ dac_data_w(machine().device("dac"), data & 0x80); /* Sound DAC */
+
+ coin_counter_w(machine(), 0, data & 0x40); /* Coin1 */
+ coin_counter_w(machine(), 1, data & 0x10); /* Coin2 */
+ coin_counter_w(machine(), 2, data & 0x20); /* Payout */
+}
+
+
+/*************************
+* Memory map information *
+*************************/
+
+static ADDRESS_MAP_START( magicfly_map, AS_PROGRAM, 8, magicfly_state )
+ AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("nvram") /* MK48Z02B NVRAM */
+ AM_RANGE(0x0800, 0x0800) AM_DEVWRITE("crtc", mc6845_device, address_w)
+ AM_RANGE(0x0801, 0x0801) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
+ AM_RANGE(0x1000, 0x13ff) AM_RAM_WRITE(magicfly_videoram_w) AM_SHARE("videoram") /* HM6116LP #1 (2K x 8) RAM (only 1st half used) */
+ AM_RANGE(0x1800, 0x1bff) AM_RAM_WRITE(magicfly_colorram_w) AM_SHARE("colorram") /* HM6116LP #2 (2K x 8) RAM (only 1st half used) */
+ AM_RANGE(0x2800, 0x2800) AM_READ(mux_port_r) /* multiplexed input port */
+ AM_RANGE(0x3000, 0x3000) AM_WRITE(mux_port_w) /* output port */
+ AM_RANGE(0xc000, 0xffff) AM_ROM /* ROM space */
+ADDRESS_MAP_END
+
+
+/*************************
+* Input ports *
+*************************/
+
+static INPUT_PORTS_START( magicfly )
+/* Multiplexed 4 x 5 bits.
+ Code accept only bits 0, 1, 2, 3 and 5 as valid.
+*/
+ PORT_START("IN0-0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0-1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_Q)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0-2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0-3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Deal / Last Bet") PORT_CODE(KEYCODE_C)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Cancel") PORT_CODE(KEYCODE_V)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Bet10") PORT_CODE(KEYCODE_X)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Bet1/Select") PORT_CODE(KEYCODE_Z)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("DSW0") /* Only 4 phisical DIP switches (valid bits = 4, 6, 7) */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x10, 0x10, "Maximum Bet" )
+ PORT_DIPSETTING( 0x10, "20" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) /* invalid - don't change */
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( 7mezzo )
+/* Multiplexed 4 x 5 bits.
+ Code accept only bits 0, 1, 2, 3 and 5 as valid.
+*/
+ PORT_START("IN0-0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0-1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Big") PORT_CODE(KEYCODE_A)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Small") PORT_CODE(KEYCODE_S)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Payout") PORT_CODE(KEYCODE_Q)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Take") PORT_CODE(KEYCODE_V)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0-2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* present in the input test */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN0-3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Deal / Last Bet") PORT_CODE(KEYCODE_Z)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Stand") PORT_CODE(KEYCODE_X)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Double") PORT_CODE(KEYCODE_C)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Bet") PORT_CODE(KEYCODE_1)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("DSW0") /* Only 4 phisical DIP switches (valid bits = 4, 6, 7) */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) /* invalid - don't change */
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+/*************************
+* Graphics Layouts *
+*************************/
+
+static const gfx_layout tilelayout =
+{
+ 8, 8,
+ RGN_FRAC(1,3),
+ 3,
+ { 0, RGN_FRAC(1,3), RGN_FRAC(2,3) },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+static const gfx_layout charlayout =
+{
+ 8, 8,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+
+/******************************
+* Graphics Decode Information *
+******************************/
+
+static GFXDECODE_START( magicfly )
+ GFXDECODE_ENTRY( "gfxbnk1", 0, tilelayout, 16, 1 )
+ GFXDECODE_ENTRY( "gfxbnk0", 0, charlayout, 0, 8 )
+GFXDECODE_END
+
+
+/************************
+* CRTC Interface *
+************************/
+
+static const mc6845_interface mc6845_intf =
+{
+ "screen", /* screen we are acting on */
+ 8, /* 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( magicfly, magicfly_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK/16) /* guess */
+ MCFG_CPU_PROGRAM_MAP(magicfly_map)
+ MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse)
+
+ MCFG_NVRAM_ADD_0FILL("nvram")
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). */
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) /* Taken from MC6845 init, registers 01 & 06. */
+ MCFG_SCREEN_UPDATE_STATIC(magicfly)
+
+ MCFG_GFXDECODE(magicfly)
+ MCFG_PALETTE_LENGTH(32)
+ MCFG_PALETTE_INIT(magicfly)
+
+ MCFG_VIDEO_START(magicfly)
+
+ MCFG_MC6845_ADD("crtc", MC6845, MASTER_CLOCK/16, mc6845_intf) /* guess */
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("dac", DAC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( 7mezzo, magicfly )
+
+ /* basic machine hardware */
+
+ /* video hardware */
+ MCFG_VIDEO_START(7mezzo)
+
+MACHINE_CONFIG_END
+
+
+/*************************
+* Rom Load *
+*************************/
+
+ROM_START( magicfly )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "magicfly3_3.bin", 0xc000, 0x4000, CRC(c29798d5) SHA1(bf92ac93d650398569b3ab79d01344e74a6d35be) )
+
+ ROM_REGION( 0x6000, "gfx", 0 )
+ ROM_LOAD( "magicfly2.bin", 0x0000, 0x2000, CRC(3596a45b) SHA1(7ec32ec767d0883d05606beb588d8f27ba8f10a4) )
+ ROM_LOAD( "magicfly1.bin", 0x2000, 0x2000, CRC(724d330c) SHA1(cce3923ce48634b27f0e7d29979cd36e7394ab37) )
+ ROM_LOAD( "magicfly0.bin", 0x4000, 0x2000, CRC(44e3c9d6) SHA1(677d25360d261bf2400f399b8015eeb529ad405e) )
+
+ ROM_REGION( 0x0800, "gfxbnk0", 0 )
+// ROM_FILL( 0x0000, 0x1000, 0 ) /* filling the R-G bitplanes */
+ ROM_COPY( "gfx", 0x1800, 0x0000, 0x0800 ) /* chars */
+
+ ROM_REGION( 0x1800, "gfxbnk1", 0 )
+ ROM_COPY( "gfx", 0x1000, 0x0000, 0x0800 ) /* sprites, bitplane 1 */
+ ROM_COPY( "gfx", 0x3800, 0x0800, 0x0800 ) /* sprites, bitplane 2 */
+ ROM_COPY( "gfx", 0x5800, 0x1000, 0x0800 ) /* sprites, bitplane 3 */
+
+ ROM_REGION( 0x0200, "plds", 0 )
+ ROM_LOAD( "pal16r4a-magicfly.bin", 0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
+
+ROM_END
+
+ROM_START( 7mezzo )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "ns3_1.bin", 0xc000, 0x4000, CRC(b1867b76) SHA1(eb76cffb81c865352f4767015edade54801f6155) )
+
+ ROM_REGION( 0x6000, "gfx", 0 )
+ ROM_LOAD( "ns2.bin", 0x0000, 0x2000, CRC(7983a41c) SHA1(68805ea960c2738d3cd2c7490ffed84f90da029b) ) /* Renamed as ns2.bin regarding pcb location and content */
+ ROM_LOAD( "ns1.bin", 0x2000, 0x2000, CRC(a6ada872) SHA1(7f531a76e73d479161e485bdcf816eb8eb9fdc62) )
+ ROM_LOAD( "ns0.bin", 0x4000, 0x2000, CRC(e04fb210) SHA1(81e764e296fe387daf8ca67064d5eba2a4fc3c26) ) /* Renamed as ns0.bin regarding pcb location and content */
+
+ ROM_REGION( 0x0800, "gfxbnk0", 0 )
+// ROM_FILL( 0x0000, 0x1000, 0 ) /* filling the R-G bitplanes */
+ ROM_COPY( "gfx", 0x1800, 0x0000, 0x0800 ) /* chars */
+
+ ROM_REGION( 0x1800, "gfxbnk1", 0 )
+ ROM_COPY( "gfx", 0x1000, 0x0000, 0x0800 ) /* sprites, bitplane 1 */
+ ROM_COPY( "gfx", 0x3800, 0x0800, 0x0800 ) /* sprites, bitplane 2 */
+ ROM_COPY( "gfx", 0x5800, 0x1000, 0x0800 ) /* sprites, bitplane 3 */
+
+ ROM_REGION( 0x0200, "plds", 0 )
+ ROM_LOAD( "pal16r4a-7mezzo.bin", 0x0000, 0x0104, BAD_DUMP CRC(61ac7372) SHA1(7560506468a7409075094787182ded24e2d0c0a3) )
+ROM_END
+
+
+/*************************
+* Game Drivers *
+*************************/
+
+/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS... */
+GAME( 198?, magicfly, 0, magicfly, magicfly, 0, ROT0, "P&A Games", "Magic Fly", 0 )
+GAME( 198?, 7mezzo, 0, 7mezzo, 7mezzo, 0, ROT0, "<unknown>", "7 e Mezzo", 0 )