summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2018-09-20 17:11:01 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2018-09-20 17:11:01 +1000
commit4c9172a0d7d0491972fdcb75282f0e4b2525c9d3 (patch)
tree3cd6e16af28eb434076d0ff1721f7fb7220aee41
parentb98658573b11ecb8afce4ca340866e56131b4dc8 (diff)
(nw) z8: fixed more bugs; jtc: fixed cassette, wave sound, added quickload
-rw-r--r--src/devices/cpu/z8/z8.cpp48
-rw-r--r--src/devices/cpu/z8/z8ops.hxx4
-rw-r--r--src/mame/drivers/jtc.cpp131
3 files changed, 142 insertions, 41 deletions
diff --git a/src/devices/cpu/z8/z8.cpp b/src/devices/cpu/z8/z8.cpp
index 9b2febe17fc..4725132b7fa 100644
--- a/src/devices/cpu/z8/z8.cpp
+++ b/src/devices/cpu/z8/z8.cpp
@@ -321,16 +321,28 @@ uint8_t z8_device::register_read(uint8_t offset)
case Z8_REGISTER_P0:
switch (P01M & Z8_P01M_P0L_MODE_MASK)
{
- case Z8_P01M_P0L_MODE_OUTPUT: data = m_output[offset] & 0x0f; break;
- case Z8_P01M_P0L_MODE_INPUT: mask = 0x0f; break;
- default: /* A8...A11 */ data = 0x0f; break;
+ case Z8_P01M_P0L_MODE_OUTPUT:
+ data = m_output[offset] & 0x0f;
+ break;
+ case Z8_P01M_P0L_MODE_INPUT:
+ mask = 0x0f;
+ break;
+ default: /* A8...A11 */
+ data = 0x0f;
+ break;
}
switch (P01M & Z8_P01M_P0H_MODE_MASK)
{
- case Z8_P01M_P0H_MODE_OUTPUT: data |= m_output[offset] & 0xf0; break;
- case Z8_P01M_P0H_MODE_INPUT: mask |= 0xf0; break;
- default: /* A12...A15 */ data |= 0xf0; break;
+ case Z8_P01M_P0H_MODE_OUTPUT:
+ data |= m_output[offset] & 0xf0;
+ break;
+ case Z8_P01M_P0H_MODE_INPUT:
+ mask |= 0xf0;
+ break;
+ default: /* A12...A15 */
+ data |= 0xf0;
+ break;
}
if (!(P3M & Z8_P3M_P0_STROBED))
@@ -344,9 +356,15 @@ uint8_t z8_device::register_read(uint8_t offset)
case Z8_REGISTER_P1:
switch (P01M & Z8_P01M_P1_MODE_MASK)
{
- case Z8_P01M_P1_MODE_OUTPUT: data = m_output[offset]; break;
- case Z8_P01M_P1_MODE_INPUT: mask = 0xff; break;
- default: /* AD0..AD7 */ data = 0xff; break;
+ case Z8_P01M_P1_MODE_OUTPUT:
+ data = m_output[offset];
+ break;
+ case Z8_P01M_P1_MODE_INPUT:
+ mask = 0xff;
+ break;
+ default: /* AD0..AD7 */
+ data = 0xff;
+ break;
}
if ((P3M & Z8_P3M_P33_P34_MASK) != Z8_P3M_P33_P34_DAV1_RDY1)
@@ -370,10 +388,10 @@ uint8_t z8_device::register_read(uint8_t offset)
case Z8_REGISTER_P3:
// TODO: special port 3 modes
- if (!(P3M & 0x7c))
- {
+ //if (!(P3M & 0x7c))
+ //{
mask = 0x0f;
- }
+ //}
if (mask) m_input[offset] = m_input_cb[3](0, mask);
@@ -439,10 +457,10 @@ void z8_device::register_write(uint8_t offset, uint8_t data)
m_output[offset] = data;
// TODO: special port 3 modes
- if (!(P3M & 0x7c))
- {
+ //if (!(P3M & 0x7c))
+ //{
mask = 0xf0;
- }
+ //}
if (mask) m_output_cb[3](0, data & mask, mask);
break;
diff --git a/src/devices/cpu/z8/z8ops.hxx b/src/devices/cpu/z8/z8ops.hxx
index a10dd43a719..b08d051caf1 100644
--- a/src/devices/cpu/z8/z8ops.hxx
+++ b/src/devices/cpu/z8/z8ops.hxx
@@ -37,8 +37,8 @@
_func(dst, src);
#define mode_IR2_R1(_func) \
- uint8_t src = read(R);\
- uint8_t dst = IR;\
+ uint8_t src = m_r[read(R)];\
+ uint8_t dst = R;\
_func(dst, src);
#define mode_R1_IM(_func) \
diff --git a/src/mame/drivers/jtc.cpp b/src/mame/drivers/jtc.cpp
index f93296a91c7..6dfd01dd4c3 100644
--- a/src/mame/drivers/jtc.cpp
+++ b/src/mame/drivers/jtc.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder, Robbbert
-/***************************************************************************
+/***************************************************************************************
Jugend+Technik CompJU+TEr
@@ -9,13 +9,12 @@ Jugend+Technik CompJU+TEr
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?
+- On jtces40, hires gfx and colours to fix.
****************************************************************************************/
@@ -26,6 +25,7 @@ To Do:
#include "machine/ram.h"
#include "sound/spkrdev.h"
#include "sound/wave.h"
+#include "imagedev/snapquik.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@@ -48,12 +48,6 @@ public:
, m_video_ram(*this, "videoram")
{ }
- required_device<cpu_device> m_maincpu;
- required_device<ram_device> m_ram;
- required_device<cassette_image_device> m_cassette;
- required_device<speaker_sound_device> m_speaker;
- required_device<centronics_device> m_centronics;
-
virtual void machine_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -62,13 +56,20 @@ public:
DECLARE_READ8_MEMBER( p3_r );
DECLARE_WRITE8_MEMBER( p3_w );
DECLARE_PALETTE_INIT(jtc_es40);
- optional_shared_ptr<uint8_t> m_video_ram;
+ DECLARE_QUICKLOAD_LOAD_MEMBER( jtc );
int m_centronics_busy;
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
void basic(machine_config &config);
void jtc(machine_config &config);
void jtc_mem(address_map &map);
+
+ required_device<cpu_device> m_maincpu;
+ required_device<ram_device> m_ram;
+ required_device<cassette_image_device> m_cassette;
+ required_device<speaker_sound_device> m_speaker;
+ required_device<centronics_device> m_centronics;
+ optional_shared_ptr<uint8_t> m_video_ram;
};
@@ -158,10 +159,6 @@ READ8_MEMBER( jtc_state::p3_r )
P31
P32
P33 centronics busy input
- P34
- P35
- P36 tape output
- P37 speaker output
*/
@@ -179,10 +176,6 @@ WRITE8_MEMBER( jtc_state::p3_w )
bit description
- P30 tape input
- P31
- P32
- P33 centronics busy input
P34
P35
P36 tape output
@@ -597,6 +590,94 @@ static INPUT_PORTS_START( jtces40 )
PORT_START("Y15")
INPUT_PORTS_END
+QUICKLOAD_LOAD_MEMBER( jtc_state, jtc )
+{
+ address_space &space = m_maincpu->space(AS_PROGRAM);
+ u16 i, quick_addr, quick_length;
+ std::vector<uint8_t> quick_data;
+ image_init_result result = image_init_result::FAIL;
+
+ quick_length = image.length();
+ if (image.is_filetype("jtc"))
+ {
+ if (quick_length < 0x0088)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too short");
+ image.message(" File too short");
+ }
+ else
+ if (quick_length > 0x8000)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.message(" File too long");
+ }
+ else
+ {
+ quick_data.resize(quick_length+1);
+ u16 read_ = image.fread( &quick_data[0], quick_length);
+ if (read_ != quick_length)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.message(" Cannot read the file");
+ }
+ else
+ {
+ quick_addr = quick_data[0x12] * 256 + quick_data[0x11];
+ quick_length = quick_data[0x14] * 256 + quick_data[0x13] - quick_addr + 0x81;
+ if (image.length() != quick_length)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Invalid file header");
+ image.message(" Invalid file header");
+ }
+ else
+ {
+ for (i = 0x80; i < image.length(); i++)
+ space.write_byte(quick_addr+i-0x80, quick_data[i]);
+
+ /* display a message about the loaded quickload */
+ image.message(" Quickload: size=%04X : loaded at %04X",quick_length,quick_addr);
+
+ result = image_init_result::PASS;
+ }
+ }
+ }
+ }
+ else
+ if (image.is_filetype("bin"))
+ {
+ quick_addr = 0xe000;
+ if (quick_length > 0x8000)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "File too long");
+ image.message(" File too long");
+ }
+ else
+ {
+ quick_data.resize(quick_length+1);
+ u16 read_ = image.fread( &quick_data[0], quick_length);
+ if (read_ != quick_length)
+ {
+ image.seterror(IMAGE_ERROR_INVALIDIMAGE, "Cannot read the file");
+ image.message(" Cannot read the file");
+ }
+ else
+ {
+ for (i = 0; i < image.length(); i++)
+ space.write_byte(quick_addr+i, quick_data[i]);
+
+ /* display a message about the loaded quickload */
+ image.message(" Quickload: size=%04X : loaded at %04X",quick_length,quick_addr);
+
+ result = image_init_result::PASS;
+ m_maincpu->set_pc(quick_addr);
+ }
+ }
+ }
+
+ return result;
+}
+
+
/* Video */
uint32_t jtc_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -737,19 +818,21 @@ MACHINE_CONFIG_START(jtc_state::basic)
MCFG_Z8_PORT_P3_READ_CB(READ8(*this, jtc_state, p3_r))
MCFG_Z8_PORT_P3_WRITE_CB(WRITE8(*this, jtc_state, p3_w))
+ /* cassette */
+ MCFG_CASSETTE_ADD( "cassette" )
+ MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25);
-
- WAVE(config, "wave", "cassette").add_route(1, "mono", 0.25);
-
- /* cassette */
- MCFG_CASSETTE_ADD("cassette")
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED)
+ WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
/* printer */
MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(*this, jtc_state, write_centronics_busy))
+
+ /* quickload */
+ MCFG_QUICKLOAD_ADD("quickload", jtc_state, jtc, "jtc,bin", 2)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(jtc_state::jtc)