dcpu16

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

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:
MMakefile | 17++++++++++++-----
Adcpu.c | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Memulator.c | 62+-------------------------------------------------------------
Aemulator.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