summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/v6809.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/v6809.cpp')
-rw-r--r--src/mame/drivers/v6809.cpp382
1 files changed, 0 insertions, 382 deletions
diff --git a/src/mame/drivers/v6809.cpp b/src/mame/drivers/v6809.cpp
deleted file mode 100644
index d94b32b958a..00000000000
--- a/src/mame/drivers/v6809.cpp
+++ /dev/null
@@ -1,382 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Robbbert
-/**********************************************************************************************
-
- Vegas 6809
-
- Skeleton driver
-
-Devices:
-
-MC6809 cpu
-MC6840 timer
-MM58174 RTC
-MB8876 (or FD1791) FDC
-SY6545-1 CRTC
-2x MC6821 PIA
-2x MC6850 ACIA
-
-Memory ranges:
-
-0000-EFFF RAM
-F000-F7FF Devices
-F800-FFFF ROM
-
-Monitor commands:
-
-D boot from floppy (launch Flex OS)
-F relaunch Flex
-G go
-M modify memory (. to exit)
-
-ToDo:
-
- - Colours (Looks like characters 0xc0-0xff produce coloured lores gfx).
-
- - Connect the RTC interrupt pin (not supported currently)
-
- - Find the missing character generator rom.
-
- - Schematic is almost useless, riddled with omissions and errors. All documents are in
- French. The parts list only has half of the parts.
-
- - Need software (there are floppy images, but they are not yet in a supported format)
-
-
-*******************************************************************************************/
-
-#include "emu.h"
-
-#include "cpu/m6809/m6809.h"
-#include "imagedev/floppy.h"
-#include "machine/6821pia.h"
-#include "machine/6840ptm.h"
-#include "machine/6850acia.h"
-#include "machine/clock.h"
-#include "machine/keyboard.h"
-#include "machine/mm58174.h"
-#include "machine/wd_fdc.h"
-#include "sound/spkrdev.h"
-#include "video/mc6845.h"
-
-#include "emupal.h"
-#include "screen.h"
-#include "speaker.h"
-
-
-namespace {
-
-class v6809_state : public driver_device
-{
-public:
- v6809_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_video_address(0)
- , m_pia0(*this, "pia0")
- , m_maincpu(*this, "maincpu")
- , m_crtc(*this, "crtc")
- , m_fdc(*this, "fdc")
- , m_floppy0(*this, "fdc:0")
- , m_floppy1(*this, "fdc:1")
- , m_speaker(*this, "speaker")
- , m_palette(*this, "palette")
- , m_p_chargen(*this, "chargen")
- { }
-
- void v6809(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- DECLARE_WRITE_LINE_MEMBER(speaker_en_w);
- DECLARE_WRITE_LINE_MEMBER(speaker_w);
- u8 pb_r();
- void pa_w(u8 data);
- void videoram_w(u8 data);
- void v6809_address_w(u8 data);
- void v6809_register_w(u8 data);
- void kbd_put(u8 data);
- MC6845_UPDATE_ROW(crtc_update_row);
- MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr);
-
- void v6809_mem(address_map &map);
-
- u16 m_video_address;
- bool m_speaker_en;
- u8 m_video_index;
- u8 m_term_data;
- u8 m_vidbyte;
- std::unique_ptr<u8[]> m_vram;
- required_device<pia6821_device> m_pia0;
- required_device<cpu_device> m_maincpu;
- required_device<mc6845_device> m_crtc;
- required_device<mb8876_device> m_fdc;
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
- required_device<speaker_sound_device> m_speaker;
- required_device<palette_device> m_palette;
- required_region_ptr<u8> m_p_chargen;
-};
-
-
-void v6809_state::v6809_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0xefff).ram();
- map(0xf000, 0xf000).mirror(0xfe).r(m_crtc, FUNC(mc6845_device::status_r)).w(FUNC(v6809_state::v6809_address_w));
- map(0xf001, 0xf001).mirror(0xfe).r(m_crtc, FUNC(mc6845_device::register_r)).w(FUNC(v6809_state::v6809_register_w));
- map(0xf200, 0xf200).mirror(0xff).w(FUNC(v6809_state::videoram_w));
- map(0xf500, 0xf501).mirror(0x36).rw("acia0", FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // modem
- map(0xf508, 0xf509).mirror(0x36).rw("acia1", FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // printer
- map(0xf600, 0xf603).mirror(0x3c).rw(m_fdc, FUNC(mb8876_device::read), FUNC(mb8876_device::write));
- map(0xf640, 0xf64f).mirror(0x30).rw("rtc", FUNC(mm58174_device::read), FUNC(mm58174_device::write));
- map(0xf680, 0xf683).mirror(0x3c).rw(m_pia0, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf6c0, 0xf6c7).mirror(0x08).rw("ptm", FUNC(ptm6840_device::read), FUNC(ptm6840_device::write));
- map(0xf6d0, 0xf6d3).mirror(0x0c).rw("pia1", FUNC(pia6821_device::read), FUNC(pia6821_device::write));
- map(0xf800, 0xffff).rom().region("maincpu", 0);
-}
-
-
-/* Input ports */
-static INPUT_PORTS_START( v6809 )
-INPUT_PORTS_END
-
-void v6809_state::machine_start()
-{
- m_vram = make_unique_clear<u8[]>(0x0800);
- save_pointer(NAME(m_vram), 0x0800);
- save_item(NAME(m_speaker_en));
- save_item(NAME(m_term_data));
- save_item(NAME(m_video_address));
- save_item(NAME(m_video_index));
- save_item(NAME(m_vidbyte));
-}
-
-void v6809_state::machine_reset()
-{
- m_term_data = 0;
- m_pia0->cb1_w(1);
-}
-
-// **** Video ****
-
-/* F4 Character Displayer */
-static const gfx_layout v6809_charlayout =
-{
- 8, 10, /* 8 x 10 characters */
- 256, /* 128 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8 },
- 8*16 /* every char takes 16 bytes */
-};
-
-static GFXDECODE_START( gfx_v6809 )
- GFXDECODE_ENTRY( "chargen", 0x0000, v6809_charlayout, 0, 1 )
-GFXDECODE_END
-
-MC6845_UPDATE_ROW( v6809_state::crtc_update_row )
-{
- rgb_t const *const palette = m_palette->palette()->entry_list_raw();
- u32 *p = &bitmap.pix(y);
-
- for (u16 x = 0; x < x_count; x++)
- {
- u16 mem = (ma + x) & 0x7ff;
- u8 chr = m_vram[mem];
- u8 gfx = m_p_chargen[(chr<<4) | ra] ^ ((x == cursor_x) ? 0xff : 0);
-
- /* Display a scanline of a character (8 pixels) */
- *p++ = palette[BIT(gfx, 7)];
- *p++ = palette[BIT(gfx, 6)];
- *p++ = palette[BIT(gfx, 5)];
- *p++ = palette[BIT(gfx, 4)];
- *p++ = palette[BIT(gfx, 3)];
- *p++ = palette[BIT(gfx, 2)];
- *p++ = palette[BIT(gfx, 1)];
- *p++ = palette[BIT(gfx, 0)];
- }
-}
-
-MC6845_ON_UPDATE_ADDR_CHANGED( v6809_state::crtc_update_addr )
-{
-/* not sure what goes in here - parameters passed are device, address, strobe */
- m_video_address = address & 0x7ff;
-}
-
-void v6809_state::videoram_w(u8 data)
-{
- m_vidbyte = data;
-}
-
-void v6809_state::v6809_address_w(u8 data)
-{
- m_crtc->address_w(data);
-
- m_video_index = data & 0x1f;
-
- if (m_video_index == 31)
- m_vram[m_video_address] = m_vidbyte;
-}
-
-void v6809_state::v6809_register_w(u8 data)
-{
- u16 temp = m_video_address;
-
- m_crtc->register_w(data);
-
- // Get transparent address
- if (m_video_index == 18)
- m_video_address = ((data & 7) << 8 ) | (temp & 0xff);
- else
- if (m_video_index == 19)
- m_video_address = data | (temp & 0xff00);
-}
-
-// **** Keyboard ****
-
-void v6809_state::kbd_put(u8 data)
-{
- m_term_data = data;
- m_pia0->cb1_w(0);
- m_pia0->cb1_w(1);
-}
-
-u8 v6809_state::pb_r()
-{
- u8 ret = m_term_data;
- m_term_data = 0;
- return ret;
-}
-
-// can support 4 drives
-void v6809_state::pa_w(u8 data)
-{
- floppy_image_device *floppy = nullptr;
- if ((data & 3) == 0) floppy = m_floppy0->get_device();
- if ((data & 3) == 1) floppy = m_floppy1->get_device();
- //if ((data & 3) == 2) floppy = m_floppy2->get_device();
- //if ((data & 3) == 3) floppy = m_floppy3->get_device();
-
- m_fdc->set_floppy(floppy);
-
-// Bits 2 and 3 go to the floppy connector but are not documented
-
- if (floppy)
- {
- floppy->mon_w(0);
- m_fdc->dden_w(BIT(data, 4));
- }
-}
-
-WRITE_LINE_MEMBER( v6809_state::speaker_en_w )
-{
- m_speaker_en = state;
-}
-
-WRITE_LINE_MEMBER( v6809_state::speaker_w )
-{
- if (m_speaker_en)
- m_speaker->level_w(state);
-}
-
-static void v6809_floppies(device_slot_interface &device)
-{
- device.option_add("525dd", FLOPPY_525_DD);
-}
-
-
-// *** Machine ****
-
-void v6809_state::v6809(machine_config &config)
-{
- /* basic machine hardware */
- MC6809(config, m_maincpu, 16_MHz_XTAL / 4); // divided by 4 again internally
- m_maincpu->set_addrmap(AS_PROGRAM, &v6809_state::v6809_mem);
-
- /* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(50);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(640, 480);
- screen.set_visarea(0, 640-1, 0, 480-1);
- screen.set_screen_update("crtc", FUNC(sy6545_1_device::screen_update));
- PALETTE(config, m_palette, palette_device::MONOCHROME);
- GFXDECODE(config, "gfxdecode", m_palette, gfx_v6809);
-
- /* sound hardware */
- SPEAKER(config, "mono").front_center();
- SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
-
- /* devices */
- SY6545_1(config, m_crtc, 16_MHz_XTAL / 8);
- m_crtc->set_screen("screen");
- m_crtc->set_show_border_area(false);
- m_crtc->set_char_width(8);
- m_crtc->set_update_row_callback(FUNC(v6809_state::crtc_update_row));
- m_crtc->set_on_update_addr_change_callback(FUNC(v6809_state::crtc_update_addr));
-
- generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
- keyboard.set_keyboard_callback(FUNC(v6809_state::kbd_put));
-
- // port A = drive select and 2 control lines ; port B = keyboard
- PIA6821(config, m_pia0, 0);
- m_pia0->readpb_handler().set(FUNC(v6809_state::pb_r));
- m_pia0->writepa_handler().set(FUNC(v6809_state::pa_w));
- m_pia0->irqa_handler().set_inputline("maincpu", M6809_IRQ_LINE);
- m_pia0->irqb_handler().set_inputline("maincpu", M6809_IRQ_LINE);
-
- // no idea what this does
- pia6821_device &pia1(PIA6821(config, "pia1", 0));
- pia1.irqa_handler().set_inputline("maincpu", M6809_IRQ_LINE);
- pia1.irqb_handler().set_inputline("maincpu", M6809_IRQ_LINE);
-
- ptm6840_device &ptm(PTM6840(config, "ptm", 16_MHz_XTAL / 4));
- ptm.set_external_clocks(4000000/14, 4000000/14, 4000000/14/8);
- ptm.o1_callback().set(FUNC(v6809_state::speaker_en_w));
- ptm.o2_callback().set(FUNC(v6809_state::speaker_w));
- ptm.irq_callback().set_inputline("maincpu", M6809_IRQ_LINE);
-
- ACIA6850(config, "acia0", 0);
-
- ACIA6850(config, "acia1", 0);
-
- clock_device &acia_clock(CLOCK(config, "acia_clock", 153600));
- acia_clock.signal_handler().set("acia0", FUNC(acia6850_device::write_txc));
- acia_clock.signal_handler().append("acia0", FUNC(acia6850_device::write_rxc));
- acia_clock.signal_handler().append("acia1", FUNC(acia6850_device::write_txc));
- acia_clock.signal_handler().append("acia1", FUNC(acia6850_device::write_rxc));
-
- MM58174(config, "rtc", 0);
- //rtc.irq_handler().set(m_pia0, FUNC(pia6821_device::cb2_w)); // unsupported by RTC emulation
-
- MB8876(config, m_fdc, 16_MHz_XTAL / 16);
- FLOPPY_CONNECTOR(config, "fdc:0", v6809_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "fdc:1", v6809_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
-}
-
-/* ROM definition */
-ROM_START( v6809 )
- ROM_REGION( 0x0800, "maincpu", 0 )
- ROM_SYSTEM_BIOS(0, "v1", "Original")
- ROMX_LOAD( "v6809.rom", 0x0000, 0x0800, CRC(54bf5f32) SHA1(10d1d70f0b51e2b90e5c29249d3eab4c6b0033a1), ROM_BIOS(0))
- ROM_SYSTEM_BIOS(1, "v3", "Ver 3.3")
- ROMX_LOAD( "v6809v3.bin", 0x0000, 0x0800, CRC(f9cd126d) SHA1(2da719820e393efde801057d76b2a63dcfbd8541), ROM_BIOS(1))
- /* character generator not dumped, using the one from 'h19' for now */
- ROM_REGION( 0x1000, "chargen", 0 )
- ROM_LOAD( "2716_444-29_h19font.bin", 0x0000, 0x0800, BAD_DUMP CRC(d595ac1d) SHA1(130fb4ea8754106340c318592eec2d8a0deaf3d0))
- ROM_RELOAD(0x0800, 0x0800)
-ROM_END
-
-} // anonymous namespace
-
-
-/* Driver */
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1982, v6809, 0, 0, v6809, v6809, v6809_state, empty_init, "Microkit", "Vegas 6809", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )