static uint8_t mount_line(void) { FRESULT res; UINT bytesread; uint8_t i,*str,*strend, *buffer_start; uint16_t curpos; bool got_colon = false; uint8_t olderror = current_error; current_error = ERROR_OK; /* Kill all buffers */ free_multiple_buffers(FMB_USER_CLEAN); curpos = 0; strend = NULL; buffer_start = command_buffer + 1; globalflags |= SWAPLIST_ASCII; for (i=0;i<=linenum;i++) { str = buffer_start; res = f_lseek(&swaplist,curpos); if (res != FR_OK) { parse_error(res,1); return 0; } res = f_read(&swaplist, str, CONFIG_COMMAND_BUFFER_SIZE - 1, &bytesread); if (res != FR_OK) { parse_error(res,1); return 0; } /* Terminate string in buffer */ if (bytesread < CONFIG_COMMAND_BUFFER_SIZE - 1) str[bytesread] = 0; if (bytesread == 0) { if (linenum == 255) { /* Last entry requested, found it */ linenum = i-1; } else { /* End of file - restart loop to read the first entry */ linenum = 0; } i = -1; /* I could've used goto instead... */ curpos = 0; continue; } /* Skip name */ got_colon = false; while (*str != '\r' && *str != '\n') { if (*str == ':') got_colon = true; str++; } strend = str; /* Skip line terminator */ while (*str == '\r' || *str == '\n') str++; /* check for PETSCII marker */ if (curpos == 0) { if (!memcmp_P(buffer_start, petscii_marker, sizeof(petscii_marker))) { /* swaplist is in PETSCII, ignore this line */ globalflags &= ~SWAPLIST_ASCII; i--; } } curpos += str - buffer_start; } /* Terminate file name */ *strend = 0; if (partition[swappath.part].fop != &fatops) image_unmount(swappath.part); /* Start in the partition+directory of the swap list */ current_part = swappath.part; display_current_part(current_part); partition[current_part].current_dir = swappath.dir; /* add a colon if neccessary */ if (!got_colon && buffer_start[0] != '/') { command_buffer[0] = ':'; buffer_start = command_buffer; } /* recode entry if neccessary */ if (globalflags & SWAPLIST_ASCII) asc2pet(buffer_start); /* parse and change */ do_chdir(buffer_start); if (current_error != 0 && current_error != ERROR_DOSVERSION) { current_error = olderror; return 0; } return 1; }
int main(void) { /* Early system initialisation */ early_board_init(); system_init_early(); leds_init(); set_busy_led(1); set_dirty_led(0); /* Due to an erratum in the LPC17xx chips anything that may change */ /* peripheral clock scalers must come before system_init_late() */ uart_init(); #ifndef SPI_LATE_INIT spi_init(SPI_SPEED_SLOW); #endif timer_init(); i2c_init(); /* Second part of system initialisation, switches to full speed on ARM */ system_init_late(); enable_interrupts(); /* Prompt software name and version string */ uart_puts_P(PSTR("\r\nNODISKEMU " VERSION "\r\n")); /* Internal-only initialisation, called here because it's faster */ buffers_init(); buttons_init(); /* Anything that does something which needs the system clock */ /* should be placed after system_init_late() */ rtc_init(); // accesses I2C disk_init(); // accesses card read_configuration(); // restores configuration, may change device address filesystem_init(0); // FIXME: change_init(); #ifdef CONFIG_REMOTE_DISPLAY /* at this point all buffers should be free, */ /* so just use the data area of the first to build the string */ uint8_t *strbuf = buffers[0].data; ustrcpy_P(strbuf, versionstr); ustrcpy_P(strbuf+ustrlen(strbuf), longverstr); if (display_init(ustrlen(strbuf), strbuf)) { display_address(device_address); display_current_part(0); } #endif set_busy_led(0); #if defined(HAVE_SD) /* card switch diagnostic aid - hold down PREV button to use */ if (menu_system_enabled && get_key_press(KEY_PREV)) board_diagnose(); #endif if (menu_system_enabled) lcd_splashscreen(); bus_interface_init(); bus_init(); read_configuration(); late_board_init(); for (;;) { if (menu_system_enabled) lcd_refresh(); else { lcd_clear(); lcd_printf("#%d", device_address); } /* Unit number may depend on hardware and stored settings */ /* so present it here at last */ printf("#%02d\r\n", device_address); bus_mainloop(); bus_interface_init(); bus_init(); // needs delay, inits device address with HW settings } }
int main(void) { /* Early system initialisation */ board_init(); system_init_early(); leds_init(); set_busy_led(1); set_dirty_led(0); /* Due to an erratum in the LPC17xx chips anything that may change */ /* peripheral clock scalers must come before system_init_late() */ uart_init(); #ifndef SPI_LATE_INIT spi_init(SPI_SPEED_SLOW); #endif timer_init(); bus_interface_init(); i2c_init(); /* Second part of system initialisation, switches to full speed on ARM */ system_init_late(); enable_interrupts(); /* Internal-only initialisation, called here because it's faster */ buffers_init(); buttons_init(); /* Anything that does something which needs the system clock */ /* should be placed after system_init_late() */ bus_init(); // needs delay rtc_init(); // accesses I2C disk_init(); // accesses card read_configuration(); fatops_init(0); change_init(); uart_puts_P(PSTR("\r\nsd2iec " VERSION " #")); uart_puthex(device_address); uart_putcrlf(); #ifdef CONFIG_REMOTE_DISPLAY /* at this point all buffers should be free, */ /* so just use the data area of the first to build the string */ uint8_t *strbuf = buffers[0].data; ustrcpy_P(strbuf, versionstr); ustrcpy_P(strbuf+ustrlen(strbuf), longverstr); if (display_init(ustrlen(strbuf), strbuf)) { display_address(device_address); display_current_part(0); } #endif set_busy_led(0); #if defined(HAVE_SD) && BUTTON_PREV != 0 /* card switch diagnostic aid - hold down PREV button to use */ if (!(buttons_read() & BUTTON_PREV)) { while (buttons_read() & BUTTON_NEXT) { set_dirty_led(sdcard_detect()); # ifndef SINGLE_LED set_busy_led(sdcard_wp()); # endif } reset_key(0xff); } #endif bus_mainloop(); while (1); }