summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenedikt Spranger <b.spranger@pengutronix.de>2004-10-06 16:09:25 +0000
committerBenedikt Spranger <b.spranger@pengutronix.de>2004-10-06 16:09:25 +0000
commite341a29c81700d3c82fc8b9566ba8c0d9adef3fe (patch)
treeb228d7cf5e59a08e15011af64b6e6e0822d36af4
parenta0d32640675676b757ad1400d611788fbf87033b (diff)
downloadmemedit-e341a29c81700d3c82fc8b9566ba8c0d9adef3fe.tar.gz
memedit-e341a29c81700d3c82fc8b9566ba8c0d9adef3fe.tar.xz
BSP: write allignment fixed. some feature update.
-rw-r--r--fpgaedit.l6
-rw-r--r--fpgaedit.y83
2 files changed, 81 insertions, 8 deletions
diff --git a/fpgaedit.l b/fpgaedit.l
index 3ecc53c..45f96a1 100644
--- a/fpgaedit.l
+++ b/fpgaedit.l
@@ -117,6 +117,12 @@ eq {
return EQ;
}
+\@ |
+at {
+ if (debug > 4) printf ("AT\n");
+ return AT;
+}
+
o |
open {
if (debug > 4) printf ("\n");
diff --git a/fpgaedit.y b/fpgaedit.y
index 5a177c8..879ec4b 100644
--- a/fpgaedit.y
+++ b/fpgaedit.y
@@ -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");