Explorar el Código

+ implemented Move() using inline asm

git-svn-id: branches/z80@44972 -
nickysn hace 5 años
padre
commit
902b8e0958
Se han modificado 2 ficheros con 39 adiciones y 31 borrados
  1. 38 31
      rtl/z80/z80.inc
  2. 1 0
      rtl/zxspectrum/system.pp

+ 38 - 31
rtl/z80/z80.inc

@@ -21,37 +21,44 @@ procedure fpc_cpuinit;{$ifdef SYSTEMINLINE}inline;{$endif}
 
 
 
 
 {$define FPC_SYSTEM_HAS_MOVE}
 {$define FPC_SYSTEM_HAS_MOVE}
-procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];
-{var
-  pdest,psrc,pend : pbyte;}
-begin
-(*  if (@dest=@source) or (count<=0) then
-    exit;
-  if (@dest<@source) or (@source+count<@dest) then
-    begin
-      { Forward Move }
-      psrc:=@source;
-      pdest:=@dest;
-      pend:=psrc+count;
-      while psrc<pend do
-        begin
-          pdest^:=psrc^;
-          inc(pdest);
-          inc(psrc);
-        end;
-    end
-  else
-    begin
-      { Backward Move }
-      psrc:=@source+count;
-      pdest:=@dest+count;
-      while psrc>@source do
-        begin
-          dec(pdest);
-          dec(psrc);
-          pdest^:=psrc^;
-        end;
-    end;*)
+procedure Move(const source;var dest;count:SizeInt);assembler;[public, alias: 'FPC_MOVE'];
+label
+  skip, forward_move;
+asm
+  ld c, (count)
+  ld b, (count+1)
+  bit 7, b
+  jp NZ, skip
+  ld a, b
+  or a, c
+  jp Z, skip
+
+  ld l, (source)
+  ld h, (source+1)
+  ld e, (dest)
+  ld d, (dest+1)
+
+  ld a, d
+  cp a, h
+  jp C, forward_move
+  ld a, e
+  cp a, l
+  jp C, forward_move
+
+  { backward move }
+  add hl, bc
+  dec hl
+  ex de, hl
+  add hl, bc
+  dec hl
+  ex de, hl
+  lddr
+  jp skip
+
+forward_move:
+  ldir
+
+skip:
 end;
 end;
 
 
 
 

+ 1 - 0
rtl/zxspectrum/system.pp

@@ -64,6 +64,7 @@ Type
 
 
 procedure fpc_InitializeUnits;compilerproc;
 procedure fpc_InitializeUnits;compilerproc;
 Procedure fpc_do_exit;compilerproc;
 Procedure fpc_do_exit;compilerproc;
+procedure Move(const source;var dest;count:SizeInt);
 Procedure FillChar(var x;count:SizeInt;value:byte);
 Procedure FillChar(var x;count:SizeInt;value:byte);
 function get_frame:pointer;
 function get_frame:pointer;
 function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;
 function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;