summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--avr/cmd_loadcpm3.c52
-rw-r--r--avr/command_tbl.c10
-rw-r--r--avr/env.c2
-rw-r--r--include/config.h22
-rw-r--r--z180/z180reg.inc5
5 files changed, 60 insertions, 31 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,
diff --git a/avr/env.c b/avr/env.c
index a947583..9ea355f 100644
--- a/avr/env.c
+++ b/avr/env.c
@@ -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
diff --git a/include/config.h b/include/config.h
index a403520..c7c4511 100644
--- a/include/config.h
+++ b/include/config.h
@@ -9,15 +9,17 @@
/* Environment variables */
-#define ENV_BAUDRATE "baudrate"
-#define ENV_BOOTDELAY "bootdelay"
+#define ENV_BAUDRATE "baudrate"
+#define ENV_BOOTDELAY "bootdelay"
#define ENV_BOOTCMD "bootcmd"
-#define ENV_PATH_CPM3SYS "cpm3_file"
-#define ENV_PINALIAS "pin_alias"
-#define ENV_STARTADDRESS "startaddress"
-#define ENV_ESC_CHAR "esc_char"
-#define CONFIG_PATH_CPM3SYS "1:/cpm3.sys"
+#define ENV_CPM3_SYSFILE "cpm3_file"
+#define ENV_CPM3_COMMON_BASE "cpm3_commonbase"
+#define ENV_CPM3_BANKED_BASE "cpm3_bankedbase"
+
+#define ENV_PINALIAS "pin_alias"
+#define ENV_STARTADDRESS "startaddress"
+#define ENV_ESC_CHAR "esc_char"
#define CONFIG_ENV_SIZE 1600
#define CONFIG_ENV_OFFSET 0
@@ -28,6 +30,12 @@
#define CONFIG_BOOTDELAY 4
//#define CONFIG_ZERO_BOOTDELAY_CHECK 1
+#define CONFIG_CPM3_SYSFILE "1:/cpm3.sys"
+#define CONFIG_CPM3_COMMON_BASE 0xC000
+#define CONFIG_CPM3_BANKED_BASE 0x0
+#define CONFIG_CPM3_COMMON_BASE_STR "C000"
+#define CONFIG_CPM3_BANKED_BASE_STR "0"
+
#define CONFIG_CMD_MEMTEST
#define CONFIG_MX_CYCLIC
#define CONFIG_SYS_RAMSIZE_MAX (1l<<19) /* max. addressable memory */
diff --git a/z180/z180reg.inc b/z180/z180reg.inc
index a248f5f..2666867 100644
--- a/z180/z180reg.inc
+++ b/z180/z180reg.inc
@@ -130,8 +130,8 @@ bcr1h equ IOBASE+2Fh ;
dstat equ IOBASE+30h ;DMA Status Register
b2m DE1,7 ;DMA enable ch 1,0
b2m DE0,6 ;
- b2m DWE1,5 ;DMA Enable Bit Write Enable 1,0
- b2m DWE0,4 ;
+ b2m NDWE1,5 ;DMA Enable Bit Write Enable 1,0
+ b2m NDWE0,4 ;
b2m DIE1,3 ;DMA Interrupt Enable 1,0
b2m DIE0,2 ;
b2m DME,0 ;DMA Master enable
@@ -195,4 +195,3 @@ IV$ASCI0 equ 14 ;ASCI channel 0
IV$ASCI1 equ 16 ;ASCI channel 1 (lowest priority)
.list
-