From 775eb69d1dfd9c355cd34f8bde58d9d6c49cd148 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 20 Aug 2023 00:43:08 +0200 Subject: [PATCH] capcom/alien.cpp: stub MB86292 as a device --- scripts/src/video.lua | 12 +++ src/devices/video/mb86292.cpp | 181 ++++++++++++++++++++++++++++++++++ src/devices/video/mb86292.h | 38 +++++++ src/mame/capcom/alien.cpp | 100 ++++++------------- 4 files changed, 260 insertions(+), 71 deletions(-) create mode 100644 src/devices/video/mb86292.cpp create mode 100644 src/devices/video/mb86292.h diff --git a/scripts/src/video.lua b/scripts/src/video.lua index 13c113230e5..e23e563cdea 100644 --- a/scripts/src/video.lua +++ b/scripts/src/video.lua @@ -689,6 +689,18 @@ if (VIDEOS["M50458"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/video/mb86292.h,VIDEOS["MB86292"] = true +--------------------------------------------------- + +if (VIDEOS["MB86292"]~=null) then + files { + MAME_DIR .. "src/devices/video/mb86292.cpp", + MAME_DIR .. "src/devices/video/mb86292.h", + } +end + --------------------------------------------------- -- --@src/devices/video/mb88303.h,VIDEOS["MB88303"] = true diff --git a/src/devices/video/mb86292.cpp b/src/devices/video/mb86292.cpp new file mode 100644 index 00000000000..eef4d29c64b --- /dev/null +++ b/src/devices/video/mb86292.cpp @@ -0,0 +1,181 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese + +#include "emu.h" +#include "mb86292.h" + +#include "screen.h" + +//#define LOG_CONFIG (1U << 1) + +#define VERBOSE (LOG_GENERAL) +#include "logmacro.h" + +//MB86290 / MB86290A +//DEFINE_DEVICE_TYPE(MB86291, mb86291_device, "mb86291", "Fujitsu MB86291 \"Scarlet\" Graphics Controller") +DEFINE_DEVICE_TYPE(MB86292, mb86292_device, "mb86292", "Fujitsu MB86292 \"Orchid\" Graphics Controller") + +mb86292_device::mb86292_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) + , device_video_interface(mconfig, *this) + , m_screen(*this, finder_base::DUMMY_TAG) + , m_vram(*this, finder_base::DUMMY_TAG) +{ +} + +mb86292_device::mb86292_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) + : mb86292_device(mconfig, MB86292, tag, owner, clock) +{ +} + +void mb86292_device::device_start() +{ +} + +void mb86292_device::device_reset() +{ +} + +void mb86292_device::vregs_map(address_map &map) +{ + // 0x1fc0000 Host interface HostBase +// map(0x00000, 0x00003) DTC DMA Transfer Count +// map(0x00004, 0x00004) DSU DMA Set Up +// map(0x00005, 0x00005) DRM DMA Request Mask +// map(0x00006, 0x00006) DST DMA STatus +// map(0x00008, 0x00008) DTS DMA Transfer Stop +// map(0x00009, 0x00009) LTS display [List] Transfer Stop +// map(0x00010, 0x00010) LSTA display List Transfer STAtus +// map(0x00018, 0x00018) DRQ DMA ReQuest +// map(0x00020, 0x00023) IST Interrupt STatus +// map(0x00024, 0x00027) MASK Interrupt MASK +// map(0x0002c, 0x0002c) SRST Software ReSeT +// map(0x00040, 0x00043) LSA display List Source Address +// map(0x00044, 0x00047) LCO display List COunt +// map(0x00048, 0x00048) LREQ display List transfer REQuest +// map(0x0fffc, 0x0ffff) MMR Memory I/F Mode Register + // 0x1fd0000 Display engine DisplayBase +// map(0x10000, 0x10001) DCM Display Control Mode +// map(0x10002, 0x10003) DCE Display Controller Enable +// map(0x10006, 0x10007) HTP Horizontal Total Pixels +// map(0x10008, 0x10009) HDP Horizontal Display Period +// map(0x1000a, 0x1000b) HDB Horizontal Display Boundary +// map(0x1000c, 0x1000d) HSP Horizontal Sync pulse Position +// map(0x1000e, 0x1000e) HSW Horizontal Sync pulse Width +// map(0x1000f, 0x1000f) VSW Vertical Sync pulse Width +// map(0x10012, 0x10013) VTR Vertical Total Rasters +// map(0x10014, 0x10015) VSP Vertical Sync pulse Position +// map(0x10016, 0x10017) VDP Vertical Display Period +// map(0x10018, 0x10019) WX Window position X +// map(0x1001a, 0x1001b) WX Window position Y +// map(0x1001c, 0x1001d) WW Window Width +// map(0x1001e, 0x1001f) WH Window Height +// map(0x10020, 0x10023) CM C[onsole] layer Mode +// map(0x10024, 0x10027) COA C[onsole] layer Origin Address +// map(0x10028, 0x1002b) CDA C[onsole] layer Display Address +// map(0x1002c, 0x1002d) CDX C[onsole] layer Display position X +// map(0x1002e, 0x1002f) CDY C[onsole] layer Display position Y +// map(0x10030, 0x10033) WM W[indow] layer Mode +// map(0x10034, 0x10037) WOA W[indow] layer Origin Address +// map(0x10038, 0x1003b) WDA W[indow] layer Display Address +// map(0x10040, 0x10043) MLM M[iddle] L[eft] layer Mode +// map(0x10044, 0x10047) MLOA0 M[iddle] L[eft] Origin Address 0 +// map(0x10048, 0x1004b) MLDA0 M[iddle] L[eft] Display Address 0 +// map(0x1004c, 0x1004f) MLOA1 M[iddle] L[eft] Origin Address 1 +// map(0x10050, 0x10053) MLDA1 M[iddle] L[eft] Display Address 1 +// map(0x10054, 0x10055) MLDX M[iddle] L[eft] Display position X +// map(0x10056, 0x10057) MLDY M[iddle] L[eft] Display position Y +// map(0x10058, 0x1005b) MRM M[iddle] R[ight] layer Mode +// map(0x1005c, 0x1005f) MROA0 M[iddle] R[ight] Origin Address 0 +// map(0x10060, 0x10063) MRDA0 M[iddle] R[ight] Display Address 0 +// map(0x10064, 0x1004f) MROA1 M[iddle] R[ight] Origin Address 1 +// map(0x10068, 0x10053) MRDA1 M[iddle] R[ight] Display Address 1 +// map(0x1006c, 0x1006d) MRDX M[iddle] R[ight] Display position X +// map(0x1006e, 0x1006f) MRDY M[iddle] R[ight] Display position Y +// map(0x10070, 0x10073) BLM B[ase] L[eft] layer Mode +// map(0x10074, 0x10077) BLOA0 B[ase] L[eft] Origin Address 0 +// map(0x10078, 0x1007b) BLDA0 B[ase] L[eft] Display Address 0 +// map(0x1007c, 0x1007f) BLOA1 B[ase] L[eft] Origin Address 1 +// map(0x10080, 0x10083) BLDA1 B[ase] L[eft] Display Address 1 +// map(0x10084, 0x10085) BLDX B[ase] L[eft] Display position X +// map(0x10086, 0x10087) BLDY B[ase] L[eft] Display position Y +// map(0x10088, 0x1008b) BRM B[ase] R[ight] layer Mode +// map(0x1008c, 0x1008f) BROA0 B[ase] R[ight] Origin Address 0 +// map(0x10090, 0x10093) BRDA0 B[ase] R[ight] Display Address 0 +// map(0x10094, 0x10097) BROA1 B[ase] R[ight] Origin Address 1 +// map(0x10098, 0x1009b) BRDA1 B[ase] R[ight] Display Address 1 +// map(0x1009c, 0x1009d) BRDX B[ase] R[ight] Display position X +// map(0x1009e, 0x1009f) BRDY B[ase] R[ight] Display position Y +// map(0x100a0, 0x100a1) CUTC Cursor Transparent Control +// map(0x100a2, 0x100a2) CPM Cursor Priority Mode +// ... +// map(0x10400, 0x107ff) CPAL C layer PALette +// map(0x10800, 0x10bff) MBPAL M & B layer PALette + // 0x1fd8000 Video capture CaptureBase +// map(0x18000, ...) + // 0x1fe0000 Internal texture memory TextureBase +// map(0x20000, ...) + // 0x1ff0000 Drawing engine DrawBase +// map(0x30000, ...) + // 0x1ff8000 Geometry engine GeometryBase +// map(0x38000, ...) +} + +u32 mb86292_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect) +{ +// mariojjl / mmaruchan has two RGB555 charsets at $36d80 & $150600 (pitch=128) +// pingu has one at $96000 +// all Medalusion games also loads up a display list at $780000, which references above and +// (presumably) do clipped ROP transfers to whatever the framebuffer VRAM is. +#if 0 + static int m_test_x = 128, m_test_y = 256, m_start_offs; + + if(machine().input().code_pressed(KEYCODE_Z)) + m_test_x+=4; + + if(machine().input().code_pressed(KEYCODE_X)) + m_test_x-=4; + + if(machine().input().code_pressed(KEYCODE_A)) + m_test_y++; + + if(machine().input().code_pressed(KEYCODE_S)) + m_test_y--; + + if(machine().input().code_pressed(KEYCODE_Q)) + m_start_offs+=0x2000; + + if(machine().input().code_pressed(KEYCODE_W)) + m_start_offs-=0x2000; + + if(machine().input().code_pressed_once(KEYCODE_E)) + m_start_offs+=0x1000; + + if(machine().input().code_pressed_once(KEYCODE_R)) + m_start_offs-=0x1000; + + popmessage("%d %d %04x", m_test_x, m_test_y, m_start_offs); + + bitmap.fill(0, cliprect); + + int count = m_start_offs; + + for(int y = 0; y < m_test_y; y++) + { + for(int x = 0; x < m_test_x; x ++) + { + uint16_t color = m_vram->read(count) | (m_vram->read(count + 1) << 8); + + u8 r = pal5bit((color >> 0) & 0x1f); + u8 g = pal5bit((color >> 5) & 0x1f); + u8 b = pal5bit((color >> 10) & 0x1f); + + if(cliprect.contains(x, y)) + bitmap.pix(y, x) = (r << 16) | (g << 8) | b; + + count +=2; + } + } +#endif + return 0; +} diff --git a/src/devices/video/mb86292.h b/src/devices/video/mb86292.h new file mode 100644 index 00000000000..b164f291fb3 --- /dev/null +++ b/src/devices/video/mb86292.h @@ -0,0 +1,38 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +#ifndef MAME_VIDEO_MB86292_H +#define MAME_VIDEO_MB86292_H + +#pragma once + +#include "machine/ram.h" + +class mb86292_device : public device_t, + public device_video_interface +{ +public: + mb86292_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + static constexpr feature_type unemulated_features() { return feature::GRAPHICS; } + + template void set_screen(T &&tag) { m_screen.set_tag(std::forward(tag)); } + template void set_vram(T &&tag) { m_vram.set_tag(std::forward(tag)); } + + virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, rectangle const &cliprect); + + virtual void vregs_map(address_map &map); + +protected: + mb86292_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); + + virtual void device_start() override; + virtual void device_reset() override; + + required_device m_screen; + required_device m_vram; +}; + +DECLARE_DEVICE_TYPE(MB86292, mb86292_device) + + +#endif // MAME_VIDEO_MB86292_H diff --git a/src/mame/capcom/alien.cpp b/src/mame/capcom/alien.cpp index 93971008804..9b847702f4f 100644 --- a/src/mame/capcom/alien.cpp +++ b/src/mame/capcom/alien.cpp @@ -71,7 +71,9 @@ #include "emu.h" #include "cpu/sh/sh4.h" +#include "machine/ram.h" #include "machine/timekpr.h" +#include "video/mb86292.h" #include "screen.h" #include "speaker.h" @@ -86,7 +88,10 @@ public: alien_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") - , m_vram(*this, "vram%d", 0U) + , m_screen(*this, "screen") + , m_gpu(*this, "gpu") +// , m_vram(*this, "vram%d", 0U) + , m_vram(*this, "vram") { } void alien(machine_config &config); @@ -102,7 +107,9 @@ private: // devices required_device m_maincpu; - required_shared_ptr_array m_vram; + required_device m_screen; + required_device m_gpu; + required_device m_vram; // driver_device overrides virtual void machine_reset() override; @@ -110,63 +117,7 @@ private: u32 alien_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { -// mariojjl / mmaruchan has two RGB555 charsets at $36d80 & $150600 (pitch=128) -// pingu has one at $96000 -// all Medalusion games also loads up a display list at $780000, which references above and -// (presumably) do clipped ROP transfers to whatever the framebuffer VRAM is. -#if 0 - static int m_test_x = 128, m_test_y = 256, m_start_offs; - - if(machine().input().code_pressed(KEYCODE_Z)) - m_test_x+=4; - - if(machine().input().code_pressed(KEYCODE_X)) - m_test_x-=4; - - if(machine().input().code_pressed(KEYCODE_A)) - m_test_y++; - - if(machine().input().code_pressed(KEYCODE_S)) - m_test_y--; - - if(machine().input().code_pressed(KEYCODE_Q)) - m_start_offs+=0x2000; - - if(machine().input().code_pressed(KEYCODE_W)) - m_start_offs-=0x2000; - - if(machine().input().code_pressed_once(KEYCODE_E)) - m_start_offs+=0x1000; - - if(machine().input().code_pressed_once(KEYCODE_R)) - m_start_offs-=0x1000; - - popmessage("%d %d %04x", m_test_x, m_test_y, m_start_offs); - - bitmap.fill(0, cliprect); - - int count = m_start_offs / 8; - - for(int y = 0; y < m_test_y; y++) - { - for(int x = 0; x < m_test_x; x += 4) - { - for (int xi = 0; xi < 4; xi ++) - { - uint16_t color = (m_vram[0][count] >> (xi * 16)) & 0xffff; - - u8 r = pal5bit((color >> 0) & 0x1f); - u8 g = pal5bit((color >> 5) & 0x1f); - u8 b = pal5bit((color >> 10) & 0x1f); - - if(cliprect.contains(x + xi, y)) - bitmap.pix(y, x + xi) = (r << 16) | (g << 8) | b; - } - - count ++; - } - } -#endif + m_gpu->screen_update(screen, bitmap, cliprect); return 0; } @@ -184,11 +135,11 @@ void alien_state::alien_map(address_map &map) map(0x04a00000, 0x04a00007).nopw(); // FPGA config map(0x08000000, 0x08000007).portr("DSW"); map(0x0c000000, 0x0cffffff).ram(); // main RAM - // TODO: convert to MB86292 devices - map(0x10000000, 0x107fffff).ram().share(m_vram[0]); // GPU 1 VRAM - map(0x11fc0000, 0x11ffffff).ram().share("vregs1"); // GPU 1 regs - map(0x12000000, 0x127fffff).ram().share(m_vram[1]); // GPU 2 VRAM - map(0x13fc0000, 0x13ffffff).ram().share("vregs2"); // GPU 2 regs + + map(0x10000000, 0x107fffff).rw(m_vram, FUNC(ram_device::read), FUNC(ram_device::write)); // GPU 1 VRAM + map(0x11fc0000, 0x11ffffff).m(m_gpu, FUNC(mb86292_device::vregs_map)); // GPU 1 regs +// map(0x12000000, 0x127fffff).ram().share(m_vram[1]); // GPU 2 VRAM +// map(0x13fc0000, 0x13ffffff).ram().share("vregs2"); // GPU 2 regs //map(0x18000000, 0x1800000f).r(FUNC(alien_state::test_r)).nopw(); // Alien CF ATA, other games have it other way } @@ -232,14 +183,21 @@ void alien_state::alien(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &alien_state::alien_map); m_maincpu->set_force_no_drc(true); - /* video hardware */ + RAM(config, m_vram); + m_vram->set_default_size("8M"); + m_vram->set_default_value(0); - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_screen_update(FUNC(alien_state::screen_update)); - screen.set_size((32)*8, (32)*8); - screen.set_visarea_full(); + /* video hardware */ + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen->set_screen_update(FUNC(alien_state::screen_update)); + m_screen->set_size((32)*8, (32)*8); + m_screen->set_visarea_full(); + + MB86292(config, m_gpu, 0); + m_gpu->set_screen(m_screen); + m_gpu->set_vram(m_vram); /* sound hardware */ SPEAKER(config, "mono").front_center();