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_base(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_cass(*this, "cassette") + { } + +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 m_maincpu; + required_device m_cass; +}; + +class ravens_state : public ravens_base { public: ravens_state(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") + : ravens_base(mconfig, type, tag) , 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); - DECLARE_READ_LINE_MEMBER(cass_r); - DECLARE_WRITE_LINE_MEMBER(cass_w); - DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb); - - void ravens2_io(address_map &map); - void ravens_io(address_map &map); - void ravens_mem(address_map &map); - - uint8_t m_term_char; - uint8_t m_term_data; virtual void machine_start() override { m_digits.resolve(); } - required_device m_maincpu; - optional_device m_terminal; - required_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 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 quick_data; + std::vector 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 )