( <CMOVE                      copy n bytes from addr1 to addr2 )
(             the move proceeds from high memory to low memory )

: <cmove                          ( addr1 addr2 n --- )
  dup rot +                       ( calculate addr2+n)
  swap rot                        ( and put it on the bottom)
  1 -                             ( DO-LOOP end = addr1-1)
  dup rot +                       ( DO-LOOP start = addr1+n-1)
  do
    1 -                           ( decrement addr2)
    i c@                          ( fetch next byte from addr1)
    over c!                       ( and copy it to addr2)
    -1                            ( decrement index)
  +loop
  drop                            ( discard addr2)
;
