.TITLE COPYB .IDENT /11JUN/ ; ; Fortran callable subroutine to copy from one ; array to another by bytes. ; ; CALL COPYB (SOURCE, START, TARGET, BEGIN, LENGTH) ; SOURCE = Array containing information to be copied ; START = Starting position in array SOURCE ; TARGET = Array where information will to copied to ; BEGIN = Starting position in array TARGET ; LENGTH = Length of copy in decimal bytes ;------ ; Parameter LENGTH determines the type of copy to be performed. ; LENGTH: ; if equal to zero - no operations performed ; if greater than zero - copy proceeds in ascending order ; if less than zero - copy into TARGET will start at ; BEGIN and proceed in descending address order. ; COPYB:: CMP (R5), #5 ;CORRECT NUMBER OF PARAMETERS? BEQ GO RTN: RTS PC ;RETURN TO CALLING PROCEDURE ; GO: MOV 2(R5), R0 ;ADDRESS OF SOURCE ARRAY ADD @4(R5), R0 ;ADD START OFFSET DEC R0 ;FORTRAN ARRAYS START AT ONE MOV 6(R5), R1 ;ADDRESS OF TARGET ARRAY ADD @10(R5), R1 ;ADD BEGIN OFFSET DEC R1 ;FORTRAN ARRAYS START AT ONE MOV @12(R5), R2 ;LENGTH OF COPY ; TST R2 ;DETERMINE TYPE OF COPY BEQ RTN ;IF ZERO, SIMPLY RETURN BPL NORMAL ;LENGTH IS POSITIVE, STANDARD COPY ; ; MUST PERFORM A DESCENDING COPY INTO TARGET ARRAY ; NEG R2 ;MAKE LENGTH POSITIVE INC R1 ;SET ADDRESS TO 1 BYTE BEYOND BEGIN MI: MOVB (R0)+, -(R1) ;MOVE BYTE FROM SOURCE TO TARGET SOB R2, MI ;REPEAT UNTIL FINISHED RTS PC ;DONE - RETURN ; ; PERFORM AN ASCENDING COPY INTO TARGET ARRAY ; NORMAL: MOVB (R0)+, (R1)+ ;MOVE BYTE FROM SOURCE TO TARGET SOB R2, NORMAL ;REPEAT UNTIL FINISHED RTS PC ;DONE - RETURN ; .END