From dc948f592ad4dd37f0349c4faa12e30eb00aa158 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 9 May 2012 01:34:43 +0000 Subject: improve prog dump, move hardware registration out of device module --- clock.c | 11 ----------- dcpu16.h | 10 ++++++---- doc/notes.txt | 1 - emu.c | 17 +++++++++++------ gramar.y | 2 +- keyboard.c | 11 ----------- lem1802.c | 11 ----------- main.c | 44 ++++++++++++++++++++++++++++---------------- 8 files changed, 46 insertions(+), 61 deletions(-) delete mode 100644 doc/notes.txt 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; -- cgit v1.2.3