summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/h01x.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/h01x.cpp')
-rw-r--r--src/mame/drivers/h01x.cpp47
1 files changed, 21 insertions, 26 deletions
diff --git a/src/mame/drivers/h01x.cpp b/src/mame/drivers/h01x.cpp
index 11bca4cf202..63069912350 100644
--- a/src/mame/drivers/h01x.cpp
+++ b/src/mame/drivers/h01x.cpp
@@ -1,11 +1,22 @@
// license:BSD-3-Clause
-// copyright-holders:zzemu-cn
+// copyright-holders:zzemu-cn, Robbbert
/***************************************************************************
- NF500A (TRS80 Level II Basic)
+NF500A (TRS80 Level II Basic)
09/01/2019
- H-01B (TRS80 Level II Basic)
+H-01B (TRS80 Level II Basic)
10/05/2019
+
+Despite the references to the TRS-80, the machines are entirely incompatible.
+
+TODO:
+- Need schematics and technical info.
+- Need confirmation of clock speeds for each machine.
+ (Cassettes made on machines of different clocks are not shareable)
+- JCE's 16KB extended ROM functionality is not understood, functionality is
+ unemulated
+- Need software.
+
****************************************************************************/
#include "emu.h"
@@ -17,7 +28,6 @@
#include "machine/ram.h"
#include "sound/spkrdev.h"
#include "imagedev/cassette.h"
-#include "formats/trs_cas.h"
class h01x_state : public driver_device
{
@@ -50,8 +60,6 @@ private:
void h01x_mem_map(address_map &map);
void h01x_io_map(address_map &map);
- uint32_t screen_update_h01x(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
-
uint8_t mem_0000_r(offs_t offset);
void mem_0000_w(uint8_t data);
uint8_t mem_4000_r(offs_t offset);
@@ -84,7 +92,6 @@ private:
TIMER_CALLBACK_MEMBER(cassette_data_callback);
bool m_cassette_data = 0;
emu_timer *m_cassette_data_timer;
- double m_old_cassette_val = 0;
};
@@ -93,7 +100,7 @@ static const double speaker_levels[] = {-1.0, 0.0, 1.0, 0.0};
void h01x_state::h01x(machine_config &config)
{
// basic machine hardware
- Z80(config, m_maincpu, 10.6445_MHz_XTAL / 6); // TRS-80 clock frequency
+ Z80(config, m_maincpu, 16_MHz_XTAL / 8);
m_maincpu->set_addrmap(AS_PROGRAM, &h01x_state::h01x_mem_map);
m_maincpu->set_addrmap(AS_IO, &h01x_state::h01x_io_map);
@@ -122,7 +129,6 @@ void h01x_state::h01x(machine_config &config)
/* devices */
CASSETTE(config, m_cassette);
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
- m_cassette->set_formats(trs80l2_cassette_formats);
m_cassette->set_default_state(CASSETTE_STOPPED);
}
@@ -130,21 +136,21 @@ void h01x_state::h01b(machine_config &config)
{
// H-01B CPU: 2MHz ROM: 16KB + 32KB
h01x(config);
- //m_maincpu->set_clock(16_MHz_XTAL/8); using TRS-80 clock frequency until original cassettes can be found
+ m_maincpu->set_clock(16_MHz_XTAL/8); // to confirm
}
void h01x_state::nf500a(machine_config &config)
{
// NF-500A CPU: 4MHz ROM: 16KB + 32KB
h01x(config);
- //m_maincpu->set_clock(16_MHz_XTAL/4); using TRS-80 clock frequency until original cassettes can be found
+ m_maincpu->set_clock(16_MHz_XTAL/4); // to confirm
}
void h01x_state::h01jce(machine_config &config)
{
// JCE CPU: 4MHz ROM: 16KB + 32KB + 16KB
h01x(config);
- //m_maincpu->set_clock(16_MHz_XTAL/4); using TRS-80 clock frequency until original cassettes can be found
+ m_maincpu->set_clock(16_MHz_XTAL/4); // to confirm
}
void h01x_state::h01x_mem_map(address_map &map)
@@ -438,10 +444,9 @@ void h01x_state::machine_start()
{
save_item(NAME(m_bank));
save_item(NAME(m_cassette_data));
- save_item(NAME(m_old_cassette_val));
m_cassette_data_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(h01x_state::cassette_data_callback), this));
- m_cassette_data_timer->adjust(attotime::zero, 0, attotime::from_hz(11025));
+ m_cassette_data_timer->adjust(attotime::zero, 0, attotime::from_hz(48000));
}
void h01x_state::machine_reset()
@@ -480,14 +485,11 @@ void h01x_state::port_70_w(uint8_t data)
// bit4, cassette
m_cassette->output(BIT(data, 4) ? 1.0 : -1.0);
- m_cassette_data = false;
}
uint8_t h01x_state::port_50_r()
{
// bit 7, cassette input
- //return (m_cassette->input() > 0.04) ? 0x7f : 0xff;
-
return m_cassette_data ? 0xff : 0x7f;
}
@@ -564,13 +566,10 @@ void h01x_state::mem_c000_w(offs_t offset, uint8_t data)
TIMER_CALLBACK_MEMBER(h01x_state::cassette_data_callback)
{
- double new_val = m_cassette->input();
+ m_cassette_data = false;
- /* Check for HI-LO transition */
- if (m_old_cassette_val > -0.2 && new_val < -0.2)
+ if (m_cassette->input() > 0.2)
m_cassette_data = true;
-
- m_old_cassette_val = new_val;
}
@@ -629,10 +628,6 @@ ROM_END
// NF500A : H-01型汉字微电脑 中国科学院H电脑公司
// JCE : H-01型中文普及电脑 北岳电子有限公司制造
-// Incomplete features:
-// Cassette I/O is incomplete, and the TRS-80 main CPU frequency is used
-// JCE's 16KB extended ROM functionality is not understood, functionality is unemulated
-
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1985, h01b, 0, 0, h01b, h01b, h01x_state, empty_init, "China H Computer Company", "H-01B", MACHINE_SUPPORTS_SAVE )
COMP( 1985, nf500a, 0, 0, nf500a, h01x, h01x_state, empty_init, "China State-owned 830 Factory", "NF500A", MACHINE_SUPPORTS_SAVE )