]> git.sur5r.net Git - cc65/blobdiff - src/sim65/paravirt.c
Fixed Visual C++ build (and some style adjustments).
[cc65] / src / sim65 / paravirt.c
index 56211b5c17558d57e56d3132cd7b9f2c483ffb8d..55caeeb9464b7a4a53004c5e0f6fd21287a86828 100644 (file)
@@ -36,6 +36,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <fcntl.h>
+#include <sys/stat.h>
 #if defined(_WIN32)
 #  define O_INITIAL O_BINARY
 #else
 /* Anyone else */
 #  include <unistd.h>
 #endif
+#ifndef S_IREAD
+#  define S_IREAD  S_IRUSR
+#endif
+#ifndef S_IWRITE
+#  define S_IWRITE S_IWUSR
+#endif
 
 /* common */
 #include "cmdline.h"
@@ -156,6 +163,9 @@ static void PVArgs (CPURegs* Regs)
 static void PVExit (CPURegs* Regs)
 {
     Print (stderr, 1, "PVExit ($%02X)\n", Regs->AC);
+    if (PrintCycles) {
+        Print (stdout, 0, "%lu cycles\n", GetCycles ());
+    }
 
     exit (Regs->AC);
 }
@@ -166,12 +176,20 @@ static void PVOpen (CPURegs* Regs)
 {
     char Path[1024];
     int OFlag = O_INITIAL;
+    int OMode = 0;
     unsigned RetVal, I = 0;
 
     unsigned Mode  = PopParam (Regs->YR - 4);
     unsigned Flags = PopParam (2);
     unsigned Name  = PopParam (2);
 
+    if (Regs->YR - 4 < 2) {
+        /* If the caller didn't supply the mode
+        ** argument, use a reasonable default.
+        */
+        Mode = 0x01 | 0x02;
+    }
+
     do {
         Path[I] = MemReadByte (Name++);
     }
@@ -203,10 +221,14 @@ static void PVOpen (CPURegs* Regs)
         OFlag |= O_EXCL;
     }
 
-    /* Avoid gcc warning */
-    (void) Mode;
+    if (Mode & 0x01) {
+        OMode |= S_IREAD;
+    }
+    if (Mode & 0x02) {
+        OMode |= S_IWRITE;
+    }
 
-    RetVal = open (Path, OFlag);
+    RetVal = open (Path, OFlag, OMode);
 
     SetAX (Regs, RetVal);
 }