]> git.sur5r.net Git - cc65/commitdiff
Fixed a bug
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 14 Aug 2003 13:08:46 +0000 (13:08 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 14 Aug 2003 13:08:46 +0000 (13:08 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2312 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codegen.c

index 06fe224c743067509a29759fa7a9863f20cc4e2a..5eb1825e3913bd3f01fb8af1864c8ff8f713631d 100644 (file)
@@ -585,39 +585,49 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
     /* Don't loop for up to two bytes */
     if (Bytes == 1) {
 
-       ldyconst (StackOffs);
-       AddCodeLine ("lda (sp),y");
-       AddCodeLine ("sta regbank%+d", RegOffs);
+               ldyconst (StackOffs);
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("sta regbank%+d", RegOffs);
 
     } else if (Bytes == 2) {
 
-       ldyconst (StackOffs);
-       AddCodeLine ("lda (sp),y");
-       AddCodeLine ("sta regbank%+d", RegOffs);
-       AddCodeLine ("iny");
-       AddCodeLine ("lda (sp),y");
-       AddCodeLine ("sta regbank%+d", RegOffs+1);
+               ldyconst (StackOffs);
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("sta regbank%+d", RegOffs);
+               AddCodeLine ("iny");
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("sta regbank%+d", RegOffs+1);
+
+    } else if (Bytes == 3 && CodeSizeFactor >= 133) {
+
+               ldyconst (StackOffs);
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("sta regbank%+d", RegOffs);
+               AddCodeLine ("iny");
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("sta regbank%+d", RegOffs+1);
+               AddCodeLine ("iny");
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("sta regbank%+d", RegOffs+2);
 
     } else {
 
-       /* More than two bytes - loop */
-       unsigned Label = GetLocalLabel ();
-       ldyconst (StackOffs+Bytes-1);
-       ldxconst (Bytes);
-       g_defcodelabel (Label);
+               /* More bytes - loop */
+               unsigned Label = GetLocalLabel ();
+       ldyconst (StackOffs);
+               g_defcodelabel (Label);
        AddCodeLine ("lda (sp),y");
-       AddCodeLine ("sta regbank%+d,x", RegOffs-1);
-       AddCodeLine ("dey");
-       AddCodeLine ("dex");
+       AddCodeLine ("sta regbank%+d,y", RegOffs - StackOffs);
+       AddCodeLine ("iny");
+       AddCodeLine ("cpy #$%02X", StackOffs + Bytes);
        AddCodeLine ("bne %s", LocalLabelName (Label));
-
     }
 }
 
 
 
 /*****************************************************************************/
-/*                          Fetching memory cells                           */
+/*                                  Fetching memory cells                           */
 /*****************************************************************************/