summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/altos2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/altos2.cpp')
-rw-r--r--src/mame/drivers/altos2.cpp67
1 files changed, 47 insertions, 20 deletions
diff --git a/src/mame/drivers/altos2.cpp b/src/mame/drivers/altos2.cpp
index b9ba88922af..410dff740a9 100644
--- a/src/mame/drivers/altos2.cpp
+++ b/src/mame/drivers/altos2.cpp
@@ -21,7 +21,8 @@ Keyboard: P8035L CPU, undumped 2716 labelled "358_2758", XTAL marked "4608-300-1
#include "machine/z80dart.h"
#include "machine/clock.h"
#include "machine/x2212.h"
-//#include "video/crt9007.h"
+//#include "video/crt9006.h"
+#include "video/crt9007.h"
//#include "video/crt9021.h"
#include "screen.h"
@@ -32,6 +33,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_novram(*this, "novram")
+ , m_vpac(*this, "vpac")
, m_p_chargen(*this, "chargen")
, m_p_videoram(*this, "videoram")
{ }
@@ -39,6 +41,8 @@ public:
void altos2(machine_config &config);
private:
+ DECLARE_READ8_MEMBER(vpac_r);
+ DECLARE_WRITE8_MEMBER(vpac_w);
DECLARE_WRITE8_MEMBER(video_mode_w);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
@@ -49,6 +53,7 @@ private:
required_device<z80_device> m_maincpu;
required_device<x2210_device> m_novram;
+ required_device<crt9007_device> m_vpac;
required_region_ptr<u8> m_p_chargen;
required_shared_ptr<u8> m_p_videoram;
};
@@ -59,10 +64,31 @@ void altos2_state::machine_reset()
m_novram->recall(CLEAR_LINE);
}
+READ8_MEMBER(altos2_state::vpac_r)
+{
+ return m_vpac->read(space, offset >> 1);
+}
+
+WRITE8_MEMBER(altos2_state::vpac_w)
+{
+ m_vpac->write(space, offset >> 1, data);
+}
+
WRITE8_MEMBER(altos2_state::video_mode_w)
{
- // D5 = 1 for 132-column mode (6-pixel char width)
- // D5 = 0 for 80-column mode (10-pixel char width)
+ if (BIT(data, 5))
+ {
+ // D5 = 1 for 132-column mode
+ m_vpac->set_unscaled_clock(40_MHz_XTAL / 12);
+ m_vpac->set_character_width(6);
+ }
+ else
+ {
+ // D5 = 0 for 80-column mode
+ m_vpac->set_unscaled_clock(40_MHz_XTAL / 20);
+ m_vpac->set_character_width(10);
+ }
+
logerror("Writing %02X to mode register at %s\n", data, machine().describe_context());
}
@@ -86,10 +112,10 @@ void altos2_state::io_map(address_map &map)
map(0x08, 0x0b).rw("ctc", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
map(0x0c, 0x0c).w(FUNC(altos2_state::video_mode_w));
map(0x40, 0x7f).rw(m_novram, FUNC(x2210_device::read), FUNC(x2210_device::write));
- //AM_RANGE(0x80, 0xff) AM_DEVREADWRITE_MOD("vpac", crt9007_device, read, write, rshift<1>)
+ map(0x80, 0xff).rw(FUNC(altos2_state::vpac_r), FUNC(altos2_state::vpac_w));
}
-static INPUT_PORTS_START( altos2 )
+static INPUT_PORTS_START(altos2)
INPUT_PORTS_END
static const z80_daisy_config daisy_chain[] =
@@ -100,19 +126,19 @@ static const z80_daisy_config daisy_chain[] =
{ nullptr }
};
-MACHINE_CONFIG_START(altos2_state::altos2)
- /* basic machine hardware */
- Z80(config, m_maincpu, XTAL(4'000'000)); // unknown clock
+void altos2_state::altos2(machine_config &config)
+{
+ Z80(config, m_maincpu, 8_MHz_XTAL / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &altos2_state::mem_map);
m_maincpu->set_addrmap(AS_IO, &altos2_state::io_map);
m_maincpu->set_daisy_config(daisy_chain);
- clock_device &ctc_clock(CLOCK(config, "ctc_clock", 4915200)); // ctc & dart connections are guesswork
+ clock_device &ctc_clock(CLOCK(config, "ctc_clock", 4.9152_MHz_XTAL / 2)); // ctc & dart connections are guesswork
ctc_clock.signal_handler().set("ctc", FUNC(z80ctc_device::trg0));
ctc_clock.signal_handler().append("ctc", FUNC(z80ctc_device::trg1));
ctc_clock.signal_handler().append("ctc", FUNC(z80ctc_device::trg2));
- z80ctc_device &ctc(Z80CTC(config, "ctc", 4_MHz_XTAL));
+ z80ctc_device &ctc(Z80CTC(config, "ctc", 8_MHz_XTAL / 2));
ctc.intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
ctc.zc_callback<0>().set("dart1", FUNC(z80dart_device::txca_w));
ctc.zc_callback<0>().append("dart1", FUNC(z80dart_device::rxca_w));
@@ -120,23 +146,24 @@ MACHINE_CONFIG_START(altos2_state::altos2)
ctc.zc_callback<2>().set("dart2", FUNC(z80dart_device::rxca_w));
ctc.zc_callback<2>().append("dart2", FUNC(z80dart_device::txca_w));
- z80dart_device &dart1(Z80DART(config, "dart1", 4_MHz_XTAL));
+ z80dart_device &dart1(Z80DART(config, "dart1", 8_MHz_XTAL / 2));
dart1.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- z80dart_device &dart2(Z80DART(config, "dart2", 4_MHz_XTAL)); // channel B not used for communications
+ z80dart_device &dart2(Z80DART(config, "dart2", 8_MHz_XTAL / 2)); // channel B not used for communications
dart2.out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
dart2.out_dtrb_callback().set(m_novram, FUNC(x2210_device::store)).invert(); // FIXME: no inverter should be needed
- X2210(config, m_novram, 0);
+ X2210(config, m_novram);
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(XTAL(40'000'000) / 2, 960, 0, 800, 347, 0, 325)
- MCFG_SCREEN_UPDATE_DRIVER(altos2_state, screen_update)
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(40_MHz_XTAL / 2, 960, 0, 800, 347, 0, 325);
+ screen.set_screen_update(FUNC(altos2_state::screen_update));
- //MCFG_DEVICE_ADD("vpac", CRT9007, VPAC_CLOCK)
- //MCFG_CRT9007_INT_CALLBACK(WRITELINE("ctc", z80ctc_device, trg3))
- //MCFG_VIDEO_SET_SCREEN("screen")
-MACHINE_CONFIG_END
+ CRT9007(config, m_vpac, 40_MHz_XTAL / 20);
+ m_vpac->set_screen("screen");
+ m_vpac->set_character_width(10);
+ m_vpac->int_callback().set("ctc", FUNC(z80ctc_device::trg3));
+}
ROM_START( altos2 )
ROM_REGION( 0x4000, "roms", 0 )