summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/tmmjprd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/tmmjprd.cpp')
-rw-r--r--src/mame/drivers/tmmjprd.cpp855
1 files changed, 0 insertions, 855 deletions
diff --git a/src/mame/drivers/tmmjprd.cpp b/src/mame/drivers/tmmjprd.cpp
deleted file mode 100644
index 16a39d24ac1..00000000000
--- a/src/mame/drivers/tmmjprd.cpp
+++ /dev/null
@@ -1,855 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:David Haywood
-/* tmmjprd.cpp
-
- - split from rabbit.cpp (it uses the same GFX chip, but is otherwise a different PCB, and until the methods
- of configuring the graphic chip are understood it's easier to work on them here)
-
- - in 16x16 tile mode, the offset into tileram doesn't necessarily align to 16x16 tiles! This makes using the
- tilemap system excessively difficult, as it expects predecoded tiles which simply isn't possible here.
- This is used for the girls in the intro at least, they specify 16x16 tiles on non 16x16 boundaries.
- (basically the physical tile rom addressing doesn't change between modes even if the data type does)
- (handling this in the tilemap system is very messy, might just be best with custom renderer)
-
- - Rom Test not hooked up (can read the gfx roms via a BANK
- - should hook this up as a test to help determine if the tmpdoki roms should really be different
-
- - EEPROM might be wrong, pressing what might be coin3 causes the game to hang
- (see input ports)
-
- - Video has a 'blitter' but it isn't used by these games, it is used by Rabbit
-
- - sprites from one screen are overlapping on the other, probably there's a way to limit them to a single screen
-
- - priority is wrong.
-
-*/
-
-
-#include "emu.h"
-#include "cpu/m68000/m68000.h"
-#include "machine/eepromser.h"
-#include "machine/timer.h"
-#include "sound/i5000.h"
-#include "emupal.h"
-#include "rendlay.h"
-#include "screen.h"
-#include "speaker.h"
-
-
-#define EMULATE_BLITTER 0 // FIXME: code is incomplete
-
-class tmmjprd_state : public driver_device
-{
-public:
- tmmjprd_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_eeprom(*this, "eeprom"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_tilemap_regs(*this, "tilemap_regs.%u", 0),
- m_spriteregs(*this, "spriteregs"),
-#if EMULATE_BLITTER
- m_blitterregs(*this, "blitterregs"),
-#endif
- m_spriteram(*this, "spriteram"),
- m_gfxroms(*this, "gfx2"),
- m_pl1(*this, "PL1.%u", 1),
- m_pl2(*this, "PL2.%u", 1),
- m_system(*this, "SYSTEM")
- { }
-
- void tmmjprd(machine_config &config);
- void tmpdoki(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void video_start() override;
-
-private:
- required_device<cpu_device> m_maincpu;
- required_device<eeprom_serial_93cxx_device> m_eeprom;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
-
- required_shared_ptr_array<uint32_t, 4> m_tilemap_regs;
- required_shared_ptr<uint32_t> m_spriteregs;
-#if EMULATE_BLITTER
- required_shared_ptr<uint32_t> m_blitterregs;
-#endif
- required_shared_ptr<uint32_t> m_spriteram;
-
- required_region_ptr<uint8_t> m_gfxroms;
-
- required_ioport_array<5> m_pl1;
- required_ioport_array<5> m_pl2;
- required_ioport m_system;
-
- std::unique_ptr<uint32_t[]> m_tilemap_ram[4];
- uint8_t m_mux_data;
- uint8_t m_system_in;
- double m_old_brt[2];
-#if EMULATE_BLITTER
- tilemap_t *m_tilemap[4];
- emu_timer *m_blit_done_timer;
-#endif
-
- template<uint8_t Tilemap> DECLARE_WRITE32_MEMBER(tilemap_w);
- template<uint8_t Tilemap> DECLARE_READ32_MEMBER(tilemap_r);
- DECLARE_READ32_MEMBER(randomtmmjprds);
- DECLARE_READ32_MEMBER(mux_r);
- template<uint8_t Number> DECLARE_WRITE32_MEMBER(brt_w);
- DECLARE_WRITE32_MEMBER(eeprom_write);
-
-#if EMULATE_BLITTER
- DECLARE_WRITE32_MEMBER(blitter_w);
- void do_blit();
-#endif
-
- uint32_t screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
- TIMER_DEVICE_CALLBACK_MEMBER(scanline);
-
-#if EMULATE_BLITTER
- TIMER_CALLBACK_MEMBER(blit_done);
-#endif
-
- void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int screen);
- void draw_tile(bitmap_ind16 &bitmap, const rectangle &cliprect, int x,int y,int sizex,int sizey, uint32_t tiledata, uint8_t* rom);
- void draw_tilemap(bitmap_ind16 &bitmap, const rectangle &cliprect, uint32_t*tileram, uint32_t*tileregs, uint8_t*rom );
-
- void main_map(address_map &map);
-};
-
-template<uint8_t Tilemap>
-WRITE32_MEMBER(tmmjprd_state::tilemap_w)
-{
- COMBINE_DATA(&m_tilemap_ram[Tilemap][offset]);
-}
-
-void tmmjprd_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int screen)
-{
- int xpos,ypos;
- gfx_element *gfx = m_gfxdecode->gfx(0);
- // int todraw = (m_spriteregs[5]&0x0fff0000)>>16; // how many sprites to draw (start/end reg..) what is the other half?
-
-// uint32_t *source = (m_spriteram+ (todraw*2))-2;
-// uint32_t *finish = m_spriteram;
-
- uint32_t *source = m_spriteram+(0xc000/4)-2;
- uint32_t *finish = m_spriteram;
- int xoffs = (screen & 1)*320;
-
- for(;source>finish;source-=2)
- {
- if(screen != (source[0]&0x2000)>>13) continue; //screen flag
- if(!(source[0]&0x80000000)) continue; //disable flag
-
- /* Note: sprite-sprite priorities works as back-to-top but abs x/y calcs works as top-to-back */
- if(source[0]&0x40000000)
- {
- xpos = (source[0]&0x00000fff);
- ypos = (source[0]&0x0fff0000)>>16;
- if(xpos&0x800)xpos-=0x1000;
- if(ypos&0x800)ypos-=0x1000;
- }
- else
- {
- uint32_t *calc_abs;
- uint8_t calc_abs_helper;
- int abs_x = 0,abs_y = 0;
-
- calc_abs = source-2;
-
- /* TODO: wrong sprite positioning for the right screen */
- calc_abs_helper = 0;
- while(calc_abs > finish || calc_abs_helper == 0) //sanity check
- {
- if(calc_abs[0] & 0x40000000)
- {
- abs_x = (calc_abs[0]&0x00000fff);
- abs_y = (calc_abs[0]&0x0fff0000)>>16;
-
- if(abs_x & 0x800) abs_x-=0x1000;
- if(abs_y & 0x800) abs_y-=0x1000;
-
- calc_abs_helper = 1;
- }
- calc_abs-=2;
- }
-
- xpos = (source[0]&0x00000fff);
- ypos = (source[0]&0x0fff0000)>>16;
-
- if(xpos&0x800)xpos-=0x1000;
- if(ypos&0x800)ypos-=0x1000;
- xpos+=abs_x;
- ypos+=abs_y;
- xpos&=0x7ff;
- ypos&=0x7ff;
- }
-
- int xflip = (source[0]&0x00008000)>>15;
- int yflip = (source[0]&0x00004000)>>14;
- int tileno = (source[1]&0x0003ffff);
- int colr = (source[1]&0x0ff00000)>>20;
-
- // the tiles in this are 8bpp, it can probably do the funky sub-tile addressing for them too tho..
- tileno >>=1;
-
- // 255 for 8bpp
- gfx->transpen(bitmap,cliprect,tileno,colr,!xflip,yflip,(xpos-xoffs)-8,(ypos)-8,255);
- }
-}
-
-void tmmjprd_state::draw_tile(bitmap_ind16 &bitmap, const rectangle &cliprect, int x,int y,int sizex,int sizey, uint32_t tiledata, uint8_t* rom)
-{
- /* note, it's tile address _NOT_ tile number, 'sub-tile' access is possible, hence using the custom rendering */
- int tileaddr = (tiledata&0x000fffff)>>0;
- int colour = (tiledata&0x0ff00000)>>20;
- int depth = (tiledata&0x10000000)>>28;
- //int flipxy = (tiledata&0x60000000)>>29;
- // 0x80000000 (blank tile like metro.cpp?)
- int count;
-
- // entirely off right
- if (x > cliprect.max_x)
- return;
-
- // entirely off left
- if ((x+sizex) < cliprect.min_x)
- return;
-
- // entirely off bottom
- if (y > cliprect.max_y)
- return;
-
- // entirely off bottom
- if ((y+sizey) < cliprect.min_y)
- return;
-
- count = 0;
- for (int drawy=y;drawy<y+sizey;drawy++)
- {
- for (int drawx=x;drawx<x+sizex;drawx++)
- {
- uint16_t dat;
- uint16_t* dst;
-
- if (!depth)
- {
- if (cliprect.contains(drawx, drawy))
- {
- dat = (rom[(tileaddr*32)+count] & 0xf0)>>4;
- if (dat!=15)
- {
- //dat += (colour<<8);
- dst = &bitmap.pix16(drawy, drawx);
- dst[0] = dat;
- }
- }
- drawx++;
- if (cliprect.contains(drawx, drawy))
- {
- dat = (rom[(tileaddr*32)+count] & 0x0f);
- if (dat!=15)
- {
- //dat += (colour<<8);
- dst = &bitmap.pix16(drawy, drawx);
- dst[0] = dat;
- }
- }
-
- count++;
- }
- else
- {
- if (cliprect.contains(drawx, drawy))
- {
- dat = (rom[(tileaddr*32)+count] & 0xff);
- if (dat!=255)
- {
- dat += (colour<<8) & 0xf00;
- dst = &bitmap.pix16(drawy, drawx);
- dst[0] = dat;
- }
- }
- count++;
- }
- }
- }
-}
-
-void tmmjprd_state::draw_tilemap(bitmap_ind16 &bitmap, const rectangle &cliprect, uint32_t*tileram, uint32_t*tileregs, uint8_t*rom )
-{
- int tilemap_sizex = 64;
- int tilemap_sizey = 64;
-
- int tile_sizex;
- int tile_sizey;
-
- int scrolly, scrollx;
-
- if (tileregs[0]&0x00400000)
- {
- tile_sizex = 16;
- tile_sizey = 16;
- }
- else
- {
- tile_sizex = 8;
- tile_sizey = 8;
- }
-
- scrolly = (tileregs[2] & 0xfff00000) >> 20;
- scrollx = (tileregs[2] & 0x0000fff0) >> 4;
-
- int count = 0;
- for (int y=0;y<tilemap_sizey;y++)
- {
- for (int x=0;x<tilemap_sizex;x++)
- {
- uint32_t tiledata = tileram[count];
- // todo: handle wraparound
- draw_tile(bitmap,cliprect,(x*tile_sizex)-scrollx,(y*tile_sizey)-scrolly,tile_sizex,tile_sizey, tiledata, rom);
- count++;
- }
- }
-
-}
-
-uint32_t tmmjprd_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(m_palette->black_pen(), cliprect);
-
- draw_tilemap(bitmap, cliprect, m_tilemap_ram[3].get(), m_tilemap_regs[3], m_gfxroms );
- draw_sprites(bitmap,cliprect, 1);
- draw_tilemap(bitmap, cliprect, m_tilemap_ram[2].get(), m_tilemap_regs[2], m_gfxroms );
-
- /*
- popmessage("%08x %08x %08x %08x %08x %08x",
- m_tilemap_regs[2][0],
- m_tilemap_regs[2][1],
- m_tilemap_regs[2][2],
- m_tilemap_regs[2][3],
- m_tilemap_regs[2][4],
- m_tilemap_regs[2][5]);
- */
-
-/*
- popmessage("%08x %08x %08x %08x %08x %08x %08x",
- m_spriteregs[0],
- m_spriteregs[1],
- m_spriteregs[2],
- m_spriteregs[3],
- m_spriteregs[4],
- m_spriteregs[5],
- m_spriteregs[6]);
-*/
-
- return 0;
-}
-
-uint32_t tmmjprd_state::screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(m_palette->black_pen(), cliprect);
-
- draw_tilemap(bitmap, cliprect, m_tilemap_ram[1].get(), m_tilemap_regs[1], m_gfxroms );
- draw_sprites(bitmap,cliprect, 0);
- draw_tilemap(bitmap, cliprect, m_tilemap_ram[0].get(), m_tilemap_regs[0], m_gfxroms );
-
- return 0;
-}
-
-void tmmjprd_state::video_start()
-{
- /* the tilemaps are bigger than the regions the cpu can see, need to allocate the ram here */
- /* or maybe not for this game/hw .... */
- m_tilemap_ram[0] = make_unique_clear<uint32_t[]>(0x8000);
- m_tilemap_ram[1] = make_unique_clear<uint32_t[]>(0x8000);
- m_tilemap_ram[2] = make_unique_clear<uint32_t[]>(0x8000);
- m_tilemap_ram[3] = make_unique_clear<uint32_t[]>(0x8000);
-
-
- save_pointer(NAME(m_tilemap_ram[0]), 0x8000);
- save_pointer(NAME(m_tilemap_ram[1]), 0x8000);
- save_pointer(NAME(m_tilemap_ram[2]), 0x8000);
- save_pointer(NAME(m_tilemap_ram[3]), 0x8000);
-
- save_item(NAME(m_old_brt));
-}
-
-template<uint8_t Tilemap>
-READ32_MEMBER(tmmjprd_state::tilemap_r)
-{
- return m_tilemap_ram[Tilemap][offset];
-}
-
-READ32_MEMBER(tmmjprd_state::randomtmmjprds)
-{
- return 0x0000;//machine().rand();
-}
-
-
-#define BLITCMDLOG 0
-#define BLITLOG 0
-
-#if EMULATE_BLITTER
-TIMER_CALLBACK_MEMBER(tmmjprd_state::blit_done)
-{
- m_maincpu->set_input_line(3, HOLD_LINE);
-}
-
-void tmmjprd_state::do_blit()
-{
- uint8_t *blt_data = memregion("gfx1")->base();
- int blt_source = (m_blitterregs[0]&0x000fffff)>>0;
- int blt_column = (m_blitterregs[1]&0x00ff0000)>>16;
- int blt_line = (m_blitterregs[1]&0x000000ff);
- int blt_tilemp = (m_blitterregs[2]&0x0000e000)>>13;
- int blt_oddflg = (m_blitterregs[2]&0x00000001)>>0;
- int mask,shift;
-
-
- if(BLITCMDLOG) osd_printf_debug("BLIT command %08x %08x %08x\n", m_blitterregs[0], m_blitterregs[1], m_blitterregs[2]);
-
- if (blt_oddflg&1)
- {
- mask = 0xffff0000;
- shift= 0;
- }
- else
- {
- mask = 0x0000ffff;
- shift= 16;
- }
-
- blt_oddflg>>=1; /* blt_oddflg is now in dword offsets*/
- blt_oddflg+=0x80*blt_line;
-
- blt_source<<=1; /* blitsource is in word offsets */
-
- while(1)
- {
- int blt_commnd = blt_data[blt_source+1];
- int blt_amount = blt_data[blt_source+0];
- int blt_value;
- int loopcount;
- int writeoffs;
- blt_source+=2;
-
- switch (blt_commnd)
- {
- case 0x00: /* copy nn bytes */
- if (!blt_amount)
- {
- if(BLITLOG) osd_printf_debug("end of blit list\n");
- m_blit_done_timer->adjust(attotime::from_usec(500));
- return;
- }
-
- if(BLITLOG) osd_printf_debug("blit copy %02x bytes\n", blt_amount);
- for (loopcount=0;loopcount<blt_amount;loopcount++)
- {
- blt_value = ((blt_data[blt_source+1]<<8)|(blt_data[blt_source+0]));
- blt_source+=2;
- writeoffs=blt_oddflg+blt_column;
- m_tilemap_ram[blt_tilemp][writeoffs]=(m_tilemap_ram[blt_tilemp][writeoffs]&mask)|(blt_value<<shift);
- m_tilemap[blt_tilemp]->mark_tile_dirty(writeoffs);
-
- blt_column++;
- blt_column&=0x7f;
- }
-
- break;
-
- case 0x02: /* fill nn bytes */
- if(BLITLOG) osd_printf_debug("blit fill %02x bytes\n", blt_amount);
- blt_value = ((blt_data[blt_source+1]<<8)|(blt_data[blt_source+0]));
- blt_source+=2;
-
- for (loopcount=0;loopcount<blt_amount;loopcount++)
- {
- writeoffs=blt_oddflg+blt_column;
- m_tilemap_ram[blt_tilemp][writeoffs]=(m_tilemap_ram[blt_tilemp][writeoffs]&mask)|(blt_value<<shift);
- m_tilemap[blt_tilemp]->mark_tile_dirty(writeoffs);
- blt_column++;
- blt_column&=0x7f;
- }
-
- break;
-
- case 0x03: /* next line */
- if(BLITLOG) osd_printf_debug("blit: move to next line\n");
- blt_column = (m_blitterregs[1]&0x00ff0000)>>16; /* --CC---- */
- blt_oddflg+=128;
- break;
-
- default: /* unknown / illegal */
- if(BLITLOG) osd_printf_debug("unknown blit command %02x\n",blt_commnd);
- break;
- }
- }
-
-}
-
-
-
-WRITE32_MEMBER(tmmjprd_state::blitter_w)
-{
- COMBINE_DATA(&m_blitterregs[offset]);
-
- if (offset == 0x0c/4)
- {
- do_blit();
- }
-}
-#endif
-
-void tmmjprd_state::machine_start()
-{
-#if EMULATE_BLITTER
- m_blit_done_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tmmjprd_state::blit_done), this));
-#endif
-
- save_item(NAME(m_mux_data));
- save_item(NAME(m_system_in));
-}
-
-WRITE32_MEMBER(tmmjprd_state::eeprom_write)
-{
- // don't disturb the EEPROM if we're not actually writing to it
- // (in particular, data & 0x100 here with mask = ffff00ff looks to be the watchdog)
- if (mem_mask == 0x000000ff)
- m_mux_data = (~data & 0xff);
-
- if (mem_mask == 0xff000000)
- {
- // latch the bit
- m_eeprom->di_write((data & 0x01000000) >> 24);
-
- // reset line asserted: reset.
- m_eeprom->cs_write((data & 0x04000000) ? ASSERT_LINE : CLEAR_LINE );
-
- // clock line asserted: write latch or select next bit to read
- m_eeprom->clk_write((data & 0x02000000) ? ASSERT_LINE : CLEAR_LINE );
- }
-}
-
-READ32_MEMBER(tmmjprd_state::mux_r)
-{
- m_system_in = m_system->read();
-
- switch(m_mux_data)
- {
- case 0x01: return (m_system_in & 0xff) | m_pl1[0]->read()<<8 | m_pl2[0]->read()<<16 | 0xff000000;
- case 0x02: return (m_system_in & 0xff) | m_pl1[1]->read()<<8 | m_pl2[1]->read()<<16 | 0xff000000;
- case 0x04: return (m_system_in & 0xff) | m_pl1[2]->read()<<8 | m_pl2[2]->read()<<16 | 0xff000000;
- case 0x08: return (m_system_in & 0xff) | m_pl1[3]->read()<<8 | m_pl2[3]->read()<<16 | 0xff000000;
- case 0x10: return (m_system_in & 0xff) | m_pl1[4]->read()<<8 | m_pl2[4]->read()<<16 | 0xff000000;
- }
-
- return (m_system_in & 0xff) | 0xffffff00;
-}
-
-static INPUT_PORTS_START( tmmjprd )
- PORT_START("SYSTEM")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Left Screen Coin A")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Left Screen Coin B")
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // might actually be coin 3 button.. but hangs the game? (eeprom issue?)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_NAME("Right Screen Coin A")
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_NAME("Right Screen Coin B") // might actually be service 1
- PORT_SERVICE( 0x20, IP_ACTIVE_LOW )
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read) // CHECK!
-
- PORT_START("PL1.1")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) PORT_PLAYER(1)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E ) PORT_PLAYER(1)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M ) PORT_PLAYER(1)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) PORT_PLAYER(1)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL1.2")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B ) PORT_PLAYER(1)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) PORT_PLAYER(1)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N ) PORT_PLAYER(1)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(1)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) //bet button
- PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL1.3")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_PLAYER(1)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G ) PORT_PLAYER(1)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) PORT_PLAYER(1)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(1)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL1.4")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_PLAYER(1)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H ) PORT_PLAYER(1)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L ) PORT_PLAYER(1)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_PLAYER(1)
- PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL1.5")
- PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL2.1")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E ) PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M ) PORT_PLAYER(2)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) PORT_PLAYER(2)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL2.2")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N ) PORT_PLAYER(2)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(2)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) //bet button
- PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL2.3")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G ) PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) PORT_PLAYER(2)
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(2)
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL2.4")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_PLAYER(2)
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H ) PORT_PLAYER(2)
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L ) PORT_PLAYER(2)
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_PLAYER(2)
- PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("PL2.5")
- PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-
-
-/* notice that data & 0x4 is always cleared on brt_1 and set on brt_2. *
- * My wild guess is that bits 0,1 and 2 controls what palette entries to dim. */
-template<uint8_t Number>
-WRITE32_MEMBER(tmmjprd_state::brt_w)
-{
- data>>=24;
- double brt = ((data & 0x78)>>3) / 15.0;
- int bank = data & 0x4 ? 0x800 : 0; //guess
-
- if(data & 0x80 && m_old_brt[Number] != brt)
- {
- m_old_brt[Number] = brt;
- for (int i = bank; i < 0x800+bank; i++)
- m_palette->set_pen_contrast(i, brt);
- }
-}
-
-
-void tmmjprd_state::main_map(address_map &map)
-{
- map(0x000000, 0x1fffff).rom();
- map(0x200010, 0x200013).r(FUNC(tmmjprd_state::randomtmmjprds)); // gfx chip status?
- /* check these are used .. */
-// map(0x200010, 0x200013).writeonly().share("viewregs0");
- map(0x200100, 0x200117).writeonly().share(m_tilemap_regs[0]); // tilemap regs1
- map(0x200120, 0x200137).writeonly().share(m_tilemap_regs[1]); // tilemap regs2
- map(0x200140, 0x200157).writeonly().share(m_tilemap_regs[2]); // tilemap regs3
- map(0x200160, 0x200177).writeonly().share(m_tilemap_regs[3]); // tilemap regs4
- map(0x200200, 0x20021b).writeonly().share(m_spriteregs); // sprregs?
-// map(0x200300, 0x200303).w(FUNC(tmmjprd_state::rombank_w)); // used during rom testing, rombank/area select + something else?
- map(0x20040c, 0x20040f).w(FUNC(tmmjprd_state::brt_w<0>));
- map(0x200410, 0x200413).w(FUNC(tmmjprd_state::brt_w<1>));
-// map(0x200500, 0x200503).writeonly().share("viewregs7");
-#if EMULATE_BLITTER
- map(0x200700, 0x20070f).w(FUNC(tmmjprd_state::blitter_w)).share(m_blitterregs);
-#endif
-// map(0x200800, 0x20080f).writeonly().share("viewregs9"); // never changes?
- map(0x200900, 0x2009ff).rw("i5000snd", FUNC(i5000snd_device::read), FUNC(i5000snd_device::write));
- /* hmm */
-// map(0x279700, 0x279713).writeonly().share("viewregs10");
- /* tilemaps */
- map(0x280000, 0x283fff).rw(FUNC(tmmjprd_state::tilemap_r<0>), FUNC(tmmjprd_state::tilemap_w<0>));
- map(0x284000, 0x287fff).rw(FUNC(tmmjprd_state::tilemap_r<1>), FUNC(tmmjprd_state::tilemap_w<1>));
- map(0x288000, 0x28bfff).rw(FUNC(tmmjprd_state::tilemap_r<2>), FUNC(tmmjprd_state::tilemap_w<2>));
- map(0x28c000, 0x28ffff).rw(FUNC(tmmjprd_state::tilemap_r<3>), FUNC(tmmjprd_state::tilemap_w<3>));
- /* ?? is palette ram shared with sprites in this case or just a different map */
- map(0x290000, 0x29bfff).ram().share(m_spriteram);
- map(0x29c000, 0x29ffff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette");
-
- map(0x400000, 0x400003).r(FUNC(tmmjprd_state::mux_r)).w(FUNC(tmmjprd_state::eeprom_write));
- map(0xf00000, 0xffffff).ram();
-}
-
-
-
-static const gfx_layout sprite_16x16x8_layout =
-{
- 16,16,
- RGN_FRAC(1,2),
- 8,
- { 0,1,2,3,4,5,6,7 },
- {
- 40, 32, RGN_FRAC(1,2)+40,RGN_FRAC(1,2)+32,
- 56, 48,RGN_FRAC(1,2)+56, RGN_FRAC(1,2)+48,
- 8, 0,RGN_FRAC(1,2)+8 , RGN_FRAC(1,2)+0,
- 24, 16,RGN_FRAC(1,2)+24, RGN_FRAC(1,2)+16,
- },
-
-
- { 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,8*64,9*64,10*64,11*64,12*64,13*64,14*64,15*64 },
- 16*64
-};
-
-
-// gfx decoding is ugly.. 16*16 tiles can start at varying different offsets..
-static GFXDECODE_START( gfx_tmmjprd )
- /* this seems to be sprites */
-// GFXDECODE_ENTRY( "gfx1", 0, sprite_8x8x4_layout, 0x0, 0x1000 )
-// GFXDECODE_ENTRY( "gfx1", 0, sprite_16x16x4_layout, 0x0, 0x1000 )
-// GFXDECODE_ENTRY( "gfx1", 0, sprite_8x8x8_layout, 0x0, 0x1000 )
- GFXDECODE_ENTRY( "gfx1", 0, sprite_16x16x8_layout, 0x0, 0x10 )
-GFXDECODE_END
-
-
-TIMER_DEVICE_CALLBACK_MEMBER(tmmjprd_state::scanline)
-{
- int scanline = param;
-
- if(scanline == 224) // vblank-out irq
- m_maincpu->set_input_line(5, HOLD_LINE);
-
- if(scanline == 736) // blitter irq?
- m_maincpu->set_input_line(3, HOLD_LINE);
-
-}
-
-void tmmjprd_state::tmpdoki(machine_config &config)
-{
- M68EC020(config, m_maincpu, 24000000); /* 24 MHz */
- m_maincpu->set_addrmap(AS_PROGRAM, &tmmjprd_state::main_map);
- TIMER(config, "scantimer").configure_scanline(FUNC(tmmjprd_state::scanline), "lscreen", 0, 1);
-
- EEPROM_93C46_16BIT(config, m_eeprom, eeprom_serial_streaming::ENABLE);
-
- GFXDECODE(config, m_gfxdecode, m_palette, gfx_tmmjprd);
- PALETTE(config, m_palette).set_format(palette_device::xGRB_888, 0x1000);
-
- screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER));
- lscreen.set_refresh_hz(60);
- lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
- lscreen.set_size(64*16, 64*16);
- lscreen.set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
- //lscreen.set_visarea(0*8, 64*16-1, 0*8, 64*16-1);
- lscreen.set_screen_update(FUNC(tmmjprd_state::screen_update_left));
- lscreen.set_palette(m_palette);
-
- /* sound hardware */
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
-
- i5000snd_device &i5000snd(I5000_SND(config, "i5000snd", XTAL(40'000'000)));
- i5000snd.add_route(0, "rspeaker", 1.0);
- i5000snd.add_route(1, "lspeaker", 1.0);
-}
-
-void tmmjprd_state::tmmjprd(machine_config &config)
-{
- tmpdoki(config);
-
- config.set_default_layout(layout_dualhsxs);
-
- screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER));
- rscreen.set_refresh_hz(60);
- rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
- rscreen.set_size(64*16, 64*16);
- rscreen.set_visarea(0*8, 40*8-1, 0*8, 28*8-1);
- //rscreen.set_visarea(0*8, 64*16-1, 0*8, 64*16-1);
- rscreen.set_screen_update(FUNC(tmmjprd_state::screen_update_right));
- rscreen.set_palette(m_palette);
-}
-
-ROM_START( tmmjprd )
- ROM_REGION( 0x200000, "maincpu", 0 )
- ROM_LOAD32_BYTE( "p00.bin", 0x000000, 0x080000, CRC(a1efd960) SHA1(7f41ab58de32777bccbfe28e6e5a1f2dca35bb90) )
- ROM_LOAD32_BYTE( "p01.bin", 0x000001, 0x080000, CRC(9c325374) SHA1(1ddf1c292fc1bcf4dcefb5d4aa3abdeb1489c020) )
- ROM_LOAD32_BYTE( "p02.bin", 0x000002, 0x080000, CRC(729a5f12) SHA1(615704d36afdceb4b1ff2e5dc34856e614181e16) )
- ROM_LOAD32_BYTE( "p03.bin", 0x000003, 0x080000, CRC(595615ab) SHA1(aca746d74aa6e7e856eb5c9b740d884778743b27) )
-
- ROM_REGION( 0x2000000, "gfx1", 0 ) /* Sprite Roms */
- ROM_LOAD32_WORD( "00.bin", 0x1000002, 0x400000, CRC(303e91a1) SHA1(c29a22061ab8af8b72e0e6bdb36915a0cb5b2a5c) )
- ROM_LOAD32_WORD( "01.bin", 0x0000002, 0x400000, CRC(3371b775) SHA1(131dd850bd01dac52fa82c41948d900c4833db3c) )
- ROM_LOAD32_WORD( "02.bin", 0x1000000, 0x400000, CRC(4c1e13b9) SHA1(d244eb74f755350604824670db58ab2a56a856cb) )
- ROM_LOAD32_WORD( "03.bin", 0x0000000, 0x400000, CRC(9cf86152) SHA1(e27e0d9befb12ad5c2acf547afe80d1c7921a4d1) )
- ROM_LOAD32_WORD( "10.bin", 0x1800002, 0x400000, CRC(5ab6af41) SHA1(e29cee23c84e17dd8dabd2ec71e622c25418646e) )
- ROM_LOAD32_WORD( "11.bin", 0x0800002, 0x400000, CRC(1d1fd633) SHA1(655be5b72bb70a90d23e49512ca84d9978d87b0b) )
- ROM_LOAD32_WORD( "12.bin", 0x1800000, 0x400000, CRC(5b8bb9d6) SHA1(ee93774077d8a2ddcf70869a9c2f4961219a85b4) )
- ROM_LOAD32_WORD( "13.bin", 0x0800000, 0x400000, CRC(d950df0a) SHA1(3b109341ab4ad87005113fb481b5d1ed9a82f50f) )
-
- ROM_REGION( 0x2000000, "gfx2", 0 ) /* BG Roms */
- ROM_LOAD32_WORD( "40.bin", 0x0000000, 0x400000, CRC(8bedc606) SHA1(7159c8b86e8d7d5ae202c239638483ccdc7dfc25) )
- ROM_LOAD32_WORD( "41.bin", 0x0000002, 0x400000, CRC(e19713dd) SHA1(a8f1b716913f2e391abf277e5bf0e9986cc75898) )
- ROM_LOAD32_WORD( "50.bin", 0x0800000, 0x400000, CRC(85ca9ce9) SHA1(c5a7270507522e11e9485196be325508846fda90) )
- ROM_LOAD32_WORD( "51.bin", 0x0800002, 0x400000, CRC(6ba1d2ec) SHA1(bbe7309b33f213c8cb9ab7adb3221ea79f89e8b0) )
- ROM_LOAD32_WORD( "60.bin", 0x1000000, 0x400000, CRC(7cb132e0) SHA1(f9c366befec46c7f6e307111a62eede029202b16) )
- ROM_LOAD32_WORD( "61.bin", 0x1000002, 0x400000, CRC(caa7e854) SHA1(592867e001abd0781f83a5124bf9aa62ad1aa7f3) )
- ROM_LOAD32_WORD( "70.bin", 0x1800000, 0x400000, CRC(9b737ae4) SHA1(0b62a90d42ace81ee32db073a57731a55a32f989) )
- ROM_LOAD32_WORD( "71.bin", 0x1800002, 0x400000, CRC(189f694e) SHA1(ad0799d4aadade51be38d824910d299257a758a3) )
-
- ROM_REGION( 0x400000, "i5000snd", 0 ) /* Sound Roms */
- ROM_LOAD( "21.bin", 0x0000000, 0x400000, CRC(bb5fa8da) SHA1(620e609b3e2524d06d58844625f186fd4682205f))
-ROM_END
-
-// single screen?
-ROM_START( tmpdoki )
- ROM_REGION( 0x200000, "maincpu", 0 )
- ROM_LOAD32_BYTE( "u70_p0.bin", 0x000000, 0x080000, CRC(c0ee1942) SHA1(0cebc3e326d84e200c2399208d810c0ac767dbb4) )
- ROM_LOAD32_BYTE( "u72_p1.bin", 0x000001, 0x080000, CRC(3c1bc6f6) SHA1(7b3719d4bb52e45db793564b0ccee067fd7af4e4) )
- ROM_LOAD32_BYTE( "u71_p2.bin", 0x000002, 0x080000, CRC(f2091cce) SHA1(88c6822eb1546e914c2644264367e71fb2a82be3) )
- ROM_LOAD32_BYTE( "u73_p3.bin", 0x000003, 0x080000, CRC(cca8ef13) SHA1(d5b077f3d8d38262e69d058a7d61e4563332abce) )
-
- ROM_REGION( 0x2000000, "gfx1", 0 ) /* Sprite Roms */
- ROM_LOAD32_WORD( "00.bin", 0x1000002, 0x400000, CRC(303e91a1) SHA1(c29a22061ab8af8b72e0e6bdb36915a0cb5b2a5c) )
- ROM_LOAD32_WORD( "01.bin", 0x0000002, 0x400000, CRC(3371b775) SHA1(131dd850bd01dac52fa82c41948d900c4833db3c) )
- ROM_LOAD32_WORD( "02.bin", 0x1000000, 0x400000, CRC(4c1e13b9) SHA1(d244eb74f755350604824670db58ab2a56a856cb) )
- ROM_LOAD32_WORD( "03.bin", 0x0000000, 0x400000, CRC(9cf86152) SHA1(e27e0d9befb12ad5c2acf547afe80d1c7921a4d1) )
- ROM_LOAD32_WORD( "10.bin", 0x1800002, 0x400000, CRC(5ab6af41) SHA1(e29cee23c84e17dd8dabd2ec71e622c25418646e) )
- ROM_LOAD32_WORD( "11.bin", 0x0800002, 0x400000, CRC(1d1fd633) SHA1(655be5b72bb70a90d23e49512ca84d9978d87b0b) )
- ROM_LOAD32_WORD( "12.bin", 0x1800000, 0x400000, CRC(5b8bb9d6) SHA1(ee93774077d8a2ddcf70869a9c2f4961219a85b4) )
- ROM_LOAD32_WORD( "13.bin", 0x0800000, 0x400000, CRC(d950df0a) SHA1(3b109341ab4ad87005113fb481b5d1ed9a82f50f) )
-
- ROM_REGION( 0x2000000, "gfx2", 0 ) /* BG Roms */
- ROM_LOAD32_WORD( "40.bin", 0x0000000, 0x400000, CRC(8bedc606) SHA1(7159c8b86e8d7d5ae202c239638483ccdc7dfc25) )
- ROM_LOAD32_WORD( "41.bin", 0x0000002, 0x400000, CRC(e19713dd) SHA1(a8f1b716913f2e391abf277e5bf0e9986cc75898) )
- ROM_LOAD32_WORD( "50.bin", 0x0800000, 0x400000, CRC(85ca9ce9) SHA1(c5a7270507522e11e9485196be325508846fda90) )
- ROM_LOAD32_WORD( "51.bin", 0x0800002, 0x400000, CRC(6ba1d2ec) SHA1(bbe7309b33f213c8cb9ab7adb3221ea79f89e8b0) )
-
- /* I think these should be different, the game attempts to draw tiles from here for the title logo, but
- the tiles are empty. Once the ROM check is hooked up this will be easier to confirm */
- ROM_LOAD32_WORD( "60.bin", 0x1000000, 0x400000, BAD_DUMP CRC(7cb132e0) SHA1(f9c366befec46c7f6e307111a62eede029202b16) )
- ROM_LOAD32_WORD( "61.bin", 0x1000002, 0x400000, BAD_DUMP CRC(caa7e854) SHA1(592867e001abd0781f83a5124bf9aa62ad1aa7f3) )
- ROM_LOAD32_WORD( "70.bin", 0x1800000, 0x400000, BAD_DUMP CRC(9b737ae4) SHA1(0b62a90d42ace81ee32db073a57731a55a32f989) )
- ROM_LOAD32_WORD( "71.bin", 0x1800002, 0x400000, BAD_DUMP CRC(189f694e) SHA1(ad0799d4aadade51be38d824910d299257a758a3) )
-
- ROM_REGION( 0x400000, "i5000snd", 0 ) /* Sound Roms */
- ROM_LOAD( "21.bin", 0x0000000, 0x400000, CRC(bb5fa8da) SHA1(620e609b3e2524d06d58844625f186fd4682205f))
-ROM_END
-
-
-GAME( 1997, tmmjprd, 0, tmmjprd, tmmjprd, tmmjprd_state, empty_init, ROT0, "Media / Sonnet", "Tokimeki Mahjong Paradise - Dear My Love", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1998, tmpdoki, tmmjprd, tmpdoki, tmmjprd, tmmjprd_state, empty_init, ROT0, "Media / Sonnet", "Tokimeki Mahjong Paradise - Doki Doki Hen", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // missing gfx due to wrong roms?