Imported MSM6255 LCD controller device from MESS. (no whatsnew)

This commit is contained in:
Curt Coder 2011-03-29 07:19:09 +00:00
parent ea0681da07
commit b72cf3c570
4 changed files with 589 additions and 0 deletions

2
.gitattributes vendored
View File

@ -1208,6 +1208,8 @@ src/emu/video/hd63484.c svneol=native#text/plain
src/emu/video/hd63484.h svneol=native#text/plain src/emu/video/hd63484.h svneol=native#text/plain
src/emu/video/mc6845.c svneol=native#text/plain src/emu/video/mc6845.c svneol=native#text/plain
src/emu/video/mc6845.h svneol=native#text/plain src/emu/video/mc6845.h svneol=native#text/plain
src/emu/video/msm6255.c svneol=native#text/plain
src/emu/video/msm6255.h svneol=native#text/plain
src/emu/video/pc_vga.c svneol=native#text/plain src/emu/video/pc_vga.c svneol=native#text/plain
src/emu/video/pc_vga.h svneol=native#text/plain src/emu/video/pc_vga.h svneol=native#text/plain
src/emu/video/pc_video.c svneol=native#text/plain src/emu/video/pc_video.c svneol=native#text/plain

View File

@ -234,6 +234,7 @@ EMUVIDEOOBJS = \
$(EMUVIDEO)/hd61830.o \ $(EMUVIDEO)/hd61830.o \
$(EMUVIDEO)/hd63484.o \ $(EMUVIDEO)/hd63484.o \
$(EMUVIDEO)/mc6845.o \ $(EMUVIDEO)/mc6845.o \
$(EMUVIDEO)/msm6255.o \
$(EMUVIDEO)/pc_vga.o \ $(EMUVIDEO)/pc_vga.o \
$(EMUVIDEO)/pc_video.o \ $(EMUVIDEO)/pc_video.o \
$(EMUVIDEO)/poly.o \ $(EMUVIDEO)/poly.o \

452
src/emu/video/msm6255.c Normal file
View File

@ -0,0 +1,452 @@
/**********************************************************************
OKI MSM6255 Dot Matrix LCD Controller implementation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "emu.h"
#include "msm6255.h"
#include "machine/devhelpr.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define LOG 0
// registers
enum
{
REGISTER_MOR = 0,
REGISTER_PR,
REGISTER_HNR,
REGISTER_DVR,
REGISTER_CPR,
REGISTER_SLR,
REGISTER_SUR,
REGISTER_CLR,
REGISTER_CUR
};
#define MOR_GRAPHICS 0x01
#define MOR_4_BIT_PARALLEL 0x02
#define MOR_2_BIT_PARALLEL 0x04
#define MOR_DISPLAY_ON 0x08
#define MOR_CURSOR_BLINK 0x10
#define MOR_CURSOR_ON 0x20
#define MOR_BLINK_TIME_16 0x40
#define PR_HP_4 0x03
#define PR_HP_5 0x04
#define PR_HP_6 0x05
#define PR_HP_7 0x06
#define PR_HP_8 0x07
#define PR_HP_MASK 0x07
#define PR_VP_MASK 0xf0
#define HNR_HN_MASK 0x7f
#define DVR_DN_MASK 0x7f
#define CPR_CPD_MASK 0x0f
#define CPR_CPU_MASK 0xf0
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// devices
const device_type MSM6255 = msm6255_device_config::static_alloc_device_config;
//**************************************************************************
// DEVICE CONFIGURATION
//**************************************************************************
GENERIC_DEVICE_CONFIG_SETUP(msm6255, "MSM6255")
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void msm6255_device_config::device_config_complete()
{
// inherit a copy of the static data
const msm6255_interface *intf = reinterpret_cast<const msm6255_interface *>(static_config());
if (intf != NULL)
{
*static_cast<msm6255_interface *>(this) = *intf;
m_char_ram_r = intf->m_char_ram_r;
}
// or initialize to defaults if none provided
else
{
fatalerror("Interface not specified!");
}
}
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
//-------------------------------------------------
// read_video_data - read video ROM/RAM
//-------------------------------------------------
inline UINT8 msm6255_device::read_video_data(UINT16 ma, UINT8 ra)
{
return m_config.m_char_ram_r(this, ma, ra);
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// msm6255_device - constructor
//-------------------------------------------------
msm6255_device::msm6255_device(running_machine &_machine, const msm6255_device_config &config)
: device_t(_machine, config),
m_cursor(0),
m_config(config)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void msm6255_device::device_start()
{
// find screen
m_screen = machine->device<screen_device>(m_config.m_screen_tag);
// register for state saving
save_item(NAME(m_ir));
save_item(NAME(m_mor));
save_item(NAME(m_pr));
save_item(NAME(m_hnr));
save_item(NAME(m_dvr));
save_item(NAME(m_cpr));
save_item(NAME(m_slr));
save_item(NAME(m_sur));
save_item(NAME(m_clr));
save_item(NAME(m_cur));
save_item(NAME(m_cursor));
save_item(NAME(m_frame));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void msm6255_device::device_reset()
{
m_frame = 0;
}
//-------------------------------------------------
// read - register read
//-------------------------------------------------
READ8_MEMBER( msm6255_device::read )
{
UINT8 data = 0;
if (offset & 0x01)
{
return m_ir;
}
else
{
switch (m_ir)
{
case REGISTER_MOR:
break; // write-only
case REGISTER_PR:
data = m_pr;
break;
case REGISTER_HNR:
data = m_hnr;
break;
case REGISTER_DVR:
break; // write-only
case REGISTER_CPR:
data = m_cpr;
break;
case REGISTER_SLR:
data = m_slr;
break;
case REGISTER_SUR:
data = m_sur;
break;
case REGISTER_CLR:
data = m_clr;
break;
case REGISTER_CUR:
data = m_cur;
break;
}
}
return data;
}
//-------------------------------------------------
// write - register write
//-------------------------------------------------
WRITE8_MEMBER( msm6255_device::write )
{
if (offset & 0x01)
{
m_ir = data & 0x0f;
}
else
{
switch (m_ir)
{
case REGISTER_MOR:
m_mor = data & 0x7f;
break;
case REGISTER_PR:
m_pr = data & 0xf7;
break;
case REGISTER_HNR:
m_hnr = data & 0x7f;
break;
case REGISTER_DVR:
m_dvr = data;
break;
case REGISTER_CPR:
m_cpr = data;
break;
case REGISTER_SLR:
m_slr = data;
break;
case REGISTER_SUR:
m_sur = data;
break;
case REGISTER_CLR:
m_clr = data;
break;
case REGISTER_CUR:
m_cur = data;
break;
}
}
}
//-------------------------------------------------
// update_cursor -
//-------------------------------------------------
void msm6255_device::update_cursor()
{
if (m_mor & MOR_CURSOR_ON)
{
if (m_mor & MOR_CURSOR_BLINK)
{
if (m_mor & MOR_BLINK_TIME_16)
{
if (m_frame == 16)
{
m_cursor = !m_cursor;
m_frame = 0;
}
else
{
m_frame++;
}
}
else
{
if (m_frame == 32)
{
m_cursor = !m_cursor;
m_frame = 0;
}
else
{
m_frame++;
}
}
}
else
{
m_cursor = 1;
}
}
else
{
m_cursor = 0;
}
}
//-------------------------------------------------
// draw_scanline -
//-------------------------------------------------
void msm6255_device::draw_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ma, UINT8 ra)
{
UINT8 hp = (m_pr & PR_HP_MASK) + 1;
UINT8 hn = (m_hnr & HNR_HN_MASK) + 1;
UINT8 cpu = m_cpr & CPR_CPU_MASK;
UINT8 cpd = m_cpr & CPR_CPD_MASK;
UINT16 car = (m_cur << 8) | m_clr;
int sx, x;
for (sx = 0; sx < hn; sx++)
{
UINT8 data = read_video_data(ma, ra);
if (m_cursor)
{
if (ma == car)
{
if (ra >= cpu && ra <= cpd)
{
data ^= 0xff;
}
}
}
for (x = 0; x < hp; x++)
{
*BITMAP_ADDR16(bitmap, y, (sx * hp) + x) = BIT(data, 7);
data <<= 1;
}
ma++;
}
}
//-------------------------------------------------
// update_graphics -
//-------------------------------------------------
void msm6255_device::update_graphics(bitmap_t *bitmap, const rectangle *cliprect)
{
UINT8 hn = (m_hnr & HNR_HN_MASK) + 1;
UINT8 nx = (m_dvr & DVR_DN_MASK) + 1;
UINT16 sar = (m_sur << 8) | m_slr;
int y;
m_cursor = 0;
m_frame = 0;
for (y = 0; y < nx; y++)
{
// draw upper half scanline
UINT16 ma = sar + (y * hn);
draw_scanline(bitmap, cliprect, y, ma, 0);
// draw lower half scanline
ma = sar + ((y + nx) * hn);
draw_scanline(bitmap, cliprect, y + nx, ma, 0);
}
}
//-------------------------------------------------
// update_text -
//-------------------------------------------------
void msm6255_device::update_text(bitmap_t *bitmap, const rectangle *cliprect)
{
UINT8 hn = (m_hnr & HNR_HN_MASK) + 1;
UINT8 vp = (m_pr & PR_VP_MASK) + 1;
UINT8 nx = (m_dvr & DVR_DN_MASK) + 1;
UINT16 sar = (m_sur << 8) | m_slr;
int sy, y;
update_cursor();
for (sy = 0; sy < nx; sy++)
{
for (y = 0; y < vp; y++)
{
// draw upper half scanline
UINT16 ma = sar + ((sy * vp) + y) * hn;
draw_scanline(bitmap, cliprect, (sy * vp) + y, ma, y);
// draw lower half scanline
ma = sar + (((sy + nx) * vp) + y) * hn;
draw_scanline(bitmap, cliprect, (sy * vp) + y, ma, y);
}
}
}
//-------------------------------------------------
// update_screen - update screen
//-------------------------------------------------
void msm6255_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect)
{
if (m_mor & MOR_DISPLAY_ON)
{
if (m_mor & MOR_GRAPHICS)
{
update_graphics(bitmap, cliprect);
}
else
{
update_text(bitmap, cliprect);
}
}
else
{
bitmap_fill(bitmap, cliprect, get_black_pen(machine));
}
}

134
src/emu/video/msm6255.h Normal file
View File

@ -0,0 +1,134 @@
/**********************************************************************
OKI MSM6255 Dot Matrix LCD Controller implementation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __MSM6255__
#define __MSM6255__
#include "emu.h"
///*************************************************************************
// INTERFACE CONFIGURATION MACROS
///*************************************************************************
#define MCFG_MSM6255_ADD(_tag, _clock, _config) \
MCFG_DEVICE_ADD(_tag, MSM6255, _clock) \
MCFG_DEVICE_CONFIG(_config)
#define MSM6255_INTERFACE(name) \
const msm6255_interface (name) =
#define MSM6255_CHAR_RAM_READ(_name) \
UINT8 _name(device_t *device, UINT16 ma, UINT8 ra)
///*************************************************************************
// TYPE DEFINITIONS
///*************************************************************************
// ======================> msm6255_char_ram_read_func
typedef UINT8 (*msm6255_char_ram_read_func)(device_t *device, UINT16 ma, UINT8 ra);
// ======================> msm6255_interface
struct msm6255_interface
{
const char *m_screen_tag;
int m_character_clock;
// ROM/RAM data read function
msm6255_char_ram_read_func m_char_ram_r;
};
// ======================> msm6255_device_config
class msm6255_device_config : public device_config,
public msm6255_interface
{
friend class msm6255_device;
// construction/destruction
msm6255_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
public:
// allocators
static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
virtual device_t *alloc_device(running_machine &machine) const;
protected:
// device_config overrides
virtual void device_config_complete();
msm6255_char_ram_read_func m_char_ram_r;
};
// ======================> msm6255_device
class msm6255_device : public device_t
{
friend class msm6255_device_config;
// construction/destruction
msm6255_device(running_machine &_machine, const msm6255_device_config &_config);
public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
void update_screen(bitmap_t *bitmap, const rectangle *cliprect);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
private:
inline UINT8 read_video_data(UINT16 ma, UINT8 ra);
void update_cursor();
void draw_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ma, UINT8 ra);
void update_graphics(bitmap_t *bitmap, const rectangle *cliprect);
void update_text(bitmap_t *bitmap, const rectangle *cliprect);
screen_device *m_screen;
UINT8 m_ir; // instruction register
UINT8 m_mor; // mode control register
UINT8 m_pr; // character pitch register
UINT8 m_hnr; // horizontal character number register
UINT8 m_dvr; // duty number register
UINT8 m_cpr; // cursor form register
UINT8 m_slr; // start address (lower) register
UINT8 m_sur; // start address (upper) register
UINT8 m_clr; // cursor address (lower) register
UINT8 m_cur; // cursor address (upper) register
int m_cursor; // is cursor displayed
int m_frame; // frame counter
const msm6255_device_config &m_config;
};
// device type definition
extern const device_type MSM6255;
#endif