summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/poly.cpp
blob: 8d5fd97dda59c8de8ee4f6072ea07ccdda82eaab (plain) (tree)
































































































































































































































                                                                                                                                       





















                                                                        











                                                                   
// license:BSD-3-Clause
// copyright-holders:Robbbert,Nigel Barnes
// thanks-to:Andrew Trotman
/***************************************************************************

    Poly 1/2 (New Zealand)

****************************************************************************/

#include "emu.h"
#include "includes/poly.h"


inline offs_t poly_state::physical(offs_t offset)
{
	return (((~m_dat[(m_dat_bank << 3) | (offset >> 13)]) & 0x0f) << 13) | (offset & 0x1fff);
}

READ8_MEMBER(poly_state::logical_mem_r)
{
	return m_user->base()[physical(offset)];
}

WRITE8_MEMBER(poly_state::logical_mem_w)
{
	m_user->base()[physical(offset)] = data;
}


READ8_MEMBER(poly_state::vector_r)
{
	/* system mode is selected by a vector fetch (interrupt and reset) */
	m_bankdev->set_bank(0);

	return m_system->base()[0x0ff0 + offset];
}


TIMER_CALLBACK_MEMBER(poly_state::set_protect)
{
	m_bankdev->set_bank(1);
}

WRITE8_MEMBER(poly_state::set_protect_w)
{
	/* set protect after 1 E cycle */
	machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(2), timer_expired_delegate(FUNC(poly_state::set_protect), this));
}


READ8_MEMBER(poly_state::select_map_r)
{
	return 0x00;
}

WRITE8_MEMBER(poly_state::select_map1_w)
{
	m_dat_bank = 0;
}

WRITE8_MEMBER(poly_state::select_map2_w)
{
	m_dat_bank = 1;
}


WRITE8_MEMBER(poly_state::pia0_pa_w)
{
	logerror("PIA0: Port A out: %02X\n", data);
	m_video_pa = data;
	m_ptm->set_g3(BIT(data, 7));
}

WRITE8_MEMBER(poly_state::pia0_pb_w)
{
	logerror("PIA0: Port B out: %02X\n", data);
	m_video_pb = data;
}


READ8_MEMBER(poly_state::pia1_b_in)
{
	// B1 - D0
	// B2 - D1
	// B3 - D2
	// B4 - D3
	// B5 - D4
	// B6
	// B7
	// B8 - D6
	// STROBE - D7

	/* return key code */
	//data = m_kr2376->data_r(space, 0) & 0x7f;
	/* bit 5 is derived from data bits 5,6 and caps lock */
	//data |= !(!(BIT(m_kr2376->data_r(space, 0), 6) && !caps_lock) && !(caps_lock && BIT(m_kr2376->data_r(space, 0), 5))) << 5;
	/* bit 6 is data bit 7 */
	//data |= BIT(m_kr2376->data_r(space, 0), 7) << 6;
	/* caps lock needs verifying */
	//data |= ((caps_lock && BIT(m_kr2376->data_r(space, 0), 6)) ? 0 : BIT(m_kr2376->data_r(space, 0), 5)) << 5;
	/* bit 7 is the strobe value */
	//data |= m_kr2376->get_output_pin(kr2376_device::KR2376_SO) << 7;

	// return ascii key value, bit 7 is the strobe value
	uint8_t data = m_term_data;
	m_term_data &= 0x7f;
	return data;
}


READ8_MEMBER(poly_state::videoram_1_r)
{
	return m_videoram[offset];
}

READ8_MEMBER(poly_state::videoram_2_r)
{
	return m_videoram[offset + 0x400];
}


void poly_state::kbd_put(u8 data)
{
	m_term_data = data | 0x80;

	m_pia[1]->cb1_w(1);
	m_pia[1]->cb1_w(0);
}

READ_LINE_MEMBER(poly_state::kbd_shift_r)
{
	return BIT(m_modifiers->read(), 1);
}

READ_LINE_MEMBER(poly_state::kbd_control_r)
{
	return BIT(m_modifiers->read(), 0);
}


WRITE_LINE_MEMBER(poly_state::ptm_o2_callback)
{
	m_ptm->set_c1(state);
}

WRITE_LINE_MEMBER(poly_state::ptm_o3_callback)
{
	m_speaker->level_w(state);
}

WRITE8_MEMBER(poly_state::baud_rate_w )
{
	/* baud rate controller (0=9600,2=4800,4=2400,6=1200,8=600,A=300) */
	int selector = (data & 0x0e) >> 1;
	m_acia_clock->set_clock_scale((selector <= 5) ? 1.0 / (1 << selector) : 0.0);
}

READ8_MEMBER(poly_state::network_r)
{
	return m_adlc->read(space, offset >> 1);
}

WRITE8_MEMBER(poly_state::network_w)
{
	m_adlc->write(space, offset >> 1, data);
}

WRITE_LINE_MEMBER(poly_state::network_clk_w)
{
	m_adlc->rxc_w(state);
	m_adlc->txc_w(state);
}


WRITE8_MEMBER(polydev_state::drive_register_w)
{
	/* drive select */
	switch (data & 0x03)
	{
	case 0:
		m_current_floppy = m_floppy[0]->get_device();
		break;

	case 1:
		m_current_floppy = m_floppy[1]->get_device();
		break;

	default:
		m_current_floppy = nullptr;
		break;
	}
	m_fdc->set_floppy(m_current_floppy);

	if (m_current_floppy)
	{
		/* side select */
		m_current_floppy->ss_w(BIT(data, 6));
	}
}

READ8_MEMBER(polydev_state::drive_register_r)
{
	/* disk change */
	return (m_current_floppy ? m_current_floppy->dskchg_r() : 1) << 1;
}

WRITE_LINE_MEMBER(polydev_state::motor_w)
{
	if (m_current_floppy) m_current_floppy->mon_w(!state);
}

READ8_MEMBER(polydev_state::fdc_inv_r)
{
	return m_fdc->gen_r(offset) ^ 0xff;
}

WRITE8_MEMBER(polydev_state::fdc_inv_w)
{
	m_fdc->gen_w(offset, data ^ 0xff);
}


uint32_t poly_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
	/*
	    PA0     Not used. Connected to CA2.
	    PA1  (  Mix colour  0) Blue   1) Green  0) Red    1) No
	    PA2  (  Graphics 1  0)        0)        1)        1) Mix
	    PA3     1 = Enable Teletext 1 screen
	    PA4     1 = 480 Graphics mode. 0 = 240 Graphics mode.
	    PA5     1 = Enable Graphics 1 screen or 480 Graphics screen.
	    PA6     1 = Mix Mode 0 = Priority mode
	    PA7     Must be 0. Connected to PA7 and timer G3.

	    PB0     1 = Enable Teletext 2 screen.
	    PB1     1 = Enable Graphics 2 (must be 0 for 480 Graphics)
	    PB2  (  Mix colour  0) Blue    1) Green  0) Red    1) No
	    PB3  (  Graphics 2  0)         0)        1)        1) Mix
	    PB4     1 = Enable Red Background
	    PB5     1 = Enable Green Background
	    PB6     1 = Enable Blue Background
	    PB7     Not used.

	    CA1     Connected to PA7 and timer G3. Must be 0.
	    CA2     Not used. Connected to PA0.
	    CB1     Not used.
	    CB2     Not used.
	*/

	/* Enable Teletext 1 screen */
	if (BIT(m_video_pa, 3))
		m_trom[0]->screen_update(screen, bitmap, cliprect);

	/* Enable Teletext 2 screen */
	if (BIT(m_video_pb, 0))
		m_trom[1]->screen_update(screen, bitmap, cliprect);

	return 0;
}