]> git.sur5r.net Git - cc65/blobdiff - src/ca65/macpack.c
Free expression trees when they're no longer needed
[cc65] / src / ca65 / macpack.c
index 317cf390cc59a0e46f36ed189b2bb7ae578bc7d6..e275693224c81da1964cfc7a978c5e4f707c5f82 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2003 Ullrich von Bassewitz                                       */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -35,7 +35,7 @@
 
 /* common */
 #include "check.h"
-                 
+
 /* ca65 */
 #include "error.h"
 #include "scanner.h"
@@ -50,7 +50,9 @@
 
 
 /* Predefined packages */
-static const char MacGeneric [] =      /* Generic macros */
+
+/* Generic macros */
+static char MacGeneric[] =
     ".macro  add     Arg1, Arg2\n"
     "        clc\n"
     "        .if .paramcount = 2\n"
@@ -68,11 +70,13 @@ static const char MacGeneric [] =   /* Generic macros */
     "        .endif\n"
     ".endmacro\n";
 
-
-
-static const char MacLongBranch [] =   /* Long branch macros */
+/* Long branch macros */
+static char MacLongBranch[] =
     ".macro  jeq     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bne     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        beq     Target\n"
     "        .else\n"
     "        bne     *+5\n"
@@ -80,7 +84,10 @@ static const char MacLongBranch [] = /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jne     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        beq     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bne     Target\n"
     "        .else\n"
     "        beq     *+5\n"
@@ -88,7 +95,10 @@ static const char MacLongBranch [] = /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jmi     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bpl     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bmi     Target\n"
     "        .else\n"
     "        bpl     *+5\n"
@@ -96,7 +106,10 @@ static const char MacLongBranch [] =        /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jpl     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bmi     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bpl     Target\n"
     "        .else\n"
     "        bmi     *+5\n"
@@ -104,7 +117,10 @@ static const char MacLongBranch [] =       /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jcs     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bcc     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bcs     Target\n"
     "        .else\n"
     "        bcc     *+5\n"
@@ -112,7 +128,10 @@ static const char MacLongBranch [] =       /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jcc     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bcs     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bcc     Target\n"
     "        .else\n"
     "        bcs     *+5\n"
@@ -120,7 +139,10 @@ static const char MacLongBranch [] =       /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jvs     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bvc     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bvs     Target\n"
     "        .else\n"
     "        bvc     *+5\n"
@@ -128,7 +150,10 @@ static const char MacLongBranch [] =       /* Long branch macros */
     "        .endif\n"
     ".endmacro\n"
     ".macro  jvc     Target\n"
-    "        .if     .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .if     .match(Target, 0)\n"
+    "        bvs     *+5\n"
+    "        jmp     Target\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bvc     Target\n"
     "        .else\n"
     "        bvs     *+5\n"
@@ -136,12 +161,49 @@ static const char MacLongBranch [] =      /* Long branch macros */
     "        .endif\n"
     ".endmacro\n";
 
+/* Commodore specific macros */
+static char MacCBM[] =
+    ".macro scrcode str\n"
+    "        .repeat .strlen(str), i\n"
+    "                .if (.strat(str, i) >= '@' .and .strat(str, i) <= 'z')\n"
+    "                        .byte .strat(str, i) - '@'\n"
+    "                .elseif (.strat(str, i) >= 'A' .and .strat(str, i) <= 'Z')\n"
+    "                        .byte .strat(str, i) - 'A' + 65\n"
+    "                .elseif (.strat(str, i) = '[')\n"
+    "                        .byte 27\n"
+    "                .elseif (.strat(str, i) = ']')\n"
+    "                        .byte 29\n"
+    "                .elseif (.strat(str, i) = '^')\n"
+    "                        .byte 30\n"
+    "                .elseif (.strat(str, i) = '_')\n"
+    "                        .byte 31\n"
+    "                .else\n"
+    "                        .byte .strat(str, i)\n"
+    "                .endif\n"
+    "        .endrepeat\n"
+    ".endmacro\n";
+
+/* CPU defines */
+static char MacCPU[] =
+    "CPU_ISET_6502      = $01\n"
+    "CPU_ISET_65SC02    = $02\n"
+    "CPU_ISET_65C02     = $04\n"
+    "CPU_ISET_65816     = $08\n"
+    "CPU_ISET_SUNPLUS   = $10\n"
+    "CPU_6502           = $01\n"
+    "CPU_65SC02         = $03\n"
+    "CPU_65C02          = $07\n"
+    "CPU_65816          = $0F\n"
+    "CPU_SUNPLUS        = $10\n";
+
 
 
 /* Table with pointers to the different packages */
-static const char* MacPackages [] = {
+static char* MacPackages [] = {
     MacGeneric,
     MacLongBranch,
+    MacCBM,
+    MacCPU
 };