summaryrefslogtreecommitdiff
path: root/avr/cmd_loadcpm3.c
diff options
context:
space:
mode:
Diffstat (limited to 'avr/cmd_loadcpm3.c')
-rw-r--r--avr/cmd_loadcpm3.c119
1 files changed, 61 insertions, 58 deletions
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. <erbl259-lmu@yahoo.de>
+ * (C) Copyright 2015,2016,2018 Leo C. <erbl259-lmu@yahoo.de>
*
* 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;
}