]> cloudbase.mooo.com Git - z180-stamp.git/commitdiff
loadcpm3 for new memory map
authorLeo C <erbl259-lmu@yahoo.de>
Tue, 9 Jun 2015 15:20:01 +0000 (17:20 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Tue, 9 Jun 2015 15:20:01 +0000 (17:20 +0200)
avr/cmd_loadcpm3.c
avr/command_tbl.c
avr/env.c
include/config.h
z180/z180reg.inc

index 3f1bbe10e9a0868f3a4440251fc36231588c7009..da1be375526aee63bce44ac656c490d2ddaa2c42 100644 (file)
@@ -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"));
 
index a9cc2bd64ae81b559a86f6411a2ce5acc23e2de0..72a87b9bbe2bd1dec5e63b5704ee9c9aaf5ff456 100644 (file)
@@ -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,
index a947583a6fe273ce4b3710c5b642e616fb216534..9ea355fa974001c9c9b2e4264c9b2356902c7769 100644 (file)
--- 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
index a4035204378a04bd53407af8004372606b85f3d3..c7c45119ac102e0a704be1846dc00a35c97946f8 100644 (file)
@@ -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
 #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 */
index a248f5f43e958dc5d6c53f08f46898249d1b34cd..266686756391996c16299e6e087558e8fb3460f7 100644 (file)
@@ -130,8 +130,8 @@ bcr1h       equ     IOBASE+2Fh      ;
 dstat  equ     IOBASE+30h      ;DMA Status Register\r
        b2m DE1,7               ;DMA enable ch 1,0\r
        b2m DE0,6               ;\r
-       b2m DWE1,5              ;DMA Enable Bit Write Enable 1,0\r
-       b2m DWE0,4              ;\r
+       b2m NDWE1,5             ;DMA Enable Bit Write Enable 1,0\r
+       b2m NDWE0,4             ;\r
        b2m DIE1,3              ;DMA Interrupt Enable 1,0\r
        b2m DIE0,2              ;\r
        b2m DME,0               ;DMA Master enable\r
@@ -195,4 +195,3 @@ IV$ASCI0 equ        14              ;ASCI channel 0
 IV$ASCI1 equ   16              ;ASCI channel 1 (lowest priority)\r
 \r
        .list\r
-\r