From 46df3e764010697b8c5f6b0d501b59d71d0a6ba0 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Fri, 7 Jan 2022 13:43:10 +0100 Subject: cv1k: Detect versions of the ep1c12 firmware --- src/devices/video/epic12.cpp | 42 +++++++++++++++++++++++++++++++++++++++--- src/devices/video/epic12.h | 21 +++++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/devices/video/epic12.cpp b/src/devices/video/epic12.cpp index e8368f8bac9..d48e8a7726d 100644 --- a/src/devices/video/epic12.cpp +++ b/src/devices/video/epic12.cpp @@ -1,6 +1,6 @@ // license:BSD-3-Clause // copyright-holders:David Haywood, Luca Elia, MetalliC -/* emulation of Altera Cyclone EPIC12 FPGA programmed as a blitter */ +/* emulation of Altera Cyclone EP1C12 FPGA programmed as a blitter */ #include "emu.h" #include "epic12.h" @@ -61,6 +61,12 @@ void epic12_device::device_start() m_blitter_delay_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(epic12_device::blitter_delay_callback),this)); m_blitter_delay_timer->adjust(attotime::never); + m_firmware_pos = 0; + m_firmware.clear(); + m_firmware.resize(290405, 0); + m_firmware_port = 0; + m_firmware_version = -1; + save_item(NAME(m_gfx_addr)); save_item(NAME(m_gfx_scroll_0_x)); save_item(NAME(m_gfx_scroll_0_y)); @@ -74,6 +80,10 @@ void epic12_device::device_start() save_item(NAME(m_gfx_scroll_1_y_shadowcopy)); save_pointer(NAME(m_ram16_copy), m_main_ramsize/2); save_item(NAME(*m_bitmaps)); + save_item(NAME(m_firmware_pos)); + save_item(NAME(m_firmware_port)); + save_item(NAME(m_firmware)); + save_item(NAME(m_firmware_version)); } void epic12_device::device_reset() @@ -1012,13 +1022,39 @@ u64 epic12_device::fpga_r() return 0xff; } -// todo, store what's written here and checksum it, different microcode probably leads to slightly different blitter timings void epic12_device::fpga_w(offs_t offset, u64 data, u64 mem_mask) { - if (ACCESSING_BITS_24_31) + if (ACCESSING_BITS_0_7) { // data & 0x08 = CE // data & 0x10 = CLK // data & 0x20 = DATA + + if((data & 0x08) && !(m_firmware_port & 0x10) && (data & 0x10)) { + if(m_firmware_pos < 2323240 && (data & 0x20)) + m_firmware[m_firmware_pos >> 3] |= 1 << (m_firmware_pos & 7); + m_firmware_pos++; + } + + m_firmware_port = data; + + if(m_firmware_pos == 2323240) { + u8 checksum = 0; + for(u8 c : m_firmware) + checksum += c; + + switch(checksum) { + case 0x03: m_firmware_version = FW_A; break; + case 0x3e: m_firmware_version = FW_B; break; + case 0xf9: m_firmware_version = FW_C; break; + case 0xe1: m_firmware_version = FW_D; break; + default: m_firmware_version = -1; break; + } + + if(m_firmware_version < 0) + logerror("Unrecognized firmware version\n"); + else + logerror("Detected firmware version %c\n", 'A' + m_firmware_version); + } } } diff --git a/src/devices/video/epic12.h b/src/devices/video/epic12.h index afea33d4f0d..82e58d07e9b 100644 --- a/src/devices/video/epic12.h +++ b/src/devices/video/epic12.h @@ -78,6 +78,21 @@ public: static void *blit_request_callback_unsafe(void *param, int threadid); protected: + // The firmware versions + enum { + // Used by ibara & mushisama + FW_A, // Byte checksum 03 + + // Used by espgal2 + FW_B, // Byte checksum 3e + + // Used by espgal2a, mushitama and mushisamb + FW_C, // Byte checksum f9 + + // Used by everything else + FW_D, // Byte checksum e1 + }; + struct clr_t { // clr_t to r5g5b5 @@ -821,6 +836,12 @@ protected: emu_timer *m_blitter_delay_timer; int m_blitter_busy; + // fpga firmware + std::vector m_firmware; + int m_firmware_pos; + u8 m_firmware_port; + int m_firmware_version; + // debug vram viewer #ifdef DEBUG_VRAM_VIEWER bool m_debug_vram_view_en; -- cgit v1.2.3