tk635: Some initial work, displays something on screen now

This commit is contained in:
Dirk Best 2019-10-17 17:30:41 +02:00
parent d6f184529b
commit 6ed7385f8b

View File

@ -19,7 +19,6 @@
Notes:
- Identical to the Qume QVT-72 Plus?
- Character shape defintions start at 0x20000 in the ROM
TODO:
- Everything
@ -36,7 +35,11 @@ class tk635_state : public driver_device
public:
tk635_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu")
m_maincpu(*this, "maincpu"),
m_ram(*this, "ram"),
m_charram(*this, "charram"),
m_nmi_enable(false),
m_voffset(0)
{ }
void tk635(machine_config &config);
@ -47,37 +50,139 @@ protected:
private:
required_device<cpu_device> m_maincpu;
required_shared_ptr<u8> m_ram;
required_shared_ptr<u8> m_charram;
void mem_map(address_map &map);
void io_map(address_map &map);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void vblank_w(int state);
uint8_t unk_00_r();
void voffset_lsb_w(uint8_t data);
void voffset_msb_w(uint8_t data);
uint8_t unk_11_r();
uint8_t unk_19_r();
void unk_f0_w(uint8_t data);
bool m_nmi_enable;
uint16_t m_voffset;
};
void tk635_state::mem_map(address_map &map)
{
map(0x00000, 0x1ffff).ram();
map(0x00000, 0x1ffff).ram().share("ram");
map(0x20000, 0x23fff).ram().share("charram");
map(0xc0000, 0xfffff).rom().region("maincpu", 0);
}
void tk635_state::io_map(address_map &map)
{
map(0x00, 0x00).r(FUNC(tk635_state::unk_00_r));
map(0x04, 0x04).w(FUNC(tk635_state::voffset_lsb_w));
map(0x05, 0x05).w(FUNC(tk635_state::voffset_msb_w));
map(0x11, 0x11).r(FUNC(tk635_state::unk_11_r));
// map(0x13, 0x13).ram(); // host port
map(0x19, 0x19).r(FUNC(tk635_state::unk_19_r));
// map(0x1b, 0x1b).ram(); // aux port
map(0xf0, 0xf0).w(FUNC(tk635_state::unk_f0_w));
}
static INPUT_PORTS_START( tk635 )
INPUT_PORTS_END
static const gfx_layout char_layout_8x16 =
{
8, 16,
512,
1,
{ 0 },
{ STEP8(0, 1) },
{ STEP16(0, 8) },
8*32
};
static GFXDECODE_START(chars)
GFXDECODE_RAM("charram", 0, char_layout_8x16, 0, 1)
GFXDECODE_END
uint32_t tk635_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
for (int y = 0; y < 26; y++)
{
for (int x = 0; x < 132; x++)
{
uint8_t code = m_ram[(0x10000 | m_voffset) + (y * 132) + x];
// draw 16 lines
for (int i = 0; i < 16; i++)
{
uint8_t data = m_charram[(code << 5) + i];
// 8 pixels of the character
for (int p = 0; p < 8; p++)
bitmap.pix32(y * 16 + i, x * 9 + p) = BIT(data, 7 - p) ? rgb_t::white() : rgb_t::black();
// 9th pixel empty
bitmap.pix32(y * 16 + i, x * 9 + 8) = rgb_t::black();
}
}
}
return 0;
}
void tk635_state::vblank_w(int state)
{
if (state == 1 && m_nmi_enable)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
uint8_t tk635_state::unk_00_r()
{
logerror("unk_00_r: %02x\n", 0x10);
return 0x10;
}
void tk635_state::voffset_lsb_w(uint8_t data)
{
m_voffset = (m_voffset & 0xff00) | data;
}
void tk635_state::voffset_msb_w(uint8_t data)
{
m_voffset = (data << 8) | (m_voffset & 0x00ff);
}
uint8_t tk635_state::unk_11_r()
{
logerror("unk_11_r: %02x\n", 0x09);
return 0x09;
}
uint8_t tk635_state::unk_19_r()
{
logerror("unk_19_r: %02x\n", 0x09);
return 0x09;
}
void tk635_state::unk_f0_w(uint8_t data)
{
logerror("unk_f0_w: %02x\n", data);
m_nmi_enable = true;
}
void tk635_state::machine_start()
{
// register for save states
save_item(NAME(m_nmi_enable));
save_item(NAME(m_voffset));
}
void tk635_state::machine_reset()
{
m_nmi_enable = false;
}
void tk635_state::tk635(machine_config &config)
@ -90,10 +195,13 @@ void tk635_state::tk635(machine_config &config)
screen.set_refresh_hz(70);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
screen.set_screen_update(FUNC(tk635_state::screen_update));
screen.set_size(800, 600);
screen.set_visarea(0, 800-1, 0, 600-1);
screen.set_size(1188, 416);
screen.set_visarea(0, 1188-1, 0, 416-1);
screen.screen_vblank().set(FUNC(tk635_state::vblank_w));
PALETTE(config, "palette").set_entries(16);
GFXDECODE(config, "gfxdecode", "palette", chars);
}
ROM_START( tk635 )
@ -101,4 +209,4 @@ ROM_START( tk635 )
ROM_LOAD("fw_v0_23.bin", 0x00000, 0x40000, CRC(bec6fdae) SHA1(37dc46f6b761d874bd1627a1137bc4082e364698))
ROM_END
COMP( 199?, tk635, 0, 0, tk635, tk635, tk635_state, empty_init, "Termtek", "TK-635", MACHINE_IS_SKELETON )
COMP( 199?, tk635, 0, 0, tk635, tk635, tk635_state, empty_init, "Termtek", "TK-635", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )