mirror of
https://github.com/holub/mame
synced 2025-04-29 11:30:28 +03:00
(MESS) vtvideo: devcb2. (nw)
This commit is contained in:
parent
b3c35fa4bc
commit
0bb67d587f
@ -221,7 +221,7 @@ public:
|
||||
}
|
||||
|
||||
DECLARE_READ8_MEMBER(read_video_ram_r);
|
||||
DECLARE_WRITE8_MEMBER(clear_video_interrupt);
|
||||
DECLARE_WRITE_LINE_MEMBER(clear_video_interrupt);
|
||||
|
||||
DECLARE_READ8_MEMBER(diagnostic_r);
|
||||
DECLARE_WRITE8_MEMBER(diagnostic_w);
|
||||
@ -1010,7 +1010,7 @@ INTERRUPT_GEN_MEMBER(rainbow_state::vblank_irq)
|
||||
raise_8088_irq(IRQ_8088_VBL);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( rainbow_state::clear_video_interrupt )
|
||||
WRITE_LINE_MEMBER( rainbow_state::clear_video_interrupt )
|
||||
{
|
||||
lower_8088_irq(IRQ_8088_VBL);
|
||||
}
|
||||
@ -1146,8 +1146,6 @@ WRITE_LINE_MEMBER(rainbow_state::irq_hi_w)
|
||||
static const vt_video_interface video_interface =
|
||||
{
|
||||
"chargen",
|
||||
DEVCB_DRIVER_MEMBER(rainbow_state, read_video_ram_r),
|
||||
DEVCB_DRIVER_MEMBER(rainbow_state, clear_video_interrupt)
|
||||
};
|
||||
|
||||
/* F4 Character Displayer */
|
||||
@ -1214,6 +1212,8 @@ static MACHINE_CONFIG_START( rainbow, rainbow_state )
|
||||
MCFG_GFXDECODE_ADD("gfxdecode", "vt100_video:palette", rainbow)
|
||||
|
||||
MCFG_RAINBOW_VIDEO_ADD("vt100_video", "screen", video_interface)
|
||||
MCFG_VT_VIDEO_RAM_CALLBACK(READ8(rainbow_state, read_video_ram_r))
|
||||
MCFG_VT_VIDEO_CLEAR_VIDEO_INTERRUPT_CALLBACK(WRITELINE(rainbow_state, clear_video_interrupt))
|
||||
|
||||
MCFG_FD1793_ADD("wd1793", rainbow_wd17xx_interface )
|
||||
MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(floppy_intf)
|
||||
|
@ -54,7 +54,7 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(vt100_baud_rate_w);
|
||||
DECLARE_WRITE8_MEMBER(vt100_nvr_latch_w);
|
||||
DECLARE_READ8_MEMBER(vt100_read_video_ram_r);
|
||||
DECLARE_WRITE8_MEMBER(vt100_clear_video_interrupt);
|
||||
DECLARE_WRITE_LINE_MEMBER(vt100_clear_video_interrupt);
|
||||
required_shared_ptr<UINT8> m_p_ram;
|
||||
bool m_keyboard_int;
|
||||
bool m_receiver_int;
|
||||
@ -369,7 +369,7 @@ READ8_MEMBER( vt100_state::vt100_read_video_ram_r )
|
||||
return m_p_ram[offset];
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( vt100_state::vt100_clear_video_interrupt )
|
||||
WRITE_LINE_MEMBER( vt100_state::vt100_clear_video_interrupt )
|
||||
{
|
||||
m_vertical_int = 0;
|
||||
}
|
||||
@ -377,8 +377,6 @@ WRITE8_MEMBER( vt100_state::vt100_clear_video_interrupt )
|
||||
static const vt_video_interface vt100_video_interface =
|
||||
{
|
||||
"chargen",
|
||||
DEVCB_DRIVER_MEMBER(vt100_state, vt100_read_video_ram_r),
|
||||
DEVCB_DRIVER_MEMBER(vt100_state, vt100_clear_video_interrupt)
|
||||
};
|
||||
|
||||
INTERRUPT_GEN_MEMBER(vt100_state::vt100_vertical_interrupt)
|
||||
@ -428,6 +426,8 @@ static MACHINE_CONFIG_START( vt100, vt100_state )
|
||||
MCFG_DEFAULT_LAYOUT( layout_vt100 )
|
||||
|
||||
MCFG_VT100_VIDEO_ADD("vt100_video", "screen", vt100_video_interface)
|
||||
MCFG_VT_VIDEO_RAM_CALLBACK(READ8(vt100_state, vt100_read_video_ram_r))
|
||||
MCFG_VT_VIDEO_CLEAR_VIDEO_INTERRUPT_CALLBACK(WRITELINE(vt100_state, vt100_clear_video_interrupt))
|
||||
|
||||
MCFG_DEVICE_ADD("i8251", I8251, 0)
|
||||
MCFG_I8251_TXD_HANDLER(DEVWRITELINE(RS232_TAG, rs232_port_device, write_txd))
|
||||
|
@ -47,6 +47,8 @@ const device_type RAINBOW_VIDEO = &device_creator<rainbow_video_device>;
|
||||
vt100_video_device::vt100_video_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
|
||||
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
|
||||
device_video_interface(mconfig, *this),
|
||||
m_read_ram(*this),
|
||||
m_write_clear_video_interrupt(*this),
|
||||
m_palette(*this, "palette")
|
||||
{
|
||||
}
|
||||
@ -55,6 +57,8 @@ vt100_video_device::vt100_video_device(const machine_config &mconfig, device_typ
|
||||
vt100_video_device::vt100_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: device_t(mconfig, VT100_VIDEO, "VT100 Video", tag, owner, clock, "vt100_video", __FILE__),
|
||||
device_video_interface(mconfig, *this),
|
||||
m_read_ram(*this),
|
||||
m_write_clear_video_interrupt(*this),
|
||||
m_palette(*this, "palette")
|
||||
{
|
||||
}
|
||||
@ -82,8 +86,6 @@ void vt100_video_device::device_config_complete()
|
||||
// or initialize to defaults if none provided
|
||||
else
|
||||
{
|
||||
memset(&m_in_ram_cb, 0, sizeof(m_in_ram_cb));
|
||||
memset(&m_clear_video_cb, 0, sizeof(m_clear_video_cb));
|
||||
m_char_rom_tag = "";
|
||||
}
|
||||
}
|
||||
@ -95,8 +97,8 @@ void vt100_video_device::device_config_complete()
|
||||
void vt100_video_device::device_start()
|
||||
{
|
||||
/* resolve callbacks */
|
||||
m_in_ram_func.resolve(m_in_ram_cb, *this);
|
||||
m_clear_video_interrupt.resolve(m_clear_video_cb, *this);
|
||||
m_read_ram.resolve_safe(0);
|
||||
m_write_clear_video_interrupt.resolve_safe();
|
||||
|
||||
m_gfx = machine().root_device().memregion(m_char_rom_tag)->base();
|
||||
assert(m_gfx != NULL);
|
||||
@ -264,7 +266,7 @@ WRITE8_MEMBER( vt100_video_device::dc012_w )
|
||||
break;
|
||||
case 0x09:
|
||||
// clear vertical frequency interrupt;
|
||||
m_clear_video_interrupt(0, 0);
|
||||
m_write_clear_video_interrupt(0);
|
||||
|
||||
break;
|
||||
case 0x0a:
|
||||
@ -438,12 +440,12 @@ void vt100_video_device::video_update(bitmap_ind16 &bitmap, const rectangle &cli
|
||||
UINT8 display_type = 3; // binary 11
|
||||
UINT16 temp = 0;
|
||||
|
||||
if (m_in_ram_func(0) != 0x7f)
|
||||
if (m_read_ram(0) != 0x7f)
|
||||
return;
|
||||
|
||||
while (line < (m_height + m_skip_lines))
|
||||
{
|
||||
code = m_in_ram_func(addr + xpos);
|
||||
code = m_read_ram(addr + xpos);
|
||||
if (code == 0x7f)
|
||||
{
|
||||
// end of line, fill empty till end of line
|
||||
@ -455,7 +457,7 @@ void vt100_video_device::video_update(bitmap_ind16 &bitmap, const rectangle &cli
|
||||
}
|
||||
}
|
||||
// move to new data
|
||||
temp = m_in_ram_func(addr + xpos + 1) * 256 + m_in_ram_func(addr + xpos + 2);
|
||||
temp = m_read_ram(addr + xpos + 1) * 256 + m_read_ram(addr + xpos + 2);
|
||||
addr = (temp) & 0x1fff;
|
||||
// if A12 is 1 then it is 0x2000 block, if 0 then 0x4000 (AVO)
|
||||
if (addr & 0x1000) addr &= 0xfff; else addr |= 0x2000;
|
||||
@ -708,7 +710,7 @@ void rainbow_video_device::video_update(bitmap_ind16 &bitmap, const rectangle &c
|
||||
|
||||
while (line < (m_height + m_skip_lines))
|
||||
{
|
||||
code = m_in_ram_func(addr + xpos);
|
||||
code = m_read_ram(addr + xpos);
|
||||
|
||||
if ( code == 0x00 ) // TODO: investigate side effect on regular zero character!
|
||||
display_type |= 0x80; // DEFAULT: filler chars (till end of line) and empty lines (00) will be blanked
|
||||
@ -732,10 +734,10 @@ void rainbow_video_device::video_update(bitmap_ind16 &bitmap, const rectangle &c
|
||||
attr_addr = 0x1000 | ( (addr + xpos + 1) & 0x0fff );
|
||||
|
||||
// MOVE TO NEW DATA
|
||||
temp = m_in_ram_func(addr + xpos + 2) * 256 + m_in_ram_func(addr + xpos + 1);
|
||||
temp = m_read_ram(addr + xpos + 2) * 256 + m_read_ram(addr + xpos + 1);
|
||||
addr = (temp) & 0x0fff;
|
||||
|
||||
temp = m_in_ram_func(attr_addr);
|
||||
temp = m_read_ram(attr_addr);
|
||||
scroll_region = (temp) & 1;
|
||||
display_type = (temp >> 1) & 3;
|
||||
|
||||
@ -752,7 +754,7 @@ void rainbow_video_device::video_update(bitmap_ind16 &bitmap, const rectangle &c
|
||||
if (line >= m_skip_lines)
|
||||
{
|
||||
attr_addr = 0x1000 | ( (addr + xpos) & 0x0fff );
|
||||
temp = m_in_ram_func(attr_addr); // get character attribute
|
||||
temp = m_read_ram(attr_addr); // get character attribute
|
||||
|
||||
// CONFIRMED: Reverse active on 1. No attributes = 0x0E
|
||||
// 1 = display char. in REVERSE (encoded as 8)
|
||||
|
@ -15,13 +15,15 @@
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#define MCFG_VT_VIDEO_RAM_CALLBACK(_read) \
|
||||
devcb = &vt100_video_device::set_ram_rd_callback(*device, DEVCB2_##_read);
|
||||
|
||||
#define MCFG_VT_VIDEO_CLEAR_VIDEO_INTERRUPT_CALLBACK(_write) \
|
||||
devcb = &vt100_video_device::set_clear_video_irq_wr_callback(*device, DEVCB2_##_write);
|
||||
|
||||
struct vt_video_interface
|
||||
{
|
||||
const char *m_char_rom_tag; /* character rom region */
|
||||
|
||||
/* this gets called for every memory read */
|
||||
devcb_read8 m_in_ram_cb;
|
||||
devcb_write8 m_clear_video_cb;
|
||||
};
|
||||
|
||||
|
||||
@ -34,6 +36,9 @@ public:
|
||||
vt100_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
~vt100_video_device() {}
|
||||
|
||||
template<class _Object> static devcb2_base &set_ram_rd_callback(device_t &device, _Object object) { return downcast<vt100_video_device &>(device).m_read_ram.set_callback(object); }
|
||||
template<class _Object> static devcb2_base &set_clear_video_irq_wr_callback(device_t &device, _Object object) { return downcast<vt100_video_device &>(device).m_write_clear_video_interrupt.set_callback(object); }
|
||||
|
||||
DECLARE_READ8_MEMBER(lba7_r);
|
||||
DECLARE_WRITE8_MEMBER(dc012_w);
|
||||
DECLARE_WRITE8_MEMBER(dc011_w);
|
||||
@ -52,8 +57,8 @@ protected:
|
||||
virtual void display_char(bitmap_ind16 &bitmap, UINT8 code, int x, int y, UINT8 scroll_region, UINT8 display_type);
|
||||
TIMER_CALLBACK_MEMBER(lba7_change);
|
||||
|
||||
devcb_resolved_read8 m_in_ram_func;
|
||||
devcb_resolved_write8 m_clear_video_interrupt;
|
||||
devcb2_read8 m_read_ram;
|
||||
devcb2_write8 m_write_clear_video_interrupt;
|
||||
|
||||
UINT8 *m_gfx; /* content of char rom */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user