aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-05-09 01:34:43 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-05-09 01:34:43 +0000
commitdc948f592ad4dd37f0349c4faa12e30eb00aa158 (patch)
treeefb9642bccf901808e68a68920495fffea40e0b1
parentd94d595fd7c7817dae2887285a3c3d47fba6a765 (diff)
improve prog dump, move hardware registration out of device module
-rw-r--r--clock.c11
-rw-r--r--dcpu16.h10
-rw-r--r--doc/notes.txt1
-rw-r--r--emu.c17
-rw-r--r--gramar.y2
-rw-r--r--keyboard.c11
-rw-r--r--lem1802.c11
-rw-r--r--main.c44
8 files changed, 46 insertions, 61 deletions
diff --git a/clock.c b/clock.c
index 15ae242..9813e50 100644
--- a/clock.c
+++ b/clock.c
@@ -37,14 +37,3 @@ clk(struct context *c)
break;
}
}
-
-void
-register_clk(struct context *c)
-{
- struct device *d = &c->dev[++c->ndev];
-
- d->id = 0x12d0b402;
- d->version = 0x1;
- d->manu = 0;
- d->cb = clk;
-}
diff --git a/dcpu16.h b/dcpu16.h
index 0194f46..5f8b5ad 100644
--- a/dcpu16.h
+++ b/dcpu16.h
@@ -52,8 +52,9 @@ struct context {
unsigned int version;
unsigned int manu;
void (*cb)(struct context *);
- } dev[256];
+ } dev[MEMSZ];
int ndev;
+ int proglen;
};
/* display: 32x12 (128x96) + 16 pixel boarder, font 8x4 */
@@ -63,8 +64,9 @@ int step(struct context *);
void tuiemu(struct context *);
void guiemu(struct context *);
void dumpcode(struct context *);
-void register_lem(struct context *);
-void register_keyb(struct context *);
-void register_clk(struct context *);
+
+void lem(struct context *);
+void keyb(struct context *);
+void clk(struct context *);
#endif
diff --git a/doc/notes.txt b/doc/notes.txt
deleted file mode 100644
index ce4fad6..0000000
--- a/doc/notes.txt
+++ /dev/null
@@ -1 +0,0 @@
-http://dcpu.com/highnerd/rc_1/clock.txt
diff --git a/emu.c b/emu.c
index c1e29e1..afcc646 100644
--- a/emu.c
+++ b/emu.c
@@ -103,11 +103,16 @@ hwq(struct context *c, unsigned short *a)
{
struct device *d = &c->dev[*a];
- c->reg[A] = d->id;
- c->reg[B] = d->id >> 16;
- c->reg[C] = d->version;
- c->reg[X] = d->manu;
- c->reg[Y] = d->manu >> 16;
+ if (d) {
+ c->reg[A] = d->id;
+ c->reg[B] = d->id >> 16;
+ c->reg[C] = d->version;
+ c->reg[X] = d->manu;
+ c->reg[Y] = d->manu >> 16;
+ } else {
+ warnx("invalid device %d", *a);
+ errors++;
+ }
cycle += 4;
}
@@ -117,7 +122,7 @@ hwi(struct context *c, unsigned short *a)
{
struct device *d = &c->dev[*a];
- if (d->cb) {
+ if (d && d->cb) {
d->cb(c);
} else {
warnx("invalid device %d", *a);
diff --git a/gramar.y b/gramar.y
index 853d486..829cffd 100644
--- a/gramar.y
+++ b/gramar.y
@@ -364,5 +364,5 @@ compile(FILE *fd, unsigned short *mem, size_t sz)
free(stack);
free(label);
- return haserrors;
+ return haserrors ? 0 : pc;
}
diff --git a/keyboard.c b/keyboard.c
index cd8dde5..bb4cc5d 100644
--- a/keyboard.c
+++ b/keyboard.c
@@ -40,14 +40,3 @@ keyb(struct context *c)
break;
}
}
-
-void
-register_keyb(struct context *c)
-{
- struct device *d = &c->dev[++c->ndev];
-
- d->id = 0x30cf7406;
- d->version = 0x1;
- d->manu = 0;
- d->cb = keyb;
-}
diff --git a/lem1802.c b/lem1802.c
index 55dd492..6036269 100644
--- a/lem1802.c
+++ b/lem1802.c
@@ -46,14 +46,3 @@ lem(struct context *c)
break;
}
}
-
-void
-register_lem(struct context *c)
-{
- struct device *d = &c->dev[++c->ndev];
-
- d->id = 0x7349f615;
- d->version = 0x1802;
- d->manu = 0x1c6c8b36;
- d->cb = lem;
-}
diff --git a/main.c b/main.c
index f54bf45..ddd905d 100644
--- a/main.c
+++ b/main.c
@@ -27,18 +27,16 @@ void (*emu)(struct context *);
void
dumpcode(struct context *c)
{
- int i, k, sum;
-
- for (i = 0; i < MEMSZ; i += 8) {
- sum = 0;
- for (k = 0; k < 8; k++)
- sum += c->mem[i + k];
- if (!sum)
- continue;
- printf("%4.4x:", i);
- for (k = 0; k < 8; k++)
- printf("%5.4x", c->mem[i + k]);
- printf("\n");
+ int i, k;
+
+ for (i = 0; i < c->proglen; i += 8) {
+ printf("DAT ");
+ for (k = 0; k < 8; k++) {
+ printf("0x%.4x", c->mem[i + k]);
+ if ((k + 1) % 8)
+ printf(", ");
+ }
+ printf("; @ 0x%.4x\n", i);
}
}
@@ -51,6 +49,19 @@ usage(void)
exit(1);
}
+void
+addhw(struct context *c,
+ unsigned int id, unsigned short ver, unsigned int manu,
+ void (*cb)(struct context *))
+{
+ struct device *d = &c->dev[c->ndev++];
+
+ d->id = id;
+ d->version = ver;
+ d->manu = manu;
+ d->cb = cb;
+}
+
int
main(int argc, char **argv)
{
@@ -84,14 +95,15 @@ main(int argc, char **argv)
err(1, "cannot open file");
bzero(&c, sizeof(c));
- if (compile(fd, c.mem, MEMSZ))
+ if (!(c.proglen = compile(fd, c.mem, MEMSZ)))
errx(1, "compilation errors");
fclose(fd);
- register_lem(&c);
- register_keyb(&c);
- register_clk(&c);
+ addhw(&c, 0x7349f615, 0x1802, 0x1c6c8b36, lem);
+ addhw(&c, 0x30cf7406, 1, 0, keyb);
+ addhw(&c, 0x12d0b402, 1, 0, clk);
+
emu(&c);
return 0;