summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/ravens.cpp172
1 files changed, 98 insertions, 74 deletions
diff --git a/src/mame/drivers/ravens.cpp b/src/mame/drivers/ravens.cpp
index 61cc38b911f..91f123cefbf 100644
--- a/src/mame/drivers/ravens.cpp
+++ b/src/mame/drivers/ravens.cpp
@@ -14,7 +14,7 @@ https://web.archive.org/web/20160321001634/http://petersieg.bplaced.com/?2650_Co
No instructions, no schematics - it's all guesswork.
-The cassette saves a noise but it returns a bad load.
+The cassette saves a noise but it returns a bad load. This is why MNW is set.
Version 0.9
@@ -57,12 +57,12 @@ Commands (must be in uppercase):
A Examine memory; press C to alter memory
B Set breakpoint?
C View breakpoint?
-D Dump to screen and tape (at the same time)
+D Dump to screen and tape (at the same time) D 00 04 dumps pages 0 to 4
E Execute
-I ?
+I Registers? (Esc to quit)
L Load
-R ?
-V Verify?
+R ? (Esc to quit)
+V Verify
ToDo:
- Cassette
@@ -80,62 +80,82 @@ ToDo:
#include "ravens.lh"
-class ravens_state : public driver_device
+class ravens_base : public driver_device
{
public:
- ravens_state(const machine_config &mconfig, device_type type, const char *tag)
+ ravens_base(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
- , m_terminal(*this, "terminal")
, m_cass(*this, "cassette")
- , m_digits(*this, "digit%u", 0U)
{ }
- void ravens(machine_config &config);
- void ravens2(machine_config &config);
-
-private:
- uint8_t port07_r();
- uint8_t port17_r();
- void port1b_w(uint8_t data);
- void port1c_w(uint8_t data);
- void display_w(offs_t offset, uint8_t data);
- void leds_w(uint8_t data);
- void kbd_put(u8 data);
- DECLARE_MACHINE_RESET(ravens2);
+protected:
DECLARE_READ_LINE_MEMBER(cass_r);
DECLARE_WRITE_LINE_MEMBER(cass_w);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
+ void mem_map(address_map &map);
+ required_device<s2650_device> m_maincpu;
+ required_device<cassette_image_device> m_cass;
+};
+
+class ravens_state : public ravens_base
+{
+public:
+ ravens_state(const machine_config &mconfig, device_type type, const char *tag)
+ : ravens_base(mconfig, type, tag)
+ , m_digits(*this, "digit%u", 0U)
+ { }
- void ravens2_io(address_map &map);
- void ravens_io(address_map &map);
- void ravens_mem(address_map &map);
+ void ravens(machine_config &config);
- uint8_t m_term_char;
- uint8_t m_term_data;
+private:
virtual void machine_start() override { m_digits.resolve(); }
- required_device<s2650_device> m_maincpu;
- optional_device<generic_terminal_device> m_terminal;
- required_device<cassette_image_device> m_cass;
+ void io_map(address_map &map);
+ u8 port17_r();
+ void display_w(offs_t offset, u8 data);
+ void leds_w(u8 data);
output_finder<7> m_digits;
};
-WRITE_LINE_MEMBER( ravens_state::cass_w )
+class ravens2_state : public ravens_base
+{
+public:
+ ravens2_state(const machine_config &mconfig, device_type type, const char *tag)
+ : ravens_base(mconfig, type, tag)
+ , m_terminal(*this, "terminal")
+ { }
+
+ void ravens2(machine_config &config);
+
+private:
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+ void io_map(address_map &map);
+ void kbd_put(u8 data);
+ u8 port07_r();
+ void port1b_w(u8 data);
+ void port1c_w(u8 data);
+ u8 m_term_out;
+ u8 m_term_in;
+ required_device<generic_terminal_device> m_terminal;
+};
+
+WRITE_LINE_MEMBER( ravens_base::cass_w )
{
m_cass->output(state ? -1.0 : +1.0);
}
-READ_LINE_MEMBER( ravens_state::cass_r )
+READ_LINE_MEMBER( ravens_base::cass_r )
{
return (m_cass->input() > 0.03) ? 1 : 0;
}
-void ravens_state::display_w(offs_t offset, uint8_t data)
+void ravens_state::display_w(offs_t offset, u8 data)
{
m_digits[offset] = data;
}
-void ravens_state::leds_w(uint8_t data)
+void ravens_state::leds_w(u8 data)
{
char ledname[8];
for (int i = 0; i < 8; i++)
@@ -145,16 +165,16 @@ void ravens_state::leds_w(uint8_t data)
}
}
-uint8_t ravens_state::port07_r()
+u8 ravens2_state::port07_r()
{
- uint8_t ret = m_term_data;
- m_term_data = 0x80;
+ u8 ret = m_term_in;
+ m_term_in = 0x80;
return ret;
}
-uint8_t ravens_state::port17_r()
+u8 ravens_state::port17_r()
{
- uint8_t keyin, i;
+ u8 keyin, i;
keyin = ioport("X0")->read();
if (keyin != 0xff)
@@ -179,38 +199,44 @@ uint8_t ravens_state::port17_r()
return 0;
}
-void ravens_state::port1b_w(uint8_t data)
+void ravens2_state::port1b_w(u8 data)
{
if (BIT(data, 7))
return;
+ if (data == 1) // don't send PSU register to terminal
+ return;
else
- if ((data == 0x08 && m_term_char == 0x20))
+ if ((data == 0x08 && m_term_out == 0x20))
data = 0x0c; // FormFeed
else
- if ((data == 0x0a && m_term_char == 0x20))
+ if ((data == 0x0a && m_term_out == 0x20))
data = 0x0a; // LineFeed
else
- if ((data == 0x01 && m_term_char == 0xc2))
+ if ((data == 0x01 && m_term_out == 0xc2))
data = 0x0d; // CarriageReturn
else
- data = m_term_char;
+ data = m_term_out;
m_terminal->write(data);
}
-void ravens_state::port1c_w(uint8_t data)
+void ravens2_state::port1c_w(u8 data)
{
- m_term_char = data;
+ m_term_out = data;
}
-MACHINE_RESET_MEMBER( ravens_state, ravens2 )
+void ravens2_state::machine_reset()
{
- m_term_data = 0x80;
- m_digits[6] = 0;
+ m_term_in = 0x80;
}
+void ravens2_state::machine_start()
+{
+ save_item(NAME(m_term_out));
+ save_item(NAME(m_term_in));
+}
-void ravens_state::ravens_mem(address_map &map)
+void ravens_base::mem_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x07ff).rom();
@@ -218,7 +244,7 @@ void ravens_state::ravens_mem(address_map &map)
map(0x2000, 0x7FFF).ram(); // for quickload, optional
}
-void ravens_state::ravens_io(address_map &map)
+void ravens_state::io_map(address_map &map)
{
map.unmap_value_high();
map(0x09, 0x09).w(FUNC(ravens_state::leds_w)); // LED output port
@@ -226,12 +252,12 @@ void ravens_state::ravens_io(address_map &map)
map(0x17, 0x17).r(FUNC(ravens_state::port17_r)); // pushbuttons
}
-void ravens_state::ravens2_io(address_map &map)
+void ravens2_state::io_map(address_map &map)
{
map.unmap_value_high();
- map(0x07, 0x07).r(FUNC(ravens_state::port07_r));
- map(0x1b, 0x1b).w(FUNC(ravens_state::port1b_w));
- map(0x1c, 0x1c).w(FUNC(ravens_state::port1c_w));
+ map(0x07, 0x07).r(FUNC(ravens2_state::port07_r));
+ map(0x1b, 0x1b).w(FUNC(ravens2_state::port1b_w));
+ map(0x1c, 0x1c).w(FUNC(ravens2_state::port1c_w));
}
/* Input ports */
@@ -267,20 +293,20 @@ static INPUT_PORTS_START( ravens )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("???") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
INPUT_PORTS_END
-void ravens_state::kbd_put(u8 data)
+void ravens2_state::kbd_put(u8 data)
{
if (data > 0x60) data -= 0x20; // fold to uppercase
- m_term_data = data;
+ m_term_in = data;
}
-QUICKLOAD_LOAD_MEMBER(ravens_state::quickload_cb)
+QUICKLOAD_LOAD_MEMBER(ravens_base::quickload_cb)
{
address_space &space = m_maincpu->space(AS_PROGRAM);
int i;
int quick_addr = 0x900;
int exec_addr;
int quick_length;
- std::vector<uint8_t> quick_data;
+ std::vector<u8> quick_data;
int read_;
image_init_result result = image_init_result::FAIL;
@@ -341,8 +367,8 @@ void ravens_state::ravens(machine_config &config)
{
/* basic machine hardware */
S2650(config, m_maincpu, XTAL(1'000'000)); // frequency is unknown
- m_maincpu->set_addrmap(AS_PROGRAM, &ravens_state::ravens_mem);
- m_maincpu->set_addrmap(AS_IO, &ravens_state::ravens_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &ravens_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &ravens_state::io_map);
m_maincpu->sense_handler().set(FUNC(ravens_state::cass_r));
m_maincpu->flag_handler().set(FUNC(ravens_state::cass_w));
@@ -359,23 +385,21 @@ void ravens_state::ravens(machine_config &config)
m_cass->add_route(ALL_OUTPUTS, "mono", 0.05);
}
-void ravens_state::ravens2(machine_config &config)
+void ravens2_state::ravens2(machine_config &config)
{
/* basic machine hardware */
S2650(config, m_maincpu, XTAL(1'000'000)); // frequency is unknown
- m_maincpu->set_addrmap(AS_PROGRAM, &ravens_state::ravens_mem);
- m_maincpu->set_addrmap(AS_IO, &ravens_state::ravens2_io);
- m_maincpu->sense_handler().set(FUNC(ravens_state::cass_r));
- m_maincpu->flag_handler().set(FUNC(ravens_state::cass_w));
-
- MCFG_MACHINE_RESET_OVERRIDE(ravens_state, ravens2)
+ m_maincpu->set_addrmap(AS_PROGRAM, &ravens2_state::mem_map);
+ m_maincpu->set_addrmap(AS_IO, &ravens2_state::io_map);
+ m_maincpu->sense_handler().set(FUNC(ravens2_state::cass_r));
+ m_maincpu->flag_handler().set(FUNC(ravens2_state::cass_w));
/* video hardware */
GENERIC_TERMINAL(config, m_terminal, 0);
- m_terminal->set_keyboard_callback(FUNC(ravens_state::kbd_put));
+ m_terminal->set_keyboard_callback(FUNC(ravens2_state::kbd_put));
/* quickload */
- QUICKLOAD(config, "quickload", "pgm", attotime::from_seconds(1)).set_load_callback(FUNC(ravens_state::quickload_cb));
+ QUICKLOAD(config, "quickload", "pgm", attotime::from_seconds(1)).set_load_callback(FUNC(ravens2_state::quickload_cb));
SPEAKER(config, "mono").front_center();
@@ -386,7 +410,7 @@ void ravens_state::ravens2(machine_config &config)
/* ROM definition */
ROM_START( ravens )
- ROM_REGION( 0x8000, "maincpu", 0 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
ROM_SYSTEM_BIOS( 0, "v1.0", "V1.0" )
ROMX_LOAD( "mon_v1.0.bin", 0x0000, 0x0800, CRC(785eb1ad) SHA1(c316b8ac32ab6aa37746af37b9f81a23367fedd8), ROM_BIOS(0))
ROM_SYSTEM_BIOS( 1, "v0.9", "V0.9" )
@@ -394,12 +418,12 @@ ROM_START( ravens )
ROM_END
ROM_START( ravens2 )
- ROM_REGION( 0x8000, "maincpu", 0 )
+ ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mon_v2.0.bin", 0x0000, 0x0800, CRC(bcd47c58) SHA1(f261a3f128fbedbf59a8b5480758fff4d7f76de1))
ROM_END
/* Driver */
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1984, ravens, 0, 0, ravens, ravens, ravens_state, empty_init, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V0.9", MACHINE_NO_SOUND_HW )
-COMP( 1985, ravens2, ravens, 0, ravens2, ravens, ravens_state, empty_init, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V2.0", MACHINE_NO_SOUND_HW )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1984, ravens, 0, 0, ravens, ravens, ravens_state, empty_init, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V0.9", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )
+COMP( 1985, ravens2, ravens, 0, ravens2, ravens, ravens2_state, empty_init, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V2.0", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE )