void hmcs40_cpu_device::device_start() { m_program = &space(AS_PROGRAM); m_data = &space(AS_DATA); m_prgmask = (1 << m_prgwidth) - 1; m_datamask = (1 << m_datawidth) - 1; m_pcmask = (1 << m_pcwidth) - 1; m_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(hmcs40_cpu_device::simple_timer_cb), this)); reset_prescaler(); // resolve callbacks m_read_r0.resolve_safe(m_polarity & 0xf); m_read_r1.resolve_safe(m_polarity & 0xf); m_read_r2.resolve_safe(m_polarity & 0xf); m_read_r3.resolve_safe(m_polarity & 0xf); m_read_r4.resolve_safe(m_polarity & 0xf); m_read_r5.resolve_safe(m_polarity & 0xf); m_read_r6.resolve_safe(m_polarity & 0xf); m_read_r7.resolve_safe(m_polarity & 0xf); m_write_r0.resolve_safe(); m_write_r1.resolve_safe(); m_write_r2.resolve_safe(); m_write_r3.resolve_safe(); m_write_r4.resolve_safe(); m_write_r5.resolve_safe(); m_write_r6.resolve_safe(); m_write_r7.resolve_safe(); m_read_d.resolve_safe(m_polarity); m_write_d.resolve_safe(); // zerofill memset(m_stack, 0, sizeof(m_stack)); m_op = 0; m_prev_op = 0; m_i = 0; m_eint_line = 0; m_halt = 0; m_pc = 0; m_prev_pc = 0; m_page = 0; m_a = 0; m_b = 0; m_x = 0; m_spx = 0; m_y = 0; m_spy = 0; m_s = 1; m_c = 0; m_tc = 0; m_cf = 0; m_ie = 0; m_iri = m_irt = 0; memset(m_if, 0, sizeof(m_if)); m_tf = 0; memset(m_int, 0, sizeof(m_int)); memset(m_r, 0, sizeof(m_r)); m_d = 0; // register for savestates save_item(NAME(m_stack)); save_item(NAME(m_op)); save_item(NAME(m_prev_op)); save_item(NAME(m_i)); save_item(NAME(m_eint_line)); save_item(NAME(m_halt)); save_item(NAME(m_timer_halted_remain)); save_item(NAME(m_pc)); save_item(NAME(m_prev_pc)); save_item(NAME(m_page)); save_item(NAME(m_a)); save_item(NAME(m_b)); save_item(NAME(m_x)); save_item(NAME(m_spx)); save_item(NAME(m_y)); save_item(NAME(m_spy)); save_item(NAME(m_s)); save_item(NAME(m_c)); save_item(NAME(m_tc)); save_item(NAME(m_cf)); save_item(NAME(m_ie)); save_item(NAME(m_iri)); save_item(NAME(m_irt)); save_item(NAME(m_if)); save_item(NAME(m_tf)); save_item(NAME(m_int)); save_item(NAME(m_r)); save_item(NAME(m_d)); // register state for debugger state_add(HMCS40_PC, "PC", m_pc).formatstr("%04X"); state_add(HMCS40_A, "A", m_a).formatstr("%01X"); state_add(HMCS40_B, "B", m_b).formatstr("%01X"); state_add(HMCS40_X, "X", m_x).formatstr("%01X"); state_add(HMCS40_SPX, "SPX", m_spx).formatstr("%01X"); state_add(HMCS40_Y, "Y", m_y).formatstr("%01X"); state_add(HMCS40_SPY, "SPY", m_spy).formatstr("%01X"); state_add(STATE_GENPC, "curpc", m_pc).formatstr("%04X").noshow(); state_add(STATE_GENFLAGS, "GENFLAGS", m_s).formatstr("%2s").noshow(); m_icountptr = &m_icount; }
int main(void) { //uint i; /* Timer 1 is 10-bit PWM. */ TCCR1A = _BV(WGM10) | _BV(WGM11) | _BV(COM1A1); /* Use clock input. */ TCCR1B |= _BV(CS10); // clock/1024 //TCCR1B = _BV(CS12) | _BV(CS10); // clock/64 //TCCR1B = _BV(CS11) | _BV(CS10); /* Turn out the light, turn out the light.... */ LIGHT = light = 0; /* Enable OC1 as output. */ DDROC = _BV(OC1); /* Enable timer 1 overflow interrupt. */ TIMSK1 = _BV(TOIE1); // Timer 0: 8-bit CTC-mode counter. TCCR0A = _BV(WGM01); // clock/1024 TCCR0B |= _BV(CS02) | _BV(CS00); // TCNT0, OCR0A, OCR0B // Set output compare value: OCR0A = PERIOD1; // Enable timer 0 output compare match interrupt A TIMSK0 |= _BV(OCIE0A); /* Set dim port inputs & pull-ups. */ DIM_DIR &= ~(_BV(DIM_UP) | _BV(DIM_DOWN)); DIM_PORT |= (_BV(DIM_UP) | _BV(DIM_DOWN)); /* Set correction port inputs & pull-ups */ /* CORR_DIR &= ~(_BV(CORR_UP) | _BV(CORR_DOWN)); CORR_PORT |= (_BV(CORR_UP) | _BV(CORR_DOWN)); */ /* Set time-setting ports to input, and set pull-ups. */ TIMEUP_DIR &= ~(_BV(TIME_UP)); TIMEDN_DIR &= ~(_BV(TIME_DN)); TIMEUP_PORT |= _BV(TIME_UP); TIMEDN_PORT |= _BV(TIME_DN); /* Set pin-changed interrupt for time-setting buttons. */ PCICR |= PCI_IE_MASK; PCMSK0 |= PCI0_MASK; PCMSK1 |= PCI1_MASK; PCMSK2 |= PCI2_MASK; /* Set wake port to input with pull-up. */ WAKE_DIR &= ~(_BV(WAKE_BIT)); WAKE_PORT |= _BV(WAKE_BIT); /* Set alarm toggle port to input with pull-up. */ ALARM_DIR &= ~(_BV(ALARM_BIT)); ALARM_PORT |= _BV(ALARM_BIT); lcd_port_init(); _delay_ms(20); lcd_full_reset(); lcd_write_instr(LCD_CMD_FUNCTION | LCD_FUNCTION_4BITS | LCD_FUNCTION_2LINES | LCD_FUNCTION_FONT_5X8); lcd_write_instr(LCD_CMD_DISPLAY | LCD_DISPLAY_ON | LCD_CURSOR_ON | LCD_CURSOR_BLINK); lcd_write_instr(LCD_CMD_ENTRY | LCD_ENTRY_INC); lcd_write_instr(LCD_CMD_HOME); lcd_set_stdout(); lcd_write_instr(LCD_CMD_DISPLAY | LCD_DISPLAY_ON); lcd_write_instr(LCD_CMD_CLEAR); correction = 590; // reset the counter. TCNT0 = 0; reset_prescaler(); hours = minutes = 0; seconds = 0; wakehours = 7; wakeminutes = 0; timeup = timedn = 0; alarm_toggle = 0; hours = 6; minutes = 39; seconds = 45; setdelay = 0; sei(); for (;;) { sleep_mode(); } return 0; }