diff options
Diffstat (limited to 'src/mame/machine/pp01.cpp')
-rw-r--r-- | src/mame/machine/pp01.cpp | 101 |
1 files changed, 63 insertions, 38 deletions
diff --git a/src/mame/machine/pp01.cpp b/src/mame/machine/pp01.cpp index a711856ff5d..665724e5a60 100644 --- a/src/mame/machine/pp01.cpp +++ b/src/mame/machine/pp01.cpp @@ -13,12 +13,12 @@ #include "includes/pp01.h" -WRITE8_MEMBER(pp01_state::pp01_video_write_mode_w) +WRITE8_MEMBER(pp01_state::video_write_mode_w) { m_video_write_mode = data & 0x0f; } -void pp01_state::pp01_video_w(uint8_t block,uint16_t offset,uint8_t data,uint8_t part) +void pp01_state::video_w(uint8_t block,uint16_t offset,uint8_t data,uint8_t part) { uint16_t addroffset = part ? 0x1000 : 0x0000; uint8_t *ram = m_ram->pointer(); @@ -53,34 +53,34 @@ void pp01_state::pp01_video_w(uint8_t block,uint16_t offset,uint8_t data,uint8_t } } -WRITE8_MEMBER(pp01_state::pp01_video_r_1_w) +WRITE8_MEMBER(pp01_state::video_r_1_w) { - pp01_video_w(0,offset,data,0); + video_w(0,offset,data,0); } -WRITE8_MEMBER(pp01_state::pp01_video_g_1_w) +WRITE8_MEMBER(pp01_state::video_g_1_w) { - pp01_video_w(1,offset,data,0); + video_w(1,offset,data,0); } -WRITE8_MEMBER(pp01_state::pp01_video_b_1_w) +WRITE8_MEMBER(pp01_state::video_b_1_w) { - pp01_video_w(2,offset,data,0); + video_w(2,offset,data,0); } -WRITE8_MEMBER(pp01_state::pp01_video_r_2_w) +WRITE8_MEMBER(pp01_state::video_r_2_w) { - pp01_video_w(0,offset,data,1); + video_w(0,offset,data,1); } -WRITE8_MEMBER(pp01_state::pp01_video_g_2_w) +WRITE8_MEMBER(pp01_state::video_g_2_w) { - pp01_video_w(1,offset,data,1); + video_w(1,offset,data,1); } -WRITE8_MEMBER(pp01_state::pp01_video_b_2_w) +WRITE8_MEMBER(pp01_state::video_b_2_w) { - pp01_video_w(2,offset,data,1); + video_w(2,offset,data,1); } -void pp01_state::pp01_set_memory(uint8_t block, uint8_t data) +void pp01_state::set_memory(uint8_t block, uint8_t data) { uint8_t *mem = memregion("maincpu")->base(); address_space &space = m_maincpu->space(AS_PROGRAM); @@ -94,22 +94,22 @@ void pp01_state::pp01_set_memory(uint8_t block, uint8_t data) space.install_read_bank (startaddr, endaddr, bank); switch(data) { case 0xe6 : - space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_r_1_w),this)); + space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::video_r_1_w),this)); break; case 0xe7 : - space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_r_2_w),this)); + space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::video_r_2_w),this)); break; case 0xea : - space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_g_1_w),this)); + space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::video_g_1_w),this)); break; case 0xeb : - space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_g_2_w),this)); + space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::video_g_2_w),this)); break; case 0xee : - space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_b_1_w),this)); + space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::video_b_1_w),this)); break; case 0xef : - space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_b_2_w),this)); + space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::video_b_2_w),this)); break; default : @@ -134,49 +134,74 @@ void pp01_state::machine_reset() memset(m_memory_block,0xff,16); for(i=0;i<16;i++) { m_memory_block[i] = 0xff; - pp01_set_memory(i, 0xff); + set_memory(i, 0xff); } m_uart->write_cts(0); } -WRITE8_MEMBER(pp01_state::pp01_mem_block_w) +WRITE8_MEMBER(pp01_state::mem_block_w) { m_memory_block[offset] = data; - pp01_set_memory(offset, data); + set_memory(offset, data); } -READ8_MEMBER(pp01_state::pp01_mem_block_r) +READ8_MEMBER(pp01_state::mem_block_r) { - return m_memory_block[offset]; + return m_memory_block[offset]; } void pp01_state::machine_start() { } - -WRITE_LINE_MEMBER(pp01_state::z2_w) +TIMER_DEVICE_CALLBACK_MEMBER( pp01_state::kansas_r ) { - if (state) + if (m_rts) + { + m_cass_data[1] = m_cass_data[2] = m_cass_data[3] = 0; + m_casspol = 1; + return; + } + + m_cass_data[1]++; + m_cass_data[2]++; + + uint8_t cass_ws = (m_cass->input() > +0.04) ? 1 : 0; + + if (cass_ws != m_cass_data[0]) + { + m_cass_data[0] = cass_ws; + if (m_cass_data[1] > 13) + m_casspol ^= 1; + m_cass_data[1] = 0; + m_cass_data[2] = 0; + m_uart->write_rxd(m_casspol); + } + if ((m_cass_data[2] & 7)==2) { - bool cassbit = (m_cass->input() < -0.04) ? 0 : 1; - m_uart->write_rxd(cassbit); + m_cass_data[3]++; + m_uart->write_rxc(BIT(m_cass_data[3], 0)); } +} - m_uart->write_rxc(state); +WRITE_LINE_MEMBER(pp01_state::z2_w) +{ + // incoming 1200Hz m_uart->write_txc(state); + if (!m_txe) + m_cass->output((m_txd ^ state) ? -1.0 : 1.0); } -READ8_MEMBER(pp01_state::pp01_8255_porta_r) +READ8_MEMBER(pp01_state::ppi1_porta_r) { return m_video_scroll; } -WRITE8_MEMBER(pp01_state::pp01_8255_porta_w) +WRITE8_MEMBER(pp01_state::ppi1_porta_w) { m_video_scroll = data; } -READ8_MEMBER(pp01_state::pp01_8255_portb_r) +READ8_MEMBER(pp01_state::ppi1_portb_r) { static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", @@ -185,13 +210,13 @@ READ8_MEMBER(pp01_state::pp01_8255_portb_r) return (ioport(keynames[m_key_line])->read() & 0x3F) | (ioport("LINEALL")->read() & 0xC0); } -WRITE8_MEMBER(pp01_state::pp01_8255_portb_w) +WRITE8_MEMBER(pp01_state::ppi1_portb_w) { //logerror("pp01_8255_portb_w %02x\n",data); } -WRITE8_MEMBER(pp01_state::pp01_8255_portc_w) +WRITE8_MEMBER(pp01_state::ppi1_portc_w) { if (BIT(data, 4)) m_key_line = data & 0x0f; @@ -199,7 +224,7 @@ WRITE8_MEMBER(pp01_state::pp01_8255_portc_w) m_speaker->level_w(BIT(data, 0)); } -READ8_MEMBER(pp01_state::pp01_8255_portc_r) +READ8_MEMBER(pp01_state::ppi1_portc_r) { return 0xff; } |