(MESS) cat.c: switched driver to use the new DUART n68681 core [Lord Nightmare]

This commit is contained in:
Jonathan Gevaryahu 2013-09-03 18:53:04 +00:00
parent 930e5b8cd0
commit 5253dbac24

View File

@ -255,7 +255,7 @@ ToDo:
// Includes // Includes
#include "emu.h" #include "emu.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "machine/68681.h" #include "machine/n68681.h"
#include "machine/nvram.h" #include "machine/nvram.h"
class cat_state : public driver_device class cat_state : public driver_device
@ -272,7 +272,7 @@ public:
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
//m_nvram(*this, "nvram"), // merge with svram? //m_nvram(*this, "nvram"), // merge with svram?
//m_duart(*this, "duart68681"), m_duart(*this, "duartn68681"),
//m_speaker(*this, "speaker"), //m_speaker(*this, "speaker"),
m_svram(*this, "svram"), // nvram m_svram(*this, "svram"), // nvram
m_p_videoram(*this, "p_videoram"), m_p_videoram(*this, "p_videoram"),
@ -289,7 +289,11 @@ public:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
//optional_device<nvram_device> m_nvram; //optional_device<nvram_device> m_nvram;
//required_device<68681_device> m_duart; optional_device<duartn68681_device> m_duart; // should be required once plumbed to the swyft
DECLARE_WRITE_LINE_MEMBER(cat_duart_irq_handler);
DECLARE_WRITE_LINE_MEMBER(cat_duart_txa);
DECLARE_READ8_MEMBER(cat_duart_input);
DECLARE_WRITE8_MEMBER(cat_duart_output);
//required_device<speaker_sound_device> m_speaker; //required_device<speaker_sound_device> m_speaker;
optional_shared_ptr<UINT16> m_svram; optional_shared_ptr<UINT16> m_svram;
required_shared_ptr<UINT16> m_p_videoram; required_shared_ptr<UINT16> m_p_videoram;
@ -344,6 +348,7 @@ public:
this causes the DUART to fire an interrupt, which makes the 68000 read this causes the DUART to fire an interrupt, which makes the 68000 read
the keyboard. the keyboard.
*/ */
UINT8 m_duart_irq_state;
UINT16 m_6ms_counter; UINT16 m_6ms_counter;
UINT8 m_video_enable; UINT8 m_video_enable;
UINT8 m_video_invert; UINT8 m_video_invert;
@ -697,7 +702,7 @@ static ADDRESS_MAP_START(cat_mem, AS_PROGRAM, 16, cat_state)
AM_RANGE(0x80000c, 0x80000d) AM_READ(cat_0080_r) AM_MIRROR(0x18FFE0) // Open bus? AM_RANGE(0x80000c, 0x80000d) AM_READ(cat_0080_r) AM_MIRROR(0x18FFE0) // Open bus?
AM_RANGE(0x80000e, 0x80000f) AM_READWRITE(cat_battery_r,cat_printer_control_w) AM_MIRROR(0x18FFE0) // Centronics Printer Control, keyboard led and country code enable AM_RANGE(0x80000e, 0x80000f) AM_READWRITE(cat_battery_r,cat_printer_control_w) AM_MIRROR(0x18FFE0) // Centronics Printer Control, keyboard led and country code enable
AM_RANGE(0x800010, 0x80001f) AM_READ(cat_0080_r) AM_MIRROR(0x18FFE0) // Open bus? AM_RANGE(0x800010, 0x80001f) AM_READ(cat_0080_r) AM_MIRROR(0x18FFE0) // Open bus?
AM_RANGE(0x810000, 0x81001f) AM_DEVREADWRITE8_LEGACY("duart68681", duart68681_r, duart68681_w, 0xff ) AM_MIRROR(0x18FFE0) AM_RANGE(0x810000, 0x81001f) AM_DEVREADWRITE8("duartn68681", duartn68681_device, read, write, 0xff ) AM_MIRROR(0x18FFE0)
AM_RANGE(0x820000, 0x82003f) AM_READWRITE(cat_modem_r,cat_modem_w) AM_MIRROR(0x18FFC0) // AMI S35213 Modem Chip, all access is on bit 7 AM_RANGE(0x820000, 0x82003f) AM_READWRITE(cat_modem_r,cat_modem_w) AM_MIRROR(0x18FFC0) // AMI S35213 Modem Chip, all access is on bit 7
AM_RANGE(0x830000, 0x830001) AM_READ(cat_6ms_counter_r) AM_MIRROR(0x18FFFE) // 16bit 6ms counter clocked by output of another 16bit counter clocked at 10mhz AM_RANGE(0x830000, 0x830001) AM_READ(cat_6ms_counter_r) AM_MIRROR(0x18FFFE) // 16bit 6ms counter clocked by output of another 16bit counter clocked at 10mhz
AM_RANGE(0x840000, 0x840001) AM_READWRITE(cat_2e80_r,cat_opr_w) AM_MIRROR(0x18FFFE) // Output port register (video enable, invert, watchdog reset) AM_RANGE(0x840000, 0x840001) AM_READWRITE(cat_2e80_r,cat_opr_w) AM_MIRROR(0x18FFFE) // Output port register (video enable, invert, watchdog reset)
@ -860,6 +865,7 @@ IRQ_CALLBACK_MEMBER(cat_state::cat_int_ack)
MACHINE_START_MEMBER(cat_state,cat) MACHINE_START_MEMBER(cat_state,cat)
{ {
m_duart_inp = 0; m_duart_inp = 0;
m_duart_irq_state = 0;
m_6ms_counter = 0; m_6ms_counter = 0;
m_video_enable = 1; m_video_enable = 1;
m_video_invert = 0; m_video_invert = 0;
@ -871,6 +877,7 @@ MACHINE_RESET_MEMBER(cat_state,cat)
{ {
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(cat_state::cat_int_ack),this)); m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(cat_state::cat_int_ack),this));
m_duart_inp = 0; m_duart_inp = 0;
m_duart_irq_state = 0;
m_6ms_counter = 0; m_6ms_counter = 0;
m_floppy_control = 0; m_floppy_control = 0;
m_6ms_timer->adjust(attotime::zero, 0, attotime::from_hz((XTAL_19_968MHz/2)/65536)); m_6ms_timer->adjust(attotime::zero, 0, attotime::from_hz((XTAL_19_968MHz/2)/65536));
@ -952,15 +959,16 @@ UINT32 cat_state::screen_update_swyft(screen_device &screen, bitmap_ind16 &bitma
* d-latch and inputs on ip2 of the duart, causing the duart to fire an irq; * d-latch and inputs on ip2 of the duart, causing the duart to fire an irq;
* this is used by the cat to read the keyboard. * this is used by the cat to read the keyboard.
*/ */
static void duart_irq_handler(device_t *device, int state, UINT8 vector) WRITE_LINE_MEMBER(cat_state::cat_duart_irq_handler)
{ {
#ifdef DEBUG_DUART_IRQ_HANDLER #ifdef DEBUG_DUART_IRQ_HANDLER
fprintf(stderr, "Duart IRQ handler called: state: %02X, vector: %06X\n", state, vector); fprintf(stderr, "Duart IRQ handler called: state: %02X, vector: %06X\n", state, vector);
#endif #endif
m_duart_irq_state = state;
//device->m_maincpu->set_input_line_and_vector(M68K_IRQ_1, state, vector); //device->m_maincpu->set_input_line_and_vector(M68K_IRQ_1, state, vector);
} }
static void duart_tx(device_t *device, int channel, UINT8 data) WRITE_LINE_MEMBER(cat_state::cat_duart_txa)
{ {
#ifdef DEBUG_DUART_TXD #ifdef DEBUG_DUART_TXD
fprintf(stderr, "Duart TXD: data %02X\n", data); fprintf(stderr, "Duart TXD: data %02X\n", data);
@ -968,24 +976,23 @@ static void duart_tx(device_t *device, int channel, UINT8 data)
} }
/* mc68681 DUART Input pins: /* mc68681 DUART Input pins:
* IP0: CTS [using the hardware-CTS feature?] * IP0: CTS [using the duart builtin hardware-CTS feature?]
* IP1: Centronics ACK (IP1 changes state 0->1 or 1->0 on the falling edge of /ACK using a d-latch) * IP1: Centronics ACK (IP1 changes state 0->1 or 1->0 on the falling edge of /ACK using a d-latch)
* IP2: KTOBF (IP2 changes state 0->1 or 1->0 on the rising edge of KTOBF using a d-latch; KTOBF is a 6.5536ms-period squarewave generated by one of the gate arrays, i need to check with a scope to see whether it is a single spike/pulse every 6.5536ms or if from the gate array it inverts every 6.5536ms, documentation isn't 100% clear but I suspect the former) [uses the Delta IP2 state change detection feature to generate an interrupt; I'm not sure if IP2 is used as a counter clock source but given the beep frequency of the real unit i very much doubt it, 6.5536ms is too slow] * IP2: KTOBF (IP2 changes state 0->1 or 1->0 on the rising edge of KTOBF using a d-latch; KTOBF is a 6.5536ms-period squarewave generated by one of the gate arrays, i need to check with a scope to see whether it is a single spike/pulse every 6.5536ms or if from the gate array it inverts every 6.5536ms, documentation isn't 100% clear but I suspect the former) [uses the Delta IP2 state change detection feature to generate an interrupt; I'm not sure if IP2 is used as a counter clock source but given the beep frequency of the real unit i very much doubt it, 6.5536ms is too slow]
* IP3: RG ("ring" input) * IP3: RG ("ring" input)
* IP4: Centronics BUSY * IP4: Centronics BUSY
* IP5: DSR * IP5: DSR
*/ */
static UINT8 duart_input(device_t *device) READ8_MEMBER(cat_state::cat_duart_input)
{ {
cat_state *state = device->machine().driver_data<cat_state>();
#ifdef DEBUG_DUART_INPUT_LINES #ifdef DEBUG_DUART_INPUT_LINES
fprintf(stderr, "Duart input lines read!\n"); fprintf(stderr, "Duart input lines read!\n");
#endif #endif
return state->m_duart_inp; return m_duart_inp;
} }
/* mc68681 DUART Output pins: /* mc68681 DUART Output pins:
* OP0: RTS [using the hardware-RTS feature?] * OP0: RTS [using the duart builtin hardware-RTS feature?]
* OP1: DTR * OP1: DTR
* OP2: /TDCS (select/enable the S2579 DTMF tone generator chip) * OP2: /TDCS (select/enable the S2579 DTMF tone generator chip)
* OP3: speaker out [using the 'channel b 1X tx or rx clock output' or more likely the 'timer output' feature to generate a squarewave] * OP3: speaker out [using the 'channel b 1X tx or rx clock output' or more likely the 'timer output' feature to generate a squarewave]
@ -994,19 +1001,20 @@ static UINT8 duart_input(device_t *device)
* OP6: TD01 " * OP6: TD01 "
* OP7: TD00 " * OP7: TD00 "
*/ */
static void duart_output(device_t *device, UINT8 data) WRITE8_MEMBER(cat_state::cat_duart_output)
{ {
#ifdef DEBUG_DUART_OUTPUT_LINES #ifdef DEBUG_DUART_OUTPUT_LINES
fprintf(stderr,"Duart output io lines changed to: %02X\n", data); fprintf(stderr,"Duart output io lines changed to: %02X\n", data);
#endif #endif
} }
static const duart68681_config cat_duart68681_config = static const duartn68681_config cat_duart_config =
{ {
duart_irq_handler, DEVCB_DRIVER_LINE_MEMBER(cat_state, cat_duart_irq_handler), /* irq callback */
duart_tx, DEVCB_DRIVER_LINE_MEMBER(cat_state, cat_duart_txa), /* serial transmit A */
duart_input, DEVCB_NULL, /* serial transmit B */
duart_output DEVCB_DRIVER_MEMBER(cat_state, cat_duart_input), /* input port */
DEVCB_DRIVER_MEMBER(cat_state, cat_duart_output), /* output port */
}; };
static MACHINE_CONFIG_START( cat, cat_state ) static MACHINE_CONFIG_START( cat, cat_state )
@ -1031,7 +1039,7 @@ static MACHINE_CONFIG_START( cat, cat_state )
MCFG_VIDEO_START_OVERRIDE(cat_state,cat) MCFG_VIDEO_START_OVERRIDE(cat_state,cat)
MCFG_DUART68681_ADD( "duart68681", XTAL_19_968MHz*2/11, cat_duart68681_config ) // duart is normally clocked by 3.6864mhz xtal, but cat uses a divider from the main xtal instead which yields 3.63054545Mhz. There is a trace to cut and a mounting area to allow using an actual 3.6864mhz xtal if you so desire MCFG_DUARTN68681_ADD( "duartn68681", XTAL_19_968MHz*2/11, cat_duart_config ) // duart is normally clocked by 3.6864mhz xtal, but cat seemingly uses a divider from the main xtal instead which probably yields 3.63054545Mhz. There is a trace to cut and a mounting area to allow using an actual 3.6864mhz xtal if you so desire
MCFG_NVRAM_ADD_0FILL("nvram") MCFG_NVRAM_ADD_0FILL("nvram")
MACHINE_CONFIG_END MACHINE_CONFIG_END