/******************************
 ** LIBRERIA FUNZIONI VARIE  **
 ** by BIANCA HARD&SOFT 1994 **
 ******************************/
/************************************************
 ** FUNZIONE PER TRASFERIRE BLOCCHI DI MEMORIA **
 ************************************************
 *** INPUT :                                   **
 ** source - puntatore a blocco di partenza.   **
 ** dest   - puntatore a blocco d'arrivo.      **
 ** lung   - n# bytes blocco da trasferire.    **
 *** OUTPUT:                                   **
 ** nessuno.                                   **
 *** NOTE:                                     **
 ** La routin supporta anche spostamenti di    **
 ** aree parzialmente o totalmente sovrapposte.**
 ** E' scritta in assembler per ragioni di     **
 ** efficenza.                                 **
 ************************************************/
PROC cmem(source:PTR TO CHAR,dest:PTR TO CHAR,lung)

   MOVE.L   A1,-(A7)
   MOVE.L   A2,-(A7)
/** FATTO IN ASSEMBLER **/

   MOVE.L   source,A1
   MOVE.L   dest,A2
   MOVE.L   lung,D0
   TST.L    D0
   BEQ.B    fine
/* test se origine maggiore di destinazione */
   CMPA.L   dest,A1
   BGT.B    maggiore

/** trasferimento per dest >= source **/
   ADDA.L   lung,A1
   ADDA.L   lung,A2
loop1:
   MOVE.B   -(A1),-(A2)
   SUB.L    #1,D0
   BNE.B    loop1
   BRA.B    fine

/** trasferimento per dest < source **/
maggiore:
   MOVE.B   (A1)+,(A2)+
   SUB.L    #1,D0
   BNE.B    maggiore

fine:

   MOVE.L   (A7)+,A1
   MOVE.L   (A7)+,A2

ENDPROC

