mirror of
https://github.com/holub/mame
synced 2025-07-08 03:12:37 +03:00
free220: Improve video
This commit is contained in:
parent
b6b6c9b15c
commit
17dd927149
@ -32,8 +32,9 @@
|
|||||||
- Expansion slot
|
- Expansion slot
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- Fix CRT controller hookup
|
- Verify CRT controller hookup
|
||||||
- Keyboard
|
- Cursor
|
||||||
|
- Keyboard
|
||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ public:
|
|||||||
m_translate(*this, "translate"),
|
m_translate(*this, "translate"),
|
||||||
m_charram(*this, "charram%u", 0U),
|
m_charram(*this, "charram%u", 0U),
|
||||||
m_attrram(*this, "attrram%u", 0U),
|
m_attrram(*this, "attrram%u", 0U),
|
||||||
|
m_current_line(0),
|
||||||
m_nmi_enabled(false)
|
m_nmi_enabled(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -94,11 +96,13 @@ private:
|
|||||||
void row_buffer_map(address_map &map);
|
void row_buffer_map(address_map &map);
|
||||||
uint8_t mbc_char_r(offs_t offset);
|
uint8_t mbc_char_r(offs_t offset);
|
||||||
uint8_t mbc_attr_r(offs_t offset);
|
uint8_t mbc_attr_r(offs_t offset);
|
||||||
|
void avdc_intr_w(int state);
|
||||||
|
void avdc_breq_w(int state);
|
||||||
SCN2674_DRAW_CHARACTER_MEMBER(draw_character);
|
SCN2674_DRAW_CHARACTER_MEMBER(draw_character);
|
||||||
|
|
||||||
void nmi_control_w(uint8_t data);
|
void nmi_control_w(uint8_t data);
|
||||||
void nmi_w(int state);
|
|
||||||
|
|
||||||
|
uint8_t m_current_line;
|
||||||
bool m_nmi_enabled;
|
bool m_nmi_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -142,27 +146,66 @@ void freedom220_state::row_buffer_map(address_map &map)
|
|||||||
|
|
||||||
uint8_t freedom220_state::mbc_char_r(offs_t offset)
|
uint8_t freedom220_state::mbc_char_r(offs_t offset)
|
||||||
{
|
{
|
||||||
logerror("read char offset %04x\n", offset);
|
if (offset >= 0x800)
|
||||||
return m_charram[0][offset & 0x7ff];
|
logerror("%d read char offset %04x\n", m_current_line, offset);
|
||||||
|
|
||||||
|
return m_charram[0][(m_current_line * 0x50 + offset) & 0x7ff];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t freedom220_state::mbc_attr_r(offs_t offset)
|
uint8_t freedom220_state::mbc_attr_r(offs_t offset)
|
||||||
{
|
{
|
||||||
logerror("read attr offset %04x\n", offset);
|
return m_attrram[0][(m_current_line * 0x50 + offset) & 0x7ff];
|
||||||
return m_attrram[0][offset & 0x7ff];
|
}
|
||||||
|
|
||||||
|
void freedom220_state::avdc_intr_w(int state)
|
||||||
|
{
|
||||||
|
if (state && m_nmi_enabled)
|
||||||
|
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freedom220_state::avdc_breq_w(int state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
if (m_screen->vblank())
|
||||||
|
m_current_line = 0;
|
||||||
|
else
|
||||||
|
m_current_line++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SCN2674_DRAW_CHARACTER_MEMBER( freedom220_state::draw_character )
|
SCN2674_DRAW_CHARACTER_MEMBER( freedom220_state::draw_character )
|
||||||
{
|
{
|
||||||
|
// 765----- unknown
|
||||||
|
// ---4---- normal/bold
|
||||||
|
// ----3--- underline
|
||||||
|
// -----2-- invert
|
||||||
|
// ------1- blink
|
||||||
|
// -------0 unknown
|
||||||
|
|
||||||
|
const pen_t *const pen = m_palette->pens();
|
||||||
|
|
||||||
// translation table
|
// translation table
|
||||||
const int table = 0; // 0-f
|
const int table = 0; // 0-f
|
||||||
charcode = m_translate[(table << 8) | charcode];
|
charcode = m_translate[(table << 8) | charcode];
|
||||||
|
|
||||||
uint8_t data = m_chargen[charcode << 4 | linecount];
|
uint8_t data = m_chargen[charcode << 4 | linecount];
|
||||||
const pen_t *const pen = m_palette->pens();
|
|
||||||
|
if (ul && (BIT(attrcode, 3)))
|
||||||
|
data = 0xff;
|
||||||
|
|
||||||
|
if (blink && (BIT(attrcode, 1)))
|
||||||
|
data = 0x00;
|
||||||
|
|
||||||
|
if (BIT(attrcode, 2))
|
||||||
|
data = ~data;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
if (0 && cursor)
|
||||||
|
data = ~data;
|
||||||
|
|
||||||
// foreground/background colors
|
// foreground/background colors
|
||||||
rgb_t fg = pen[1];
|
rgb_t fg = BIT(attrcode, 4) ? pen[1] : pen[2];
|
||||||
rgb_t bg = pen[0];
|
rgb_t bg = pen[0];
|
||||||
|
|
||||||
// draw 8 pixels of the character
|
// draw 8 pixels of the character
|
||||||
@ -198,15 +241,10 @@ void freedom220_state::nmi_control_w(uint8_t data)
|
|||||||
m_nmi_enabled = true;
|
m_nmi_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void freedom220_state::nmi_w(int state)
|
|
||||||
{
|
|
||||||
if (state && m_nmi_enabled)
|
|
||||||
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
|
||||||
}
|
|
||||||
|
|
||||||
void freedom220_state::machine_start()
|
void freedom220_state::machine_start()
|
||||||
{
|
{
|
||||||
// register for save states
|
// register for save states
|
||||||
|
save_item(NAME(m_current_line));
|
||||||
save_item(NAME(m_nmi_enabled));
|
save_item(NAME(m_nmi_enabled));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,19 +268,19 @@ void freedom220_state::freedom220(machine_config &config)
|
|||||||
m_screen->set_color(rgb_t::green());
|
m_screen->set_color(rgb_t::green());
|
||||||
m_screen->set_raw(16000000, 768, 0, 640, 321, 0, 300); // clock unverified
|
m_screen->set_raw(16000000, 768, 0, 640, 321, 0, 300); // clock unverified
|
||||||
m_screen->set_screen_update(m_avdc, FUNC(scn2674_device::screen_update));
|
m_screen->set_screen_update(m_avdc, FUNC(scn2674_device::screen_update));
|
||||||
|
|
||||||
PALETTE(config, m_palette, palette_device::MONOCHROME);
|
PALETTE(config, m_palette, palette_device::MONOCHROME);
|
||||||
|
|
||||||
GFXDECODE(config, "gfxdecode", m_palette, chars);
|
GFXDECODE(config, "gfxdecode", m_palette, chars);
|
||||||
|
|
||||||
SCN2674(config, m_avdc, 16000000 / 8); // clock unverified
|
SCN2674(config, m_avdc, 16000000 / 8); // clock unverified
|
||||||
//m_avdc->intr_callback().set_inputline("maincpu", INPUT_LINE_IRQ0); // ?
|
m_avdc->intr_callback().set(FUNC(freedom220_state::avdc_intr_w));
|
||||||
|
m_avdc->breq_callback().set(FUNC(freedom220_state::avdc_breq_w));
|
||||||
m_avdc->set_screen(m_screen);
|
m_avdc->set_screen(m_screen);
|
||||||
m_avdc->set_character_width(8); // unverified
|
m_avdc->set_character_width(8); // unverified
|
||||||
m_avdc->set_addrmap(0, &freedom220_state::row_buffer_map);
|
m_avdc->set_addrmap(0, &freedom220_state::row_buffer_map);
|
||||||
m_avdc->set_addrmap(1, &freedom220_state::row_buffer_map);
|
m_avdc->set_addrmap(1, &freedom220_state::row_buffer_map);
|
||||||
m_avdc->set_display_callback(FUNC(freedom220_state::draw_character));
|
m_avdc->set_display_callback(FUNC(freedom220_state::draw_character));
|
||||||
m_avdc->breq_callback().set(FUNC(freedom220_state::nmi_w));
|
|
||||||
m_avdc->mbc_char_callback().set(FUNC(freedom220_state::mbc_char_r));
|
m_avdc->mbc_char_callback().set(FUNC(freedom220_state::mbc_char_r));
|
||||||
m_avdc->mbc_attr_callback().set(FUNC(freedom220_state::mbc_attr_r));
|
m_avdc->mbc_attr_callback().set(FUNC(freedom220_state::mbc_attr_r));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user