diff options
Diffstat (limited to 'avr')
-rw-r--r-- | avr/cmd_loadcpm3.c | 52 | ||||
-rw-r--r-- | avr/command_tbl.c | 10 | ||||
-rw-r--r-- | avr/env.c | 2 |
3 files changed, 43 insertions, 21 deletions
diff --git a/avr/cmd_loadcpm3.c b/avr/cmd_loadcpm3.c index 3f1bbe1..da1be37 100644 --- a/avr/cmd_loadcpm3.c +++ b/avr/cmd_loadcpm3.c @@ -27,7 +27,7 @@ * len = Length in pages of module to read * */ -int load(FIL *File, uint16_t addr, uint8_t len) +int load(FIL *File, uint32_t addr, uint8_t len) { uint8_t buffer[RS]; unsigned int br; /* bytes read */ @@ -63,12 +63,12 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg uint8_t res_len; uint16_t bank_top; uint8_t bank_len; - uint16_t osentry_adr = 0; - long offset = 0; + uint16_t osentry_addr = 0; + uint32_t common_base, banked_base; char *fname; FIL File; - /* TODO: put CONFIG_PATH_CPM3SYS in flash */ - char default_fname[] = CONFIG_PATH_CPM3SYS; + /* TODO: put CONFIG_CPM3_SYSFILE in flash */ + char default_fname[] = CONFIG_CPM3_SYSFILE; unsigned int br; /* bytes read */ uint8_t buffer[RS]; int res; @@ -76,15 +76,20 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg (void) cmdtp; (void) flag; - if (argc > 1) - offset = strtoul(argv[1], NULL, 16); + common_base = getenv_ulong(PSTR(ENV_CPM3_COMMON_BASE), 16, + CONFIG_CPM3_COMMON_BASE); + banked_base = getenv_ulong(PSTR(ENV_CPM3_BANKED_BASE), 16, + CONFIG_CPM3_BANKED_BASE); - fname = getenv(PSTR(ENV_PATH_CPM3SYS)); + if (argc > 3) + banked_base = strtoul(argv[3], NULL, 16); + if (argc > 2) + banked_base = strtoul(argv[2], NULL, 16); + fname = getenv(PSTR(ENV_CPM3_SYSFILE)); if (argc > 2) { fname = argv[2]; } - if (fname == NULL || *fname == '\0') fname = default_fname; @@ -105,7 +110,7 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg res_len = buffer[1]; bank_top = buffer[2] << 8; bank_len = buffer[3]; - osentry_adr = buffer[4] + (buffer[5] << 8); + osentry_addr = buffer[4] + (buffer[5] << 8); /* read display info */ res = f_read(&File, buffer, RS, &br); @@ -121,11 +126,11 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg /* Main System Load */ /* Load Common Portion of System */ - if ((res = load(&File, mem_top, res_len)) != 0) + if ((res = load(&File, common_base + mem_top, res_len)) != 0) goto out; /* Load Banked Portion of System */ - res = load(&File, bank_top, bank_len); + res = load(&File, banked_base + bank_top, bank_len); out: f_close(&File); @@ -134,16 +139,31 @@ out: printf_P(PSTR("Error: failed to read '%s'\n"), fname); return CMD_RET_FAILURE; } else { - if (res_len != 0) - setenv_hex(PSTR(ENV_STARTADDRESS), osentry_adr); + 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; + } + setenv_hex(PSTR(ENV_STARTADDRESS), osentry_addr); + } printf_P(PSTR("Loaded: Resident: ")); if (res_len != 0) - printf_P(PSTR("0x%.4X-0x%.4X, "), mem_top-res_len*256, mem_top-1); + 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%.4X-0x%.4X\n"), bank_top-bank_len*256, bank_top-1); + 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")); diff --git a/avr/command_tbl.c b/avr/command_tbl.c index a9cc2bd..72a87b9 100644 --- a/avr/command_tbl.c +++ b/avr/command_tbl.c @@ -151,10 +151,12 @@ CMD_TBL_ITEM( CMD_TBL_ITEM( loadcpm3, 3, 0, do_loadcpm3, "load CPM3.SYS file", - "[offset] [filename]\n" - " - Load CP/M 3 system file from FAT filesystem. This command makes\n" - " CPMLDR superfluous. Default filename is '"CONFIG_PATH_CPM3SYS"', but\n" - " uses environment variable '"ENV_PATH_CPM3SYS"', if set." + "[filename] [common base] [banked base]] \n" + " Load CP/M 3 system file from FAT filesystem. This command makes\n" + " CPMLDR superfluous. Uses the following environment variable if set:\n" + " '"ENV_CPM3_SYSFILE"' File to load. Default is '"CONFIG_CPM3_SYSFILE"'.\n" + " '"ENV_CPM3_COMMON_BASE"' Default is '"CONFIG_CPM3_COMMON_BASE_STR"'.\n" + " '"ENV_CPM3_BANKED_BASE"' Default is '"CONFIG_CPM3_BANKED_BASE_STR"'.\n" ), CMD_TBL_ITEM( loadi, 2, 0, do_loadihex, @@ -34,7 +34,7 @@ const FLASH char default_env[] = { ENV_BAUDRATE "=" "115200" DELIM ENV_BOOTDELAY "=" "3" DELIM ENV_BOOTCMD "=" "reset; loadf; go ${startaddr}" DELIM - ENV_PATH_CPM3SYS "=" CONFIG_PATH_CPM3SYS DELIM + ENV_CPM3_SYSFILE "=" CONFIG_CPM3_SYSFILE DELIM ENV_PINALIAS "=" "0:PG5,1:PG4,2:PB4,3:PB5,4:PB6,5:PB7," "6:PG3,7:PG2,8:PG1,9:PG0,10:PE7" DELIM ENV_STARTADDRESS "=" "0" DELIM |