dealloc
;
+import "std:out"
+
+: copy_byte ( addr_from addr_to -- addr_from addr_to )
+ swap \ ( addr_to addr_from )
+ dup \ ( addr_to addr_from addr_from )
+ @:8 \ ( addr_to addr_from byte )
+ rot \ ( addr_from byte addr_to )
+ dup \ ( addr_from byte addr_to addr_to)
+ rot \ ( addr_from addr_to addr_to byte )
+ swap \ ( addr_from addr_to byte addr_to )
+ !:8 \ ( addr_from addr_to )
+;
+
+export memcopy
+: memcopy ( addr_from addr_to count -- )
+ dup \ ( addr_from addr_to count count )
+ loop \ ( addr_from addr_to count )
+ rot \ ( addr_to count addr_from )
+ rot \ ( count addr_from addr_to )
+ copy_byte \ ( count addr_from addr_to )
+ 1 + \ ( count addr_from addr_to+1 )
+ rot \ ( addr_from addr_to+1 count )
+ 1 - \ ( addr_from addr_to+1 count-1 )
+ rot \ ( addr_to+1 count-1 addr_from )
+ 1 + \ ( addr_to+1 count-1 addr_from+1 )
+ rot rot \ ( addr_from+1 addr_to+1 count-1 )
+ dup \ ( addr_from+1 addr_to+1 count-1 count-1)
+ endloop \ ( addr_from+count addr_to+count 0 )
+ drop drop drop \ ( )
+;
0 assert
+import "std:string"
+import "std:mem"
+import "std:out"
+
+extern putstack
+
+16 alloc \ ( ptr )
+dup \ ( ptr ptr )
+"To be copied!" \ ( ptr ptr strptr )
+dup \ ( ptr ptr strptr strptr )
+strlen 1 + \ ( ptr ptr strptr len )
+rot \ ( ptr strptr len ptr )
+swap \ ( ptr strptr ptr len )
+memcopy \ ( ptr )
+puts \ ( ptr )
+free \ ( )
+
+