int main (void) { struct eeprom_boot_data eedata; DDRB = 0; DDRC = 0; DDRD = 0; PORTB = 0xFF; PORTC = 0xFF; PORTD = 0xFF; DDRB |= _BV(2) | _BV(4) | _BV(5); seed_pseudorandom(); load_eeprom_data(&eedata); init_eeprom_data(&eedata); save_eeprom_data(&eedata); if (memcmp_PP(bootloader_data, (void *)__bootloader_start, bootloader_data_len)) { DDRB |= _BV(PB5); for (int pageaddr = 0; pageaddr < bootloader_data_len; pageaddr += SPM_PAGESIZE) { PORTB ^= _BV(PB5); memcpy_P(flashdata, bootloader_data + pageaddr, SPM_PAGESIZE); flash_write_page((void *)__bootloader_start + pageaddr, flashdata); } } while (1) { PORTB ^= _BV(PB5); _delay_ms(500); } }
void handle_mode_options() { const char* ppitems[] = {S_OPTION_MACHINE_TYPE, S_OPTION_VIDEO_MODE, S_OPTION_SIGNAL, S_OPTION_KEY_REPEAT, S_OPTION_TICKER_SPEED, S_OPTION_TICKER_HOLD, S_OPTION_REC_FINALIZE, S_OPTION_REC_AUTO_FINALIZE}; uint16_t value = 0; uint8_t save = 0; uint8_t cur_mode = 0; while (1) { cur_mode = handle_select_mode(S_MODE_OPTIONS, ppitems, 8, cur_mode); switch (cur_mode) { case OPTION_MACHINE_TYPE: { const char* ppenum[] = {S_C64, S_VIC, S_C16}; value = g_machine_type; if (handle_option_enum(S_OPTION_MACHINE_TYPE, &value, 3, ppenum)) { save = 1; g_machine_type = value; } } break; case OPTION_VIDEO_MODE: { const char* ppenum[] = {S_PAL, S_NTSC}; value = g_video_mode; if (handle_option_enum(S_OPTION_VIDEO_MODE, &value, 2, ppenum)) { save = 1; g_video_mode = value; } } break; case OPTION_SIGNAL: value = g_invert_signal; if (handle_option_value(S_OPTION_SIGNAL, &value, 0, 1, 1)) { g_invert_signal = value; if (value) { CONTROL_SET_BUS1(); } else { CONTROL_SET_BUS0(); } save = 1; } break; case OPTION_KEY_REPEAT: value = g_key_repeat_next * 10; if (handle_option_value(S_OPTION_KEY_REPEAT, &value, 50, 500, 50)) { g_key_repeat_next = value / 10; save = 1; } break; case OPTION_TICKER_SPEED: value = g_ticker_rate * 10; if (handle_option_value(S_OPTION_TICKER_SPEED, &value, 50, 500, 50)) { g_ticker_rate = value / 10; save = 1; } break; case OPTION_TICKER_HOLD: value = g_ticker_hold_rate * 10; if (handle_option_value(S_OPTION_TICKER_HOLD, &value, 250, 2500, 250)) { g_ticker_hold_rate = value / 10; save = 1; } break; case OPTION_REC_FINALIZE: value = g_rec_finalize_time * 10; if (handle_option_value(S_OPTION_REC_FINALIZE, &value, 500, 2500, 500)) { g_rec_finalize_time = value / 10; save = 1; } break; case OPTION_REC_AUTO_FINALIZE: value = g_rec_auto_finalize; if (handle_option_value(S_OPTION_REC_AUTO_FINALIZE, &value, 0, 1, 1)) { g_rec_auto_finalize = value; save = 1; } break; case SELECT_MODE_EXIT: if (save) { save_eeprom_data(); } return; break; } } }