X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/86ee5f8bc4c5a4c204be6fff004ef6bf6b839dcd..5e8ac5e02a09140e97d56a9d5313504dfa31282d:/avr/cmd_loadcpm3.c diff --git a/avr/cmd_loadcpm3.c b/avr/cmd_loadcpm3.c index 6ccb3f9..ee336da 100644 --- a/avr/cmd_loadcpm3.c +++ b/avr/cmd_loadcpm3.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2015,2016 Leo C. + * (C) Copyright 2015,2016,2018 Leo C. * * SPDX-License-Identifier: GPL-2.0 */ @@ -17,12 +17,23 @@ #include "con-utils.h" #include "z80-if.h" #include "debug.h" +#include "errnum.h" #define RS 128 /* CP/M record size */ #define FSIZE_t DWORD +static FRESULT read_record(FIL *fp, uint8_t *buffer) +{ + unsigned int br; /* bytes read */ + + FRESULT res = f_read(fp, buffer, RS, &br); + if (br != RS) + return EEOF; + return res; +} + /* * Load Routine * @@ -30,37 +41,32 @@ * len = Length in pages of module to read * */ -int load(FIL *File, uint32_t addr, uint8_t len) +ERRNUM load(FIL *File, uint32_t addr, uint8_t len) { uint8_t buffer[RS]; - unsigned int br; /* bytes read */ - int res; len *= 2; /* length in records of module */ //debug("## load: addr: 0x%.4X, records: 0x%.4X, (%u)\n", addr, len, len); for (; len; len--) { addr -= RS; - res = f_read(File, buffer, RS, &br); - if (res || br != RS) { - return 1; - } + FRESULT res = read_record(File, buffer); + if (res) + return res; - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return 2; - } + if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) + return EBUSTO; z80_write_block(buffer, addr, RS); z80_bus_cmd(Release); //debug("## written: 0x%.4X\n", addr); } - return 0; + return ESUCCESS; } #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint16_t mem_top; uint8_t res_len; @@ -72,11 +78,8 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * char *fname; FIL File; char default_fname[strlen_P(PSTR(CONFIG_CPM3_SYSFILE)) + 1]; - unsigned int br; /* bytes read */ uint8_t buffer[RS]; - int res; - - (void) cmdtp; (void) flag; + FRESULT res; //common_base = getenv_ulong(PSTR(ENV_CPM3_COMMON_BASE), 16, @@ -99,16 +102,14 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * } res = f_open(&File, fname, FA_READ ); - if (res) { - printf_P(PSTR("Error: failed to open '%s'\n"), fname); - return CMD_RET_FAILURE; - } + if (res) + goto out; printf_P(PSTR("Loading: '%s'...\n"), fname); /* read the load record */ - res = f_read(&File, buffer, RS, &br); - if (res || br != RS) + res = read_record(&File, buffer); + if (res) goto out; mem_top = buffer[0] << 8; @@ -118,8 +119,8 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * osentry_addr = buffer[4] + (buffer[5] << 8); /* read display info */ - res = f_read(&File, buffer, RS, &br); - if (res || br != RS) + res = read_record(&File, buffer); + if (res) goto out; /* print the info */ @@ -134,11 +135,15 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * */ FSIZE_t common_base_ofs = ((res_len - 6) << 8) + 2*RS + RS-7; FSIZE_t cur_pos = f_tell(&File); + unsigned int br; /* bytes read */ if ((res = f_lseek(&File, common_base_ofs)) || (res = f_read(&File, buffer, 2, &br)) || - (br != 2) || (res = f_lseek(&File, cur_pos))) goto out; + if (br != 2) { + res = EEOF; + goto out; + } common_base = (uint16_t) buffer[0] + (buffer[1] << 8); setenv_hex(PSTR(ENV_CPM3_COMMON_BASE), common_base); } @@ -157,38 +162,36 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * out: f_close(&File); - if (res) { - printf_P(PSTR("Error: failed to read '%s'\n"), fname); - return CMD_RET_FAILURE; - } else { - if (res_len != 0) { - if (osentry_addr + common_base > 0xffff) { - z80_bus_cmd(Request); - if (z80_read(osentry_addr + common_base) == 0xc3) { - osentry_addr = z80_read(osentry_addr+common_base+1) + - (z80_read(osentry_addr + common_base+2) << 8); - } - z80_bus_cmd(Release); - if (banked_base + osentry_addr > 0xffff) - osentry_addr = 0; + if (res) + cmd_error(CMD_RET_FAILURE, res, PSTR("%s"), fname); + + if (res_len != 0) { + if (osentry_addr + common_base > 0xffff) { + z80_bus_cmd(Request); + if (z80_read(osentry_addr + common_base) == 0xc3) { + osentry_addr = z80_read(osentry_addr+common_base+1) + + (z80_read(osentry_addr + common_base+2) << 8); } - setenv_hex(PSTR(ENV_STARTADDRESS), osentry_addr); + z80_bus_cmd(Release); + if (banked_base + osentry_addr > 0xffff) + osentry_addr = 0; } - printf_P(PSTR("Loaded: Resident: ")); - if (res_len != 0) - printf_P(PSTR("0x%.5lX-0x%.5lX, "), - (common_base + mem_top) - res_len*256, - (common_base + mem_top) - 1); - else - printf_P(PSTR(" - ")); - printf_P(PSTR("Banked: ")); - if (bank_len != 0) - printf_P(PSTR("0x%.5lX-0x%.5lX\n"), - (banked_base + bank_top) - bank_len*256, - (banked_base + bank_top) - 1); - else - printf_P(PSTR(" - \n")); - - return CMD_RET_SUCCESS; + setenv_hex(PSTR(ENV_STARTADDRESS), osentry_addr); } + printf_P(PSTR("Loaded: Resident: ")); + if (res_len != 0) + printf_P(PSTR("%.5lX-%.5lX, "), + (common_base + mem_top) - res_len*256, + (common_base + mem_top) - 1); + else + printf_P(PSTR(" - ")); + printf_P(PSTR("Banked: ")); + if (bank_len != 0) + printf_P(PSTR("%.5lX-%.5lX\n"), + (banked_base + bank_top) - bank_len*256, + (banked_base + bank_top) - 1); + else + printf_P(PSTR(" - \n")); + + return CMD_RET_SUCCESS; }