]> git.sur5r.net Git - cc65/commitdiff
Added support for cc65 program arguments.
authorOliver Schmidt <ol.sc@web.de>
Fri, 24 May 2013 16:36:30 +0000 (18:36 +0200)
committerOliver Schmidt <ol.sc@web.de>
Fri, 24 May 2013 16:36:30 +0000 (18:36 +0200)
libsrc/sim6502/mainargs.s [new file with mode: 0644]
libsrc/sim6502/paravirt.s
src/sim65/6502.c
src/sim65/main.c
src/sim65/paravirt.c
src/sim65/paravirt.h

diff --git a/libsrc/sim6502/mainargs.s b/libsrc/sim6502/mainargs.s
new file mode 100644 (file)
index 0000000..1daa23a
--- /dev/null
@@ -0,0 +1,16 @@
+;
+; Oliver Schmidt, 2013-05-16
+;
+
+        .constructor    initmainargs, 24
+        .import         __argc, __argv, args
+
+        .segment        "INIT"
+
+initmainargs:
+        lda     #<__argv
+        ldx     #>__argv
+        jsr     args
+        sta     __argc
+        stx     __argc+1
+        rts
index 8c12cf85da3eedf9ff48d82b18d627d9681e3f24..81b655c735a95fec60cd619f46a1eaacbe7a0b95 100644 (file)
@@ -7,10 +7,11 @@
 ; int __fastcall__ write (int fd, const void* buf, unsigned count);
 ;
 
-        .export         exit, _open, _close, _read, _write
+        .export         args, exit, _open, _close, _read, _write
 
-exit            := $FFF0
-_open           := $FFF1
-_close          := $FFF2
-_read           := $FFF3
-_write          := $FFF4
+args            := $FFF0
+exit            := $FFF1
+_open           := $FFF2
+_close          := $FFF3
+_read           := $FFF4
+_write          := $FFF5
index f00aa3943abdb7a76c963f1d761bafefee8fa0ed..2a43e40dc2513a8568f32fa4545a689a817efcf0 100644 (file)
@@ -537,7 +537,7 @@ static void OPC_6502_20 (void)
     PUSH (PCL);
     Regs.PC = Addr;
 
-    ParaVirtualization (&Regs);
+    ParaVirtHooks (&Regs);
 }
 
 
@@ -819,7 +819,7 @@ static void OPC_6502_4C (void)
     Cycles = 3;
     Regs.PC = MemReadWord (Regs.PC+1);
 
-    ParaVirtualization (&Regs);
+    ParaVirtHooks (&Regs);
 }
 
 
index 2e2c2085b14cca15177ef593460d2535b5cf3846..8ac01a20b9db5e656ae13719b6b7b8e8f1cb3e3e 100644 (file)
@@ -47,6 +47,7 @@
 #include "6502.h"
 #include "error.h"
 #include "memory.h"
+#include "paravirt.h"
 
 
 
@@ -201,12 +202,8 @@ int main (int argc, char* argv[])
                     break;
             }
         } else {
-            /* Filename. Check if we already had one */
-            if (ProgramFile) {
-                AbEnd ("Don't know what to do with `%s'", Arg);
-            } else {
-                ProgramFile = Arg;
-            }
+            ProgramFile = Arg;
+            break;
         }
 
         /* Next argument */
@@ -218,6 +215,8 @@ int main (int argc, char* argv[])
         AbEnd ("No program file");
     }
 
+    ParaVirtInit (I);
+
     MemInit ();
 
     ReadProgramFile ();
index 2de8f4775ca4a135dbcb1b4316bcaa0f52fbac4b..29b8ea9307eb30d20f0ffe1752efe3b462200eb6 100644 (file)
@@ -33,6 +33,7 @@
 
 
 
+#include <string.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #if defined(_MSC_VER)
@@ -47,6 +48,7 @@
 #endif
 
 /* common */
+#include "cmdline.h"
 #include "print.h"
 #include "xmalloc.h"
 
@@ -65,6 +67,8 @@
 
 typedef void (*PVFunc) (CPURegs* Regs);
 
+static unsigned ArgStart;
+
 
 
 /*****************************************************************************/
@@ -73,6 +77,31 @@ typedef void (*PVFunc) (CPURegs* Regs);
 
 
 
+static unsigned GetAX (CPURegs* Regs)
+{
+    return Regs->AC + (Regs->XR << 8);
+}
+
+
+
+static void SetAX (CPURegs* Regs, unsigned Val)
+{
+    Regs->AC = Val & 0xFF;
+    Val >>= 8;
+    Regs->XR = Val;
+}
+
+
+
+static void MemWriteWord (unsigned Addr, unsigned Val)
+{
+    MemWriteByte (Addr, Val);
+    Val >>= 8;
+    MemWriteByte (Addr + 1, Val);
+}
+
+
+
 static unsigned char Pop (CPURegs* Regs)
 {
     return MemReadByte (0x0100 + ++Regs->SP);
@@ -84,15 +113,44 @@ static unsigned PopParam (unsigned char Incr)
 {
     unsigned SP = MemReadZPWord (0x00);
     unsigned Val = MemReadWord (SP);
-    SP += Incr;
-    MemWriteByte (0x00, SP);
-    SP >>= 8;
-    MemWriteByte (0x01, SP);
+    MemWriteWord (0x0000, SP + Incr);
     return Val;
 }
 
 
 
+static void PVArgs (CPURegs* Regs)
+{
+    unsigned ArgC = ArgCount - ArgStart;
+    unsigned ArgV = GetAX (Regs);
+    unsigned SP   = MemReadZPWord (0x00);
+    unsigned Args = SP - (ArgC + 1) * 2;
+
+    Print (stdout, 2, "PVArgs ($%04X)\n", ArgV);
+
+    MemWriteWord (ArgV, Args);
+
+    SP = Args;
+    while (ArgStart < ArgCount) {
+        unsigned I = 0;
+        const char* Arg = ArgVec[ArgStart++];
+        SP -= strlen (Arg) + 1;
+        do {
+            MemWriteByte (SP + I, Arg[I]);
+        }
+        while (Arg[I++]);
+
+        MemWriteWord (Args, SP);
+        Args += 2;
+    }
+    MemWriteWord (Args, 0x0000);
+
+    MemWriteWord (0x0000, SP);
+    SetAX (Regs, ArgC);
+}
+
+
+
 static void PVExit (CPURegs* Regs)
 {
     Print (stdout, 1, "PVExit ($%02X)\n", Regs->AC);
@@ -148,9 +206,7 @@ static void PVOpen (CPURegs* Regs)
 
     RetVal = open (Path, OFlag);
 
-    Regs->AC = RetVal & 0xFF;
-    RetVal >>= 8;
-    Regs->XR = RetVal & 0xFF;
+    SetAX (Regs, RetVal);
 }
 
 
@@ -159,15 +215,13 @@ static void PVClose (CPURegs* Regs)
 {
     unsigned RetVal;
 
-    unsigned FD = Regs->AC + (Regs->XR << 8);
+    unsigned FD = GetAX (Regs);
 
     Print (stdout, 2, "PVClose ($%04X)\n", FD);
 
     RetVal = close (FD);
 
-    Regs->AC = RetVal & 0xFF;
-    RetVal >>= 8;
-    Regs->XR = RetVal & 0xFF;
+    SetAX (Regs, RetVal);
 }
 
 
@@ -177,7 +231,7 @@ static void PVRead (CPURegs* Regs)
     unsigned char* Data;
     unsigned RetVal, I = 0;
 
-    unsigned Count = Regs->AC + (Regs->XR << 8);
+    unsigned Count = GetAX (Regs);
     unsigned Buf   = PopParam (2);
     unsigned FD    = PopParam (2);
 
@@ -194,9 +248,7 @@ static void PVRead (CPURegs* Regs)
     }
     xfree (Data);
 
-    Regs->AC = RetVal & 0xFF;
-    RetVal >>= 8;
-    Regs->XR = RetVal & 0xFF;
+    SetAX (Regs, RetVal);
 }
 
 
@@ -206,7 +258,7 @@ static void PVWrite (CPURegs* Regs)
     unsigned char* Data;
     unsigned RetVal, I = 0;
 
-    unsigned Count = Regs->AC + (Regs->XR << 8);
+    unsigned Count = GetAX (Regs);
     unsigned Buf   = PopParam (2);
     unsigned FD    = PopParam (2);
 
@@ -221,14 +273,13 @@ static void PVWrite (CPURegs* Regs)
 
     xfree (Data);
 
-    Regs->AC = RetVal & 0xFF;
-    RetVal >>= 8;
-    Regs->XR = RetVal & 0xFF;
+    SetAX (Regs, RetVal);
 }
 
 
 
 static const PVFunc Hooks[] = {
+    PVArgs,
     PVExit,
     PVOpen,
     PVClose,
@@ -238,8 +289,16 @@ static const PVFunc Hooks[] = {
 
 
 
-void ParaVirtualization (CPURegs* Regs)
-/* Potentially execute paravirtualization hook */
+void ParaVirtInit (unsigned aArgStart)
+/* Initialize the paravirtualization subsystem */
+{
+    ArgStart = aArgStart;
+};
+
+
+
+void ParaVirtHooks (CPURegs* Regs)
+/* Potentially execute paravirtualization hooks */
 {
     /* Check for paravirtualization address range */
     if (Regs->PC <  0xFFF0 ||
index bf483e29f44ccc8506f35a1369265b412fd030ce..34317b49f70a5ed58756598926db3e587bdf8c49 100644 (file)
 
 
 
-void ParaVirtualization (CPURegs* Regs);
-/* Potentially execute paravirtualization hook */
+void ParaVirtInit (unsigned aArgStart);
+/* Initialize the paravirtualization subsystem */
+
+void ParaVirtHooks (CPURegs* Regs);
+/* Potentially execute paravirtualization hooks */