Browse Source

* bugfix of STRCONCAT alignment problem

carl 27 years ago
parent
commit
b170680325
1 changed files with 21 additions and 43 deletions
  1. 21 43
      rtl/m68k/m68k.inc

+ 21 - 43
rtl/m68k/m68k.inc

@@ -433,40 +433,25 @@
 
       begin
          asm
-            move.l 12(a6), a0   { @s1 = a0             }
-            move.b (a0),d1      { Get length of string }
-            and.l  #$ff,d1      { extend to dword      }
-
-            lea    1(a0,d1),a0    { Get the address of the end of the second string }
-            neg.l  d1
-            add.l  #$ff,d1
-            move.l 8(a6),a1
-            move.b (a1)+,d0     { Length of second string in d0    }
-            cmp.b  d1,d0
-            ble    @LM5
-            move.b d1,d0        { If too long, then truncate to 255 }
-
-         @LM5:
-            move.b  d0,d1
-            move.l  a2,d6      { save a2    }
-            move.l  12(a6),a2
-            add.b   d1,(a2)
-            move.l  d6,a2      { restore a2 }
-            andi.l  #$ff,d1
-            move.l  d1,d0      { Save length of string }
-            lsr.l   #2,d1
-            bra     @LMOVE6
-         @LMOVE55:
-            move.l  (a1)+,(a0)+
-          @LMOVE6:
-            dbra    d1,@LMOVE55   { d1 is counter }
-            move.l  d0,d1         { now if bytes left to move, move them }
-            andi.l  #3,d1         { i.e  d1 := d1 mod 4                  }
-            bra     @LMOVE56
-          @LMOVE57:
-            move.b  (a1)+,(a0)+   { move those remaining bytes           }
-          @LMOVE56:
-            dbra    d1,@LMOVE57
+          move.b  #255,d0
+          move.l  s1,a0
+          move.l  s1,a1
+          sub.b   (a0),d0              {  copyl:= 255 -length(s1)    }
+          move.b  (a1),d6
+          cmp.b   d0,d6                { if copyl > length(s2) then  }
+          ble     @Lcontinue
+          move.b  (a1),d0              {  copyl:=length(s2)          }
+    @Lcontinue:
+          move.b  (a0),d6
+          and.l   #$ff,d6
+          lea     1(a0,d6),a0          { s1[length(s1)+1]            }
+          add.l   #1,a1                { s2[1]                       }
+          move.b  d0,d6
+    @Loop:
+          move.b  (a1)+,(a0)+          { s1[i] := s2[i];             }
+          dbra    d6,@Loop
+          move.l  s1,a0
+          add.b   d0,(a0)              { change to new string length }
          end ['d0','d1','a0','a1','d6'];
       end;
 
@@ -738,15 +723,8 @@ XDEF RE_BOUNDS_CHECK
 
 {
   $Log$
-  Revision 1.1  1998-03-25 11:18:44  root
-  Initial revision
-
-  Revision 1.19  1998/03/21 04:18:36  carl
-    * bugfix of FillChar (wrong value)
-    * bugfix of FillObject (wrong value)
-    * bugfix of strcopy (illegal address)
-    * strconcat tested ok
-    (still left to fix: STRCMP flag is LOST because of push and pop!)
+  Revision 1.2  1998-03-27 23:48:06  carl
+    * bugfix of STRCONCAT alignment problem
 
   Revision 1.18  1998/03/02 04:17:24  carl
     * problem with CHECK_OBJECT fixed, will probably only work with