diff options
Diffstat (limited to 'src/mame/drivers/gamate.cpp')
-rw-r--r-- | src/mame/drivers/gamate.cpp | 165 |
1 files changed, 5 insertions, 160 deletions
diff --git a/src/mame/drivers/gamate.cpp b/src/mame/drivers/gamate.cpp index d73743e4310..02ee6bda185 100644 --- a/src/mame/drivers/gamate.cpp +++ b/src/mame/drivers/gamate.cpp @@ -18,7 +18,7 @@ #include "bus/generic/carts.h" #include "bus/generic/slot.h" #include "cpu/m6502/m6502.h" -#include "rendlay.h" +#include "video/gamate.h" #include "screen.h" #include "softlist.h" #include "speaker.h" @@ -32,7 +32,6 @@ public: , m_ay(*this, "ay8910") , m_cart(*this, "cartslot") , m_io_joy(*this, "JOY") - , m_palette(*this, "palette") , m_bios(*this, "bios") , m_bank(*this, "bank") , m_bankmulti(*this, "bankmulti") @@ -46,9 +45,7 @@ public: DECLARE_WRITE8_MEMBER(gamate_cart_protection_w); DECLARE_WRITE8_MEMBER(cart_bankswitchmulti_w); DECLARE_WRITE8_MEMBER(cart_bankswitch_w); - DECLARE_READ8_MEMBER(gamate_video_r); DECLARE_READ8_MEMBER(gamate_nmi_r); - DECLARE_WRITE8_MEMBER(gamate_video_w); DECLARE_WRITE8_MEMBER(sound_w); DECLARE_READ8_MEMBER(sound_r); DECLARE_DRIVER_INIT(gamate); @@ -62,19 +59,6 @@ private: struct { - uint8_t reg[8]; - struct - { - bool page2; // else page1 - uint8_t ypos, xpos/*tennis*/; - uint8_t data[2][0x100][0x20]; - } bitmap; - uint8_t x, y; - bool y_increment; - } video; - - struct - { bool set; int bit_shifter; uint8_t cartridge_byte; @@ -87,7 +71,6 @@ private: required_device<ay8910_device> m_ay; required_device<generic_slot_device> m_cart; required_ioport m_io_joy; - required_device<palette_device> m_palette; required_shared_ptr<uint8_t> m_bios; required_memory_bank m_bank; required_memory_bank m_bankmulti; @@ -163,40 +146,6 @@ READ8_MEMBER( gamate_state::newer_protection_set ) return 0; } -WRITE8_MEMBER( gamate_state::gamate_video_w ) -{ - video.reg[offset]=data; - switch (offset) - { - case 1: - if (data&0xf) - printf("lcd mode %x\n", data); - video.y_increment=data&0x40; - break; - case 2: - video.bitmap.xpos=data; - break; - case 3: - if (data>=200) - printf("lcd ypos: %x\n", data); - video.bitmap.ypos=data; - break; - case 4: - video.bitmap.page2=data&0x80; - video.x=data&0x1f; - break; - case 5: - video.y=data; - break; - case 7: - video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data; - if (video.y_increment) - video.y++; - else - video.x++; // overruns - } -} - WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w ) { bank_multi=data; @@ -208,21 +157,6 @@ WRITE8_MEMBER( gamate_state::cart_bankswitch_w ) m_bank->set_base(m_cart_ptr+0x4000*data); } -READ8_MEMBER( gamate_state::gamate_video_r ) -{ - if (offset!=6) - return 0; - uint8_t data = video.bitmap.data[video.bitmap.page2][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]; -// if (m_maincpu->pc()<0xf000) -// popmessage("lcd read x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data); - if (video.y_increment) - video.y++; - else - video.x++; // overruns? - - return data; -} - READ8_MEMBER( gamate_state::gamate_nmi_r ) { uint8_t data=0; @@ -247,7 +181,7 @@ static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state ) AM_RANGE(0x4000, 0x400f) AM_READWRITE(sound_r,sound_w) AM_RANGE(0x4400, 0x4400) AM_READ_PORT("JOY") AM_RANGE(0x4800, 0x4800) AM_READ(gamate_nmi_r) - AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w) + AM_RANGE(0x5000, 0x5007) AM_DEVICE("video", gamate_video_device, regs_map) AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set) AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset) AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r) @@ -272,75 +206,12 @@ static INPUT_PORTS_START( gamate ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select") INPUT_PORTS_END -/* palette in red, green, blue tribles */ -static const unsigned char gamate_colors[4][3] = -{ - { 255,255,255 }, - { 0xa0, 0xa0, 0xa0 }, - { 0x60, 0x60, 0x60 }, - { 0, 0, 0 } -}; - -PALETTE_INIT_MEMBER(gamate_state, gamate) -{ - int i; - - for (i = 0; i < 4; i++) - { - palette.set_pen_color(i, gamate_colors[i][0], gamate_colors[i][1], gamate_colors[i][2]); - } -} - -static void BlitPlane(uint16_t* line, uint8_t plane1, uint8_t plane2) -{ - line[3]=(plane1&1)|((plane2<<1)&2); - line[2]=((plane1>>1)&1)|((plane2<<0)&2); - line[1]=((plane1>>2)&1)|((plane2>>1)&2); - line[0]=((plane1>>3)&1)|((plane2>>2)&2); -} - -uint32_t gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int x, y, j; - for (y=0;y<152;y++) - { - for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) - { - uint8_t d1, d2; - if (video.bitmap.ypos<200) - { - d1=video.bitmap.data[0][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; - d2=video.bitmap.data[1][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f]; - } - else - if ((video.bitmap.ypos&0xf)<8) - { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines; most likely problematic 200 warp around hardware! no real usage - int yi=(y+(video.bitmap.ypos&0xf)-8); - if (yi<0) - yi=video.bitmap.ypos+y; // in this case only 2nd plane used!?, source of first plane? - d1=video.bitmap.data[0][yi][(j+video.bitmap.xpos/8)&0x1f]; // value of lines bevor 0 chaos - d2=video.bitmap.data[1][yi][(j+video.bitmap.xpos/8)&0x1f]; - } - else - { - d1=video.bitmap.data[0][y][(j+video.bitmap.xpos/8)&0x1f]; - d2=video.bitmap.data[1][y][(j+video.bitmap.xpos/8)&0x1f]; - } - BlitPlane(&bitmap.pix16(y, x+4), d1, d2); - BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4); - } - } - return 0; -} - DRIVER_INIT_MEMBER(gamate_state,gamate) { - memset(&video, 0, sizeof(video));/* memset(m_ram, 0, sizeof(m_ram));*/ timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer),this)); timer2 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer2),this)); } - void gamate_state::machine_start() { m_cart_ptr = memregion("maincpu")->base() + 0x6000; @@ -357,17 +228,6 @@ void gamate_state::machine_start() card_protection.unprotected=false; timer2->enable(true); timer2->reset(m_maincpu->cycles_to_attotime(1000)); -#if 0 - save_item(NAME(m_video.data)); - save_item(NAME(m_video.index)); - save_item(NAME(m_video.x)); - save_item(NAME(m_video.y)); - save_item(NAME(m_video.mode)); - save_item(NAME(m_video.delayed)); - save_item(NAME(m_video.pixels)); - save_item(NAME(m_ports)); - save_item(NAME(m_ram)); -#endif } TIMER_CALLBACK_MEMBER(gamate_state::gamate_timer) @@ -385,26 +245,11 @@ TIMER_CALLBACK_MEMBER(gamate_state::gamate_timer2) timer2->reset(m_maincpu->cycles_to_attotime(32768/2)); } - -INTERRUPT_GEN_MEMBER(gamate_state::gamate_interrupt) -{ -} - static MACHINE_CONFIG_START( gamate ) - MCFG_CPU_ADD("maincpu", M6502, 4433000/2) + MCFG_CPU_ADD("maincpu", M6502, 4433000/2) // NCR 65CX02 MCFG_CPU_PROGRAM_MAP(gamate_mem) - MCFG_CPU_VBLANK_INT_DRIVER("screen", gamate_state, gamate_interrupt) - - MCFG_SCREEN_ADD("screen", LCD) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_SIZE(160, 152) - MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 152-1) - MCFG_SCREEN_UPDATE_DRIVER(gamate_state, screen_update_gamate) - MCFG_SCREEN_PALETTE("palette") - - MCFG_PALETTE_ADD("palette", ARRAY_LENGTH(gamate_colors)) - MCFG_PALETTE_INIT_OWNER(gamate_state, gamate) - MCFG_DEFAULT_LAYOUT(layout_lcd) + + MCFG_GAMATE_VIDEO_ADD("video") /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") // Stereo headphone output |