]> git.sur5r.net Git - cc65/commitdiff
Implemented new .PUSHCPU and .POPCPU commands.
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 18 Apr 2010 18:47:16 +0000 (18:47 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 18 Apr 2010 18:47:16 +0000 (18:47 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4644 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/ca65.sgml
src/ca65/main.c
src/ca65/pseudo.c
src/ca65/pseudo.h
src/ca65/scanner.c
src/ca65/token.h

index a57c7ea7780530ebb4bf361bc08a26ddfa520a22..b47737068fc94530803f18dcbfc214b05a85245c 100644 (file)
@@ -3125,6 +3125,21 @@ Here's a list of all control commands and a description, what they do:
   name=".PSC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
 
 
+<sect1><tt>.POPCPU</tt><label id=".POPCPU"><p>
+
+  Pop the last CPU setting from the stack, and activate it.
+
+  This command will switch back to the CPU that was last pushed onto the CPU
+  stack using the <tt><ref id=".PUSHCPU" name=".PUSHCPU"></tt> command, and
+  remove this entry from the stack.
+
+  The assembler will print an error message if the CPU stack is empty when
+  this command is issued.
+
+  See: <tt><ref id=".CPU" name=".CPU"></tt>, <tt><ref id=".PUSHCPU"
+  name=".PUSHCPU"></tt>, <tt><ref id=".SETCPU" name=".SETCPU"></tt>
+
+
 <sect1><tt>.POPSEG</tt><label id=".POPSEG"><p>
 
   Pop the last pushed segment from the stack, and set it.
@@ -3183,6 +3198,22 @@ Here's a list of all control commands and a description, what they do:
   name=".PC02"></tt> and <tt><ref id=".P816" name=".P816"></tt>
 
 
+<sect1><tt>.PUSHCPU</tt><label id=".PUSHCPU"><p>
+
+  Push the currently active CPU onto a stack. The stack has a size of 8
+  entries.
+
+  <tt/.PUSHCPU/ allows together with <tt><ref id=".POPCPU"
+  name=".POPCPU"></tt> to switch to another CPU and to restore the old CPU
+  later, without knowledge of the current CPU setting.
+
+  The assembler will print an error message if the CPU stack is already full,
+  when this command is issued.
+
+  See: <tt><ref id=".CPU" name=".CPU"></tt>, <tt><ref id=".POPCPU"
+  name=".POPCPU"></tt>, <tt><ref id=".SETCPU" name=".SETCPU"></tt>
+
+
 <sect1><tt>.PUSHSEG</tt><label id=".PUSHSEG"><p>
 
   Push the currently active segment onto a stack. The entries on the stack
index 2e4c6885202db9d90d6a6aba2f1a33f4a1e73960..d325725b536f91df1ac7eebd4a54337614f40989 100644 (file)
@@ -956,9 +956,9 @@ int main (int argc, char* argv [])
     /* Assemble the input */
     Assemble ();
 
-    /* If we didn't have any errors, check the segment stack */
+    /* If we didn't have any errors, check the pseudo insn stacks */
     if (ErrorCount == 0) {
-        SegStackCheck ();
+        CheckPseudo ();                                        
     }
 
     /* If we didn't have any errors, check the unnamed labels */
index c331f79b540afe012f9fefde9aabbf79213fb694..5099cf2fbf9e50e17cf521b91b6bfd21ae0187f4 100644 (file)
@@ -44,6 +44,7 @@
 #include "bitops.h"
 #include "cddefs.h"
 #include "coll.h"
+#include "intstack.h"
 #include "symdefs.h"
 #include "tgttrans.h"
 #include "xmalloc.h"
@@ -86,6 +87,9 @@
 /* Keyword we're about to handle */
 static StrBuf Keyword = STATIC_STRBUF_INITIALIZER;
 
+/* CPU stack */
+static IntStack CPUStack = STATIC_INTSTACK_INITIALIZER;
+
 /* Segment stack */
 #define MAX_PUSHED_SEGMENTS     16
 static Collection SegStack = STATIC_COLLECTION_INITIALIZER;
@@ -1412,6 +1416,21 @@ static void DoPageLength (void)
 
 
 
+static void DoPopCPU (void)
+/* Pop an old CPU setting from the CPU stack */
+{
+    /* Must have a CPU on the stack */
+    if (IS_IsEmpty (&CPUStack)) {
+        ErrorSkip ("CPU stack is empty");
+        return;
+    }
+
+    /* Set the CPU to the value popped from stack */
+    SetCPU (IS_Pop (&CPUStack));
+}
+
+
+
 static void DoPopSeg (void)
 /* Pop an old segment from the segment stack */
 {
@@ -1486,6 +1505,21 @@ static void DoPSC02 (void)
 
 
 
+static void DoPushCPU (void)
+/* Push the current CPU setting onto the CPU stack */
+{
+    /* Can only push a limited size of segments */
+    if (IS_IsFull (&CPUStack)) {
+        ErrorSkip ("CPU stack overflow");
+        return;
+    }
+
+    /* Get the current segment and push it */
+    IS_Push (&CPUStack, GetCPU ());
+}
+
+
+
 static void DoPushSeg (void)
 /* Push the current segment onto the segment stack */
 {
@@ -1865,7 +1899,7 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,                  DoUnexpected    },      /* .MAX */
     { ccNone,                  DoInvalid       },      /* .MID */
     { ccNone,                  DoUnexpected    },      /* .MIN */
-    { ccNone,          DoNull          },             
+    { ccNone,          DoNull          },
     { ccNone,          DoOrg           },
     { ccNone,          DoOut           },
     { ccNone,          DoP02           },
@@ -1873,9 +1907,11 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,                  DoPageLength    },
     { ccNone,          DoUnexpected    },      /* .PARAMCOUNT */
     { ccNone,          DoPC02          },
+    { ccNone,           DoPopCPU        },
     { ccNone,           DoPopSeg        },
     { ccNone,          DoProc          },
     { ccNone,                  DoPSC02         },
+    { ccNone,           DoPushCPU       },
     { ccNone,           DoPushSeg       },
     { ccNone,          DoUnexpected    },      /* .REFERENCED */
     { ccNone,          DoReloc         },
@@ -1944,11 +1980,14 @@ void HandlePseudo (void)
 
 
 
-void SegStackCheck (void)
-/* Check if the segment stack is empty at end of assembly */
+void CheckPseudo (void)
+/* Check if the stacks are empty at end of assembly */
 {
     if (CollCount (&SegStack) != 0) {
-        Error ("Segment stack is not empty");
+        Warning (1, "Segment stack is not empty");
+    }
+    if (!IS_IsEmpty (&CPUStack)) {
+        Warning (1, "CPU stack is not empty");
     }
 }
 
index bc3305716324056fb775b8a8330bbb38206fe3a3..32e774b9d82530b71e7a416eeaa6023901bf035e 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                pseudo.h                                  */
+/*                                pseudo.h                                  */
 /*                                                                           */
-/*             Pseudo instructions for the ca65 macroassembler              */
+/*             Pseudo instructions for the ca65 macroassembler              */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2008 Ullrich von Bassewitz                                       */
-/*               Roemerstrasse 52                                            */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -61,8 +61,8 @@ extern unsigned OpenIfs;
 void HandlePseudo (void);
 /* Handle a pseudo instruction */
 
-void SegStackCheck (void);
-/* Check if the segment stack is empty at end of assembly */
+void CheckPseudo (void);
+/* Check if the stacks are empty at end of assembly */
 
 
 
index 7edee8dfbc8979cc245dd1f6b9380e3e8d22a9c3..cc2bde590a91c7ddf3ac23cc46b0a7950dffded3 100644 (file)
@@ -251,9 +251,11 @@ struct DotKeyword {
     { ".PAGELENGTH",   TOK_PAGELENGTH  },
     { ".PARAMCOUNT",   TOK_PARAMCOUNT  },
     { ".PC02",                 TOK_PC02        },
+    { ".POPCPU",        TOK_POPCPU      },
     { ".POPSEG",       TOK_POPSEG      },
     { ".PROC",                 TOK_PROC        },
     { ".PSC02",                TOK_PSC02       },
+    { ".PUSHCPU",       TOK_PUSHCPU     },
     { ".PUSHSEG",              TOK_PUSHSEG     },
     { ".REF",          TOK_REFERENCED  },
     { ".REFERENCED",   TOK_REFERENCED  },
@@ -345,7 +347,7 @@ static void DoneCharSource (void)
 /*****************************************************************************/
 /*                            InputFile functions                            */
 /*****************************************************************************/
-
+                                          
 
 
 static void IFMarkStart (CharSource* S)
index 21992e153900f089518880170ff5e046edbd9955..51bab2d68c1d2ec66a7b2f2e1ae856f061444516 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2007      Ullrich von Bassewitz                                       */
-/*               Roemerstrasse 52                                            */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 2007-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -217,9 +217,11 @@ typedef enum Token {
     TOK_PAGELENGTH,
     TOK_PARAMCOUNT,
     TOK_PC02,
+    TOK_POPCPU,
     TOK_POPSEG,
     TOK_PROC,
-    TOK_PSC02,
+    TOK_PSC02, 
+    TOK_PUSHCPU,
     TOK_PUSHSEG,
     TOK_REFERENCED,
     TOK_RELOC,