summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/tv950.cpp148
1 files changed, 127 insertions, 21 deletions
diff --git a/src/mame/drivers/tv950.cpp b/src/mame/drivers/tv950.cpp
index 7fe87623194..a84031817ba 100644
--- a/src/mame/drivers/tv950.cpp
+++ b/src/mame/drivers/tv950.cpp
@@ -1,20 +1,55 @@
// license:BSD-3-Clause
-// copyright-holders:Robbbert
+// copyright-holders:R. Belmont, Robbbert
/***************************************************************************
2013-09-10 Skeleton driver for Televideo TV950
+ 2016-07-30 Preliminary not-so-skeleton driver
TODO:
- - Everything - this is just a skeleton
-
- Seems there should be a few more roms.
-
-
+ - Keyboard
+ - CRTC reset and drawing
+
+ Hardware:
+ 6502 CPU
+ 6545 CRTC
+ 6522 VIA, wired to count HSYNCs and to enable the 6502 to pull RESET on the CRTC
+ 3x 6551 ACIA 1 for the keyboard, 1 for the modem port, 1 for the printer port
+
+ VIA hookup (see schematics):
+ PA3 = beep?
+ PA5 = inverse video
+ PA6 = IRQ in
+ PA7 = force blank
+ PB6 = Hblank in
+ CA1 = reset CRTC in
+ CA2 = reset CRTC out
+ CB2 = blink timer
+
+ IRQ = ACIAs (all 3 ORed together)
+ NMI = 6522 VIA's IRQ line
+
+ http://www.bitsavers.org/pdf/televideo/950/Model_950_Terminal_Theory_of_Operation_26Jan1981.pdf
+ http://www.bitsavers.org/pdf/televideo/950/2002100_Model_950_Maintenance_Manual_Nov1983.pdf
+ http://www.bitsavers.org/pdf/televideo/950/B300002-001_Model_950_Operators_Manual_Feb81.pdf
+
****************************************************************************/
#include "emu.h"
#include "cpu/m6502/m6502.h"
+#include "video/mc6845.h"
+#include "machine/6522via.h"
+#include "machine/mos6551.h"
+#include "bus/rs232/rs232.h"
+#define ACIA1_TAG "acia1"
+#define ACIA2_TAG "acia2"
+#define ACIA3_TAG "acia3"
+#define CRTC_TAG "crtc"
+#define VIA_TAG "via"
+#define RS232A_TAG "rs232a"
+#define RS232B_TAG "rs232b"
+
+#define MASTER_CLOCK (23814000)
class tv950_state : public driver_device
{
@@ -22,20 +57,39 @@ public:
tv950_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_via(*this, VIA_TAG)
+ , m_crtc(*this, CRTC_TAG)
+ , m_vram(*this, "vram")
{ }
+ MC6845_UPDATE_ROW(crtc_update_row);
+ MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr);
+
+ DECLARE_WRITE8_MEMBER(row_addr_w);
+ DECLARE_WRITE_LINE_MEMBER(via_crtc_reset_w);
+
private:
virtual void machine_reset() override;
- required_device<cpu_device> m_maincpu;
+ required_device<m6502_device> m_maincpu;
+ required_device<via6522_device> m_via;
+ required_device<r6545_1_device> m_crtc;
+ required_shared_ptr<UINT8> m_vram;
+
+ int m_row_addr;
};
static ADDRESS_MAP_START(tv950_mem, AS_PROGRAM, 8, tv950_state)
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0xefff) AM_RAM
- AM_RANGE(0xf000, 0xffff) AM_ROM
-ADDRESS_MAP_END
-
-static ADDRESS_MAP_START(tv950_io, AS_IO, 8, tv950_state)
+ AM_RANGE(0x0000, 0x07ff) AM_RAM
+ AM_RANGE(0x2000, 0x3fff) AM_RAM AM_SHARE("vram") // VRAM
+ AM_RANGE(0x8000, 0x8100) AM_DEVREADWRITE(CRTC_TAG, r6545_1_device, status_r, address_w)
+ AM_RANGE(0x8001, 0x8101) AM_DEVREADWRITE(CRTC_TAG, r6545_1_device, register_r, register_w)
+ AM_RANGE(0x9000, 0x9000) AM_WRITE(row_addr_w)
+ AM_RANGE(0x9300, 0x9303) AM_DEVREADWRITE(ACIA1_TAG, mos6551_device, read, write)
+ AM_RANGE(0x9500, 0x9503) AM_DEVREADWRITE(ACIA2_TAG, mos6551_device, read, write)
+ AM_RANGE(0x9900, 0x9903) AM_DEVREADWRITE(ACIA3_TAG, mos6551_device, read, write)
+ AM_RANGE(0xb100, 0xb10f) AM_DEVREADWRITE(VIA_TAG, via6522_device, read, write)
+ AM_RANGE(0xe000, 0xffff) AM_ROM AM_REGION("maincpu", 0)
ADDRESS_MAP_END
@@ -48,23 +102,75 @@ void tv950_state::machine_reset()
{
}
+WRITE_LINE_MEMBER(tv950_state::via_crtc_reset_w)
+{
+ //printf("via_crtc_reset_w: %d\n", state);
+ m_via->write_ca1(state);
+
+ if (!state)
+ {
+ //m_crtc->device_reset();
+ }
+}
+
+WRITE8_MEMBER(tv950_state::row_addr_w)
+{
+ m_row_addr = data;
+}
+
+MC6845_ON_UPDATE_ADDR_CHANGED( tv950_state::crtc_update_addr )
+{
+}
+
+MC6845_UPDATE_ROW( tv950_state::crtc_update_row )
+{
+}
+
static MACHINE_CONFIG_START( tv950, tv950_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M6502, XTAL_2MHz)
+ MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK/14)
MCFG_CPU_PROGRAM_MAP(tv950_mem)
- MCFG_CPU_IO_MAP(tv950_io)
+
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 882, 0, 720, 370, 0, 350 ) // not real values
+ MCFG_SCREEN_UPDATE_DEVICE( CRTC_TAG, r6545_1_device, screen_update )
+
+ // there are many 6845 CRTC submodels, the Theory of Operation manual references the Rockwell R6545-1 specificially.
+ MCFG_MC6845_ADD(CRTC_TAG, R6545_1, "screen", MASTER_CLOCK/14)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(tv950_state, crtc_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(tv950_state, crtc_update_addr)
+ MCFG_MC6845_OUT_HSYNC_CB(DEVWRITELINE(VIA_TAG, via6522_device, write_pb6))
+
+ MCFG_DEVICE_ADD(VIA_TAG, VIA6522, MASTER_CLOCK/14)
+ MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M6502_NMI_LINE))
+ MCFG_VIA6522_CA2_HANDLER(WRITELINE(tv950_state, via_crtc_reset_w))
+
+ MCFG_DEVICE_ADD(ACIA1_TAG, MOS6551, 0)
+ MCFG_MOS6551_XTAL(MASTER_CLOCK/13)
+
+ MCFG_DEVICE_ADD(ACIA2_TAG, MOS6551, 0)
+ MCFG_MOS6551_XTAL(MASTER_CLOCK/13)
+
+ MCFG_DEVICE_ADD(ACIA3_TAG, MOS6551, 0)
+ MCFG_MOS6551_XTAL(MASTER_CLOCK/13)
MACHINE_CONFIG_END
/* ROM definition */
ROM_START( tv950 )
- ROM_REGION(0x10000, "maincpu", 0)
- ROM_SYSTEM_BIOS( 0, "8000043", "8000043")
- ROMX_LOAD( "tv-043h.rom", 0xf000, 0x1000, CRC(89b826be) SHA1(fd5575be04317682d0c9062702b5932b46f89926), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS( 1, "8000044", "8000044")
- ROMX_LOAD( "tv-044h.rom", 0xf000, 0x1000, CRC(24b0383d) SHA1(71cabb7f3da8652a36afdf3d505ab8a41651e801), ROM_BIOS(2) )
+ ROM_REGION(0x2000, "maincpu", 0)
+ ROM_LOAD( "180000-001a_a41_eb17.bin", 0x001000, 0x001000, CRC(b7187cc5) SHA1(41cc8fd51661314e03ee7e00cc1e206e9a694d92) )
+ ROM_LOAD( "180000-007a_a42_67d3.bin", 0x000000, 0x001000, CRC(3ef2e6fb) SHA1(21ccfd2b50c37b715eed67671b82faa4d75fc6bb) )
+
+ ROM_REGION(0x2000, "graphics", 0)
+ ROM_LOAD16_BYTE( "180000-002a_a33_9294.bin", 0x000001, 0x001000, CRC(eaf4f346) SHA1(b4c531626846f3f055ddc086ac24fdb1b34f3f8e) )
+ ROM_LOAD16_BYTE( "180000-003a_a32_7ebf.bin", 0x000000, 0x001000, CRC(783ca0b6) SHA1(1cec9a9a56ef5795809f7ca7cd2e3f61b27e698d) )
+
+ ROM_REGION(0x1000, "kbd", 0)
+ ROM_LOAD( "950kbd_8748_pn52080723-02.bin", 0x000000, 0x000400, CRC(11c8f22c) SHA1(99e73e9c74b10055733e89b92adbc5bf7f4ff338) )
ROM_END
/* Driver */
-
/* YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS */
-COMP( 198?, tv950, 0, 0, tv950, tv950, driver_device, 0, "Televideo", "TV950", MACHINE_IS_SKELETON )
+COMP( 1981, tv950, 0, 0, tv950, tv950, driver_device, 0, "TeleVideo", "TV950", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )