Example #1
0
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);
    }
}
Example #2
0
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;
    }
  }
}