commit 2c9648de71212c62369e9e8089201ec56fdd38b8
parent 261a2458d2047696e1309260e57edf5f4a2b7b17
Author: Brian Swetland <swetland@frotz.net>
Date: Sat, 7 Apr 2012 16:55:11 -0700
cleanup: improve Makefile, split emulator core from dcpu program
Diffstat:
M | Makefile | | | 17 | ++++++++++++----- |
A | dcpu.c | | | 86 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
M | emulator.c | | | 62 | +------------------------------------------------------------- |
A | emulator.h | | | 47 | +++++++++++++++++++++++++++++++++++++++++++++++ |
4 files changed, 146 insertions(+), 66 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,11 +1,18 @@
+CFLAGS := -Wall -g
+
all: dcpu a16
-dcpu: emulator.c disassemble.c
- gcc -Wall -o dcpu emulator.c disassemble.c
+DCPU_OBJS := dcpu.o emulator.o disassemble.o
+dcpu: $(DCPU_OBJS)
+ $(CC) -o dcpu $(DCPU_OBJS)
+
+A16_OBJS := assembler.o disassemble.o
+a16: $(A16_OBJS)
+ $(CC) -o a16 $(A16_OBJS)
-a16: assembler.c disassemble.c
- gcc -Wall -o a16 assembler.c disassemble.c
+dcpu.c: emulator.h
+emulator.c: emulator.h
clean:
- rm -f dcpu a16
+ rm -f dcpu a16 *.o
diff --git a/dcpu.c b/dcpu.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2012, Brian Swetland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "emulator.h"
+
+extern u16 *disassemble(u16 *pc, char *out);
+
+void dumpheader(void) {
+ fprintf(stderr,
+ "PC SP OV A B C X Y Z I J Instruction\n"
+ "---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- -----------\n");
+}
+
+void dumpstate(struct dcpu *d) {
+ char out[128];
+ disassemble(d->m + d->pc, out);
+ fprintf(stderr,
+ "%04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %s\n",
+ d->pc, d->sp, d->ov,
+ d->r[0], d->r[1], d->r[2], d->r[3],
+ d->r[4], d->r[5], d->r[6], d->r[7],
+ out);
+}
+
+void load(struct dcpu *d, const char *fn) {
+ FILE *fp;
+ char buf[128];
+ u16 n = 0;
+ if (!(fp = fopen(fn, "r"))) {
+ fprintf(stderr, "cannot open: %s\n", fn);
+ exit(1);
+ }
+ 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);
+ fclose(fp);
+}
+
+int main(int argc, char **argv) {
+ struct dcpu d;
+ memset(&d, 0, sizeof(d));
+
+ load(&d, argc > 1 ? argv[1] : "out.hex");
+
+ dumpheader();
+ for (;;) {
+ dumpstate(&d);
+ dcpu_step(&d);
+ }
+ return 0;
+}
+
diff --git a/emulator.c b/emulator.c
@@ -37,21 +37,10 @@
#include <string.h>
#include <ctype.h>
-typedef uint8_t u8;
-typedef uint16_t u16;
-typedef uint32_t u32;
+#include "emulator.h"
extern u16 *disassemble(u16 *pc, char *out);
-struct dcpu {
- u16 r[8];
- u16 pc;
- u16 sp;
- u16 ov;
- u16 unused;
- u16 m[65536];
-};
-
static u16 lit[0x20] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
@@ -149,52 +138,3 @@ extended:
exit(0);
}
}
-
-void dumpheader(void) {
- fprintf(stderr,
- "PC SP OV A B C X Y Z I J Instruction\n"
- "---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- -----------\n");
-}
-
-void dumpstate(struct dcpu *d) {
- char out[128];
- disassemble(d->m + d->pc, out);
- fprintf(stderr,
- "%04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %s\n",
- d->pc, d->sp, d->ov,
- d->r[0], d->r[1], d->r[2], d->r[3],
- d->r[4], d->r[5], d->r[6], d->r[7],
- out);
-}
-
-void load(struct dcpu *d, const char *fn) {
- FILE *fp;
- char buf[128];
- u16 n = 0;
- if (!(fp = fopen(fn, "r"))) {
- fprintf(stderr, "cannot open: %s\n", fn);
- exit(1);
- }
- 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);
- fclose(fp);
-}
-
-int main(int argc, char **argv) {
- struct dcpu d;
- memset(&d, 0, sizeof(d));
-
- load(&d, argc > 1 ? argv[1] : "out.hex");
-
- dumpheader();
- for (;;) {
- dumpstate(&d);
- dcpu_step(&d);
- }
- return 0;
-}
-
diff --git a/emulator.h b/emulator.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2012, Brian Swetland
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef _DCPU_H_
+#define _DCPU_H_
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+
+struct dcpu {
+ u16 r[8];
+ u16 pc;
+ u16 sp;
+ u16 ov;
+ u16 unused;
+ u16 m[65536];
+};
+
+void dcpu_step(struct dcpu *d);
+
+#endif