fixes for assembler - label addrs and DAT statements
[dcpu16] / vm-dcpu16.c
index d60c340d2eeaa7a6f4eb4e9630127ae1152bd439..1e3a49656757f8e68cd90ebae13a12bd75018ed1 100644 (file)
@@ -2,6 +2,8 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
+#include <strings.h>
+#include <signal.h>
 #include <errno.h>
 #include <assert.h>
 #include <sysexits.h>
@@ -10,6 +12,7 @@
 
 #include "dcpu16.h"
 #include "common.h"
+#include "display.h"
 
 /*
  *  shell-like driver for dcpu16 core
@@ -326,14 +329,17 @@ COMMAND_HELP(step) {
 
 
 COMMAND_IMPL(run) {
-    sig_t osig;
+    struct sigaction act;
     (void)arg_count, (void)arg_vector;
 
     running_ = 1;
 
-    /* install our new interrupt signal handler */
-    if ( (osig = signal(SIGINT, sigint_handler_)) == SIG_ERR ) {
-        fprintf(stderr, "%s():%s\n", "signal", strerror(errno));
+    memset(&act, 0, sizeof act);
+    act.sa_handler = sigint_handler_;
+    act.sa_flags = SA_RESETHAND;
+
+    if (sigaction(SIGINT, &act, NULL)) {
+        fprintf(stderr, "%s():%s\n", "sigaction", strerror(errno));
         return -1;
     }
 
@@ -347,12 +353,6 @@ COMMAND_IMPL(run) {
         }
     }
 
-    /* restore the old interrupt signal handler */
-    if (signal(SIGINT, osig) == SIG_ERR) {
-        fprintf(stderr, "%s():%s\n", "signal", strerror(errno));
-        return -1;
-    }
-
     printf("interrupted...\n");
 
     return 0;
@@ -365,6 +365,45 @@ COMMAND_HELP(run) {
                "May be interrupted with SIGINT.\n");
 }
 
+COMMAND_IMPL(display) {
+    (void)arg_count, (void)arg_vector;
+
+    static DPIX *pixbuf = NULL;
+
+    if (pixbuf) {
+        printf("display already enabled..\n");
+        return 0;
+    }
+
+    pixbuf = display_init_pixbuf();
+    if (pixbuf == NULL) {
+        fprintf(stderr, "failed to initialize display buffer\n");
+        return 0;
+    }
+
+    if (dcpu16_acct_add(vm, DCPU16_ACCT_EV_WRITE, display_fn, pixbuf)) {
+        fprintf(stderr, "failed to register display update callback\n");
+        return 0;
+    }
+
+    if (dcpu16_acct_add(vm, DCPU16_ACCT_EV_RESET, display_reset_fn, pixbuf)) {
+        fprintf(stderr, "failed to register display reset callback\n");
+        return 0;
+    }
+
+    /* init display as if reset occurred */
+    display_reset_fn(vm, DCPU16_ACCT_EV_RESET, 0, pixbuf);
+
+    return 0;
+}
+COMMAND_HELP(display) {
+    fprintf(f, "\tdisplay\n");
+    if (summary) return;
+
+    fprintf(f, "Begins updating a PNM of current display contents...\n"
+               "This is not a fully-baked feature...\n");
+}
+
 /* gather all these together into a searchable table */
 
 /* help command gets some assistance in declarations */
@@ -380,6 +419,7 @@ static struct command_ command_table_[] = {
     COMMAND_ENTRY(step, 0, 1),
     COMMAND_ENTRY(run, 0, 0),
     COMMAND_ENTRY(reset, 0, 0),
+    COMMAND_ENTRY(display, 0, 0),
     { NULL, 0, 0, NULL, NULL }
 };