示例#1
0
void serial_keyboard_device::device_reset()
{
	generic_keyboard_device::device_reset();
	m_rbit = 1;
	if(m_slot)
		m_owner->out_rx(m_rbit);
	else
		m_out_tx_func(m_rbit);

	UINT8 val = m_io_term_frame->read();
	set_tra_rate(rates[val & 0x0f]);

	switch(val & 0x30)
	{
	case 0x10:
		set_data_frame(7, 1, SERIAL_PARITY_EVEN);
		break;
	case 0x00:
	default:
		set_data_frame(8, 1, SERIAL_PARITY_NONE);
		break;
	case 0x20:
		set_data_frame(8, 2, SERIAL_PARITY_NONE);
		break;
	case 0x30:
		set_data_frame(8, 1, SERIAL_PARITY_EVEN);
		break;
	}
}
示例#2
0
void midiout_device::device_reset()
{
	// we don't Tx, we Rx at 31250 8-N-1
	set_rcv_rate(31250);
	set_tra_rate(0);
	set_data_frame(8, 1, PARITY_NONE, false);
}
示例#3
0
//-------------------------------------------------
//  update_serial -
//-------------------------------------------------
void z80sio_channel::update_serial()
{
	int data_bit_count = get_rx_word_length();
	stop_bits_t stop_bits = get_stop_bits();
	parity_t parity;

	LOG(("Z80SIO update_serial\n"));

	if (m_wr4 & WR4_PARITY_ENABLE)
	{
		if (m_wr4 & WR4_PARITY_EVEN)
			parity = PARITY_EVEN;
		else
			parity = PARITY_ODD;
	}
	else
		parity = PARITY_NONE;

	set_data_frame(1, data_bit_count, parity, stop_bits);

	int clocks = get_clock_mode();

	if (m_rxc > 0)
	{
		set_rcv_rate(m_rxc / clocks);
	}

	if (m_txc > 0)
	{
		set_tra_rate(m_txc / clocks);
	}
	receive_register_reset(); // if stop bits is changed from 0, receive register has to be reset
}
示例#4
0
文件: xvd701.c 项目: crazyquark/mame
void jvc_xvd701_device::device_start()
{
	int startbits = 1;
	int databits = 8;
	parity_t parity = PARITY_ODD;
	stop_bits_t stopbits = STOP_BITS_1;

	set_data_frame(startbits, databits, parity, stopbits);

	int txbaud = 9600;
	set_tra_rate(txbaud);

	int rxbaud = 9600;
	set_rcv_rate(rxbaud);

	output_rxd(1);

	// TODO: make this configurable
	output_dcd(0);
	output_dsr(0);
	output_ri(0);
	output_cts(0);

	m_timer_response = timer_alloc(TIMER_RESPONSE);
}
示例#5
0
void wangpc_keyboard_device::device_start()
{
	// set serial callbacks
	m_maincpu->i8051_set_serial_tx_callback(WRITE8_DELEGATE(wangpc_keyboard_device, mcs51_tx_callback));
	m_maincpu->i8051_set_serial_rx_callback(READ8_DELEGATE(wangpc_keyboard_device, mcs51_rx_callback));
	set_data_frame(8, 2, PARITY_NONE, false);
}
示例#6
0
void midiout_device::device_reset()
{
	// we don't Tx, we Rx at 31250 8-N-1
	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rcv_rate(31250);
	set_tra_rate(0);
}
示例#7
0
void sb_device::device_reset()
{
	m_dsp.prot_value = 0xaa;
	m_dsp.prot_count = 0;
	m_dack_out = 0;
	m_dsp.fifo_ptr = 0;
	m_dsp.fifo_r_ptr = 0;
	m_dsp.wbuf_status = 0;
	m_dsp.rbuf_status = 0;
	m_dsp.frequency = 8000; // per stereo-fx
	m_dsp.irq_active = 0;
	m_dsp.dma_no_irq = false;
	mixer_reset();

	m_onebyte_midi = false;
	m_uart_midi = false;
	m_uart_irq = false;
	m_mpu_midi = false;
	m_tx_busy = false;
	m_xmit_read = m_xmit_write = 0;
	m_recv_read = m_recv_write = 0;
	m_rx_waiting = m_tx_waiting = 0;

	// MIDI is 31250 baud, 8-N-1
	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rate(31250);
}
示例#8
0
void apollo_kbd_device::device_reset()
{
	LOG1(("reset apollo_kbd"));

	m_beeper.reset();
	m_mouse.reset();

	// init keyboard
	m_loopback_mode = 1;
	m_mode = KBD_MODE_0_COMPATIBILITY;
	m_delay = 500;
	m_repeat = 33;
	m_last_pressed = 0;
	memset(m_keytime, 0, sizeof(m_keytime));
	memset(m_keyon, 0, sizeof(m_keyon));

	// start timer
	m_timer->adjust( attotime::zero, 0, attotime::from_msec(5)); // every 5ms

	// keyboard comms is at 8E1, 1200 baud
	set_data_frame(1, 8, PARITY_EVEN, STOP_BITS_1);
	set_rcv_rate(1200);
	set_tra_rate(1200);

	m_tx_busy = false;
	m_xmit_read = m_xmit_write = 0;
}
示例#9
0
void z80dart_channel::update_serial()
{
	int clocks = get_clock_mode();

	if (m_rxc > 0)
	{
		set_rcv_rate(m_rxc / clocks);
	}

	if (m_txc > 0)
	{
		set_tra_rate(m_txc / clocks);
	}

	int num_data_bits = get_rx_word_length();
	int stop_bit_count = get_stop_bits();
	int parity_code = SERIAL_PARITY_NONE;

	if (m_wr[1] & WR4_PARITY_ENABLE)
	{
		if (m_wr[1] & WR4_PARITY_EVEN)
			parity_code = SERIAL_PARITY_EVEN;
		else
			parity_code = SERIAL_PARITY_ODD;
	}

	set_data_frame(num_data_bits, stop_bit_count, parity_code);
}
示例#10
0
void lk201_device::device_reset()
{
	m_beeper->adjust(attotime::never);

	m_speaker->set_state(0);
	m_speaker->set_output_gain(0, 0);

	ddrs[0] = ddrs[1] = ddrs[2] = 0;
	ports[0] = ports[1] = ports[2] = 0;

	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rate(4800);
	m_count->adjust(attotime::from_hz(1200), 0, attotime::from_hz(1200));
	memset(m_timer.regs, 0, sizeof(m_timer.regs));

	sci_status = (SCSR_TC | SCSR_TDRE);

	spi_status = 0;
	spi_data = 0;

	kbd_data = 0;
	led_data = 0;

	transmit_register_reset();
	receive_register_reset();
}
示例#11
0
文件: z80dart.cpp 项目: Dagarman/mame
void z80dart_channel::update_serial()
{
	int data_bit_count = get_rx_word_length();
	stop_bits_t stop_bits = get_stop_bits();

	parity_t parity;
	if (m_wr[4] & WR4_PARITY_ENABLE)
	{
		if (m_wr[4] & WR4_PARITY_EVEN)
			parity = PARITY_EVEN;
		else
			parity = PARITY_ODD;
	}
	else
		parity = PARITY_NONE;

	set_data_frame(1, data_bit_count, parity, stop_bits);

	int clocks = get_clock_mode();

	if (m_rxc > 0)
	{
		set_rcv_rate(m_rxc / clocks);
	}

	if (m_txc > 0)
	{
		set_tra_rate(m_txc / clocks);
	}
	receive_register_reset(); // if stop bits is changed from 0, receive register has to be reset (FIXME: doing this without checking is stupid)
}
示例#12
0
void z80dart_channel::update_serial()
{
	int data_bit_count = get_rx_word_length();
	stop_bits_t stop_bits = get_stop_bits();

	parity_t parity;
	if (m_wr[4] & WR4_PARITY_ENABLE)
	{
		if (m_wr[4] & WR4_PARITY_EVEN)
			parity = PARITY_EVEN;
		else
			parity = PARITY_ODD;
	}
	else
		parity = PARITY_NONE;

	set_data_frame(1, data_bit_count, parity, stop_bits);

	int clocks = get_clock_mode();

	if (m_rxc > 0)
	{
		set_rcv_rate(m_rxc / clocks);
	}

	if (m_txc > 0)
	{
		set_tra_rate(m_txc / clocks);
	}
}
示例#13
0
文件: octo_kbd.cpp 项目: mbarnes/mame
void octopus_keyboard_device::device_reset()
{
	buffered_rs232_device::device_reset();

	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rcv_rate(1200);
	set_tra_rate(9600);
	receive_register_reset();
	transmit_register_reset();

	m_enabled = 0;
	m_delay = 500;  // 3*100+200
	m_repeat = 110;  // 4^2*5+30

	stop_processing();
	reset_key_state();
	typematic_stop();
	clear_fifo();

	output_dcd(0);
	output_dsr(0);
	output_cts(0);
	output_rxd(1);

	start_processing(attotime::from_hz(9600));
}
示例#14
0
文件: midikbd.c 项目: Ilgrim/MAMEHub
void midi_keyboard_device::device_start()
{
	set_data_frame(8, 1, SERIAL_PARITY_NONE); //8N1?
	set_tra_rate(clock());
	m_out_tx_func.resolve_safe();
	m_head = m_tail = 0;
	m_keyboard_timer = timer_alloc();
	m_keyboard_timer->adjust(attotime::from_msec(10), 0, attotime::from_msec(10));
}
示例#15
0
void midiin_device::device_reset()
{
	m_tx_busy = false;
	m_xmit_read = m_xmit_write = 0;

	// we don't Rx, we Tx at 31250 8-N-1
	set_rcv_rate(0);
	set_tra_rate(31250);
	set_data_frame(8, 1, SERIAL_PARITY_NONE);
}
示例#16
0
void midiin_device::device_reset()
{
	m_tx_busy = false;
	m_xmit_read = m_xmit_write = 0;

	// we don't Rx, we Tx at 31250 8-N-1
	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rcv_rate(0);
	set_tra_rate(31250);
}
示例#17
0
void mos6551_device::update_serial()
{
	int brg = m_ctrl & CTRL_BRG_MASK;

	if (brg == CTRL_BRG_16X_EXTCLK)
	{
		set_rcv_rate(m_ext_rxc / 16);
		set_tra_rate(m_ext_rxc / 16);
	}
	else
	{
		int baud = clock() / brg_divider[brg] / 16;

		set_tra_rate(baud);

		if (m_ctrl & CTRL_RXC_BRG)
		{
			set_rcv_rate(baud);
		}
		else
		{
			set_rcv_rate(m_ext_rxc / 16);
		}

		int num_data_bits = 8;
		int stop_bit_count = 1;
		int parity_code = PARITY_NONE;

		switch (m_ctrl & CTRL_WL_MASK)
		{
		case CTRL_WL_8: num_data_bits = 8; break;
		case CTRL_WL_7: num_data_bits = 7; break;
		case CTRL_WL_6: num_data_bits = 6; break;
		case CTRL_WL_5: num_data_bits = 5; break;
		}

		set_data_frame(num_data_bits, stop_bit_count, parity_code, false);
	}

	if (m_cmd & CMD_DTR)
		m_connection_state |= DTR;
	else
		m_connection_state &= ~DTR;

	m_dtr_handler((m_connection_state & DTR) ? 0 : 1);

	if ((m_cmd & CMD_TC_MASK) == CMD_TC_RTS_HI)
		m_connection_state &= ~RTS;
	else
		m_connection_state |= RTS;

	m_rts_handler((m_connection_state & RTS) ? 0 : 1);

	serial_connection_out();
}
示例#18
0
void graph_link_hle_device::device_reset()
{
	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rate(9600);
	receive_register_reset();
	transmit_register_reset();

	m_head = m_tail = 0;
	m_empty = true;
	m_ready = true;
}
示例#19
0
void serial_keyboard_device::device_start()
{
	int baud = clock();
	if(!baud) baud = 9600;
	m_owner = dynamic_cast<serial_port_device *>(owner());
	m_out_tx_func.resolve(m_out_tx_cb, *this);
	m_slot = m_owner && 1;
	m_timer = timer_alloc();
	set_tra_rate(baud);
	set_data_frame(8, 1, SERIAL_PARITY_NONE);
}
示例#20
0
文件: wangpckb.cpp 项目: qwijibo/mame
void wangpc_keyboard_device::device_start()
{
	m_txd_handler.resolve_safe();

	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2);

	set_rcv_rate(62500);
	//set_tra_rate(62500);

	save_item(NAME(m_keylatch));
	save_item(NAME(m_rxd));
}
示例#21
0
void esqpanel_device::device_reset()
{
	// panel comms is at 62500 baud (double the MIDI rate), 8N2
	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2);
	set_rcv_rate(62500);
	set_tra_rate(62500);

	m_tx_busy = false;
	m_xmit_read = m_xmit_write = 0;
	m_bCalibSecondByte = false;
	m_bButtonLightSecondByte = false;
}
示例#22
0
文件: hle.cpp 项目: palazzol/mame
void apricot_keyboard_hle_device::device_reset()
{
	clear_fifo();

	receive_register_reset();
	transmit_register_reset();

	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rcv_rate(7800);
	set_tra_rate(7800);

	reset_key_state();
	start_processing(attotime::from_hz(7800));
}
示例#23
0
文件: miracle.cpp 项目: Ashura-X/mame
void snes_miracle_device::device_reset()
{
	m_strobe_on = 0;
	m_sent_bits = 0;
	m_strobe_clock = 0;
	m_midi_mode = MIRACLE_MIDI_WAITING;

	// set standard MIDI parameters
	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rcv_rate(31250);
	set_tra_rate(31250);

	m_xmit_read = m_xmit_write = 0;
	m_recv_read = m_recv_write = 0;
	m_read_status = m_status_bit = false;
	m_tx_busy = false;
}
示例#24
0
文件: m20_kbd.cpp 项目: bradhugh/mame
void m20_keyboard_device::device_reset()
{
	buffered_rs232_device::device_reset();

	reset_key_state();
	clear_fifo();

	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_2);
	set_rate(1'200);
	receive_register_reset();
	transmit_register_reset();

	output_dcd(0);
	output_dsr(0);
	output_cts(0);
	output_rxd(1);

	start_processing(attotime::from_hz(1'200));
}
示例#25
0
文件: ym3802.cpp 项目: Dagarman/mame
void ym3802_device::set_comms_mode()
{
	uint8_t data_bits = (m_reg[REG_TMR] & 0x20) ? 7 : 8;
	parity_t parity;
	stop_bits_t stop_bits = (m_reg[REG_TMR] & 0x02) ? STOP_BITS_2 : STOP_BITS_1;

	if(!(m_reg[REG_TMR] & 0x10))  // parity enable
		parity = PARITY_NONE;
	else
	{
		if(m_reg[REG_TMR] & 0x04)
			parity = PARITY_ODD;
		else
			parity = PARITY_EVEN;
		// TODO: 4-bit parity
	}

	set_data_frame(1, data_bits, parity, stop_bits);
	logerror("MIDI comms set to 1 start bit, %i data bits, %s, parity = %i\n",data_bits, (stop_bits == STOP_BITS_2) ? "2 stop bits" : "1 stop bit", parity);
}
示例#26
0
文件: x68k_kbd.cpp 项目: mbarnes/mame
void x68k_keyboard_device::device_reset()
{
	buffered_rs232_device::device_reset();

	set_data_frame(1, 8, PARITY_NONE, STOP_BITS_1);
	set_rate(38'400); // TODO: Should be 2400 but MC68901 doesn't support divide by 16
	receive_register_reset();
	transmit_register_reset();

	m_enabled = 0;
	m_delay = 500;  // 3*100+200
	m_repeat = 110;  // 4^2*5+30

	stop_processing();
	reset_key_state();
	typematic_stop();
	clear_fifo();

	output_dcd(0);
	output_dsr(0);
	output_cts(0);
	output_rxd(1);
}
示例#27
0
//-------------------------------------------------
//  update_serial -
//-------------------------------------------------
void z80sio_channel::update_serial()
{
	int data_bit_count = get_rx_word_length();
	stop_bits_t stop_bits = get_stop_bits();
	parity_t parity;

	LOG("%s\n", FUNCNAME);

	if (m_wr4 & WR4_PARITY_ENABLE)
	{
		LOG("- Parity enabled\n");
		if (m_wr4 & WR4_PARITY_EVEN)
			parity = PARITY_EVEN;
		else
			parity = PARITY_ODD;
	}
	else
		parity = PARITY_NONE;

	set_data_frame(1, data_bit_count, parity, stop_bits);

	int clocks = get_clock_mode();

	if (m_rxc > 0)
	{
		LOG("- RxC:%d/%d = %d\n", m_rxc, clocks, m_rxc / clocks);
		set_rcv_rate(m_rxc / clocks);
	}

	if (m_txc > 0)
	{
		LOG("- TxC:%d/%d = %d\n", m_txc, clocks, m_txc / clocks);
		set_tra_rate(m_txc / clocks);
	}
	receive_register_reset(); // if stop bits is changed from 0, receive register has to be reset
}
示例#28
0
文件: mc68901.cpp 项目: MASHinfo/mame
void mc68901_device::register_w(offs_t offset, uint8_t data)
{
	switch (offset)
	{
	case REGISTER_GPIP:
		LOG("MC68901 General Purpose I/O : %x\n", data);
		m_gpip = data;
		gpio_output();
		break;

	case REGISTER_AER:
		LOG("MC68901 Active Edge Register : %x\n", data);
		m_aer = data;
		break;

	case REGISTER_DDR:
		LOG("MC68901 Data Direction Register : %x\n", data);
		m_ddr = data;
		gpio_output();
		break;

	case REGISTER_IERA:
		LOG("MC68901 Interrupt Enable Register A : %x\n", data);
		m_ier = (data << 8) | (m_ier & 0xff);
		m_ipr &= m_ier;
		check_interrupts();
		break;

	case REGISTER_IERB:
		LOG("MC68901 Interrupt Enable Register B : %x\n", data);
		m_ier = (m_ier & 0xff00) | data;
		m_ipr &= m_ier;
		check_interrupts();
		break;

	case REGISTER_IPRA:
		LOG("MC68901 Interrupt Pending Register A : %x\n", data);
		m_ipr &= (data << 8) | (m_ipr & 0xff);
		check_interrupts();
		break;

	case REGISTER_IPRB:
		LOG("MC68901 Interrupt Pending Register B : %x\n", data);
		m_ipr &= (m_ipr & 0xff00) | data;
		check_interrupts();
		break;

	case REGISTER_ISRA:
		LOG("MC68901 Interrupt In-Service Register A : %x\n", data);
		m_isr &= (data << 8) | (m_isr & 0xff);
		break;

	case REGISTER_ISRB:
		LOG("MC68901 Interrupt In-Service Register B : %x\n", data);
		m_isr &= (m_isr & 0xff00) | data;
		break;

	case REGISTER_IMRA:
		LOG("MC68901 Interrupt Mask Register A : %x\n", data);
		m_imr = (data << 8) | (m_imr & 0xff);
		m_isr &= m_imr;
		check_interrupts();
		break;

	case REGISTER_IMRB:
		LOG("MC68901 Interrupt Mask Register B : %x\n", data);
		m_imr = (m_imr & 0xff00) | data;
		m_isr &= m_imr;
		check_interrupts();
		break;

	case REGISTER_VR:
		LOG("MC68901 Interrupt Vector : %x\n", data & 0xf0);

		m_vr = data & 0xf8;

		if (m_vr & VR_S)
		{
			LOG("MC68901 Software End-Of-Interrupt Mode\n");
		}
		else
		{
			LOG("MC68901 Automatic End-Of-Interrupt Mode\n");

			m_isr = 0;
		}
		break;

	case REGISTER_TACR:
		m_tacr = data & 0x1f;

		switch (m_tacr & 0x0f)
		{
		case TCR_TIMER_STOPPED:
			LOG("MC68901 Timer A Stopped\n");
			m_timer[TIMER_A]->enable(false);
			break;

		case TCR_TIMER_DELAY_4:
		case TCR_TIMER_DELAY_10:
		case TCR_TIMER_DELAY_16:
		case TCR_TIMER_DELAY_50:
		case TCR_TIMER_DELAY_64:
		case TCR_TIMER_DELAY_100:
		case TCR_TIMER_DELAY_200:
			{
				int divisor = PRESCALER[m_tacr & 0x07];
				LOG("MC68901 Timer A Delay Mode : %u Prescale\n", divisor);
				m_timer[TIMER_A]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor));
			}
			break;

		case TCR_TIMER_EVENT:
			LOG("MC68901 Timer A Event Count Mode\n");
			m_timer[TIMER_A]->enable(false);
			break;

		case TCR_TIMER_PULSE_4:
		case TCR_TIMER_PULSE_10:
		case TCR_TIMER_PULSE_16:
		case TCR_TIMER_PULSE_50:
		case TCR_TIMER_PULSE_64:
		case TCR_TIMER_PULSE_100:
		case TCR_TIMER_PULSE_200:
			{
				int divisor = PRESCALER[m_tacr & 0x07];
				LOG("MC68901 Timer A Pulse Width Mode : %u Prescale\n", divisor);
				m_timer[TIMER_A]->adjust(attotime::never, 0, attotime::from_hz(m_timer_clock / divisor));
				m_timer[TIMER_A]->enable(false);
			}
			break;
		}

		if (m_tacr & TCR_TIMER_RESET)
		{
			LOG("MC68901 Timer A Reset\n");

			m_to[TIMER_A] = 0;

			m_out_tao_cb(m_to[TIMER_A]);
		}
		break;

	case REGISTER_TBCR:
		m_tbcr = data & 0x1f;

		switch (m_tbcr & 0x0f)
		{
		case TCR_TIMER_STOPPED:
			LOG("MC68901 Timer B Stopped\n");
			m_timer[TIMER_B]->enable(false);
			break;

		case TCR_TIMER_DELAY_4:
		case TCR_TIMER_DELAY_10:
		case TCR_TIMER_DELAY_16:
		case TCR_TIMER_DELAY_50:
		case TCR_TIMER_DELAY_64:
		case TCR_TIMER_DELAY_100:
		case TCR_TIMER_DELAY_200:
			{
			int divisor = PRESCALER[m_tbcr & 0x07];
			LOG("MC68901 Timer B Delay Mode : %u Prescale\n", divisor);
			m_timer[TIMER_B]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor));
			}
			break;

		case TCR_TIMER_EVENT:
			LOG("MC68901 Timer B Event Count Mode\n");
			m_timer[TIMER_B]->enable(false);
			break;

		case TCR_TIMER_PULSE_4:
		case TCR_TIMER_PULSE_10:
		case TCR_TIMER_PULSE_16:
		case TCR_TIMER_PULSE_50:
		case TCR_TIMER_PULSE_64:
		case TCR_TIMER_PULSE_100:
		case TCR_TIMER_PULSE_200:
			{
			int divisor = PRESCALER[m_tbcr & 0x07];
			LOG("MC68901 Timer B Pulse Width Mode : %u Prescale\n", DIVISOR);
			m_timer[TIMER_B]->adjust(attotime::never, 0, attotime::from_hz(m_timer_clock / divisor));
			m_timer[TIMER_B]->enable(false);
			}
			break;
		}

		if (m_tacr & TCR_TIMER_RESET)
		{
			LOG("MC68901 Timer B Reset\n");

			m_to[TIMER_B] = 0;

			m_out_tbo_cb(m_to[TIMER_B]);
		}
		break;

	case REGISTER_TCDCR:
		m_tcdcr = data & 0x77;

		switch (m_tcdcr & 0x07)
		{
		case TCR_TIMER_STOPPED:
			LOG("MC68901 Timer D Stopped\n");
			m_timer[TIMER_D]->enable(false);
			break;

		case TCR_TIMER_DELAY_4:
		case TCR_TIMER_DELAY_10:
		case TCR_TIMER_DELAY_16:
		case TCR_TIMER_DELAY_50:
		case TCR_TIMER_DELAY_64:
		case TCR_TIMER_DELAY_100:
		case TCR_TIMER_DELAY_200:
			{
				int divisor = PRESCALER[m_tcdcr & 0x07];
				LOG("MC68901 Timer D Delay Mode : %u Prescale\n", divisor);
				m_timer[TIMER_D]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor));
			}
			break;
		}

		switch ((m_tcdcr >> 4) & 0x07)
		{
		case TCR_TIMER_STOPPED:
			LOG("MC68901 Timer C Stopped\n");
			m_timer[TIMER_C]->enable(false);
			break;

		case TCR_TIMER_DELAY_4:
		case TCR_TIMER_DELAY_10:
		case TCR_TIMER_DELAY_16:
		case TCR_TIMER_DELAY_50:
		case TCR_TIMER_DELAY_64:
		case TCR_TIMER_DELAY_100:
		case TCR_TIMER_DELAY_200:
			{
				int divisor = PRESCALER[(m_tcdcr >> 4) & 0x07];
				LOG("MC68901 Timer C Delay Mode : %u Prescale\n", divisor);
				m_timer[TIMER_C]->adjust(attotime::from_hz(m_timer_clock / divisor), 0, attotime::from_hz(m_timer_clock / divisor));
			}
			break;
		}
		break;

	case REGISTER_TADR:
		LOG("MC68901 Timer A Data Register : %x\n", data);

		m_tdr[TIMER_A] = data;

		if (!m_timer[TIMER_A]->enabled())
		{
			m_tmc[TIMER_A] = data;
		}
		break;

	case REGISTER_TBDR:
		LOG("MC68901 Timer B Data Register : %x\n", data);

		m_tdr[TIMER_B] = data;

		if (!m_timer[TIMER_B]->enabled())
		{
			m_tmc[TIMER_B] = data;
		}
		break;

	case REGISTER_TCDR:
		LOG("MC68901 Timer C Data Register : %x\n", data);

		m_tdr[TIMER_C] = data;

		if (!m_timer[TIMER_C]->enabled())
		{
			m_tmc[TIMER_C] = data;
		}
		break;

	case REGISTER_TDDR:
		LOG("MC68901 Timer D Data Register : %x\n", data);

		m_tdr[TIMER_D] = data;

		if (!m_timer[TIMER_D]->enabled())
		{
			m_tmc[TIMER_D] = data;
		}
		break;

	case REGISTER_SCR:
		LOG("MC68901 Sync Character : %x\n", data);

		m_scr = data;
		break;

	case REGISTER_UCR:
		{
		int data_bit_count;

		switch (data & 0x60)
		{
		case UCR_WORD_LENGTH_8: default: data_bit_count = 8; break;
		case UCR_WORD_LENGTH_7: data_bit_count = 7; break;
		case UCR_WORD_LENGTH_6: data_bit_count = 6; break;
		case UCR_WORD_LENGTH_5: data_bit_count = 5; break;
		}

		parity_t parity;

		if (data & UCR_PARITY_ENABLED)
		{
			if (data & UCR_PARITY_EVEN)
			{
				LOG("MC68901 Parity : Even\n");

				parity = PARITY_EVEN;
			}
			else
			{
				LOG("MC68901 Parity : Odd\n");

				parity = PARITY_ODD;
			}
		}
		else
		{
			LOG("MC68901 Parity : Disabled\n");

			parity = PARITY_NONE;
		}

		LOG("MC68901 Word Length : %u bits\n", data_bit_count);


		int start_bits;
		stop_bits_t stop_bits;

		switch (data & 0x18)
		{
		case UCR_START_STOP_0_0:
		default:
			start_bits = 0;
			stop_bits = STOP_BITS_0;
			LOG("MC68901 Start Bits : 0, Stop Bits : 0, Format : synchronous\n");
			break;

		case UCR_START_STOP_1_1:
			start_bits = 1;
			stop_bits = STOP_BITS_1;
			LOG("MC68901 Start Bits : 1, Stop Bits : 1, Format : asynchronous\n");
			break;

		case UCR_START_STOP_1_15:
			start_bits = 1;
			stop_bits = STOP_BITS_1_5;
			LOG("MC68901 Start Bits : 1, Stop Bits : 1.5, Format : asynchronous\n");
			break;

		case UCR_START_STOP_1_2:
			start_bits = 1;
			stop_bits = STOP_BITS_2;
			LOG("MC68901 Start Bits : 1, Stop Bits : 2, Format : asynchronous\n");
			break;
		}

		if (data & UCR_CLOCK_DIVIDE_16)
		{
			LOG("MC68901 Rx/Tx Clock Divisor : 16\n");
		}
		else
		{
			LOG("MC68901 Rx/Tx Clock Divisor : 1\n");
		}

		set_data_frame(start_bits, data_bit_count, parity, stop_bits);
		receive_register_reset();

		m_ucr = data;
		}
		break;

	case REGISTER_RSR:
		if ((data & RSR_RCV_ENABLE) == 0)
		{
			LOG("MC68901 Receiver Disabled\n");
			m_rsr = 0;
		}
		else
		{
			LOG("MC68901 Receiver Enabled\n");

			if (data & RSR_SYNC_STRIP_ENABLE)
			{
				LOG("MC68901 Sync Strip Enabled\n");
			}
			else
			{
				LOG("MC68901 Sync Strip Disabled\n");
			}

			if (data & RSR_FOUND_SEARCH)
				LOG("MC68901 Receiver Search Mode Enabled\n");

			m_rsr = data & 0x0b;
		}
		break;

	case REGISTER_TSR:
		m_tsr = (m_tsr & (TSR_BUFFER_EMPTY | TSR_UNDERRUN_ERROR | TSR_END_OF_XMIT)) | (data & ~(TSR_BUFFER_EMPTY | TSR_UNDERRUN_ERROR | TSR_END_OF_XMIT));

		if ((data & TSR_XMIT_ENABLE) == 0)
		{
			LOG("MC68901 Transmitter Disabled\n");

			m_tsr &= ~TSR_UNDERRUN_ERROR;

			if (is_transmit_register_empty())
				m_tsr |= TSR_END_OF_XMIT;
		}
		else
		{
			LOG("MC68901 Transmitter Enabled\n");

			switch (data & 0x06)
			{
			case TSR_OUTPUT_HI_Z:
				LOG("MC68901 Transmitter Disabled Output State : Hi-Z\n");
				break;
			case TSR_OUTPUT_LOW:
				LOG("MC68901 Transmitter Disabled Output State : 0\n");
				break;
			case TSR_OUTPUT_HIGH:
				LOG("MC68901 Transmitter Disabled Output State : 1\n");
				break;
			case TSR_OUTPUT_LOOP:
				LOG("MC68901 Transmitter Disabled Output State : Loop\n");
				break;
			}

			if (data & TSR_BREAK)
			{
				LOG("MC68901 Transmitter Break Enabled\n");
			}
			else
			{
				LOG("MC68901 Transmitter Break Disabled\n");
			}

			if (data & TSR_AUTO_TURNAROUND)
			{
				LOG("MC68901 Transmitter Auto Turnaround Enabled\n");
			}
			else
			{
				LOG("MC68901 Transmitter Auto Turnaround Disabled\n");
			}

			m_tsr &= ~TSR_END_OF_XMIT;

			if (m_transmit_pending && is_transmit_register_empty())
			{
				transmit_register_setup(m_transmit_buffer);
				m_transmit_pending = false;
			}
			if (!m_transmit_pending)
				m_tsr |= TSR_BUFFER_EMPTY;
		}
		break;

	case REGISTER_UDR:
		LOG("MC68901 UDR %x\n", data);
		m_transmit_buffer = data;
		m_transmit_pending = true;
		m_tsr &= ~TSR_BUFFER_EMPTY;

		if ((m_tsr & TSR_XMIT_ENABLE) && is_transmit_register_empty())
		{
			transmit_register_setup(m_transmit_buffer);
			m_transmit_pending = false;
			m_tsr |= TSR_BUFFER_EMPTY;
		}
		break;
	}
}