diff options
Diffstat (limited to 'src/mame/drivers/jtc.cpp')
-rw-r--r-- | src/mame/drivers/jtc.cpp | 92 |
1 files changed, 57 insertions, 35 deletions
diff --git a/src/mame/drivers/jtc.cpp b/src/mame/drivers/jtc.cpp index 7a93142b2d5..f93296a91c7 100644 --- a/src/mame/drivers/jtc.cpp +++ b/src/mame/drivers/jtc.cpp @@ -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 (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 (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*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) |