(nw) jtc : all 4 machines are pretty much working now

This commit is contained in:
Robbbert 2018-09-17 01:02:53 +10:00
parent e63b75da08
commit 0116ffbc71

View File

@ -1,12 +1,23 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
// copyright-holders:Curt Coder, Robbbert
/***************************************************************************
Jugend+Technik CompJU+TEr
Jugend+Technik CompJU+TEr
15/07/2009 Skeleton driver.
2009-07-15 Skeleton driver.
****************************************************************************/
2018-09: Made mostly working
To Do:
- Add quickload of jtc files
- Find out if cassette works
- Figure out how to use the so-called "Basic", all documents are in German.
- Fix any remaining CPU bugs
- On jtces40, the use of ALT key will usually freeze the system. Normal, or a bug?
- On jtces40, no backspace?
- On jtces40, is there a way to type lower case?
****************************************************************************************/
#include "emu.h"
#include "bus/centronics/ctronics.h"
@ -19,7 +30,6 @@
#include "screen.h"
#include "speaker.h"
#define SCREEN_TAG "screen"
#define UB8830D_TAG "ub8830d"
#define CENTRONICS_TAG "centronics"
@ -35,7 +45,7 @@ public:
, m_cassette(*this, "cassette")
, m_speaker(*this, "speaker")
, m_centronics(*this, CENTRONICS_TAG)
, m_video_ram(*this, "video_ram")
, m_video_ram(*this, "videoram")
{ }
required_device<cpu_device> m_maincpu;
@ -68,8 +78,8 @@ public:
jtces88_state(const machine_config &mconfig, device_type type, const char *tag)
: jtc_state(mconfig, type, tag)
{ }
void jtces88(machine_config &config);
void jtc_es1988_mem(address_map &map);
};
@ -80,8 +90,9 @@ public:
: jtc_state(mconfig, type, tag)
{ }
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void jtces23(machine_config &config);
private:
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void jtc_es23_mem(address_map &map);
};
@ -93,6 +104,8 @@ public:
: jtc_state(mconfig, type, tag)
{ }
void jtces40(machine_config &config);
private:
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -104,7 +117,6 @@ public:
std::unique_ptr<uint8_t[]> m_color_ram_r;
std::unique_ptr<uint8_t[]> m_color_ram_g;
std::unique_ptr<uint8_t[]> m_color_ram_b;
void jtces40(machine_config &config);
void jtc_es40_mem(address_map &map);
};
@ -179,10 +191,11 @@ WRITE8_MEMBER( jtc_state::p3_w )
*/
/* tape */
m_cassette->output( BIT(data, 6) ? +1.0 : -1.0);
if (BIT(data, 7))
m_cassette->output( BIT(data, 6) ? +1.0 : -1.0);
else
/* speaker */
m_speaker->level_w(BIT(data, 7));
m_speaker->level_w(BIT(data, 6));
}
READ8_MEMBER( jtces40_state::videoram_r )
@ -207,7 +220,7 @@ WRITE8_MEMBER( jtces40_state::videoram_w )
WRITE8_MEMBER( jtces40_state::banksel_w )
{
m_video_bank = offset & 0xf0;
m_video_bank = data;
}
/* Memory Maps */
@ -233,7 +246,7 @@ void jtc_state::jtc_mem(address_map &map)
map(0x700e, 0x700e).mirror(0x0ff0).portr("Y14");
map(0x700f, 0x700f).mirror(0x0ff0).portr("Y15");
map(0xe000, 0xfdff).ram();
map(0xfe00, 0xffff).ram().share("video_ram");
map(0xfe00, 0xffff).ram().share("videoram");
}
void jtces23_state::jtc_es23_mem(address_map &map)
@ -257,7 +270,7 @@ void jtces23_state::jtc_es23_mem(address_map &map)
map(0x700e, 0x700e).mirror(0x0ff0).portr("Y14");
map(0x700f, 0x700f).mirror(0x0ff0).portr("Y15");
map(0xe000, 0xf7ff).ram();
map(0xf800, 0xffff).ram().share("video_ram");
map(0xf800, 0xffff).ram().share("videoram");
}
void jtces40_state::jtc_es40_mem(address_map &map)
@ -493,11 +506,12 @@ INPUT_PORTS_END
static INPUT_PORTS_START( jtces40 )
PORT_START("Y0")
PORT_START("Y1")
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT3") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT2") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT2") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHT1") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
PORT_START("Y2")
@ -505,7 +519,7 @@ static INPUT_PORTS_START( jtces40 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
PORT_START("Y3")
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
@ -538,7 +552,7 @@ static INPUT_PORTS_START( jtces40 )
PORT_START("Y7")
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
@ -572,7 +586,8 @@ static INPUT_PORTS_START( jtces40 )
PORT_START("Y12")
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CLR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('<') PORT_CHAR('>') PORT_CHAR('^')
// can't find this: PORT_NAME("CLR") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('+') PORT_CHAR('-') PORT_CHAR('\\')
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('*') PORT_CHAR('/') PORT_CHAR('|')
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RET") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_CHAR('?') PORT_CHAR('~')
@ -622,6 +637,8 @@ uint32_t jtces23_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
PALETTE_INIT_MEMBER(jtc_state,jtc_es40)
{
for (u8 i = 8; i < 16; i++)
palette.set_pen_color(i, rgb_t(BIT(i, 0) ? 0xc0 : 0, BIT(i, 1) ? 0xc0 : 0, BIT(i, 2) ? 0xc0 : 0));
}
void jtces40_state::video_start()
@ -643,21 +660,26 @@ void jtces40_state::video_start()
uint32_t jtces40_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u8 i, y, sx;
u8 i, y, z, x;
u16 ma = 0;
for (y = 0; y < 192; y++)
for (y = 0; y < 64; y++)
{
for (sx = 0; sx < 40; sx++)
for (z = 0; z < 3; z++)
{
u8 data = m_video_ram[(y * 40) + sx];
u8 r = m_color_ram_r[(y * 40) + sx];
u8 g = m_color_ram_g[(y * 40) + sx];
u8 b = m_color_ram_b[(y * 40) + sx];
for (x = 0; x < 40; x++)
{
u8 data = m_video_ram[ma + x];
u8 r = ~m_color_ram_r[ma + x];
u8 g = ~m_color_ram_g[ma + x];
u8 b = ~m_color_ram_b[ma + x];
for (i = 0; i < 8; i++)
//bitmap.pix16(y, (sx * 8) + 7 - i) = (BIT(r, i) << 3) | (BIT(g, i) << 2) | (BIT(b, i) << 1) | BIT(data, i);
bitmap.pix16(y, (sx * 8) + 7 - i) = BIT(data, i) ? 0 : (BIT(r, i) << 0) | (BIT(g, i) << 1) | (BIT(b, i) << 2);
for (i = 0; i < 8; i++)
bitmap.pix16(y*3+z, (x * 8) + 7 - i) = (BIT(r, i) << 0) | (BIT(g, i) << 1) | (BIT(b, i) << 2) | (BIT(data, i) << 3);
}
ma+=40;
}
ma+=8;
}
return 0;
@ -688,7 +710,7 @@ static const gfx_layout jtces23_charlayout =
static const gfx_layout jtces40_charlayout =
{
8, 8, /* 8 x 16 characters */
8, 8, /* 8 x 8 characters */
128, /* 128 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
@ -733,7 +755,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(jtc_state::jtc)
basic(config);
/* video hardware */
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DRIVER(jtc_state, screen_update)
@ -761,7 +783,7 @@ MACHINE_CONFIG_START(jtces23_state::jtces23)
MCFG_DEVICE_PROGRAM_MAP(jtc_es23_mem)
/* video hardware */
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DRIVER(jtces23_state, screen_update)
@ -783,7 +805,7 @@ MACHINE_CONFIG_START(jtces40_state::jtces40)
MCFG_DEVICE_PROGRAM_MAP(jtc_es40_mem)
/* video hardware */
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DRIVER(jtces40_state, screen_update)