From b51d2360e5a32408daae39b1c311868d0d34374c Mon Sep 17 00:00:00 2001 From: Leo C Date: Tue, 17 May 2016 23:01:42 +0200 Subject: [PATCH] Get common_base from cpm3.sys file. Update default environment (BOOTCMD) --- avr/cmd_loadcpm3.c | 30 +++++++++++++++++++++++++----- avr/command_tbl.c | 10 ++++++---- avr/env.c | 5 +++-- include/config.h | 6 +++--- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/avr/cmd_loadcpm3.c b/avr/cmd_loadcpm3.c index a2436f2..f24ee19 100644 --- a/avr/cmd_loadcpm3.c +++ b/avr/cmd_loadcpm3.c @@ -1,7 +1,11 @@ /* * (C) Copyright 2015 Leo C. * - * 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 */ diff --git a/avr/command_tbl.c b/avr/command_tbl.c index 748c830..e24fcbb 100644 --- a/avr/command_tbl.c +++ b/avr/command_tbl.c @@ -1,7 +1,7 @@ /* * (C) Copyright 2014 Leo C. * - * SPDX-License-Identifier: GPL-2.0+ + * SPDX-License-Identifier: GPL-2.0 */ #include "common.h" @@ -154,9 +154,11 @@ CMD_TBL_ITEM( "[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 variables 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" + " '"ENV_CPM3_SYSFILE"' File to load. Default is '"CONFIG_CPM3_SYSFILE"'.\n" + " '"ENV_CPM3_BANKED_BASE"' Default is '"CONFIG_CPM3_BANKED_BASE_STR"'.\n" + " Sets the following environment variables after loading:\n" + " '"ENV_CPM3_COMMON_BASE"'\n" + " '"ENV_STARTADDRESS"'" ), CMD_TBL_ITEM( loadi, 2, 0, do_loadihex, diff --git a/avr/env.c b/avr/env.c index 6fbeb01..f067940 100644 --- a/avr/env.c +++ b/avr/env.c @@ -1,7 +1,7 @@ /* * (C) Copyright 2014 Leo C. * - * SPDX-License-Identifier: GPL-2.0+ + * SPDX-License-Identifier: GPL-2.0 */ #include "common.h" @@ -34,11 +34,12 @@ const FLASH char default_env[] = { ENV_BAUDRATE "=" "115200" DELIM ENV_BOOTDELAY "=" "3" DELIM - ENV_BOOTCMD "=" "reset; loadf; go ${startaddr}" DELIM + ENV_BOOTCMD "=" "pin ${pins}; loadcpm3; go ${startaddress}" 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 + "pins" "=" "2,8 low 9 high 3 2" DELIM DELIM }; diff --git a/include/config.h b/include/config.h index efc793e..0f9cdc8 100644 --- a/include/config.h +++ b/include/config.h @@ -32,10 +32,10 @@ #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_SYSFILE "0:/cpm3.sys" +#define CONFIG_CPM3_COMMON_BASE 0xF000 #define CONFIG_CPM3_BANKED_BASE 0x0 -#define CONFIG_CPM3_COMMON_BASE_STR "C000" +//#define CONFIG_CPM3_COMMON_BASE_STR "F000" #define CONFIG_CPM3_BANKED_BASE_STR "0" #define CONFIG_CMD_MEMTEST -- 2.39.2