diff options
author | Benedikt Spranger <b.spranger@pengutronix.de> | 2004-10-06 16:09:25 +0000 |
---|---|---|
committer | Benedikt Spranger <b.spranger@pengutronix.de> | 2004-10-06 16:09:25 +0000 |
commit | e341a29c81700d3c82fc8b9566ba8c0d9adef3fe (patch) | |
tree | b228d7cf5e59a08e15011af64b6e6e0822d36af4 | |
parent | a0d32640675676b757ad1400d611788fbf87033b (diff) | |
download | memedit-e341a29c81700d3c82fc8b9566ba8c0d9adef3fe.tar.gz memedit-e341a29c81700d3c82fc8b9566ba8c0d9adef3fe.tar.xz |
BSP: write allignment fixed. some feature update.
-rw-r--r-- | fpgaedit.l | 6 | ||||
-rw-r--r-- | fpgaedit.y | 83 |
2 files changed, 81 insertions, 8 deletions
@@ -117,6 +117,12 @@ eq { return EQ; } +\@ | +at { + if (debug > 4) printf ("AT\n"); + return AT; +} + o | open { if (debug > 4) printf ("\n"); @@ -53,6 +53,7 @@ char *tptr; %left <val> MD %left <val> MM %left <val> EQ +%left <val> AT %token <val> EXIT %token <val> HELP %right <val> CR @@ -71,8 +72,24 @@ line: CR | EXIT CR { exit(EXIT_SUCCESS); } | HELP CR { print_help(); } | NAME CR { printf ("%s = %d\n", $1, get_variable($1)); free($1); } - | mem CR + | mem CR { printf ("\n"); } | NAME EQ num CR { set_variable ($1, $3); free($1); } + | NAME EQ MD num CR { + if (fhan) + { + if (fseek (fhan, $4, SEEK_SET) == -1) + printf ("set offset %ld failed\n", $4); + else + { + unsigned int c = 0; + + fread(&c, $3, 1, fhan); + set_variable ($1, c); + free($1); + } + } + else printf ("please open file\n"); + } | error ; @@ -99,6 +116,36 @@ mem: MD { } | MD num { hex_output ($2, $1, 0); } | MD num num { hex_output ($2, $1, ($3 - 1)/16); } + | MD AT num { + if (fhan) + { + if (fseek (fhan, $3, SEEK_SET) == -1) + printf ("set offset %d failed\n", $3); + else + { + unsigned int c = 0; + + fread(&c, $1, 1, fhan); + hex_output (c, $1, 0); + } + } + else printf ("please open file\n"); + } + | MD AT num num { + if (fhan) + { + if (fseek (fhan, $3, SEEK_SET) == -1) + printf ("set offset %ld failed\n", $3); + else + { + unsigned int c = 0; + + fread(&c, $1, 1, fhan); + hex_output (c, $1, $4); + } + } + else printf ("please open file\n"); + } | MM { printf ("mm <offset> <value1> [<value2> ...]\n"); } | mm exp ; @@ -108,26 +155,46 @@ mm: MM { write_len = $1; if (debug > 3) printf ("write_len = %d\n", write_len);} exp: num { if (fhan) { + long offset; + if (fseek (fhan, $1, SEEK_SET) == -1) printf ("set offset %ld failed\n", $1); + else { + offset = ftell (fhan); + if (offset%write_len) { + offset -= offset%write_len; + printf ("alligned to 0x%08lx\n", + offset); + fseek (fhan, offset, SEEK_SET); + } + printf ("new values:"); + if (offset%(linelen*4)) + printf ("0x%08lx", offset); + } } else printf ("please open file\n"); - if (debug > 3) printf ("offset = 0x%0lx\n", $1); } - | exp num { + | exp num { unsigned int c; + long offset; c = $2; if (debug > 3) printf ("write_len = %d\nc = 0x%0x\n", write_len, c); if (fhan) { + offset = ftell (fhan); + if (offset%linelen) printf (" "); + else printf ("\n0x%08lx ", offset); + fwrite (&c, write_len, 1, fhan); + fflush (fhan); + fseek(fhan, -write_len, SEEK_CUR); + fread(&c, write_len, 1, fhan); switch (write_len) { - case 1: fwrite (&c, 1, 1, fhan); break; - case 2: fwrite (&c, 2, 1, fhan); break; - case 4: fwrite (&c, 4, 1, fhan); break; + case 1: c &= 0xff; printf ("%02x", c); break; + case 2: c &= 0xffff; printf ("%04x", c); break; + case 4: printf ("%08x", c); break; } - fflush (fhan); } else if (debug > 3) printf ("fhan == NULL\n"); } @@ -153,7 +220,7 @@ void print_help (void) { printf ("exit, quit quit\n"); printf ("help show this help text\n"); printf ("\n"); - printf ("md [<start> [<end>]] mem display from current position\n"); + printf ("md [[@]<start> [<end>]] mem display from current position\n"); printf (" or from <start> to <end>\n"); printf ("mm <offset> <val1> .. <valN> modify from value <offset>\n"); printf ("<var> = <expr> set variable <var> to <expr>\n"); |