(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.
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<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)
: 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<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 )