dcpu16

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 950e054e1852800d754a54459afaa6d75f685318
parent 5f7046b6897415957c6759c755d470ff138bd494
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed,  4 Apr 2012 03:54:40 -0700

- program load, tracing, test binary (from spec)

Diffstat:
AMakefile | 6++++++
Mdcpu.c | 38++++++++++++++++++++++++++++++++++++--
Atest.hex | 32++++++++++++++++++++++++++++++++
3 files changed, 74 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile @@ -0,0 +1,6 @@ + +dcpu: dcpu.c + gcc -Wall -o dcpu dcpu.c + +clean: + rm -f dcpu diff --git a/dcpu.c b/dcpu.c @@ -7,6 +7,8 @@ #include <stdio.h> #include <stdlib.h> #include <stdint.h> +#include <string.h> +#include <ctype.h> typedef uint16_t u16; typedef uint32_t u32; @@ -77,7 +79,8 @@ void dcpu_step(struct dcpu *d) { } return; default: - return; + fprintf(stderr, "< ILLEGAL OPCODE >\n"); + exit(0); } } @@ -133,11 +136,42 @@ cond: d->skip = 0; return; } - d->skip = res; + d->skip = !res; +} + +void dumpheader(void) { + fprintf(stderr, + "PC SP OV SKIP A B C X Y Z I J\n" + "---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----\n"); } +void dumpstate(struct dcpu *d) { + fprintf(stderr, + "%04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n", + d->pc, d->sp, d->ov, d->skip, + d->r[0], d->r[1], d->r[2], d->r[3], d->r[4], d->r[5], d->r[6], d->r[7]); +} + +void load(struct dcpu *d, FILE *fp) { + char buf[128]; + u16 n = 0; + while (!feof(fp) && fgets(buf, 128, fp)) { + if (!isalnum(buf[0])) + continue; + d->m[n++] = strtoul(buf, 0, 16); + } + fprintf(stderr,"< LOADED %d WORDS >\n", n); +} + int main(int argc, char **argv) { struct dcpu d; + memset(&d, 0, sizeof(d)); + load(&d, stdin); + dumpheader(); + for (;;) { + dumpstate(&d); + dcpu_step(&d); + } return 0; } diff --git a/test.hex b/test.hex @@ -0,0 +1,32 @@ +7c01 +0030 +7de1 +1000 +0020 +7803 +1000 +c00d +7dc1 +001a +a861 +7c01 +2000 +2161 +2000 +8463 +806d +7dc1 +000d +9031 +7c10 +0018 +7dc1 +001a +9037 +61c1 +7dc1 +001a +0000 +0000 +0000 +0000