(nw) ravens: cleanup; ravens2: fixed bug of unwanted B & C chars on screen.

This commit is contained in:
Robbbert 2020-06-06 01:49:34 +10:00
parent 6de5f74ff4
commit 203841fc89

View File

@ -14,7 +14,7 @@ https://web.archive.org/web/20160321001634/http://petersieg.bplaced.com/?2650_Co
No instructions, no schematics - it's all guesswork. 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 Version 0.9
@ -57,12 +57,12 @@ Commands (must be in uppercase):
A Examine memory; press C to alter memory A Examine memory; press C to alter memory
B Set breakpoint? B Set breakpoint?
C View 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 E Execute
I ? I Registers? (Esc to quit)
L Load L Load
R ? R ? (Esc to quit)
V Verify? V Verify
ToDo: ToDo:
- Cassette - Cassette
@ -80,62 +80,82 @@ ToDo:
#include "ravens.lh" #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<s2650_device> m_maincpu;
required_device<cassette_image_device> m_cass;
};
class ravens_state : public ravens_base
{ {
public: public:
ravens_state(const machine_config &mconfig, device_type type, const char *tag) ravens_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) : ravens_base(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_terminal(*this, "terminal")
, m_cass(*this, "cassette")
, m_digits(*this, "digit%u", 0U) , m_digits(*this, "digit%u", 0U)
{ } { }
void ravens(machine_config &config); void ravens(machine_config &config);
void ravens2(machine_config &config);
private: 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(); } virtual void machine_start() override { m_digits.resolve(); }
required_device<s2650_device> m_maincpu; void io_map(address_map &map);
optional_device<generic_terminal_device> m_terminal; u8 port17_r();
required_device<cassette_image_device> m_cass; void display_w(offs_t offset, u8 data);
void leds_w(u8 data);
output_finder<7> m_digits; 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); 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; 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; m_digits[offset] = data;
} }
void ravens_state::leds_w(uint8_t data) void ravens_state::leds_w(u8 data)
{ {
char ledname[8]; char ledname[8];
for (int i = 0; i < 8; i++) 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; u8 ret = m_term_in;
m_term_data = 0x80; m_term_in = 0x80;
return ret; return ret;
} }
uint8_t ravens_state::port17_r() u8 ravens_state::port17_r()
{ {
uint8_t keyin, i; u8 keyin, i;
keyin = ioport("X0")->read(); keyin = ioport("X0")->read();
if (keyin != 0xff) if (keyin != 0xff)
@ -179,38 +199,44 @@ uint8_t ravens_state::port17_r()
return 0; return 0;
} }
void ravens_state::port1b_w(uint8_t data) void ravens2_state::port1b_w(u8 data)
{ {
if (BIT(data, 7)) if (BIT(data, 7))
return; return;
if (data == 1) // don't send PSU register to terminal
return;
else else
if ((data == 0x08 && m_term_char == 0x20)) if ((data == 0x08 && m_term_out == 0x20))
data = 0x0c; // FormFeed data = 0x0c; // FormFeed
else else
if ((data == 0x0a && m_term_char == 0x20)) if ((data == 0x0a && m_term_out == 0x20))
data = 0x0a; // LineFeed data = 0x0a; // LineFeed
else else
if ((data == 0x01 && m_term_char == 0xc2)) if ((data == 0x01 && m_term_out == 0xc2))
data = 0x0d; // CarriageReturn data = 0x0d; // CarriageReturn
else else
data = m_term_char; data = m_term_out;
m_terminal->write(data); 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_term_in = 0x80;
m_digits[6] = 0;
} }
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.unmap_value_high();
map(0x0000, 0x07ff).rom(); map(0x0000, 0x07ff).rom();
@ -218,7 +244,7 @@ void ravens_state::ravens_mem(address_map &map)
map(0x2000, 0x7FFF).ram(); // for quickload, optional 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.unmap_value_high();
map(0x09, 0x09).w(FUNC(ravens_state::leds_w)); // LED output port 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 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.unmap_value_high();
map(0x07, 0x07).r(FUNC(ravens_state::port07_r)); map(0x07, 0x07).r(FUNC(ravens2_state::port07_r));
map(0x1b, 0x1b).w(FUNC(ravens_state::port1b_w)); map(0x1b, 0x1b).w(FUNC(ravens2_state::port1b_w));
map(0x1c, 0x1c).w(FUNC(ravens_state::port1c_w)); map(0x1c, 0x1c).w(FUNC(ravens2_state::port1c_w));
} }
/* Input ports */ /* 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') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("???") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
INPUT_PORTS_END 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 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); address_space &space = m_maincpu->space(AS_PROGRAM);
int i; int i;
int quick_addr = 0x900; int quick_addr = 0x900;
int exec_addr; int exec_addr;
int quick_length; int quick_length;
std::vector<uint8_t> quick_data; std::vector<u8> quick_data;
int read_; int read_;
image_init_result result = image_init_result::FAIL; image_init_result result = image_init_result::FAIL;
@ -341,8 +367,8 @@ void ravens_state::ravens(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
S2650(config, m_maincpu, XTAL(1'000'000)); // frequency is unknown 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_PROGRAM, &ravens_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &ravens_state::ravens_io); m_maincpu->set_addrmap(AS_IO, &ravens_state::io_map);
m_maincpu->sense_handler().set(FUNC(ravens_state::cass_r)); m_maincpu->sense_handler().set(FUNC(ravens_state::cass_r));
m_maincpu->flag_handler().set(FUNC(ravens_state::cass_w)); 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); 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 */ /* basic machine hardware */
S2650(config, m_maincpu, XTAL(1'000'000)); // frequency is unknown 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_PROGRAM, &ravens2_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &ravens_state::ravens2_io); m_maincpu->set_addrmap(AS_IO, &ravens2_state::io_map);
m_maincpu->sense_handler().set(FUNC(ravens_state::cass_r)); m_maincpu->sense_handler().set(FUNC(ravens2_state::cass_r));
m_maincpu->flag_handler().set(FUNC(ravens_state::cass_w)); m_maincpu->flag_handler().set(FUNC(ravens2_state::cass_w));
MCFG_MACHINE_RESET_OVERRIDE(ravens_state, ravens2)
/* video hardware */ /* video hardware */
GENERIC_TERMINAL(config, m_terminal, 0); 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 */
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(); SPEAKER(config, "mono").front_center();
@ -386,7 +410,7 @@ void ravens_state::ravens2(machine_config &config)
/* ROM definition */ /* ROM definition */
ROM_START( ravens ) ROM_START( ravens )
ROM_REGION( 0x8000, "maincpu", 0 ) ROM_REGION( 0x0800, "maincpu", 0 )
ROM_SYSTEM_BIOS( 0, "v1.0", "V1.0" ) ROM_SYSTEM_BIOS( 0, "v1.0", "V1.0" )
ROMX_LOAD( "mon_v1.0.bin", 0x0000, 0x0800, CRC(785eb1ad) SHA1(c316b8ac32ab6aa37746af37b9f81a23367fedd8), ROM_BIOS(0)) ROMX_LOAD( "mon_v1.0.bin", 0x0000, 0x0800, CRC(785eb1ad) SHA1(c316b8ac32ab6aa37746af37b9f81a23367fedd8), ROM_BIOS(0))
ROM_SYSTEM_BIOS( 1, "v0.9", "V0.9" ) ROM_SYSTEM_BIOS( 1, "v0.9", "V0.9" )
@ -394,12 +418,12 @@ ROM_START( ravens )
ROM_END ROM_END
ROM_START( ravens2 ) 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_LOAD( "mon_v2.0.bin", 0x0000, 0x0800, CRC(bcd47c58) SHA1(f261a3f128fbedbf59a8b5480758fff4d7f76de1))
ROM_END ROM_END
/* Driver */ /* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ /* 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( 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, ravens_state, empty_init, "Joseph Glagla and Dieter Feiler", "Ravensburger Selbstbaucomputer V2.0", MACHINE_NO_SOUND_HW ) 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 )