upd7220: devcb2 and delegates. (nw)

This commit is contained in:
Curt Coder 2014-04-02 13:17:56 +00:00
parent ef89442025
commit 5339b585ac
17 changed files with 322 additions and 416 deletions

View File

@ -89,19 +89,10 @@ static ADDRESS_MAP_START( upd7220_0_map, AS_0, 8, wangpc_tig_device )
AM_RANGE(0x4000, 0x7fff) AM_RAM // font memory
ADDRESS_MAP_END
static UPD7220_DRAW_TEXT_LINE( hgdc_display_text)
UPD7220_DRAW_TEXT_LINE_MEMBER( wangpc_tig_device::hgdc_draw_text )
{
}
static UPD7220_INTERFACE( hgdc0_intf )
{
NULL,
hgdc_display_text,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
//-------------------------------------------------
// UPD7220_INTERFACE( hgdc1_intf )
@ -112,19 +103,10 @@ static ADDRESS_MAP_START( upd7220_1_map, AS_0, 8, wangpc_tig_device )
AM_RANGE(0x0000, 0xffff) AM_RAM // graphics memory
ADDRESS_MAP_END
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( wangpc_tig_device::hgdc_display_pixels )
{
}
static UPD7220_INTERFACE( hgdc1_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( wangpc_tig )
@ -140,9 +122,14 @@ static MACHINE_CONFIG_FRAGMENT( wangpc_tig )
MCFG_PALETTE_ADD_MONOCHROME_GREEN_HIGHLIGHT("palette")
MCFG_UPD7220_ADD(UPD7720_0_TAG, XTAL_52_832MHz/28, hgdc0_intf, upd7220_0_map) // was /10?
MCFG_DEVICE_ADD(UPD7720_0_TAG, UPD7220, XTAL_52_832MHz/28)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_0_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(wangpc_tig_device, hgdc_draw_text)
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MCFG_UPD7220_ADD(UPD7720_1_TAG, XTAL_52_832MHz/28, hgdc1_intf, upd7220_1_map) // was /16?
MCFG_DEVICE_ADD(UPD7720_1_TAG, UPD7220, XTAL_52_832MHz/28)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(wangpc_tig_device, hgdc_display_pixels)
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MACHINE_CONFIG_END

View File

@ -38,6 +38,9 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
protected:
// device-level overrides
virtual void device_start();

View File

@ -182,30 +182,6 @@ const rom_entry *upd7220_device::device_rom_region() const
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void upd7220_device::device_config_complete()
{
// inherit a copy of the static data
const upd7220_interface *intf = reinterpret_cast<const upd7220_interface *>(static_config());
if (intf != NULL)
*static_cast<upd7220_interface *>(this) = *intf;
// or initialize to defaults if none provided
else
{
memset(&m_out_drq_cb, 0, sizeof(m_out_drq_cb));
memset(&m_out_hsync_cb, 0, sizeof(m_out_hsync_cb));
memset(&m_out_vsync_cb, 0, sizeof(m_out_vsync_cb));
memset(&m_out_blank_cb, 0, sizeof(m_out_blank_cb));
}
}
//**************************************************************************
// INLINE HELPERS
@ -681,43 +657,47 @@ inline void upd7220_device::get_graphics_partition(int index, UINT32 *sad, UINT1
// upd7220_device - constructor
//-------------------------------------------------
upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, UPD7220, "uPD7220", tag, owner, clock, "upd7220", __FILE__),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
m_mask(0),
m_pitch(0),
m_ead(0),
m_dad(0),
m_lad(0),
m_ra_addr(0),
m_sr(UPD7220_SR_FIFO_EMPTY),
m_cr(0),
m_param_ptr(0),
m_fifo_ptr(-1),
m_fifo_dir(0),
m_mode(0),
m_draw_mode(0),
m_de(0),
m_m(0),
m_aw(0),
m_al(0),
m_vs(0),
m_vfp(0),
m_vbp(0),
m_hs(0),
m_hfp(0),
m_hbp(0),
m_dc(0),
m_sc(0),
m_br(0),
m_ctop(0),
m_cbot(0),
m_lr(0),
m_disp(0),
m_gchr(0),
m_bitmap_mod(0),
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 18, 0, NULL, *ADDRESS_MAP_NAME(upd7220_vram))
upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, UPD7220, "uPD7220", tag, owner, clock, "upd7220", __FILE__),
device_memory_interface(mconfig, *this),
device_video_interface(mconfig, *this),
m_write_drq(*this),
m_write_hsync(*this),
m_write_vsync(*this),
m_write_blank(*this),
m_mask(0),
m_pitch(0),
m_ead(0),
m_dad(0),
m_lad(0),
m_ra_addr(0),
m_sr(UPD7220_SR_FIFO_EMPTY),
m_cr(0),
m_param_ptr(0),
m_fifo_ptr(-1),
m_fifo_dir(0),
m_mode(0),
m_draw_mode(0),
m_de(0),
m_m(0),
m_aw(0),
m_al(0),
m_vs(0),
m_vfp(0),
m_vbp(0),
m_hs(0),
m_hfp(0),
m_hbp(0),
m_dc(0),
m_sc(0),
m_br(0),
m_ctop(0),
m_cbot(0),
m_lr(0),
m_disp(0),
m_gchr(0),
m_bitmap_mod(0),
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 18, 0, NULL, *ADDRESS_MAP_NAME(upd7220_vram))
{
for (int i = 0; i < 16; i++)
{
@ -748,17 +728,20 @@ upd7220_device::upd7220_device(const machine_config &mconfig, const char *tag, d
void upd7220_device::device_start()
{
// resolve callbacks
m_display_cb.bind_relative_to(*owner());
m_draw_text_cb.bind_relative_to(*owner());
m_write_drq.resolve_safe();
m_write_hsync.resolve_safe();
m_write_vsync.resolve_safe();
m_write_blank.resolve_safe();
// allocate timers
m_vsync_timer = timer_alloc(TIMER_VSYNC);
m_hsync_timer = timer_alloc(TIMER_HSYNC);
m_blank_timer = timer_alloc(TIMER_BLANK);
// resolve callbacks
m_out_drq_func.resolve(m_out_drq_cb, *this);
m_out_hsync_func.resolve(m_out_hsync_cb, *this);
m_out_vsync_func.resolve(m_out_vsync_cb, *this);
m_out_blank_func.resolve(m_out_blank_cb, *this);
// register for state saving
save_item(NAME(m_ra));
save_item(NAME(m_sr));
@ -795,7 +778,7 @@ void upd7220_device::device_start()
void upd7220_device::device_reset()
{
m_out_drq_func(CLEAR_LINE);
m_write_drq(CLEAR_LINE);
}
@ -817,7 +800,7 @@ void upd7220_device::device_timer(emu_timer &timer, device_timer_id id, int para
m_sr &= ~UPD7220_SR_HBLANK_ACTIVE;
}
m_out_hsync_func(param);
m_write_hsync(param);
update_hsync_timer(param);
break;
@ -832,7 +815,7 @@ void upd7220_device::device_timer(emu_timer &timer, device_timer_id id, int para
m_sr &= ~UPD7220_SR_VSYNC_ACTIVE;
}
m_out_vsync_func(param);
m_write_vsync(param);
update_vsync_timer(param);
break;
@ -847,7 +830,7 @@ void upd7220_device::device_timer(emu_timer &timer, device_timer_id id, int para
m_sr &= ~UPD7220_SR_HBLANK_ACTIVE;
}
m_out_blank_func(param);
m_write_blank(param);
update_blank_timer(param);
break;
@ -1556,8 +1539,8 @@ void upd7220_device::update_text(bitmap_rgb32 &bitmap, const rectangle &cliprect
{
addr = sad + (y * m_pitch);
if (m_draw_text_cb)
m_draw_text_cb(this, bitmap, addr, y, wd, m_pitch, m_lr, m_dc, m_ead);
if (!m_draw_text_cb.isnull())
m_draw_text_cb(bitmap, addr, y, wd, m_pitch, m_lr, m_dc, m_ead);
}
sy = y + 1;
@ -1576,7 +1559,7 @@ void upd7220_device::draw_graphics_line(bitmap_rgb32 &bitmap, UINT32 addr, int y
for (sx = 0; sx < 80; sx++)
{
if((sx << 3) < m_aw * 16 && y < m_al)
m_display_cb(this, bitmap, y, sx << 3, addr);
m_display_cb(bitmap, y, sx << 3, addr);
addr+= wd + 1;
}
@ -1613,7 +1596,7 @@ void upd7220_device::update_graphics(bitmap_rgb32 &bitmap, const rectangle &clip
Dragon Buster (PC-98xx) contradicts with Xevious with regards of the pitch tho ... */
addr = ((sad << 1) & 0x3ffff) + (y * m_pitch * 2);
if (m_display_cb)
if (!m_display_cb.isnull())
draw_graphics_line(bitmap, addr, y + bsy/((m_pitch == 40)+1), wd);
}
}
@ -1627,8 +1610,8 @@ void upd7220_device::update_graphics(bitmap_rgb32 &bitmap, const rectangle &clip
{
addr = (sad & 0x3ffff) + ((y / m_lr) * m_pitch);
if (m_draw_text_cb)
m_draw_text_cb(this, bitmap, addr, (y + tsy) / m_lr, wd, m_pitch, m_lr, m_dc, m_ead);
if (!m_draw_text_cb.isnull())
m_draw_text_cb(bitmap, addr, (y + tsy) / m_lr, wd, m_pitch, m_lr, m_dc, m_ead);
}
}
}

View File

@ -39,24 +39,31 @@
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_UPD7220_ADD(_tag, _clock, _config, _map) \
MCFG_DEVICE_ADD(_tag, UPD7220, _clock) \
MCFG_DEVICE_CONFIG(_config) \
MCFG_DEVICE_ADDRESS_MAP(AS_0, _map)
#define UPD7220_DISPLAY_PIXELS_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int x, UINT32 address)
#define UPD7220_DRAW_TEXT_LINE_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, UINT32 addr, int y, int wd, int pitch, int lr, int cursor_on, int cursor_addr)
#define UPD7220_INTERFACE(name) \
const upd7220_interface (name) =
#define MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(_class, _method) \
upd7220_device::static_set_display_pixels_callback(*device, upd7220_display_pixels_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(_class, _method) \
upd7220_device::static_set_draw_text_callback(*device, upd7220_draw_text_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_UPD7220_DRQ_CALLBACK(_write) \
devcb = &upd7220_device::set_drq_wr_callback(*device, DEVCB2_##_write);
#define MCFG_UPD7220_HSYNC_CALLBACK(_write) \
devcb = &upd7220_device::set_hsync_wr_callback(*device, DEVCB2_##_write);
#define MCFG_UPD7220_VSYNC_CALLBACK(_write) \
devcb = &upd7220_device::set_vsync_wr_callback(*device, DEVCB2_##_write);
#define MCFG_UPD7220_BLANK_CALLBACK(_write) \
devcb = &upd7220_device::set_blank_wr_callback(*device, DEVCB2_##_write);
@ -64,37 +71,28 @@
// TYPE DEFINITIONS
//**************************************************************************
typedef void (*upd7220_display_pixels_func)(device_t *device, bitmap_rgb32 &bitmap, int y, int x, UINT32 address);
#define UPD7220_DISPLAY_PIXELS(name) void name(device_t *device, bitmap_rgb32 &bitmap, int y, int x, UINT32 address)
typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int x, UINT32 address)> upd7220_display_pixels_delegate;
typedef device_delegate<void (bitmap_rgb32 &bitmap, UINT32 addr, int y, int wd, int pitch, int lr, int cursor_on, int cursor_addr)> upd7220_draw_text_delegate;
typedef void (*upd7220_draw_text_line)(device_t *device, bitmap_rgb32 &bitmap, UINT32 addr, int y, int wd, int pitch, int lr, int cursor_on, int cursor_addr);
#define UPD7220_DRAW_TEXT_LINE(name) void name(device_t *device, bitmap_rgb32 &bitmap, UINT32 addr, int y, int wd, int pitch, int lr, int cursor_on, int cursor_addr)
// ======================> upd7220_interface
struct upd7220_interface
{
upd7220_display_pixels_func m_display_cb;
upd7220_draw_text_line m_draw_text_cb;
devcb_write_line m_out_drq_cb;
devcb_write_line m_out_hsync_cb;
devcb_write_line m_out_vsync_cb;
devcb_write_line m_out_blank_cb;
};
// ======================> upd7220_device
class upd7220_device : public device_t,
public device_memory_interface,
public device_video_interface,
public upd7220_interface
public device_video_interface
{
public:
// construction/destruction
upd7220_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
static void static_set_display_pixels_callback(device_t &device, upd7220_display_pixels_delegate callback) { downcast<upd7220_device &>(device).m_display_cb = callback; }
static void static_set_draw_text_callback(device_t &device, upd7220_draw_text_delegate callback) { downcast<upd7220_device &>(device).m_draw_text_cb = callback; }
template<class _Object> static devcb2_base &set_drq_wr_callback(device_t &device, _Object object) { return downcast<upd7220_device &>(device).m_write_drq.set_callback(object); }
template<class _Object> static devcb2_base &set_hsync_wr_callback(device_t &device, _Object object) { return downcast<upd7220_device &>(device).m_write_hsync.set_callback(object); }
template<class _Object> static devcb2_base &set_vsync_wr_callback(device_t &device, _Object object) { return downcast<upd7220_device &>(device).m_write_vsync.set_callback(object); }
template<class _Object> static devcb2_base &set_blank_wr_callback(device_t &device, _Object object) { return downcast<upd7220_device &>(device).m_write_blank.set_callback(object); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
@ -117,12 +115,14 @@ protected:
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
virtual void device_config_complete();
private:
static const device_timer_id TIMER_VSYNC = 0;
static const device_timer_id TIMER_HSYNC = 1;
static const device_timer_id TIMER_BLANK = 2;
enum
{
TIMER_VSYNC,
TIMER_HSYNC,
TIMER_BLANK
};
inline UINT8 readbyte(offs_t address);
inline void writebyte(offs_t address, UINT8 data);
@ -153,10 +153,13 @@ private:
void draw_graphics_line(bitmap_rgb32 &bitmap, UINT32 addr, int y, int wd);
void update_graphics(bitmap_rgb32 &bitmap, const rectangle &cliprect, int force_bitmap);
devcb_resolved_write_line m_out_drq_func;
devcb_resolved_write_line m_out_hsync_func;
devcb_resolved_write_line m_out_vsync_func;
devcb_resolved_write_line m_out_blank_func;
upd7220_display_pixels_delegate m_display_cb;
upd7220_draw_text_delegate m_draw_text_cb;
devcb2_write_line m_write_drq;
devcb2_write_line m_write_hsync;
devcb2_write_line m_write_vsync;
devcb2_write_line m_write_blank;
UINT16 m_mask; // mask register
UINT8 m_pitch; // number of word addresses in display memory in the horizontal direction

View File

@ -88,18 +88,19 @@ public:
required_device<ram_device> m_ram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
};
/* TODO */
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( a5105_state::hgdc_display_pixels )
{
a5105_state *state = device->machine().driver_data<a5105_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi,gfx;
UINT8 pen;
gfx = state->m_video_ram[address & 0x1ffff];
gfx = m_video_ram[address & 0x1ffff];
for(xi=0;xi<8;xi++)
{
@ -109,10 +110,9 @@ static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
}
}
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( a5105_state::hgdc_draw_text )
{
a5105_state *state = device->machine().driver_data<a5105_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int x;
int xi,yi;
int tile,color;
@ -120,14 +120,14 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
for( x = 0; x < pitch; x++ )
{
tile = (state->m_video_ram[((addr+x)*2) & 0x1ffff] & 0xff);
color = (state->m_video_ram[((addr+x)*2+1) & 0x1ffff] & 0x0f);
tile = (m_video_ram[((addr+x)*2) & 0x1ffff] & 0xff);
color = (m_video_ram[((addr+x)*2+1) & 0x1ffff] & 0x0f);
for( yi = 0; yi < lr; yi++)
{
tile_data = state->m_char_ram[(tile*8+yi) & 0x7ff];
tile_data = m_char_ram[(tile*8+yi) & 0x7ff];
if(cursor_on && cursor_addr == addr+x && device->machine().first_screen()->frame_number() & 0x10)
if(cursor_on && cursor_addr == addr+x && machine().first_screen()->frame_number() & 0x10)
tile_data^=0xff;
for( xi = 0; xi < 8; xi++)
@ -141,12 +141,12 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
if(yi >= 8) { pen = 0; }
/* TODO: pitch is currently 40, this should actually go in the upd7220 device */
if(!device->machine().first_screen()->visible_area().contains(res_x*2+0, res_y))
if(!machine().first_screen()->visible_area().contains(res_x*2+0, res_y))
continue;
bitmap.pix32(res_y, res_x*2+0) = palette[pen];
if(!device->machine().first_screen()->visible_area().contains(res_x*2+1, res_y))
if(!machine().first_screen()->visible_area().contains(res_x*2+1, res_y))
continue;
bitmap.pix32(res_y, res_x*2+1) = palette[pen];
@ -539,15 +539,6 @@ void a5105_state::video_start()
m_char_ram = memregion("pcg")->base();
}
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static ADDRESS_MAP_START( upd7220_map, AS_0, 8, a5105_state)
ADDRESS_MAP_GLOBAL_MASK(0x1ffff)
AM_RANGE(0x00000, 0x1ffff) AM_RAM AM_SHARE("video_ram")
@ -613,7 +604,11 @@ static MACHINE_CONFIG_START( a5105, a5105_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
MCFG_UPD7220_ADD("upd7220", XTAL_15MHz / 16, hgdc_intf, upd7220_map) // unk clock
MCFG_DEVICE_ADD("upd7220", UPD7220, XTAL_15MHz / 16) // unk clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(a5105_state, hgdc_display_pixels)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(a5105_state, hgdc_draw_text)
MCFG_Z80CTC_ADD( "z80ctc", XTAL_15MHz / 4, a5105_ctc_intf )
MCFG_Z80PIO_ADD( "z80pio", XTAL_15MHz / 4, a5105_pio_intf )

View File

@ -151,6 +151,9 @@ public:
UINT8 m_dma_offset[4];
IRQ_CALLBACK_MEMBER(irq_callback);
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
protected:
// driver_device overrides
@ -179,24 +182,23 @@ UINT32 apc_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, co
}
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( apc_state::hgdc_display_pixels )
{
// ...
}
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( apc_state::hgdc_draw_text )
{
apc_state *state = device->machine().driver_data<apc_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi,yi,yi_trans;
int x;
UINT8 char_size;
// UINT8 interlace_on;
// if(state->m_video_ff[DISPLAY_REG] == 0) //screen is off
// if(m_video_ff[DISPLAY_REG] == 0) //screen is off
// return;
// interlace_on = state->m_video_reg[2] == 0x10; /* TODO: correct? */
// interlace_on = m_video_reg[2] == 0x10; /* TODO: correct? */
char_size = 19;
for(x=0;x<pitch;x++)
@ -208,12 +210,12 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UINT32 tile_addr;
UINT8 tile_sel;
// tile_addr = addr+(x*(state->m_video_ff[WIDTH40_REG]+1));
// tile_addr = addr+(x*(m_video_ff[WIDTH40_REG]+1));
tile_addr = addr+(x*(1));
tile = state->m_video_ram_1[(tile_addr*2+1) & 0x1fff] & 0x00ff;
tile_sel = state->m_video_ram_1[(tile_addr*2) & 0x1fff] & 0x00ff;
attr = (state->m_video_ram_1[(tile_addr*2 & 0x1fff) | 0x2000] & 0x00ff);
tile = m_video_ram_1[(tile_addr*2+1) & 0x1fff] & 0x00ff;
tile_sel = m_video_ram_1[(tile_addr*2) & 0x1fff] & 0x00ff;
attr = (m_video_ram_1[(tile_addr*2 & 0x1fff) | 0x2000] & 0x00ff);
u_line = attr & 0x01;
o_line = attr & 0x02;
@ -233,7 +235,7 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
res_x = (x*8+xi);
res_y = y*lr+yi;
if(!device->machine().first_screen()->visible_area().contains(res_x, res_y))
if(!machine().first_screen()->visible_area().contains(res_x, res_y))
continue;
/*
@ -257,18 +259,18 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
if(yi & 0x10)
tile_data = 0;
else
tile_data = state->m_aux_pcg[(tile & 0xff)*0x20+yi*2];
tile_data = m_aux_pcg[(tile & 0xff)*0x20+yi*2];
}
else
tile_data = state->m_char_rom[(tile & 0x7f)+((tile & 0x80)<<4)+((yi_trans & 0xf)*0x80)+((yi_trans & 0x10)<<8)];
tile_data = m_char_rom[(tile & 0x7f)+((tile & 0x80)<<4)+((yi_trans & 0xf)*0x80)+((yi_trans & 0x10)<<8)];
if(reverse) { tile_data^=0xff; }
if(u_line && yi == lr-1) { tile_data = 0xff; }
if(o_line && yi == 0) { tile_data = 0xff; }
if(v_line) { tile_data|=1; }
if(blink && device->machine().first_screen()->frame_number() & 0x20) { tile_data = 0; } // TODO: rate & correct behaviour
if(blink && machine().first_screen()->frame_number() & 0x20) { tile_data = 0; } // TODO: rate & correct behaviour
if(cursor_on && cursor_addr == tile_addr && device->machine().first_screen()->frame_number() & 0x10)
if(cursor_on && cursor_addr == tile_addr && machine().first_screen()->frame_number() & 0x10)
tile_data^=0xff;
if(yi >= char_size)
@ -758,26 +760,6 @@ void apc_state::machine_reset()
m_keyb.sig = 0;
}
static UPD7220_INTERFACE( hgdc_1_intf )
{
NULL,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static UPD7220_INTERFACE( hgdc_2_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static const gfx_layout charset_8x16 =
{
8, 16,
@ -1000,8 +982,13 @@ static MACHINE_CONFIG_START( apc, apc_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", apc)
MCFG_UPD7220_ADD("upd7220_chr", XTAL_3_579545MHz, hgdc_1_intf, upd7220_1_map) // unk clock
MCFG_UPD7220_ADD("upd7220_btm", XTAL_3_579545MHz, hgdc_2_intf, upd7220_2_map) // unk clock
MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 3579545) // unk clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(apc_state, hgdc_draw_text)
MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 3579545) // unk clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(apc_state, hgdc_display_pixels)
MCFG_PALETTE_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(apc_state,apc)

View File

@ -453,25 +453,15 @@ INPUT_PORTS_END
// UPD7220_INTERFACE( hgdc_intf )
//-------------------------------------------------
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( compis_state::hgdc_display_pixels )
{
compis_state *state = device->machine().driver_data<compis_state>();
UINT8 i,gfx = state->m_video_ram[address];
const pen_t *pen = state->m_palette->pens();
UINT8 i,gfx = m_video_ram[address];
const pen_t *pen = m_palette->pens();
for(i=0; i<8; i++)
bitmap.pix32(y, x + i) = pen[BIT(gfx, i)];
}
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
//-------------------------------------------------
// I80186_INTERFACE( cpu_intf )
@ -722,8 +712,12 @@ static MACHINE_CONFIG_START( compis, compis_state )
MCFG_SCREEN_SIZE(640, 400)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update)
MCFG_UPD7220_ADD("upd7220", XTAL_4_433619MHz/2, hgdc_intf, upd7220_map) //unknown clock
MCFG_DEVICE_ADD("upd7220", UPD7220, XTAL_4_433619MHz/2) // unknown clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(compis_state, hgdc_display_pixels)
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
// devices

View File

@ -56,6 +56,9 @@ public:
required_shared_ptr<UINT8> m_video_ram;
required_device<palette_device> m_palette;
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
};
@ -131,20 +134,19 @@ WRITE8_MEMBER(dmv_state::kb_ctrl_mcu_w)
machine().device<upi41_cpu_device>("kb_ctrl_mcu")->upi41_master_w(space, offset, data);
}
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( dmv_state::hgdc_display_pixels )
{
//TODO
}
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( dmv_state::hgdc_draw_text )
{
dmv_state *state = device->machine().driver_data<dmv_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
UINT8 * chargen = state->memregion("maincpu")->base() + 0x1000;
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 * chargen = memregion("maincpu")->base() + 0x1000;
for( int x = 0; x < pitch; x++ )
{
UINT8 tile = state->m_video_ram[((addr+x)*2) & 0x1ffff] & 0xff;
UINT8 tile = m_video_ram[((addr+x)*2) & 0x1ffff] & 0xff;
for( int yi = 0; yi < lr; yi++)
{
@ -161,7 +163,7 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
res_x = x * 8 + xi;
res_y = y * lr + yi;
if(!device->machine().first_screen()->visible_area().contains(res_x, res_y))
if(!machine().first_screen()->visible_area().contains(res_x, res_y))
continue;
if(yi >= 16) { pen = 0; }
@ -250,16 +252,6 @@ static GFXDECODE_START( dmv )
GFXDECODE_END
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
//------------------------------------------------------------------------------------
// I8237_INTERFACE
//------------------------------------------------------------------------------------
@ -322,7 +314,11 @@ static MACHINE_CONFIG_START( dmv, dmv_state )
MCFG_DEFAULT_LAYOUT(layout_dmv)
// devices
MCFG_UPD7220_ADD( "upd7220", XTAL_5MHz/2, hgdc_intf, upd7220_map ) // unk clock
MCFG_DEVICE_ADD("upd7220", UPD7220, XTAL_5MHz/2) // unk clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(dmv_state, hgdc_display_pixels)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(dmv_state, hgdc_draw_text)
MCFG_I8237_ADD( "dma8237", XTAL_4MHz, dmv_dma8237_config )
MCFG_UPD765A_ADD( "upd765", true, true )
MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("dma8237", am9517a_device, dreq3_w))

View File

@ -28,17 +28,17 @@ public:
virtual void machine_reset();
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
};
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( if800_state::hgdc_display_pixels )
{
if800_state *state = device->machine().driver_data<if800_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi,gfx;
UINT8 pen;
gfx = state->m_video_ram[address];
gfx = m_video_ram[address];
for(xi=0;xi<8;xi++)
{
@ -73,15 +73,6 @@ void if800_state::machine_reset()
{
}
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static ADDRESS_MAP_START( upd7220_map, AS_0, 8, if800_state )
AM_RANGE(0x00000, 0x3ffff) AM_RAM AM_SHARE("video_ram")
ADDRESS_MAP_END
@ -94,7 +85,9 @@ static MACHINE_CONFIG_START( if800, if800_state )
// MCFG_PIC8259_ADD( "pic8259", if800_pic8259_config )
MCFG_UPD7220_ADD("upd7220", 8000000/4, hgdc_intf, upd7220_map)
MCFG_DEVICE_ADD("upd7220", UPD7220, 8000000/4)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(if800_state, hgdc_display_pixels)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)

View File

@ -97,6 +97,9 @@ public:
// screen updates
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_PALETTE_INIT(mz3500);
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
protected:
// driver_device overrides
virtual void machine_start();
@ -137,15 +140,14 @@ CRTC regs
(mirror of [5]?)
*/
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( mz3500_state::hgdc_display_pixels )
{
// ...
}
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( mz3500_state::hgdc_draw_text )
{
mz3500_state *state = device->machine().driver_data<mz3500_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int x;
int xi,yi;
int tile;
@ -156,24 +158,24 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UINT8 hires;
UINT8 color_mode;
// popmessage("%02x",state->m_crtc[6]);
// popmessage("%02x",m_crtc[6]);
color_mode = state->m_crtc[4] & 1;
width80 = (state->m_crtc[5] & 2) >> 1;
hires = (state->m_crtc[6] & 1);
color_mode = m_crtc[4] & 1;
width80 = (m_crtc[5] & 2) >> 1;
hires = (m_crtc[6] & 1);
char_size = (hires) ? 16 : 8;
for( x = 0; x < pitch; x++ )
{
tile = (state->m_video_ram[((addr+x)*2) & 0x1fff] & 0xff);
attr = (state->m_video_ram[((addr+x)*2+1) & 0x3ffff] & 0x0f);
tile = (m_video_ram[((addr+x)*2) & 0x1fff] & 0xff);
attr = (m_video_ram[((addr+x)*2+1) & 0x3ffff] & 0x0f);
//if(hires)
// tile <<= 1;
for( yi = 0; yi < lr; yi++)
{
tile_data = state->m_char_rom[((tile*16+yi) & 0xfff) | (hires*0x1000)];
tile_data = m_char_rom[((tile*16+yi) & 0xfff) | (hires*0x1000)];
for( xi = 0; xi < 8; xi++)
{
@ -234,26 +236,6 @@ UINT32 mz3500_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap,
return 0;
}
static UPD7220_INTERFACE( hgdc_1_intf )
{
NULL,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("upd7220_gfx", upd7220_device, ext_sync_w),
DEVCB_NULL
};
static UPD7220_INTERFACE( hgdc_2_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
READ8_MEMBER(mz3500_state::mz3500_ipl_r)
{
return m_ipl_rom[offset];
@ -852,8 +834,14 @@ static MACHINE_CONFIG_START( mz3500, mz3500_state )
MCFG_FLOPPY_DRIVE_ADD("upd765a:2", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("upd765a:3", mz3500_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
MCFG_UPD7220_ADD("upd7220_chr", MAIN_CLOCK/5, hgdc_1_intf, upd7220_1_map)
MCFG_UPD7220_ADD("upd7220_gfx", MAIN_CLOCK/5, hgdc_2_intf, upd7220_2_map)
MCFG_DEVICE_ADD("upd7220_chr", UPD7220, MAIN_CLOCK/5)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(mz3500_state, hgdc_draw_text)
MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_gfx", upd7220_device, ext_sync_w))
MCFG_DEVICE_ADD("upd7220_gfx", UPD7220, MAIN_CLOCK/5)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(mz3500_state, hgdc_display_pixels)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)

View File

@ -33,18 +33,18 @@ public:
virtual void video_start();
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
};
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( mz6500_state::hgdc_display_pixels )
{
mz6500_state *state = device->machine().driver_data<mz6500_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int gfx[3];
UINT8 i,pen;
gfx[0] = state->m_video_ram[address + 0x00000];
gfx[1] = state->m_video_ram[address + 0x10000];
gfx[2] = state->m_video_ram[address + 0x20000];
gfx[0] = m_video_ram[address + 0x00000];
gfx[1] = m_video_ram[address + 0x10000];
gfx[2] = m_video_ram[address + 0x20000];
for(i=0; i<8; i++)
{
@ -126,15 +126,6 @@ static SLOT_INTERFACE_START( mz6500_floppies )
SLOT_INTERFACE( "525hd", FLOPPY_525_HD )
SLOT_INTERFACE_END
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static ADDRESS_MAP_START( upd7220_map, AS_0, 8, mz6500_state )
AM_RANGE(0x00000, 0x3ffff) AM_RAM AM_SHARE("video_ram")
ADDRESS_MAP_END
@ -157,7 +148,10 @@ static MACHINE_CONFIG_START( mz6500, mz6500_state )
MCFG_PALETTE_ADD("palette", 8)
/* Devices */
MCFG_UPD7220_ADD("upd7220", 8000000/6, hgdc_intf, upd7220_map) // unk clock
MCFG_DEVICE_ADD("upd7220", UPD7220, 8000000/6) // unk clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(mz6500_state, hgdc_display_pixels)
MCFG_UPD765A_ADD("upd765", true, true)
MCFG_FLOPPY_DRIVE_ADD("upd765:0", mz6500_floppies, "525hd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("upd765:1", mz6500_floppies, "525hd", floppy_image_device::default_floppy_formats)

View File

@ -683,6 +683,8 @@ public:
DECLARE_WRITE8_MEMBER(pc9821_ext2_video_ff_w);
DECLARE_FLOPPY_FORMATS( floppy_formats );
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
private:
UINT8 m_sdip_read(UINT16 port, UINT8 sdip_offset);
@ -781,38 +783,37 @@ UINT32 pc9801_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
return 0;
}
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( pc9801_state::hgdc_display_pixels )
{
pc9801_state *state = device->machine().driver_data<pc9801_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi;
int res_x,res_y;
UINT8 pen;
UINT8 interlace_on;
UINT8 colors16_mode;
if(state->m_video_ff[DISPLAY_REG] == 0) //screen is off
if(m_video_ff[DISPLAY_REG] == 0) //screen is off
return;
// popmessage("%02x %d",state->m_video_ff[INTERLACE_REG],device->machine().first_screen()->visible_area().max_y + 1);
// interlace_on = ((device->machine().first_screen()->visible_area().max_y + 1) >= 400) ? 1 : 0;
interlace_on = state->m_video_ff[INTERLACE_REG];
colors16_mode = (state->m_ex_video_ff[ANALOG_16_MODE]) ? 16 : 8;
// popmessage("%02x %d",m_video_ff[INTERLACE_REG],machine().first_screen()->visible_area().max_y + 1);
// interlace_on = ((machine().first_screen()->visible_area().max_y + 1) >= 400) ? 1 : 0;
interlace_on = m_video_ff[INTERLACE_REG];
colors16_mode = (m_ex_video_ff[ANALOG_16_MODE]) ? 16 : 8;
if(state->m_ex_video_ff[ANALOG_256_MODE])
if(m_ex_video_ff[ANALOG_256_MODE])
{
for(xi=0;xi<8;xi++)
{
res_x = x + xi;
res_y = y;
if(!device->machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
if(!machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
return;
pen = state->m_ext_gvram[(address*8+xi)+(state->m_vram_disp*0x40000)];
pen = m_ext_gvram[(address*8+xi)+(m_vram_disp*0x40000)];
bitmap.pix32(res_y*2+0, res_x) = palette[pen + 0x20];
if(device->machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
if(machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
bitmap.pix32(res_y*2+1, res_x) = palette[pen + 0x20];
}
}
@ -823,18 +824,18 @@ static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
res_x = x + xi;
res_y = y;
pen = ((state->m_video_ram_2[(address & 0x7fff) + (0x08000) + (state->m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 1 : 0;
pen|= ((state->m_video_ram_2[(address & 0x7fff) + (0x10000) + (state->m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 2 : 0;
pen|= ((state->m_video_ram_2[(address & 0x7fff) + (0x18000) + (state->m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 4 : 0;
if(state->m_ex_video_ff[ANALOG_16_MODE])
pen|= ((state->m_video_ram_2[(address & 0x7fff) + (0) + (state->m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 8 : 0;
pen = ((m_video_ram_2[(address & 0x7fff) + (0x08000) + (m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 1 : 0;
pen|= ((m_video_ram_2[(address & 0x7fff) + (0x10000) + (m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 2 : 0;
pen|= ((m_video_ram_2[(address & 0x7fff) + (0x18000) + (m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 4 : 0;
if(m_ex_video_ff[ANALOG_16_MODE])
pen|= ((m_video_ram_2[(address & 0x7fff) + (0) + (m_vram_disp*0x20000)] >> (7-xi)) & 1) ? 8 : 0;
if(interlace_on)
{
if(device->machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
if(machine().first_screen()->visible_area().contains(res_x, res_y*2+0))
bitmap.pix32(res_y*2+0, res_x) = palette[pen + colors16_mode];
/* TODO: it looks like that PC-98xx can only display even lines ... */
if(device->machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
if(machine().first_screen()->visible_area().contains(res_x, res_y*2+1))
bitmap.pix32(res_y*2+1, res_x) = palette[pen + colors16_mode];
}
else
@ -843,10 +844,9 @@ static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
}
}
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( pc9801_state::hgdc_draw_text )
{
pc9801_state *state = device->machine().driver_data<pc9801_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi,yi;
int x;
UINT8 char_size;
@ -856,11 +856,11 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UINT8 kanji_sel;
UINT8 x_step;
if(state->m_video_ff[DISPLAY_REG] == 0) //screen is off
if(m_video_ff[DISPLAY_REG] == 0) //screen is off
return;
// interlace_on = state->m_video_ff[INTERLACE_REG];
char_size = state->m_video_ff[FONTSEL_REG] ? 16 : 8;
// interlace_on = m_video_ff[INTERLACE_REG];
char_size = m_video_ff[FONTSEL_REG] ? 16 : 8;
tile = 0;
for(x=0;x<pitch;x+=x_step)
@ -873,13 +873,13 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UINT8 knj_tile;
UINT8 gfx_mode;
tile_addr = addr+(x*(state->m_video_ff[WIDTH40_REG]+1));
tile_addr = addr+(x*(m_video_ff[WIDTH40_REG]+1));
kanji_sel = 0;
kanji_lr = 0;
tile = state->m_video_ram_1[(tile_addr*2) & 0x1fff] & 0xff;
knj_tile = state->m_video_ram_1[(tile_addr*2+1) & 0x1fff] & 0xff;
tile = m_video_ram_1[(tile_addr*2) & 0x1fff] & 0xff;
knj_tile = m_video_ram_1[(tile_addr*2+1) & 0x1fff] & 0xff;
if(knj_tile)
{
/* Note: bit 7 doesn't really count, if a kanji is enabled then the successive tile is always the second part of it.
@ -900,14 +900,14 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
else
x_step = 1;
attr = (state->m_video_ram_1[(tile_addr*2 & 0x1fff) | 0x2000] & 0xff);
attr = (m_video_ram_1[(tile_addr*2 & 0x1fff) | 0x2000] & 0xff);
secret = (attr & 1) ^ 1;
blink = attr & 2;
reverse = attr & 4;
u_line = attr & 8;
v_line = (state->m_video_ff[ATTRSEL_REG]) ? 0 : attr & 0x10;
gfx_mode = (state->m_video_ff[ATTRSEL_REG]) ? attr & 0x10 : 0;
v_line = (m_video_ff[ATTRSEL_REG]) ? 0 : attr & 0x10;
gfx_mode = (m_video_ff[ATTRSEL_REG]) ? attr & 0x10 : 0;
color = (attr & 0xe0) >> 5;
for(kanji_lr=0;kanji_lr<x_step;kanji_lr++)
@ -918,10 +918,10 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
{
int res_x,res_y;
res_x = ((x+kanji_lr)*8+xi) * (state->m_video_ff[WIDTH40_REG]+1);
res_y = y*lr+yi - (state->m_txt_scroll_reg[3] & 0xf);
res_x = ((x+kanji_lr)*8+xi) * (m_video_ff[WIDTH40_REG]+1);
res_y = y*lr+yi - (m_txt_scroll_reg[3] & 0xf);
if(!device->machine().first_screen()->visible_area().contains(res_x, res_y))
if(!machine().first_screen()->visible_area().contains(res_x, res_y))
continue;
tile_data = 0;
@ -952,9 +952,9 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
tile_data = ((tile >> gfx_bit) & 1) ? 0xff : 0x00;
}
else if(kanji_sel)
tile_data = (state->m_kanji_rom[tile*0x20+yi*2+kanji_lr]);
tile_data = (m_kanji_rom[tile*0x20+yi*2+kanji_lr]);
else
tile_data = (state->m_char_rom[tile*char_size+state->m_video_ff[FONTSEL_REG]*0x800+yi]);
tile_data = (m_char_rom[tile*char_size+m_video_ff[FONTSEL_REG]*0x800+yi]);
}
if(reverse) { tile_data^=0xff; }
@ -962,10 +962,10 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
if(v_line) { tile_data|=8; }
/* TODO: proper blink rate for these two */
if(cursor_on && cursor_addr == tile_addr && device->machine().first_screen()->frame_number() & 0x10)
if(cursor_on && cursor_addr == tile_addr && machine().first_screen()->frame_number() & 0x10)
tile_data^=0xff;
if(blink && device->machine().first_screen()->frame_number() & 0x10)
if(blink && machine().first_screen()->frame_number() & 0x10)
tile_data^=0xff;
if(yi >= char_size)
@ -976,9 +976,9 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
if(pen != -1)
bitmap.pix32(res_y, res_x) = palette[pen];
if(state->m_video_ff[WIDTH40_REG])
if(m_video_ff[WIDTH40_REG])
{
if(!device->machine().first_screen()->visible_area().contains(res_x+1, res_y))
if(!machine().first_screen()->visible_area().contains(res_x+1, res_y))
continue;
if(pen != -1)
@ -990,24 +990,6 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
}
}
static UPD7220_INTERFACE( hgdc_1_intf )
{
NULL,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER("upd7220_btm", upd7220_device, ext_sync_w),
DEVCB_NULL
};
static UPD7220_INTERFACE( hgdc_2_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
#if 0
READ8_MEMBER(pc9801_state::pc9801_xx_r)
@ -3672,8 +3654,14 @@ static MACHINE_CONFIG_START( pc9801, pc9801_state )
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
MCFG_UPD7220_ADD("upd7220_chr", 5000000/2, hgdc_1_intf, upd7220_1_map)
MCFG_UPD7220_ADD("upd7220_btm", 5000000/2, hgdc_2_intf, upd7220_2_map)
MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
MCFG_PALETTE_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
@ -3744,8 +3732,14 @@ static MACHINE_CONFIG_START( pc9801rs, pc9801_state )
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
MCFG_UPD7220_ADD("upd7220_chr", 5000000/2, hgdc_1_intf, upd7220_1_map)
MCFG_UPD7220_ADD("upd7220_btm", 5000000/2, hgdc_2_intf, upd7220_2_map)
MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
MCFG_PALETTE_ADD("palette", 16+16)
MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)
@ -3830,8 +3824,14 @@ static MACHINE_CONFIG_START( pc9821, pc9801_state )
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
MCFG_UPD7220_ADD("upd7220_chr", 5000000/2, hgdc_1_intf, upd7220_1_map)
MCFG_UPD7220_ADD("upd7220_btm", 5000000/2, hgdc_2_intf, upd7220_2_map)
MCFG_DEVICE_ADD("upd7220_chr", UPD7220, 5000000/2)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_1_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(pc9801_state, hgdc_draw_text)
MCFG_UPD7220_VSYNC_CALLBACK(DEVWRITELINE("upd7220_btm", upd7220_device, ext_sync_w))
MCFG_DEVICE_ADD("upd7220_btm", UPD7220, 5000000/2)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_2_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(pc9801_state, hgdc_display_pixels)
MCFG_PALETTE_ADD("palette", 16+16+256)
MCFG_PALETTE_INIT_OWNER(pc9801_state,pc9801)

View File

@ -148,24 +148,25 @@ public:
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<palette_device> m_palette;
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
};
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( qx10_state::hgdc_display_pixels )
{
qx10_state *state = device->machine().driver_data<qx10_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int xi,gfx[3];
UINT8 pen;
if(state->m_color_mode)
if(m_color_mode)
{
gfx[0] = state->m_video_ram[(address) + 0x00000];
gfx[1] = state->m_video_ram[(address) + 0x20000];
gfx[2] = state->m_video_ram[(address) + 0x40000];
gfx[0] = m_video_ram[(address) + 0x00000];
gfx[1] = m_video_ram[(address) + 0x20000];
gfx[2] = m_video_ram[(address) + 0x40000];
}
else
{
gfx[0] = state->m_video_ram[address];
gfx[0] = m_video_ram[address];
gfx[1] = 0;
gfx[2] = 0;
}
@ -180,10 +181,9 @@ static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
}
}
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( qx10_state::hgdc_draw_text )
{
qx10_state *state = device->machine().driver_data<qx10_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const rgb_t *palette = m_palette->palette()->entry_list_raw();
int x;
int xi,yi;
int tile;
@ -194,14 +194,14 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
for( x = 0; x < pitch; x++ )
{
tile = state->m_video_ram[(addr+x)*2];
attr = state->m_video_ram[(addr+x)*2+1];
tile = m_video_ram[(addr+x)*2];
attr = m_video_ram[(addr+x)*2+1];
color = (state->m_color_mode) ? 1 : (attr & 4) ? 2 : 1; /* TODO: color mode */
color = (m_color_mode) ? 1 : (attr & 4) ? 2 : 1; /* TODO: color mode */
for( yi = 0; yi < lr; yi++)
{
tile_data = (state->m_char_rom[tile*16+yi]);
tile_data = (m_char_rom[tile*16+yi]);
if(attr & 8)
tile_data^=0xff;
@ -209,7 +209,7 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
if(cursor_on && cursor_addr == addr+x) //TODO
tile_data^=0xff;
if(attr & 0x80 && device->machine().first_screen()->frame_number() & 0x10) //TODO: check for blinking interval
if(attr & 0x80 && machine().first_screen()->frame_number() & 0x10) //TODO: check for blinking interval
tile_data=0;
for( xi = 0; xi < 8; xi++)
@ -219,7 +219,7 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
res_x = x * 8 + xi;
res_y = y * lr + yi;
if(!device->machine().first_screen()->visible_area().contains(res_x, res_y))
if(!machine().first_screen()->visible_area().contains(res_x, res_y))
continue;
if(yi >= 16)
@ -766,15 +766,6 @@ void qx10_state::video_start()
m_char_rom = memregion("chargen")->base();
}
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
PALETTE_INIT_MEMBER(qx10_state, qx10)
{
// ...
@ -858,8 +849,13 @@ static MACHINE_CONFIG_START( qx10, qx10_state )
MCFG_I8255_ADD("i8255", qx10_i8255_interface)
MCFG_I8237_ADD("8237dma_1", MAIN_CLK/4, qx10_dma8237_1_interface)
MCFG_I8237_ADD("8237dma_2", MAIN_CLK/4, qx10_dma8237_2_interface)
MCFG_UPD7220_ADD("upd7220", MAIN_CLK/6, hgdc_intf, upd7220_map) // unk clock
MCFG_DEVICE_ADD("upd7220", UPD7220, MAIN_CLK/6) // unk clock
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(qx10_state, hgdc_display_pixels)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(qx10_state, hgdc_draw_text)
MCFG_VIDEO_SET_SCREEN("screen")
MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic8259_slave", pic8259_device, ir2_w))
MCFG_UPD765A_ADD("upd765", true, true)

View File

@ -30,8 +30,7 @@ public:
vt240_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_hgdc(*this, "upd7220")
,
m_hgdc(*this, "upd7220"),
m_video_ram(*this, "video_ram"){ }
required_device<cpu_device> m_maincpu;
@ -48,12 +47,12 @@ public:
DECLARE_DRIVER_INIT(vt240);
virtual void machine_reset();
INTERRUPT_GEN_MEMBER(vt240_irq);
UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
};
/* TODO */
static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
UPD7220_DRAW_TEXT_LINE_MEMBER( vt240_state::hgdc_draw_text )
{
//vt240_state *state = device->machine().driver_data<a5105_state>();
//int x;
//int xi,yi;
//int tile,color;
@ -67,7 +66,7 @@ static UPD7220_DRAW_TEXT_LINE( hgdc_draw_text )
for( yi = 0; yi < lr; yi++)
{
tile_data = state->m_char_rom[(tile*8+yi) & 0x7ff];
tile_data = m_char_rom[(tile*8+yi) & 0x7ff];
if(cursor_on && cursor_addr == addr+x) //TODO
tile_data^=0xff;
@ -131,15 +130,6 @@ void vt240_state::machine_reset()
{
}
static UPD7220_INTERFACE( hgdc_intf )
{
NULL,
hgdc_draw_text,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
INTERRUPT_GEN_MEMBER(vt240_state::vt240_irq)
{
//device.execute().set_input_line(I8085_RST65_LINE, ASSERT_LINE);
@ -179,7 +169,9 @@ static MACHINE_CONFIG_START( vt240, vt240_state )
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", vt240)
MCFG_UPD7220_ADD("upd7220", XTAL_4MHz / 4, hgdc_intf, upd7220_map) //unknown clock
MCFG_DEVICE_ADD("upd7220", UPD7220, XTAL_4MHz / 4)
MCFG_DEVICE_ADDRESS_MAP(AS_0, upd7220_map)
MCFG_UPD7220_DRAW_TEXT_CALLBACK_OWNER(vt240_state, hgdc_draw_text)
MACHINE_CONFIG_END
/* ROM definition */

View File

@ -125,6 +125,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_centronics_select);
int m_tmr0;
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
};

View File

@ -125,6 +125,7 @@ public:
int m_fdc_tc;
DECLARE_FLOPPY_FORMATS( floppy_formats );
UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
};

View File

@ -50,27 +50,16 @@ ADDRESS_MAP_END
// UPD7220_INTERFACE( hgdc_intf )
//-------------------------------------------------
static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels )
UPD7220_DISPLAY_PIXELS_MEMBER( mm1_state::hgdc_display_pixels )
{
mm1_state *state = device->machine().driver_data<mm1_state>();
UINT8 data = state->m_video_ram[address];
UINT8 data = m_video_ram[address];
for (int i = 0; i < 8; i++)
{
if (BIT(data, 7-i)) bitmap.pix32(y, x + i) = state->m_palette->pen(1);
if (BIT(data, 7 - i)) bitmap.pix32(y, x + i) = m_palette->pen(1);
}
}
static UPD7220_INTERFACE( hgdc_intf )
{
hgdc_display_pixels,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
UINT32 mm1_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
@ -127,6 +116,9 @@ MACHINE_CONFIG_FRAGMENT( mm1m6_video )
MCFG_I8275_ADD(I8275_TAG, XTAL_18_720MHz/8, 8, crtc_display_pixels, DEVWRITELINE(I8237_TAG, am9517a_device, dreq0_w))
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MCFG_UPD7220_ADD(UPD7220_TAG, XTAL_18_720MHz/8, hgdc_intf, mm1_upd7220_map)
MCFG_DEVICE_ADD(UPD7220_TAG, UPD7220, XTAL_18_720MHz/8)
MCFG_DEVICE_ADDRESS_MAP(AS_0, mm1_upd7220_map)
MCFG_UPD7220_DISPLAY_PIXELS_CALLBACK_OWNER(mm1_state, hgdc_display_pixels)
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
MACHINE_CONFIG_END