]> cloudbase.mooo.com Git - z180-stamp.git/commitdiff
Add commands: loadf, go, reset restart hexrel-1
authorLeo C <erbl259-lmu@yahoo.de>
Thu, 14 Aug 2014 14:27:17 +0000 (16:27 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Thu, 14 Aug 2014 14:27:17 +0000 (16:27 +0200)
avr/Tupfile
avr/cmd_boot.c [new file with mode: 0644]
avr/command_tbl.c
avr/env.c
avr/main.c [moved from avr/bootc.c with 100% similarity]
avr/z180-serv.c
avr/z80-if.c
avr/z80-if.h

index 449b2a1e16d394a2911a28af4671ff69ae1f6956..b7da73be6ec02e6d601ca43e7b662d6b45e1afa1 100644 (file)
@@ -1,14 +1,14 @@
 include_rules
 
-PROG           = stamp-bootc
-SRC            = bootc.c
+PROG           = stamp-test
+SRC            = main.c
 SRC            += cli.c cli_readline.c command.c command_tbl.c
-SRC            += cmd_help.c cmd_echo.c cmd_mem.c
+SRC            += cmd_help.c cmd_echo.c cmd_mem.c cmd_boot.c
 SRC            += env.c xmalloc.c
 SRC            += timer.c con-utils.c serial.c
 SRC            += background.c z180-serv.c z80-if.c
 
-#SRC_Z         = ../z180/hdrom.c
+SRC_Z          = ../z180/hdrom.c
 
 #TARGETS       = $(PROG).elf
 
diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c
new file mode 100644 (file)
index 0000000..4fb9c2a
--- /dev/null
@@ -0,0 +1,106 @@
+
+/*
+ * Misc boot support
+ */
+#include "common.h"
+#include <stdlib.h>
+#include <avr/pgmspace.h>
+
+#include "command.h"
+#include "z80-if.h"
+
+/* ugly hack to get Z180 loadfile into flash memory */
+#define const const FLASH
+#include "../z180/hdrom.h"
+#undef const
+
+
+
+static void z80_load_mem(void)
+{
+       unsigned sec = 0;
+       uint32_t sec_base = hdrom_start;
+
+       printf_P(PSTR("Loading Z180 memory... \n"));
+
+       while (sec < hdrom_sections) {
+               printf_P(PSTR("   From: 0x%.5lX to: 0x%.5lX    (%5li bytes)\n"),
+                               hdrom_address[sec],
+                               hdrom_address[sec]+hdrom_length_of_sections[sec] - 1,
+                               hdrom_length_of_sections[sec]);
+
+               z80_request_bus();
+               z80_write_block((const FLASH unsigned char *) &hdrom[sec_base],  /* src */
+                               hdrom_address[sec],                  /* dest */
+                               hdrom_length_of_sections[sec]);      /* len */
+               z80_release_bus();
+               sec_base+=hdrom_length_of_sections[sec];
+               sec++;
+       }
+}
+
+int do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       (void) cmdtp; (void) flag; (void) argc; (void) argv;
+
+       if (z80_runstate() != 0) {      
+               printf_P(PSTR("## Can't load while CPU is running!\n"));
+               return 1;       
+       }
+
+       z80_load_mem();
+       
+       return 0;
+}
+
+
+int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       uint32_t addr;
+
+       (void) cmdtp; (void) flag; (void) argc;
+
+       if (z80_runstate() != 0) {      
+               printf_P(PSTR("## CPU allready running!\n"));
+               return 1;
+       }
+
+       addr = strtoul(argv[1], NULL, 16);
+
+       if (addr > (1UL<<16) - 1) {
+               printf_P(PSTR("## Startaddress 0x%05lx too high.\n"
+                       "   (Out of logical address space (0x00000-0x0ffff))\n"),
+                       addr);
+               return 1;
+       } else if (addr != 0) {
+               printf_P(PSTR("## Starting application at "
+                       "address != 0x0000 not implemented yet.\n"));
+               return 1;
+       } else {
+               printf_P(PSTR("## Starting application at 0x%05lX ...\n"), addr);
+               z80_release_bus();
+               z80_reset(HIGH);
+       }
+
+       return 0;
+}
+
+int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       (void) cmdtp; (void) flag; (void) argc; (void) argv;
+
+       printf_P(PSTR("## CPU now in reset state.\n"));
+       z80_reset(LOW);
+
+       return 0;
+}
+
+int do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       (void) cmdtp; (void) flag; (void) argc; (void) argv;
+
+       z80_reset_pulse();
+
+       return 0;
+}
+
index 78f7a24d46235b5aa265e8554fea14fddb5654b8..2717a370e04b1de5762d12745427fc4d3792eee0 100644 (file)
@@ -9,6 +9,9 @@ extern int do_help(cmd_tbl_t *, int, int, char * const []);
 extern int do_echo(cmd_tbl_t *, int, int, char * const []);
 extern int do_env_print(cmd_tbl_t *, int, int, char * const []);
 extern int do_env_set(cmd_tbl_t *, int, int, char * const []);
+extern int do_loadf(cmd_tbl_t *, int, int, char * const []);
+extern int do_go(cmd_tbl_t *, int, int, char * const []);
+extern int do_restart(cmd_tbl_t *, int, int, char * const []);
 
 
 cmd_tbl_t cmd_tbl[] = {
@@ -30,7 +33,7 @@ CMD_TBL_ITEM_COMPLETE(
        printenv, CONFIG_SYS_MAXARGS,   1,      do_env_print,
        "print environment variables",
        "\n"
-       "    - print [all] values of all environment variables\n"
+       "    - print values of all environment variables\n"
        "printenv name ...\n"
        "    - print value of environment variable 'name'",
        var_complete
@@ -45,6 +48,30 @@ CMD_TBL_ITEM_COMPLETE(
        var_complete
 ),
 
+CMD_TBL_ITEM(
+       loadf, 1,       0,      do_loadf,
+       "load srec_cat prepared image from controller flash",
+       ""
+),
+CMD_TBL_ITEM(
+       go, 2,          0,      do_go,
+       "start application at address 'addr'",
+       "addr\n"
+       "    - start application at address 'addr'"
+//     "\n"
+//     "      passing 'arg' as arguments"
+),
+CMD_TBL_ITEM(
+       reset, 1,       0,      do_reset,
+       "Keep CPU in RESET state",
+       ""
+),
+CMD_TBL_ITEM(
+       restart, 1, 0,  do_restart,
+       "Perform RESET of the CPU",
+       ""
+),
+
 CMD_TBL_ITEM(
        md,     3,      1,      do_mem_md,
        "memory display",
index 3488afc060bcdc577933ff64a7c7c8a3e508585e..48413f3c5064f74ec6a8eda419eabaa57109d12f 100644 (file)
--- a/avr/env.c
+++ b/avr/env.c
 
 
 #define DELIM          "\0"
-#define ENV_SIZE       CONFIG_ENV_SIZE-2
 
 
 #define ENV_GET_VAL    (1<<0)
 
 
+/*
+ * Default Environment
+ */
+const FLASH char default_env[] = {
+       "bootdelay="    "3"             DELIM
+       "bootcmd="      "reset; loadf; go $(startaddr)" DELIM
+       "baudrate="     "115200"        DELIM
+       "startaddr="    "0"             DELIM
+       DELIM
+};
+
+
 /*
  * Debugging
  *
@@ -97,15 +108,7 @@ void dump_eep(const uint8_t *addr, int len)
        putchar('\n');
 }
 
-
-const FLASH char default_env[] = {
-       "bootdelay="    "3"             DELIM
-       "bootcmd="      "echo hallo"    DELIM
-       "baudrate="     "115200"        DELIM
-       DELIM
-};
-
-
+#define ENV_SIZE       CONFIG_ENV_SIZE-2
 typedef struct environment_s {
        uint16_t        crc;            /* CRC16 over data bytes        */
        char            data[ENV_SIZE]; /* Environment data             */
@@ -470,7 +473,7 @@ int set_default_env(void)
        char buf[64];
        uint16_t crc = 0xffff;
        uint16_t eep = CONFIG_ENV_OFFSET + offsetof(env_t, data);
-       unsigned int len = CONFIG_ENV_SIZE - offsetof(env_t, data);
+       unsigned int len = ENV_SIZE;
        unsigned int i, src = 0;
        char c = 0xff, c0 = c;
 #if 0
@@ -502,6 +505,10 @@ printf_P(PSTR("\n\n** set_default_env()\n"));
                src += sizeof(buf);
                eep += sizeof(buf);
        }
+
+       eeprom_update_word(
+               (uint16_t *) CONFIG_ENV_OFFSET + offsetof(env_t, crc), 
+               crc);
 #if 0
        dump_eep(0, 128);
 #endif
@@ -524,14 +531,15 @@ int env_check(void)
        crc = 0xffff;
        c = 0xff;
        for (i = offsetof(env_t, data); 
-               !(c == 0 && c0 == 0) && i < CONFIG_ENV_SIZE;
+               !(c == 0 && c0 == 0) && i < ENV_SIZE;
                i++)
        {
                c0 = c; 
                c = eeprom_read_byte((const uint8_t *) CONFIG_ENV_OFFSET + i);
                crc = crc16(crc, c);
        }
-       debug("** crc eep: 0x%.4x, crc new: 0x%.4x\n", stored_crc, crc);
+       debug_cond((crc != stored_crc),
+               "** crc eep: 0x%.4x, crc new: 0x%.4x\n", stored_crc, crc);
        
        return crc == stored_crc;
 }
@@ -591,7 +599,28 @@ static int env_print(char *name)
        return len;
 }
 
-
+int env_print_ramsize(void)
+{
+       int size = 0;
+       uint8_t name_cnt = 0;
+       uint8_t val_cnt = 0;
+       
+       for (int i = 0 ; i < entrycount; i++) {
+               if ((env_list[i].flags & EF_N_EEP) == 0 &&
+                               (env_list[i].name.ram != NULL)) {
+                       name_cnt++;
+                       size += strlen(env_list[i].name.ram) + 3;
+               }
+               if ((env_list[i].flags & EF_V_EEP) == 0 &&
+                               (env_list[i].val.ram != NULL)) {
+                       val_cnt++;
+                       size += strlen(env_list[i].val.ram) + 3;
+               }
+       }
+       printf_P(PSTR("%d bytes RAM used for %u names and %u values\n"),
+                       size, name_cnt, val_cnt);
+       return size;
+}
 
 int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc,
                        char * const argv[])
@@ -608,6 +637,7 @@ int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc,
                        return 1;
                printf_P(PSTR("\nEnvironment size: %d/%d bytes\n"),
                        rcode, ENV_SIZE);
+               env_print_ramsize();
                return 0;
        }
 
similarity index 100%
rename from avr/bootc.c
rename to avr/main.c
index d28cb9839783806274c6bce287fcfdd8cc99ba69..a4ff05735acbe94084b9ec664328682246246317 100644 (file)
 #include "z80-if.h"
 
 
-/* ugly hack to get Z180 loadfile into flash memory */
-#define const const FLASH
-#include "../z180/hdrom.h"
-#undef const
-
 
 /*--------------------------------------------------------------------------*/
 
@@ -274,29 +269,6 @@ void dump_mem(const FLASH uint8_t *addr, uint32_t len)
 
 /*--------------------------------------------------------------------------*/
 
-void z80_load_mem(void)
-{
-       unsigned sec = 0;
-       uint32_t sec_base = hdrom_start;
-
-       DBG_P(1, "Loading z80 memory... \n");
-
-       while (sec < hdrom_sections) {
-               DBG_P(2, "  From: 0x%.5lX to: 0x%.5lX    (%5li bytes)\n",
-                               hdrom_address[sec],
-                               hdrom_address[sec]+hdrom_length_of_sections[sec] - 1,
-                               hdrom_length_of_sections[sec]);
-
-               z80_write_block((const FLASH unsigned char *) &hdrom[sec_base],  /* src */
-                               hdrom_address[sec],                  /* dest */
-                               hdrom_length_of_sections[sec]);      /* len */
-               sec_base+=hdrom_length_of_sections[sec];
-               sec++;
-       }
-}
-
-/*--------------------------------------------------------------------------*/
-
 
 const FLASH uint8_t iniprog[] = {
        0xAF,                   // xor     a
index 9ee9cb0dc4e765548983cae937d8d9b10963bd37..949de17ffec7b19a9c1ca758b506c3d831e9fd63 100644 (file)
@@ -153,6 +153,10 @@ void z80_reset(level_t level)
                Stat &= ~S_Z180_RUNNING;
 }
 
+int z80_stat_reset(void)
+{
+       return Z80_O_RST;
+}
 
 void z80_reset_pulse(void)
 {
@@ -162,6 +166,11 @@ void z80_reset_pulse(void)
        Stat |= S_Z180_RUNNING;
 }
 
+int z80_runstate(void)
+{
+       return (Stat & S_Z180_RUNNING) != 0;
+}
+
 #if 0
 int z80_stat_halt(void)
 {
index ecb6712188ad5c103d292c0a8cafc633b7c4bb01..a2617ce94a0151508670a7e5f7f8551de45f6e81 100644 (file)
@@ -9,6 +9,8 @@ void z80_release_bus(void);
 void z80_memset(uint32_t addr, uint8_t data, uint32_t length);
 void z80_reset(level_t level);
 void z80_reset_pulse(void);
+int z80_stat_reset(void);
+int z80_runstate(void);
 //void z80_busreq(level_t level);
 void z80_write_block(const FLASH uint8_t *src, uint32_t dest, uint32_t length);
 int z80_stat_halt(void);