diff --git a/dsim.c b/dsim.c index ac6fd2e..017ce46 100644 --- a/dsim.c +++ b/dsim.c @@ -3,6 +3,11 @@ #include #include +#include +#include +#include +#include + uint16_t ram[0x10000]; uint16_t ra, rb, rc, rx, ry, rz, ri, rj; uint16_t rpc, rsp, rex, ria; @@ -47,8 +52,6 @@ void reset() running = true; } -typedef void (*dev_t)(void); - struct dev_entry { uint32_t vendor; uint32_t product; @@ -471,8 +474,8 @@ void next() ir = ram[rpc++]; opcode = ir & 0x001f; - a = (ir >> 5) & 0x001f; - b = (ir >> 10) & 0x003f; + a = (ir >> 10) & 0x003f; + b = (ir >> 5) & 0x001f; if (opcode == 0) { /* special instruction */ f = sops[b]; @@ -492,9 +495,49 @@ void next() ticks++; } -int main() +int load_image(char *filename) { - reset(); - while (running) next(); + int fd; + ssize_t r; + ssize_t pos; + + fd = open(filename, O_RDONLY); + if (fd < 0) + return fd; + for (pos=0;;) { + r = read(fd, &ram[pos], sizeof(ram)); + if (r > 0) + pos += r; + else { + close(fd); + if (r == 0) + return pos; + else + return r; + } + } +} + +void dump_ram(uint16_t addr, uint16_t count) +{ + uint16_t i, a; + + for (i=0; i 1) { + load_image(argv[1]); + dump_ram(0, 32); + reset(); + while (running) next(); + } return EXIT_SUCCESS; }