void nsc810_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { switch(id) { case TIMER0_CLOCK: m_timer0_counter--; if((m_timer0_mode & 0x07) == 0x01 || (m_timer0_mode & 0x07) == 0x02) { if(m_timer0_counter == 0) { m_timer0_out(ASSERT_LINE); m_timer0_counter = m_timer0_base; if(LOG) logerror("NSC810 '%s': Timer 0 output set\n",tag()); } } break; case TIMER1_CLOCK: m_timer1_counter--; if((m_timer1_mode & 0x07) == 0x01 || (m_timer1_mode & 0x07) == 0x02) { if(m_timer1_counter == 0) { m_timer1_out(ASSERT_LINE); m_timer1_counter = m_timer1_base; if(LOG) logerror("NSC810 '%s': Timer 1 output set\n",tag()); } } break; } }
void nsc810_device::device_start() { m_portA_r.resolve_safe(0); m_portB_r.resolve_safe(0); m_portC_r.resolve_safe(0); m_portA_w.resolve_safe(); m_portB_w.resolve_safe(); m_portC_w.resolve_safe(); m_timer0_out.resolve_safe(); m_timer1_out.resolve_safe(); m_portA_w(0); m_portB_w(0); m_portC_w(0); m_timer0_out(0); m_timer1_out(0); m_timer0 = timer_alloc(TIMER0_CLOCK); m_timer1 = timer_alloc(TIMER1_CLOCK); }
uint8_t nsc810_device::read(offs_t offset) { uint8_t res = 0xff; if(m_ramselect) { // TODO: 128 byte RAM access } else { // Register access switch(offset & 0x1f) { case REG_PORTA: res = m_portA_latch &= m_ddrA; res |= (m_portA_r() & ~m_ddrA); //LOG("NSC810: Port A data read %02x\n",res); break; case REG_PORTB: res = m_portB_latch &= m_ddrB; res |= (m_portB_r() & ~m_ddrB); //LOG("NSC810: Port B data read %02x\n",res); break; case REG_PORTC: res = m_portC_latch &= m_ddrC; res |= (m_portC_r() & ~m_ddrC); //LOG("NSC810: Port C data read %02x\n",res); break; case REG_MODE_TIMER0: res = m_timer0_mode; break; case REG_MODE_TIMER1: res = m_timer1_mode; break; case REG_TIMER0_LOW: res = m_timer0_counter & 0xff; if((m_timer0_mode & 0x07) == 0x01 || (m_timer0_mode & 0x07) == 0x02) { m_timer0_out(CLEAR_LINE); LOG("NSC810: Timer 0 output reset\n"); } break; case REG_TIMER0_HIGH: res = m_timer0_counter >> 8; if((m_timer0_mode & 0x07) == 0x01 || (m_timer0_mode & 0x07) == 0x02) { m_timer0_out(CLEAR_LINE); LOG("NSC810: Timer 0 output reset\n"); } break; case REG_TIMER1_LOW: res = m_timer1_counter & 0xff; if((m_timer1_mode & 0x07) == 0x01 || (m_timer1_mode & 0x07) == 0x02) { m_timer1_out(0); LOG("NSC810: Timer 1 output reset\n"); } break; case REG_TIMER1_HIGH: res = m_timer1_counter >> 8; if((m_timer1_mode & 0x07) == 0x01 || (m_timer1_mode & 0x07) == 0x02) { m_timer1_out(0); LOG("NSC810: Timer 1 output reset\n"); } break; default: LOG("NSC810: unused port %02x read\n",offset); } } return res; }