summaryrefslogtreecommitdiff
path: root/avr/cmd_loadcpm3.c
diff options
context:
space:
mode:
authorLeo C2015-06-09 17:20:01 +0200
committerLeo C2015-06-09 17:20:01 +0200
commit057817cb1dc71416bc798b5cd592acfcea87efaa (patch)
tree192f4dfa1d866706554a2818d3161db4a2d887bd /avr/cmd_loadcpm3.c
parent8bbf185ed81c12534c0ad9b26f0049035fde8df4 (diff)
downloadz180-stamp-057817cb1dc71416bc798b5cd592acfcea87efaa.zip
loadcpm3 for new memory map
Diffstat (limited to 'avr/cmd_loadcpm3.c')
-rw-r--r--avr/cmd_loadcpm3.c52
1 files changed, 36 insertions, 16 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"));