]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_loadcpm3.c
Get common_base from cpm3.sys file. Update default environment (BOOTCMD)
[z180-stamp.git] / avr / cmd_loadcpm3.c
index a2436f23b0490d5f3f839329f0747c9a13ec0eb2..f24ee19352d2722cc62181c8c2f5aedff40ac2ef 100644 (file)
@@ -1,7 +1,11 @@
 /*
  * (C) Copyright 2015 Leo C. <erbl259-lmu@yahoo.de>
  *
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+/*
+ * See CP/M 3 System Manual, Appendix D: CPM3.SYS File Format
  */
 
 #include "common.h"
@@ -20,6 +24,8 @@
 
 #define RS             128             /* CP/M record size */
 
+#define FSIZE_t DWORD
+
 /*
  *     Load Routine
  *
@@ -64,10 +70,10 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg
        uint16_t bank_top;
        uint8_t bank_len;
        uint16_t osentry_addr = 0;
-       uint32_t common_base, banked_base;
+       uint32_t common_base = 0;
+       uint32_t banked_base;
        char *fname;
        FIL File;
-       /* TODO: put CONFIG_CPM3_SYSFILE in flash */
        char default_fname[] = CONFIG_CPM3_SYSFILE;
        unsigned int br;                                        /* bytes read */
        uint8_t buffer[RS];
@@ -76,8 +82,8 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg
        (void) cmdtp; (void) flag;
 
 
-       common_base = getenv_ulong(PSTR(ENV_CPM3_COMMON_BASE), 16,
-                                               CONFIG_CPM3_COMMON_BASE);
+       //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);
 
@@ -123,6 +129,20 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg
        *p = '\0';
        my_puts((char *)buffer);
 
+       if (common_base == 0) {
+               /* read common base
+                * http://www.seasip.info/Cpm/scb.html
+                */
+               FSIZE_t common_base_ofs = ((res_len - 6) << 8)  + 2*RS + RS-7;
+               FSIZE_t cur_pos = f_tell(&File);
+               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;
+               common_base = (uint16_t) buffer[0] + (buffer[1] << 8);
+               setenv_hex(PSTR(ENV_CPM3_COMMON_BASE), common_base);
+       }
        /* Main System Load     */
 
        /* Load Common Portion of System */