mirror of
https://github.com/holub/mame
synced 2025-07-01 08:18:59 +03:00
tv990: WIP (nw)
i286: hlt requires CPL == 0 independent of IOPL (nice job intel) (nw)
This commit is contained in:
parent
0a95a35f0d
commit
2dc4768386
@ -1737,7 +1737,7 @@ reg.base = BASE(desc); (void)(r); reg.limit = LIMIT(desc); }
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xf4: // i_hlt
|
case 0xf4: // i_hlt
|
||||||
if(PM && (CPL > m_IOPL))
|
if(PM && CPL)
|
||||||
throw TRAP(FAULT_GP, 0);
|
throw TRAP(FAULT_GP, 0);
|
||||||
m_icount = 0;
|
m_icount = 0;
|
||||||
m_halt = true;
|
m_halt = true;
|
||||||
|
@ -56,7 +56,8 @@ public:
|
|||||||
m_vram(*this, "vram"),
|
m_vram(*this, "vram"),
|
||||||
m_fontram(*this, "fontram"),
|
m_fontram(*this, "fontram"),
|
||||||
m_uart0(*this, UART0_TAG),
|
m_uart0(*this, UART0_TAG),
|
||||||
m_uart1(*this, UART1_TAG)
|
m_uart1(*this, UART1_TAG),
|
||||||
|
m_screen(*this, "screen")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,8 +65,11 @@ public:
|
|||||||
required_shared_ptr<UINT16> m_vram;
|
required_shared_ptr<UINT16> m_vram;
|
||||||
required_shared_ptr<UINT16> m_fontram;
|
required_shared_ptr<UINT16> m_fontram;
|
||||||
required_device<ns16450_device> m_uart0, m_uart1;
|
required_device<ns16450_device> m_uart0, m_uart1;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
|
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
|
virtual void machine_start() override;
|
||||||
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||||
|
|
||||||
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
@ -79,7 +83,7 @@ public:
|
|||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER(keyboard_clock_w);
|
DECLARE_WRITE_LINE_MEMBER(keyboard_clock_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(keyboard_data_w);
|
DECLARE_WRITE_LINE_MEMBER(keyboard_data_w);
|
||||||
|
INTERRUPT_GEN_MEMBER(vblank);
|
||||||
private:
|
private:
|
||||||
UINT16 tvi1111_regs[(0x100/2)+2];
|
UINT16 tvi1111_regs[(0x100/2)+2];
|
||||||
|
|
||||||
@ -88,8 +92,28 @@ private:
|
|||||||
UINT8 m_scancode;
|
UINT8 m_scancode;
|
||||||
int m_kbit;
|
int m_kbit;
|
||||||
int m_idstage;
|
int m_idstage;
|
||||||
|
emu_timer *m_rowtimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INTERRUPT_GEN_MEMBER(tv990_state::vblank)
|
||||||
|
{
|
||||||
|
m_rowtimer->adjust(m_screen->time_until_pos(16));
|
||||||
|
m_maincpu->set_input_line(M68K_IRQ_6, ASSERT_LINE);
|
||||||
|
tvi1111_regs[0x1d] |= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tv990_state::machine_start()
|
||||||
|
{
|
||||||
|
m_rowtimer = timer_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
void tv990_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||||
|
{
|
||||||
|
m_rowtimer->adjust(m_screen->time_until_pos(m_screen->vpos() + 16));
|
||||||
|
m_maincpu->set_input_line(M68K_IRQ_6, ASSERT_LINE);
|
||||||
|
m_screen->update_now();
|
||||||
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER(tv990_state::uart0_irq)
|
WRITE_LINE_MEMBER(tv990_state::uart0_irq)
|
||||||
{
|
{
|
||||||
m_maincpu->set_input_line(M68K_IRQ_5, state);
|
m_maincpu->set_input_line(M68K_IRQ_5, state);
|
||||||
@ -106,6 +130,10 @@ READ16_MEMBER(tv990_state::tvi1111_r)
|
|||||||
{
|
{
|
||||||
tvi1111_regs[offset] |= 8; // loop at 109ca wants this set
|
tvi1111_regs[offset] |= 8; // loop at 109ca wants this set
|
||||||
}
|
}
|
||||||
|
else if(offset == 0x1d)
|
||||||
|
{
|
||||||
|
m_maincpu->set_input_line(M68K_IRQ_6, CLEAR_LINE);
|
||||||
|
}
|
||||||
|
|
||||||
return tvi1111_regs[offset];
|
return tvi1111_regs[offset];
|
||||||
}
|
}
|
||||||
@ -130,11 +158,6 @@ WRITE16_MEMBER(tv990_state::tvi1111_w)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
COMBINE_DATA(&tvi1111_regs[offset]);
|
COMBINE_DATA(&tvi1111_regs[offset]);
|
||||||
|
|
||||||
if (offset == 0x1d)
|
|
||||||
{
|
|
||||||
tvi1111_regs[offset] |= 4;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
@ -148,22 +171,25 @@ UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
|
|||||||
UINT8 *fontram = (UINT8 *)m_fontram.target();
|
UINT8 *fontram = (UINT8 *)m_fontram.target();
|
||||||
UINT16 *curchar;
|
UINT16 *curchar;
|
||||||
UINT8 *fontptr;
|
UINT8 *fontptr;
|
||||||
|
int miny = cliprect.min_y / 16;
|
||||||
|
int maxy = cliprect.max_y / 16;
|
||||||
|
int minx = cliprect.min_x / 16;
|
||||||
|
int maxx = cliprect.max_x / 16;
|
||||||
|
|
||||||
for (y = 0; y < 50; y++)
|
for (y = miny; y <= maxy; y++)
|
||||||
{
|
{
|
||||||
// this isn't exactly right.
|
// this isn't exactly right.
|
||||||
if (tvi1111_regs[y+0x50] != 0)
|
int i;
|
||||||
|
for(i = 0x50; i < 0x68; i++)
|
||||||
{
|
{
|
||||||
curchar = &vram[tvi1111_regs[y+0x50]];
|
if(tvi1111_regs[i] != 0x1ad5)
|
||||||
}
|
break;
|
||||||
else
|
|
||||||
{
|
|
||||||
curchar = &vram[(y * 144)+1];
|
|
||||||
}
|
}
|
||||||
|
curchar = &vram[tvi1111_regs[i]];
|
||||||
|
|
||||||
for (x = 0; x < 80; x++)
|
for (x = minx; x <= maxx; x++)
|
||||||
{
|
{
|
||||||
fontptr = (UINT8 *)&fontram[((curchar[x]>>8) & 0xff) * 64];
|
fontptr = (UINT8 *)&fontram[(((curchar[x]>>8) & 0xff) + (curchar[x] & 0x40 ? 256 : 0)) * 64];
|
||||||
|
|
||||||
for (int chary = 0; chary < 16; chary++)
|
for (int chary = 0; chary < 16; chary++)
|
||||||
{
|
{
|
||||||
@ -171,6 +197,11 @@ UINT32 tv990_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c
|
|||||||
|
|
||||||
pixels = *fontptr++;
|
pixels = *fontptr++;
|
||||||
pixels2 = *fontptr++;
|
pixels2 = *fontptr++;
|
||||||
|
if((curchar[x] & 0x8) && (chary == 15))
|
||||||
|
{
|
||||||
|
pixels = 0xff;
|
||||||
|
pixels2 = 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
if (curchar[x] & 0x4) // inverse video?
|
if (curchar[x] & 0x4) // inverse video?
|
||||||
{
|
{
|
||||||
@ -339,6 +370,7 @@ void tv990_state::machine_reset()
|
|||||||
m_kbit = 0;
|
m_kbit = 0;
|
||||||
m_scancode = 0;
|
m_scancode = 0;
|
||||||
m_idstage = 0;
|
m_idstage = 0;
|
||||||
|
m_rowtimer->adjust(m_screen->time_until_pos(0));
|
||||||
|
|
||||||
memset(tvi1111_regs, 0, sizeof(tvi1111_regs));
|
memset(tvi1111_regs, 0, sizeof(tvi1111_regs));
|
||||||
}
|
}
|
||||||
@ -347,7 +379,7 @@ static MACHINE_CONFIG_START( tv990, tv990_state )
|
|||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MCFG_CPU_ADD("maincpu", M68000, 14967500) // verified (59.86992/4)
|
MCFG_CPU_ADD("maincpu", M68000, 14967500) // verified (59.86992/4)
|
||||||
MCFG_CPU_PROGRAM_MAP(tv990_mem)
|
MCFG_CPU_PROGRAM_MAP(tv990_mem)
|
||||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", tv990_state, irq6_line_hold)
|
MCFG_CPU_VBLANK_INT_DRIVER("screen", tv990_state, vblank)
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(tv990_state, screen_update)
|
MCFG_SCREEN_UPDATE_DRIVER(tv990_state, screen_update)
|
||||||
|
Loading…
Reference in New Issue
Block a user