mirror of
https://github.com/holub/mame
synced 2025-10-08 09:30:17 +03:00
tmc600: Fixed printer handshake, RAM/ROM region sizes, and implemented video according to actual hardware. [Curt Coder]
This commit is contained in:
parent
c10dd36e84
commit
ee277264e2
@ -50,30 +50,30 @@ Notes:
|
|||||||
CN2 - 10x2 pin printer connector [TMC-700]
|
CN2 - 10x2 pin printer connector [TMC-700]
|
||||||
CN3 - 32x3 pin EURO connector
|
CN3 - 32x3 pin EURO connector
|
||||||
CN4 - DIN5D tape connector
|
CN4 - DIN5D tape connector
|
||||||
1 input (500 mV / 47 kohm)
|
1 input (500 mV / 47 Kohm)
|
||||||
2 GND
|
2 GND
|
||||||
3 output (580 mV / 47 kohm)
|
3 output (580 mV / 47 Kohm)
|
||||||
4 input (500 mV / 47 kohm)
|
4 input (500 mV / 47 Kohm)
|
||||||
5 output (580 mV / 47 kohm)
|
5 output (580 mV / 47 Kohm)
|
||||||
CN5 - DIN5X video connector
|
CN5 - DIN5X video connector
|
||||||
1 GND
|
1 GND
|
||||||
2 GND
|
2 GND
|
||||||
3 ?
|
3 composite video output (75 ohm)
|
||||||
4 GND
|
4 GND
|
||||||
5 ?
|
5 composite video output (75 ohm)
|
||||||
CN6 - DIN2 power connector
|
CN6 - DIN2 power connector
|
||||||
1 8..12V DC..400Hz 300mA
|
1 input 8..12V DC..400Hz 300mA
|
||||||
2 GND
|
2 GND
|
||||||
CN7 - DIN5D audio connector [TMCP-300]
|
CN7 - DIN5D audio connector [TMCP-300]
|
||||||
1 NC
|
1 N/C
|
||||||
2 GND
|
2 GND
|
||||||
3 AUDIO
|
3 mono audio output
|
||||||
4 NC
|
4 N/C
|
||||||
5 AUDIO
|
5 mono audio output
|
||||||
CN8 - 10x2 pin keyboard connector
|
CN8 - 10x2 pin keyboard connector
|
||||||
SW1 - RUN/STOP switch
|
SW1 - RUN/STOP switch (left=run, right=stop)
|
||||||
SW2 - internal speaker/external audio switch [TMCP-300]
|
SW2 - internal speaker/external audio switch [TMCP-300]
|
||||||
P1 - color phase lock adjustment
|
P1 - color phase lock adjustment potentiometer
|
||||||
C1 - dot oscillator adjustment variable capacitor
|
C1 - dot oscillator adjustment variable capacitor
|
||||||
C2 - chroma oscillator adjustment variable capacitor
|
C2 - chroma oscillator adjustment variable capacitor
|
||||||
T1 - RF signal strength adjustment potentiometer [TMC-700]
|
T1 - RF signal strength adjustment potentiometer [TMC-700]
|
||||||
@ -88,37 +88,43 @@ Notes:
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
TODO:
|
TODO
|
||||||
|
|
||||||
- proper emulation of the VISMAC interface (cursor blinking, color RAM), schematics are needed
|
- real time clock
|
||||||
- disk interface
|
- connect expansion bus
|
||||||
- serial interface expansion card
|
|
||||||
- centronics printer handshaking
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "includes/tmc600.h"
|
#include "includes/tmc600.h"
|
||||||
|
|
||||||
/* Read/Write Handlers */
|
WRITE8_MEMBER( tmc600_state::printer_w )
|
||||||
|
|
||||||
WRITE8_MEMBER( tmc600_state::keyboard_latch_w )
|
|
||||||
{
|
{
|
||||||
m_keylatch = data;
|
m_centronics->write_data0(BIT(data, 0));
|
||||||
|
m_centronics->write_data1(BIT(data, 1));
|
||||||
|
m_centronics->write_data2(BIT(data, 2));
|
||||||
|
m_centronics->write_data3(BIT(data, 3));
|
||||||
|
m_centronics->write_data4(BIT(data, 4));
|
||||||
|
m_centronics->write_data5(BIT(data, 5));
|
||||||
|
m_centronics->write_data6(BIT(data, 6));
|
||||||
|
m_centronics->write_data7(BIT(data, 7));
|
||||||
|
|
||||||
|
m_centronics->write_strobe(0);
|
||||||
|
m_centronics->write_strobe(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Memory Maps */
|
/* Memory Maps */
|
||||||
|
|
||||||
static ADDRESS_MAP_START( tmc600_map, AS_PROGRAM, 8, tmc600_state )
|
static ADDRESS_MAP_START( tmc600_map, AS_PROGRAM, 8, tmc600_state )
|
||||||
AM_RANGE(0x0000, 0x4fff) AM_ROM
|
AM_RANGE(0x0000, 0x5fff) AM_ROM
|
||||||
AM_RANGE(0x6000, 0xbfff) AM_RAM
|
AM_RANGE(0x6000, 0x7fff) AM_RAM
|
||||||
AM_RANGE(0xf400, 0xf7ff) AM_DEVICE(CDP1869_TAG, cdp1869_device, char_map)
|
AM_RANGE(0xf400, 0xf7ff) AM_DEVICE(CDP1869_TAG, cdp1869_device, char_map)
|
||||||
AM_RANGE(0xf800, 0xffff) AM_DEVICE(CDP1869_TAG, cdp1869_device, page_map)
|
AM_RANGE(0xf800, 0xffff) AM_DEVICE(CDP1869_TAG, cdp1869_device, page_map)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static ADDRESS_MAP_START( tmc600_io_map, AS_IO, 8, tmc600_state )
|
static ADDRESS_MAP_START( tmc600_io_map, AS_IO, 8, tmc600_state )
|
||||||
AM_RANGE(0x03, 0x03) AM_WRITE(keyboard_latch_w)
|
AM_RANGE(0x03, 0x03) AM_DEVWRITE(CDP1852_KB_TAG, cdp1852_device, write)
|
||||||
AM_RANGE(0x04, 0x04) AM_DEVWRITE("cent_data_out", output_latch_device, write)
|
AM_RANGE(0x04, 0x04) AM_DEVWRITE(CDP1852_TMC700_TAG, cdp1852_device, write)
|
||||||
AM_RANGE(0x05, 0x05) AM_WRITE(vismac_data_w)
|
AM_RANGE(0x05, 0x05) AM_WRITE(vismac_data_w)
|
||||||
// AM_RANGE(0x06, 0x06) AM_WRITE(floppy_w)
|
// AM_RANGE(0x06, 0x06) AM_WRITE(floppy_w)
|
||||||
AM_RANGE(0x07, 0x07) AM_WRITE(vismac_register_w)
|
AM_RANGE(0x07, 0x07) AM_WRITE(vismac_register_w)
|
||||||
@ -208,16 +214,11 @@ static INPUT_PORTS_START( tmc600 )
|
|||||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
|
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
|
||||||
|
|
||||||
PORT_START("RUN")
|
PORT_START("RUN")
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Run/Stop") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_TOGGLE
|
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Run/Stop") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_TOGGLE PORT_WRITE_LINE_DEVICE_MEMBER(CDP1802_TAG, cosmac_device, clear_w)
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
/* CDP1802 Interface */
|
/* CDP1802 Interface */
|
||||||
|
|
||||||
READ_LINE_MEMBER( tmc600_state::clear_r )
|
|
||||||
{
|
|
||||||
return BIT(m_run->read(), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
READ_LINE_MEMBER( tmc600_state::ef2_r )
|
READ_LINE_MEMBER( tmc600_state::ef2_r )
|
||||||
{
|
{
|
||||||
return m_cassette->input() < 0;
|
return m_cassette->input() < 0;
|
||||||
@ -225,9 +226,9 @@ READ_LINE_MEMBER( tmc600_state::ef2_r )
|
|||||||
|
|
||||||
READ_LINE_MEMBER( tmc600_state::ef3_r )
|
READ_LINE_MEMBER( tmc600_state::ef3_r )
|
||||||
{
|
{
|
||||||
uint8_t data = ~m_key_row[m_keylatch / 8]->read();
|
uint8_t keylatch = m_bwio->do_r();
|
||||||
|
|
||||||
return BIT(data, m_keylatch % 8);
|
return !BIT(m_key_row[(keylatch >> 3) & 0x07]->read(), keylatch & 0x07);
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( tmc600_state::q_w )
|
WRITE_LINE_MEMBER( tmc600_state::q_w )
|
||||||
@ -235,37 +236,14 @@ WRITE_LINE_MEMBER( tmc600_state::q_w )
|
|||||||
m_cassette->output(state ? +1.0 : -1.0);
|
m_cassette->output(state ? +1.0 : -1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Machine Initialization */
|
|
||||||
|
|
||||||
void tmc600_state::machine_start()
|
|
||||||
{
|
|
||||||
address_space &program = m_maincpu->space(AS_PROGRAM);
|
|
||||||
|
|
||||||
/* configure RAM */
|
|
||||||
switch (m_ram->size())
|
|
||||||
{
|
|
||||||
case 8*1024:
|
|
||||||
program.unmap_readwrite(0x8000, 0xbfff);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 16*1024:
|
|
||||||
program.unmap_readwrite(0xa000, 0xbfff);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* register for state saving */
|
|
||||||
save_item(NAME(m_keylatch));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Machine Drivers */
|
/* Machine Drivers */
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( tmc600 )
|
static MACHINE_CONFIG_START( tmc600 )
|
||||||
// basic system hardware
|
// CPU
|
||||||
MCFG_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_3_57MHz)
|
MCFG_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_3_57MHz)
|
||||||
MCFG_CPU_PROGRAM_MAP(tmc600_map)
|
MCFG_CPU_PROGRAM_MAP(tmc600_map)
|
||||||
MCFG_CPU_IO_MAP(tmc600_io_map)
|
MCFG_CPU_IO_MAP(tmc600_io_map)
|
||||||
MCFG_COSMAC_WAIT_CALLBACK(VCC)
|
MCFG_COSMAC_WAIT_CALLBACK(VCC)
|
||||||
MCFG_COSMAC_CLEAR_CALLBACK(READLINE(tmc600_state, clear_r))
|
|
||||||
MCFG_COSMAC_EF2_CALLBACK(READLINE(tmc600_state, ef2_r))
|
MCFG_COSMAC_EF2_CALLBACK(READLINE(tmc600_state, ef2_r))
|
||||||
MCFG_COSMAC_EF3_CALLBACK(READLINE(tmc600_state, ef3_r))
|
MCFG_COSMAC_EF3_CALLBACK(READLINE(tmc600_state, ef3_r))
|
||||||
MCFG_COSMAC_Q_CALLBACK(WRITELINE(tmc600_state, q_w))
|
MCFG_COSMAC_Q_CALLBACK(WRITELINE(tmc600_state, q_w))
|
||||||
@ -273,43 +251,66 @@ static MACHINE_CONFIG_START( tmc600 )
|
|||||||
// sound and video hardware
|
// sound and video hardware
|
||||||
MCFG_FRAGMENT_ADD(tmc600_video)
|
MCFG_FRAGMENT_ADD(tmc600_video)
|
||||||
|
|
||||||
/* devices */
|
// keyboard output latch
|
||||||
MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, "printer")
|
MCFG_DEVICE_ADD(CDP1852_KB_TAG, CDP1852, XTAL_3_57MHz/8) // clock is CDP1802 TPB
|
||||||
|
MCFG_CDP1852_MODE_CALLBACK(VCC)
|
||||||
|
|
||||||
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", CENTRONICS_TAG)
|
// address bus demux for expansion bus
|
||||||
|
MCFG_DEVICE_ADD(CDP1852_BUS_TAG, CDP1852, 0) // clock is expansion bus TPA
|
||||||
|
MCFG_CDP1852_MODE_CALLBACK(GND)
|
||||||
|
|
||||||
|
// printer output latch
|
||||||
|
MCFG_DEVICE_ADD(CDP1852_TMC700_TAG, CDP1852, XTAL_3_57MHz/8) // clock is CDP1802 TPB
|
||||||
|
MCFG_CDP1852_MODE_CALLBACK(VCC)
|
||||||
|
MCFG_CDP1852_DO_CALLBACK(WRITE8(tmc600_state, printer_w))
|
||||||
|
|
||||||
|
// printer connector
|
||||||
|
MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, nullptr)
|
||||||
|
MCFG_CENTRONICS_BUSY_HANDLER(DEVWRITELINE(CDP1802_TAG, cosmac_device, ef4_w)) MCFG_DEVCB_XOR(1)
|
||||||
|
|
||||||
|
// cassette
|
||||||
MCFG_CASSETTE_ADD("cassette")
|
MCFG_CASSETTE_ADD("cassette")
|
||||||
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
|
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
|
||||||
|
|
||||||
/* internal ram */
|
// expansion bus connector
|
||||||
|
MCFG_TMC600_EURO_BUS_SLOT_ADD(TMC600_EURO_BUS_TAG, tmc600_euro_bus_cards, nullptr)
|
||||||
|
|
||||||
|
// internal RAM
|
||||||
MCFG_RAM_ADD(RAM_TAG)
|
MCFG_RAM_ADD(RAM_TAG)
|
||||||
MCFG_RAM_DEFAULT_SIZE("8K")
|
MCFG_RAM_DEFAULT_SIZE("8K")
|
||||||
MCFG_RAM_EXTRA_OPTIONS("16K,24K")
|
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
/* ROMs */
|
/* ROMs */
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
ROM_START( tmc600s1 )
|
ROM_START( tmc600s1 )
|
||||||
ROM_REGION( 0x5000, CDP1802_TAG, 0 )
|
ROM_REGION( 0x6000, CDP1802_TAG, 0 )
|
||||||
ROM_LOAD( "sb20", 0x0000, 0x1000, NO_DUMP )
|
ROM_LOAD( "sb20", 0x0000, 0x1000, NO_DUMP )
|
||||||
ROM_LOAD( "sb21", 0x1000, 0x1000, NO_DUMP )
|
ROM_LOAD( "sb21", 0x1000, 0x1000, NO_DUMP )
|
||||||
ROM_LOAD( "sb22", 0x2000, 0x1000, NO_DUMP )
|
ROM_LOAD( "sb22", 0x2000, 0x1000, NO_DUMP )
|
||||||
ROM_LOAD( "sb23", 0x3000, 0x1000, NO_DUMP )
|
ROM_LOAD( "sb23", 0x3000, 0x1000, NO_DUMP )
|
||||||
ROM_LOAD( "190482_2", 0x4000, 0x1000, NO_DUMP )
|
ROM_SYSTEM_BIOS( 0, "sb040282", "SB040282" )
|
||||||
|
ROMX_LOAD( "190482", 0x4000, 0x1000, NO_DUMP, ROM_BIOS(1) )
|
||||||
|
ROM_SYSTEM_BIOS( 1, "sbdos", "SBDOS" )
|
||||||
|
ROMX_LOAD( "190482_", 0x4000, 0x1000, NO_DUMP, ROM_BIOS(2) )
|
||||||
|
ROMX_LOAD( "190482_v", 0x5000, 0x1000, NO_DUMP, ROM_BIOS(2) )
|
||||||
|
|
||||||
ROM_REGION( 0x1000, "chargen", 0 )
|
ROM_REGION( 0x1000, "chargen", 0 )
|
||||||
ROM_LOAD( "chargen", 0x0000, 0x1000, NO_DUMP )
|
ROM_LOAD( "chargen", 0x0000, 0x1000, CRC(93f92cbf) SHA1(371156fb38fa5319c6fde537ccf14eed94e7adfb) )
|
||||||
ROM_END
|
ROM_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ROM_START( tmc600s2 )
|
ROM_START( tmc600s2 )
|
||||||
ROM_REGION( 0x5000, CDP1802_TAG, 0 )
|
ROM_REGION( 0x6000, CDP1802_TAG, 0 )
|
||||||
ROM_LOAD( "sb30", 0x0000, 0x1000, CRC(95d1292a) SHA1(1fa52d59d3005f8ac74a32c2164fdb22947c2748) )
|
ROM_LOAD( "sb30", 0x0000, 0x1000, CRC(95d1292a) SHA1(1fa52d59d3005f8ac74a32c2164fdb22947c2748) )
|
||||||
ROM_LOAD( "sb31", 0x1000, 0x1000, CRC(2c8f3d17) SHA1(f14e8adbcddeaeaa29b1e7f3dfa741f4e230f599) )
|
ROM_LOAD( "sb31", 0x1000, 0x1000, CRC(2c8f3d17) SHA1(f14e8adbcddeaeaa29b1e7f3dfa741f4e230f599) )
|
||||||
ROM_LOAD( "sb32", 0x2000, 0x1000, CRC(dd58a128) SHA1(be9bdb0fc5e0cc3dcc7f2fb7ccab69bf5b043803) )
|
ROM_LOAD( "sb32", 0x2000, 0x1000, CRC(dd58a128) SHA1(be9bdb0fc5e0cc3dcc7f2fb7ccab69bf5b043803) )
|
||||||
ROM_LOAD( "sb33", 0x3000, 0x1000, CRC(b7d241fa) SHA1(6f3eadf86c4e3aaf93d123e302a18dc4d9db964b) )
|
ROM_LOAD( "sb33", 0x3000, 0x1000, CRC(b7d241fa) SHA1(6f3eadf86c4e3aaf93d123e302a18dc4d9db964b) )
|
||||||
ROM_LOAD( "151182", 0x4000, 0x1000, CRC(c1a8d9d8) SHA1(4552e1f06d0e338ba7b0f1c3a20b8a51c27dafde) )
|
ROM_SYSTEM_BIOS( 0, "sb040282", "SB040282" )
|
||||||
|
ROMX_LOAD( "151182", 0x4000, 0x1000, CRC(c1a8d9d8) SHA1(4552e1f06d0e338ba7b0f1c3a20b8a51c27dafde), ROM_BIOS(1) )
|
||||||
|
ROM_SYSTEM_BIOS( 1, "sbdos", "SBDOS" )
|
||||||
|
ROMX_LOAD( "151182_", 0x4000, 0x1000, NO_DUMP, ROM_BIOS(2) )
|
||||||
|
ROMX_LOAD( "151182_v", 0x5000, 0x1000, NO_DUMP, ROM_BIOS(2) )
|
||||||
|
|
||||||
ROM_REGION( 0x1000, "chargen", 0 )
|
ROM_REGION( 0x1000, "chargen", 0 )
|
||||||
ROM_LOAD( "chargen", 0x0000, 0x1000, CRC(93f92cbf) SHA1(371156fb38fa5319c6fde537ccf14eed94e7adfb) )
|
ROM_LOAD( "chargen", 0x0000, 0x1000, CRC(93f92cbf) SHA1(371156fb38fa5319c6fde537ccf14eed94e7adfb) )
|
||||||
|
@ -9,15 +9,20 @@
|
|||||||
#include "imagedev/cassette.h"
|
#include "imagedev/cassette.h"
|
||||||
#include "imagedev/snapquik.h"
|
#include "imagedev/snapquik.h"
|
||||||
#include "bus/centronics/ctronics.h"
|
#include "bus/centronics/ctronics.h"
|
||||||
|
#include "bus/tmc600/euro.h"
|
||||||
|
#include "machine/cdp1852.h"
|
||||||
#include "machine/ram.h"
|
#include "machine/ram.h"
|
||||||
#include "machine/timer.h"
|
#include "machine/timer.h"
|
||||||
#include "sound/cdp1869.h"
|
#include "sound/cdp1869.h"
|
||||||
#include "speaker.h"
|
#include "speaker.h"
|
||||||
|
|
||||||
#define SCREEN_TAG "screen"
|
#define SCREEN_TAG "screen"
|
||||||
#define CDP1802_TAG "cdp1802"
|
#define CDP1802_TAG "cdp1802"
|
||||||
#define CDP1869_TAG "cdp1869"
|
#define CDP1869_TAG "cdp1869"
|
||||||
#define CENTRONICS_TAG "centronics"
|
#define CDP1852_KB_TAG "cdp1852_kb"
|
||||||
|
#define CDP1852_BUS_TAG "cdp1852_bus"
|
||||||
|
#define CDP1852_TMC700_TAG "cdp1852_printer"
|
||||||
|
#define CENTRONICS_TAG "centronics"
|
||||||
|
|
||||||
#define TMC600_PAGE_RAM_SIZE 0x400
|
#define TMC600_PAGE_RAM_SIZE 0x400
|
||||||
#define TMC600_PAGE_RAM_MASK 0x3ff
|
#define TMC600_PAGE_RAM_MASK 0x3ff
|
||||||
@ -29,8 +34,10 @@ public:
|
|||||||
driver_device(mconfig, type, tag),
|
driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, CDP1802_TAG),
|
m_maincpu(*this, CDP1802_TAG),
|
||||||
m_vis(*this, CDP1869_TAG),
|
m_vis(*this, CDP1869_TAG),
|
||||||
|
m_bwio(*this, CDP1852_KB_TAG),
|
||||||
m_cassette(*this, "cassette"),
|
m_cassette(*this, "cassette"),
|
||||||
m_centronics(*this, "centronics"),
|
m_centronics(*this, "centronics"),
|
||||||
|
m_bus(*this, TMC600_EURO_BUS_TAG),
|
||||||
m_ram(*this, RAM_TAG),
|
m_ram(*this, RAM_TAG),
|
||||||
m_char_rom(*this, "chargen"),
|
m_char_rom(*this, "chargen"),
|
||||||
m_page_ram(*this, "page_ram"),
|
m_page_ram(*this, "page_ram"),
|
||||||
@ -41,8 +48,10 @@ public:
|
|||||||
|
|
||||||
required_device<cosmac_device> m_maincpu;
|
required_device<cosmac_device> m_maincpu;
|
||||||
required_device<cdp1869_device> m_vis;
|
required_device<cdp1869_device> m_vis;
|
||||||
|
required_device<cdp1852_device> m_bwio;
|
||||||
required_device<cassette_image_device> m_cassette;
|
required_device<cassette_image_device> m_cassette;
|
||||||
required_device<centronics_device> m_centronics;
|
required_device<centronics_device> m_centronics;
|
||||||
|
required_device<tmc600_euro_bus_slot_t> m_bus;
|
||||||
required_device<ram_device> m_ram;
|
required_device<ram_device> m_ram;
|
||||||
required_region_ptr<uint8_t> m_char_rom;
|
required_region_ptr<uint8_t> m_char_rom;
|
||||||
required_shared_ptr<uint8_t> m_page_ram;
|
required_shared_ptr<uint8_t> m_page_ram;
|
||||||
@ -50,11 +59,9 @@ public:
|
|||||||
required_ioport m_run;
|
required_ioport m_run;
|
||||||
required_ioport_array<8> m_key_row;
|
required_ioport_array<8> m_key_row;
|
||||||
|
|
||||||
virtual void machine_start() override;
|
|
||||||
|
|
||||||
virtual void video_start() override;
|
virtual void video_start() override;
|
||||||
|
|
||||||
DECLARE_WRITE8_MEMBER( keyboard_latch_w );
|
DECLARE_WRITE8_MEMBER( printer_w );
|
||||||
DECLARE_WRITE8_MEMBER( vismac_register_w );
|
DECLARE_WRITE8_MEMBER( vismac_register_w );
|
||||||
DECLARE_WRITE8_MEMBER( vismac_data_w );
|
DECLARE_WRITE8_MEMBER( vismac_data_w );
|
||||||
DECLARE_WRITE8_MEMBER( page_ram_w );
|
DECLARE_WRITE8_MEMBER( page_ram_w );
|
||||||
@ -62,17 +69,15 @@ public:
|
|||||||
DECLARE_READ_LINE_MEMBER( ef2_r );
|
DECLARE_READ_LINE_MEMBER( ef2_r );
|
||||||
DECLARE_READ_LINE_MEMBER( ef3_r );
|
DECLARE_READ_LINE_MEMBER( ef3_r );
|
||||||
DECLARE_WRITE_LINE_MEMBER( q_w );
|
DECLARE_WRITE_LINE_MEMBER( q_w );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( prd_w );
|
||||||
|
|
||||||
uint8_t get_color(uint16_t pma);
|
uint8_t get_color(uint16_t pma);
|
||||||
|
|
||||||
// video state
|
// video state
|
||||||
int m_vismac_reg_latch; // video register latch
|
int m_vismac_reg_latch; // video register latch
|
||||||
int m_vismac_color_latch; // color latch
|
int m_vismac_color_latch; // color latch
|
||||||
int m_vismac_bkg_latch; // background color latch
|
bool m_blink; // cursor blink
|
||||||
int m_blink; // cursor blink
|
int m_frame;
|
||||||
|
|
||||||
// keyboard state
|
|
||||||
int m_keylatch; // key latch
|
|
||||||
|
|
||||||
TIMER_DEVICE_CALLBACK_MEMBER(blink_tick);
|
TIMER_DEVICE_CALLBACK_MEMBER(blink_tick);
|
||||||
CDP1869_CHAR_RAM_READ_MEMBER(tmc600_char_ram_r);
|
CDP1869_CHAR_RAM_READ_MEMBER(tmc600_char_ram_r);
|
||||||
|
@ -5,50 +5,24 @@
|
|||||||
|
|
||||||
WRITE8_MEMBER( tmc600_state::vismac_register_w )
|
WRITE8_MEMBER( tmc600_state::vismac_register_w )
|
||||||
{
|
{
|
||||||
m_vismac_reg_latch = data;
|
m_vismac_reg_latch = data >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER( tmc600_state::vismac_data_w )
|
WRITE8_MEMBER( tmc600_state::vismac_data_w )
|
||||||
{
|
{
|
||||||
uint16_t ma = m_maincpu->get_memory_address();
|
uint16_t ma = m_maincpu->get_memory_address();
|
||||||
|
|
||||||
switch (m_vismac_reg_latch)
|
switch (m_vismac_reg_latch & 0x07)
|
||||||
{
|
{
|
||||||
case 0x20:
|
case 2: m_vismac_color_latch = data & 0x0f; break;
|
||||||
// character color latch
|
case 3: m_vis->out3_w(space, ma, data); break;
|
||||||
m_vismac_color_latch = data;
|
case 4: m_vis->out4_w(space, ma, data); break;
|
||||||
break;
|
case 5: m_vis->out5_w(space, ma, data); break;
|
||||||
|
case 6: m_vis->out6_w(space, ma, data); break;
|
||||||
case 0x30:
|
case 7: m_vis->out7_w(space, ma, data); break;
|
||||||
// background color latch
|
|
||||||
m_vismac_bkg_latch = data & 0x07;
|
|
||||||
|
|
||||||
m_vis->out3_w(space, ma, data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x40:
|
|
||||||
m_vis->out4_w(space, ma, data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x50:
|
|
||||||
m_vis->out5_w(space, ma, data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x60:
|
|
||||||
m_vis->out6_w(space, ma, data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x70:
|
|
||||||
m_vis->out7_w(space, ma, data);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_DEVICE_CALLBACK_MEMBER(tmc600_state::blink_tick)
|
|
||||||
{
|
|
||||||
m_blink = !m_blink;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t tmc600_state::get_color(uint16_t pma)
|
uint8_t tmc600_state::get_color(uint16_t pma)
|
||||||
{
|
{
|
||||||
uint16_t pageaddr = pma & TMC600_PAGE_RAM_MASK;
|
uint16_t pageaddr = pma & TMC600_PAGE_RAM_MASK;
|
||||||
@ -56,7 +30,7 @@ uint8_t tmc600_state::get_color(uint16_t pma)
|
|||||||
|
|
||||||
if (BIT(color, 3) && m_blink)
|
if (BIT(color, 3) && m_blink)
|
||||||
{
|
{
|
||||||
color = m_vismac_bkg_latch;
|
color ^= 0x07;
|
||||||
}
|
}
|
||||||
|
|
||||||
return color;
|
return color;
|
||||||
@ -93,15 +67,28 @@ CDP1869_PCB_READ_MEMBER( tmc600_state::tmc600_pcb_r )
|
|||||||
return BIT(color, 0);
|
return BIT(color, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER( tmc600_state::prd_w )
|
||||||
|
{
|
||||||
|
if (state) {
|
||||||
|
m_frame++;
|
||||||
|
|
||||||
|
if (m_frame == 32) {
|
||||||
|
m_frame = 0;
|
||||||
|
|
||||||
|
m_blink = !m_blink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void tmc600_state::video_start()
|
void tmc600_state::video_start()
|
||||||
{
|
{
|
||||||
// allocate memory
|
// allocate memory
|
||||||
m_color_ram.allocate(TMC600_PAGE_RAM_SIZE);
|
m_color_ram.allocate(TMC600_PAGE_RAM_SIZE);
|
||||||
|
|
||||||
// register for state saving
|
// state saving
|
||||||
save_item(NAME(m_vismac_reg_latch));
|
save_item(NAME(m_vismac_reg_latch));
|
||||||
save_item(NAME(m_vismac_color_latch));
|
save_item(NAME(m_vismac_color_latch));
|
||||||
save_item(NAME(m_vismac_bkg_latch));
|
save_item(NAME(m_frame));
|
||||||
save_item(NAME(m_blink));
|
save_item(NAME(m_blink));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +112,6 @@ GFXDECODE_END
|
|||||||
MACHINE_CONFIG_START( tmc600_video )
|
MACHINE_CONFIG_START( tmc600_video )
|
||||||
// video hardware
|
// video hardware
|
||||||
MCFG_CDP1869_SCREEN_PAL_ADD(CDP1869_TAG, SCREEN_TAG, cdp1869_device::DOT_CLK_PAL)
|
MCFG_CDP1869_SCREEN_PAL_ADD(CDP1869_TAG, SCREEN_TAG, cdp1869_device::DOT_CLK_PAL)
|
||||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("blink", tmc600_state, blink_tick, attotime::from_hz(2))
|
|
||||||
|
|
||||||
MCFG_GFXDECODE_ADD("gfxdecode", CDP1869_TAG":palette", tmc600)
|
MCFG_GFXDECODE_ADD("gfxdecode", CDP1869_TAG":palette", tmc600)
|
||||||
|
|
||||||
@ -136,6 +122,7 @@ MACHINE_CONFIG_START( tmc600_video )
|
|||||||
MCFG_CDP1869_CHAR_PCB_READ_OWNER(tmc600_state, tmc600_pcb_r)
|
MCFG_CDP1869_CHAR_PCB_READ_OWNER(tmc600_state, tmc600_pcb_r)
|
||||||
MCFG_CDP1869_CHAR_RAM_READ_OWNER(tmc600_state, tmc600_char_ram_r)
|
MCFG_CDP1869_CHAR_RAM_READ_OWNER(tmc600_state, tmc600_char_ram_r)
|
||||||
MCFG_CDP1869_PAL_NTSC_CALLBACK(VCC)
|
MCFG_CDP1869_PAL_NTSC_CALLBACK(VCC)
|
||||||
|
MCFG_CDP1869_PRD_CALLBACK(WRITELINE(tmc600_state, prd_w))
|
||||||
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
|
MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
Loading…
Reference in New Issue
Block a user