diff --git a/hash/c64_cart.xml b/hash/c64_cart.xml index e2d622ebd88..4b23bc36f29 100644 --- a/hash/c64_cart.xml +++ b/hash/c64_cart.xml @@ -6415,18 +6415,20 @@ - The Final ChessCard + The Final ChessCard (Ger) 1989 Tasc - + + + diff --git a/src/mess/machine/c64_fcc.c b/src/mess/machine/c64_fcc.c index 33992c4c2eb..4b5d0be5733 100644 --- a/src/mess/machine/c64_fcc.c +++ b/src/mess/machine/c64_fcc.c @@ -7,6 +7,21 @@ **********************************************************************/ +/* + + TODO: + + 629D ldx #$00 + 629F stx $0e + 62A1 sta $df00 + 62A4 inc $d020 + 62A7 dec $d020 + 62AA cpx $0e + 62AC beq $62a4 <-- eternal loop here + 62AE rts + +*/ + #include "c64_fcc.h" @@ -50,7 +65,7 @@ const rom_entry *c64_final_chesscard_device::device_rom_region() const //------------------------------------------------- static ADDRESS_MAP_START( c64_fcc_map, AS_PROGRAM, 8, c64_final_chesscard_device ) - AM_RANGE(0x0000, 0x7fff) AM_RAM + AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x6000) AM_READWRITE(nvram_r, nvram_w) AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION(G65SC02P4_TAG, 0) ADDRESS_MAP_END @@ -60,7 +75,7 @@ ADDRESS_MAP_END //------------------------------------------------- static MACHINE_CONFIG_FRAGMENT( c64_fcc ) - MCFG_CPU_ADD(G65SC02P4_TAG, M65SC02, 5000000) + MCFG_CPU_ADD(G65SC02P4_TAG, M65SC02, XTAL_5MHz) MCFG_CPU_PROGRAM_MAP(c64_fcc_map) MACHINE_CONFIG_END @@ -117,7 +132,10 @@ ioport_constructor c64_final_chesscard_device::device_input_ports() const c64_final_chesscard_device::c64_final_chesscard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, C64_FCC, "Final ChessCard", tag, owner, clock), device_c64_expansion_card_interface(mconfig, *this), - m_maincpu(*this, G65SC02P4_TAG) + device_nvram_interface(mconfig, *this), + m_maincpu(*this, G65SC02P4_TAG), + m_bank(0), + m_ramen(0) { } @@ -137,6 +155,11 @@ void c64_final_chesscard_device::device_start() void c64_final_chesscard_device::device_reset() { + m_maincpu->reset(); + + m_bank = 0; + m_ramen = 0; + m_game = 0; } @@ -148,7 +171,18 @@ UINT8 c64_final_chesscard_device::c64_cd_r(address_space &space, offs_t offset, { if (!roml) { - data = m_roml[(m_bank << 13) | (offset & 0x1fff)]; + if (m_ramen) + { + data = m_nvram[offset & 0x1fff]; + } + else + { + data = m_roml[(m_bank << 14) | (offset & 0x3fff)]; + } + } + else if (!romh) + { + data = m_roml[(m_bank << 14) | (offset & 0x3fff)]; } return data; @@ -161,11 +195,72 @@ UINT8 c64_final_chesscard_device::c64_cd_r(address_space &space, offs_t offset, void c64_final_chesscard_device::c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2) { - if (!io1) + if (!roml) { - printf("IO1 %04x %02x\n", offset, data); - m_bank = data; + if (m_ramen) + { + m_nvram[offset & 0x1fff] = data; + } } + else if (!io1) + { + /* + + bit description + + 0 ? + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + */ - if (!io2) printf("IO1 %04x %02x\n", offset, data); + printf("IO1 %04x %02x\n", offset, data); + m_bank = BIT(data, 0); + } + else if (!io2) + { + /* + + bit description + + 0 ? + 1 + 2 + 3 + 4 + 5 + 6 + 7 ? + + */ + + printf("IO2 %04x %02x\n", offset, data); + m_ramen = BIT(data, 0); + m_game = BIT(data, 7); + } +} + + +//------------------------------------------------- +// nvram_r - NVRAM read +//------------------------------------------------- + +READ8_MEMBER( c64_final_chesscard_device::nvram_r ) +{ + return m_nvram[offset & m_nvram_mask]; +} + + +//------------------------------------------------- +// nvram_w - NVRAM write +//------------------------------------------------- + +WRITE8_MEMBER( c64_final_chesscard_device::nvram_w ) +{ + m_nvram[offset & m_nvram_mask] = data; } diff --git a/src/mess/machine/c64_fcc.h b/src/mess/machine/c64_fcc.h index c2c31e3b8bb..602f60764f8 100644 --- a/src/mess/machine/c64_fcc.h +++ b/src/mess/machine/c64_fcc.h @@ -25,7 +25,8 @@ // ======================> c64_final_chesscard_device class c64_final_chesscard_device : public device_t, - public device_c64_expansion_card_interface + public device_c64_expansion_card_interface, + public device_nvram_interface { public: // construction/destruction @@ -37,6 +38,8 @@ public: virtual ioport_constructor device_input_ports() const; DECLARE_INPUT_CHANGED_MEMBER( reset ); + DECLARE_READ8_MEMBER( nvram_r ); + DECLARE_WRITE8_MEMBER( nvram_w ); protected: // device-level overrides @@ -44,6 +47,11 @@ protected: virtual void device_start(); virtual void device_reset(); + // device_nvram_interface overrides + virtual void nvram_default() { } + virtual void nvram_read(emu_file &file) { if (m_nvram != NULL) { file.read(m_nvram, m_nvram_size); } } + virtual void nvram_write(emu_file &file) { if (m_nvram != NULL) { file.write(m_nvram, m_nvram_size); } } + // device_c64_expansion_card_interface overrides virtual UINT8 c64_cd_r(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2); virtual void c64_cd_w(address_space &space, offs_t offset, UINT8 data, int sphi2, int ba, int roml, int romh, int io1, int io2); @@ -52,6 +60,7 @@ private: required_device m_maincpu; UINT8 m_bank; + int m_ramen; }; diff --git a/src/mess/video/mos6566.c b/src/mess/video/mos6566.c index dfc84804a27..4c2014dedac 100644 --- a/src/mess/video/mos6566.c +++ b/src/mess/video/mos6566.c @@ -89,6 +89,13 @@ enum REGISTER_FAST }; +static int UNUSED_BITS[0x40] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x01, 0x70, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; // VICE palette static const rgb_t PALETTE[] = @@ -2460,39 +2467,47 @@ READ8_MEMBER( mos6566_device::read ) { case 0x11: val = (m_reg[offset] & ~0x80) | ((m_rasterline & 0x100) >> 1); + val |= UNUSED_BITS[offset]; break; case 0x12: val = m_rasterline & 0xff; + val |= UNUSED_BITS[offset]; break; case 0x16: val = m_reg[offset] | 0xc0; + val |= UNUSED_BITS[offset]; break; case 0x18: val = m_reg[offset] | 0x01; + val |= UNUSED_BITS[offset]; break; case 0x19: /* interrupt flag register */ /* clear_interrupt(0xf); */ val = m_reg[offset] | 0x70; + val |= UNUSED_BITS[offset]; break; case 0x1a: val = m_reg[offset] | 0xf0; + val |= UNUSED_BITS[offset]; break; case 0x1e: /* sprite to sprite collision detect */ val = m_reg[offset]; m_reg[offset] = 0; clear_interrupt(4); + val |= UNUSED_BITS[offset]; break; case 0x1f: /* sprite to background collision detect */ val = m_reg[offset]; m_reg[offset] = 0; clear_interrupt(2); + val |= UNUSED_BITS[offset]; break; case 0x20: @@ -2501,6 +2516,7 @@ READ8_MEMBER( mos6566_device::read ) case 0x23: case 0x24: val = m_reg[offset]; + val |= UNUSED_BITS[offset]; break; case 0x00: @@ -2535,6 +2551,7 @@ READ8_MEMBER( mos6566_device::read ) case 0x2d: case 0x2e: val = m_reg[offset]; + val |= UNUSED_BITS[offset]; break; case REGISTER_KCR: @@ -2545,7 +2562,9 @@ READ8_MEMBER( mos6566_device::read ) DBG_LOG(2, "vic read", ("%.2x:%.2x\n", offset, val)); } else - val = 0xff; + { + val |= UNUSED_BITS[offset]; + } break; case 0x31: @@ -2563,13 +2582,13 @@ READ8_MEMBER( mos6566_device::read ) case 0x3d: case 0x3e: case 0x3f: /* not used */ - // val = m_reg[offset]; // - val = 0xff; DBG_LOG(2, "vic read", ("%.2x:%.2x\n", offset, val)); + val |= UNUSED_BITS[offset]; break; default: val = m_reg[offset]; + val |= UNUSED_BITS[offset]; } if ((offset != 0x11) && (offset != 0x12))