summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2025-04-17 19:11:40 +0200
committer angelosa <lordkale4@gmail.com>2025-04-18 23:44:58 +0200
commitbc4924bcb8d1654236d03e9555b48ade0110f314 (patch)
treee3e3fb93a3c8fda7f637b07002b4d52215a3b9bb
parentc2a22eb5e2635bcc5bc2b8837e91763d631860af (diff)
sony/smc777.cpp: misc cleanups
-rw-r--r--src/mame/sony/smc777.cpp126
1 files changed, 59 insertions, 67 deletions
diff --git a/src/mame/sony/smc777.cpp b/src/mame/sony/smc777.cpp
index 11270557f70..9f4028be00a 100644
--- a/src/mame/sony/smc777.cpp
+++ b/src/mame/sony/smc777.cpp
@@ -1,23 +1,21 @@
// license:LGPL-2.1+
// copyright-holders:Angelo Salese
-/*************************************************************************************
+/**************************************************************************************************
- SMC-777 (c) 1983 Sony
+SMC-777 (c) 1983 Sony
- driver by Angelo Salese
+TODO:
+- Implement SMC-70 specific features;
+- Implement GFX modes other than 160x100x4
+- ROM/RAM bankswitch, it apparently happens after one instruction prefetching.
+ We currently use an hackish implementation until the MAME/MESS framework can
+ support that ...
+- keyboard input is very sluggish, convert to device_matrix_interface;
+- cursor stuck in Bird Crash;
+- add mc6845 features;
+- interlace (cfr. cpm22 in setup mode);
- TODO:
- - Implement SMC-70 specific features;
- - Implement GFX modes other than 160x100x4
- - ROM/RAM bankswitch, it apparently happens after one instruction prefetching.
- We currently use an hackish implementation until the MAME/MESS framework can
- support that ...
- - keyboard input is very sluggish;
- - cursor stuck in Bird Crash;
- - add mc6845 features;
- - many other missing features;
-
-**************************************************************************************/
+**************************************************************************************************/
#include "emu.h"
@@ -108,12 +106,12 @@ private:
void ramdac_w(offs_t offset, uint8_t data);
uint8_t gcw_r();
void gcw_w(uint8_t data);
- uint8_t smc777_mem_r(offs_t offset);
- void smc777_mem_w(offs_t offset, uint8_t data);
+ uint8_t main_map_r(offs_t offset);
+ void main_map_w(offs_t offset, uint8_t data);
uint8_t vsync_irq_status_r();
void vsync_irq_enable_w(uint8_t data);
- void smc777_palette(palette_device &palette) const;
- uint32_t screen_update_smc777(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ void palette_init(palette_device &palette) const;
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void vsync_w(int state);
TIMER_DEVICE_CALLBACK_MEMBER(keyboard_callback);
@@ -126,8 +124,8 @@ private:
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
- void smc777_io(address_map &map) ATTR_COLD;
- void smc777_mem(address_map &map) ATTR_COLD;
+ void main_map(address_map &map) ATTR_COLD;
+ void io_map(address_map &map) ATTR_COLD;
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
@@ -173,7 +171,7 @@ void smc777_state::video_start()
{
}
-uint32_t smc777_state::screen_update_smc777(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t smc777_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t count;
@@ -489,7 +487,7 @@ void smc777_state::fdc1_select_w(uint8_t data)
floppy->mon_w(0);
if(data & 0xf0)
- printf("floppy access %02x\n", data);
+ logerror("floppy access %02x\n", data);
}
void smc777_state::fdc_intrq_w(int state)
@@ -522,7 +520,7 @@ uint8_t smc777_state::key_r(offs_t offset)
default:
{
//if(offset == 1)
- // printf("Unknown keyboard command %02x read-back\n",m_keyb_cmd);
+ // logerror("Unknown keyboard command %02x read-back\n",m_keyb_cmd);
return (offset == 0) ? 0x00 : (machine().rand() & 0x5);
}
@@ -532,7 +530,7 @@ uint8_t smc777_state::key_r(offs_t offset)
//return 0x00;
}
-/* TODO: the packet commands strikes me as something I've already seen before, don't remember where however ... */
+// TODO: pinpoint interface type
void smc777_state::key_w(offs_t offset, uint8_t data)
{
if(offset == 1) //keyboard command
@@ -546,7 +544,7 @@ void smc777_state::key_w(offs_t offset, uint8_t data)
void smc777_state::border_col_w(uint8_t data)
{
if(data & 0xf0)
- printf("Special border color enabled %02x\n",data);
+ logerror("Special border color enabled %02x\n",data);
m_backdrop_pen = data & 0xf;
}
@@ -563,7 +561,7 @@ uint8_t smc777_state::io_status_1c_r()
* ID ---- -x-- 0=SMC-777 1=SMC-70
* MD ---- --xx [SMC-70] boot mode (00=DISK; 10=ROM; 11=EXT)
*/
- printf("System R\n");
+ logerror("System R\n");
return 0;
}
@@ -643,7 +641,7 @@ void smc777_state::color_mode_w(uint8_t data)
switch(data & 0x07)
{
case 0x06: m_pal_mode = (data & 0x10) ^ 0x10; break;
- default: printf("Color FF %02x\n",data); break;
+ default: logerror("Color FF %02x\n",data); break;
}
}
@@ -653,14 +651,14 @@ void smc777_state::ramdac_w(offs_t offset, uint8_t data)
pal_index = (offset & 0xf00) >> 8;
if(data & 0x0f)
- printf("RAMdac used with data bits 0-3 set (%02x)\n",data);
+ logerror("RAMdac used with data bits 0-3 set (%02x)\n",data);
switch((offset & 0x3000) >> 12)
{
case 0: m_pal.r = (data & 0xf0) >> 4; m_palette->set_pen_color(pal_index, pal4bit(m_pal.r), pal4bit(m_pal.g), pal4bit(m_pal.b)); break;
case 1: m_pal.g = (data & 0xf0) >> 4; m_palette->set_pen_color(pal_index, pal4bit(m_pal.r), pal4bit(m_pal.g), pal4bit(m_pal.b)); break;
case 2: m_pal.b = (data & 0xf0) >> 4; m_palette->set_pen_color(pal_index, pal4bit(m_pal.r), pal4bit(m_pal.g), pal4bit(m_pal.b)); break;
- case 3: printf("RAMdac used with gradient index = 3! pal_index = %02x data = %02x\n",pal_index,data); break;
+ case 3: logerror("RAMdac used with gradient index = 3! pal_index = %02x data = %02x\n",pal_index,data); break;
}
}
@@ -669,29 +667,27 @@ uint8_t smc777_state::gcw_r()
return m_display_reg;
}
-/* x */
+/*
+ * x--- ---- text mode (0 = 80x25 1 = 40x25)
+ * -x-- ---- text page (in 40x25 mode)
+ * --x- ---- color mode (1=for 2bpp mode, blue is replaced with white)
+ * ---x ---- [SMC-70] interlace
+ * ---- xxyy gfx mode (model dependant)
+ * [SMC-70]
+ * ---- 11-- 640x400x1 bpp
+ * ---- 10-- 640x200x2 bpp
+ * ---- 01-- 320x200x4 bpp
+ * ---- 00yy 160x100x4 bpp, bits 0-1 selects page
+ * [SMC-777]
+ * ---- 1--- 640x200x2 bpp
+ * ---- 0--- 320x200x4 bpp
+ */
void smc777_state::gcw_w(uint8_t data)
{
- /*
- * x--- ---- text mode (0 = 80x25 1 = 40x25)
- * -x-- ---- text page (in 40x25 mode)
- * --x- ---- color mode (1=for 2bpp mode, blue is replaced with white)
- * ---x ---- [SMC-70] interlace
- * ---- xxyy gfx mode (model dependant)
- * [SMC-70]
- * ---- 11-- 640x400x1 bpp
- * ---- 10-- 640x200x2 bpp
- * ---- 01-- 320x200x4 bpp
- * ---- 00yy 160x100x4 bpp, bits 0-1 selects page
- * [SMC-777]
- * ---- 1--- 640x200x2 bpp
- * ---- 0--- 320x200x4 bpp
- */
-
m_display_reg = data;
}
-uint8_t smc777_state::smc777_mem_r(offs_t offset)
+uint8_t smc777_state::main_map_r(offs_t offset)
{
uint8_t z80_r;
@@ -713,7 +709,7 @@ uint8_t smc777_state::smc777_mem_r(offs_t offset)
return m_work_ram[offset];
}
-void smc777_state::smc777_mem_w(offs_t offset, uint8_t data)
+void smc777_state::main_map_w(offs_t offset, uint8_t data)
{
m_work_ram[offset] = data;
}
@@ -739,13 +735,13 @@ void smc777_state::vsync_irq_enable_w(uint8_t data)
// TODO: clear idf on 1->0 irq mask transition?
}
-void smc777_state::smc777_mem(address_map &map)
+void smc777_state::main_map(address_map &map)
{
map.unmap_value_high();
- map(0x0000, 0xffff).rw(FUNC(smc777_state::smc777_mem_r), FUNC(smc777_state::smc777_mem_w));
+ map(0x0000, 0xffff).rw(FUNC(smc777_state::main_map_r), FUNC(smc777_state::main_map_w));
}
-void smc777_state::smc777_io(address_map &map)
+void smc777_state::io_map(address_map &map)
{
map.unmap_value_high();
map(0x00, 0x07).select(0xff00).rw(FUNC(smc777_state::vram_r), FUNC(smc777_state::vram_w));
@@ -790,7 +786,7 @@ void smc777_state::smc777_io(address_map &map)
map(0x80, 0xff).select(0xff00).rw(FUNC(smc777_state::fbuf_r), FUNC(smc777_state::fbuf_w));
}
-/* Input ports */
+
static INPUT_PORTS_START( smc777 )
PORT_START("key0") //0x00-0x07
PORT_BIT (0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
@@ -1102,9 +1098,9 @@ void smc777_state::machine_reset()
}
-/* set-up SMC-70 mode colors */
-void smc777_state::smc777_palette(palette_device &palette) const
+void smc777_state::palette_init(palette_device &palette) const
{
+ // set-up SMC-70 mode colors
for(int i = 0x10; i < 0x18; i++)
{
uint8_t const r = BIT(i, 2);
@@ -1137,10 +1133,9 @@ void smc777_state::smc777(machine_config &config)
{
constexpr XTAL MASTER_CLOCK = 32.2238_MHz_XTAL;
- /* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK / 8); // nominally 4.028 MHz
- m_maincpu->set_addrmap(AS_PROGRAM, &smc777_state::smc777_mem);
- m_maincpu->set_addrmap(AS_IO, &smc777_state::smc777_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &smc777_state::main_map);
+ m_maincpu->set_addrmap(AS_IO, &smc777_state::io_map);
I8041A(config, "mcu", 6_MHz_XTAL).set_disable();
@@ -1154,16 +1149,19 @@ void smc777_state::smc777(machine_config &config)
m_ioctrl->q_out_cb<6>().set(FUNC(smc777_state::printer_strb_w));
m_ioctrl->q_out_cb<7>().set(FUNC(smc777_state::cas_out_w));
- /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ // TODO: retrieve defaults from 6845
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
m_screen->set_size(0x400, 400);
m_screen->set_visarea(0, 660-1, 0, 220-1); //normal 640 x 200 + 20 pixels for border color
- m_screen->set_screen_update(FUNC(smc777_state::screen_update_smc777));
+ m_screen->set_screen_update(FUNC(smc777_state::screen_update));
m_screen->set_palette(m_palette);
+ // TODO: 6845 CCLK width is likely supposed to handle this (currently draws 1023x261)
+ m_screen->set_default_position(1.500, 0.000, 1.125, 0.000);
- PALETTE(config, m_palette, FUNC(smc777_state::smc777_palette), 0x20); // 16 + 8 colors (SMC-777 + SMC-70) + 8 empty entries (SMC-70)
+ // 16 + 8 colors (SMC-777 + SMC-70) + 8 empty entries (SMC-70)
+ PALETTE(config, m_palette, FUNC(smc777_state::palette_init), 0x20);
GFXDECODE(config, m_gfxdecode, m_palette, gfxdecode_device::empty);
@@ -1173,7 +1171,6 @@ void smc777_state::smc777(machine_config &config)
m_crtc->set_char_width(8);
m_crtc->out_vsync_callback().set(FUNC(smc777_state::vsync_w));
- // floppy controller
MB8876(config, m_fdc, MASTER_CLOCK / 32); // divider not confirmed
m_fdc->intrq_wr_callback().set(FUNC(smc777_state::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(smc777_state::fdc_drq_w));
@@ -1185,7 +1182,6 @@ void smc777_state::smc777(machine_config &config)
SOFTWARE_LIST(config, "flop_list").set_original("smc777");
QUICKLOAD(config, "quickload", "com,cpm", attotime::from_seconds(3)).set_load_callback(FUNC(smc777_state::quickload_cb));
- /* sound hardware */
SPEAKER(config, "mono").front_center();
SN76489A(config, "sn1", MASTER_CLOCK / 8).add_route(ALL_OUTPUTS, "mono", 0.50); // unknown clock / divider
@@ -1196,7 +1192,6 @@ void smc777_state::smc777(machine_config &config)
TIMER(config, "keyboard_timer").configure_periodic(FUNC(smc777_state::keyboard_callback), attotime::from_hz(240/32));
}
-/* ROM definition */
ROM_START( smc777 )
/* shadow ROM */
ROM_REGION( 0x10000, "ipl", ROMREGION_ERASEFF )
@@ -1212,7 +1207,4 @@ ROM_END
} // anonymous namespace
-/* Driver */
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
COMP( 1983, smc777, 0, 0, smc777, smc777, smc777_state, empty_init, "Sony", "SMC-777", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND)