; SCOPY.MAC ; ; CALL SCOPY(FROM,TO[,LEN][,ST PT OF FROM][,ST PT OF TO]) ; COPIES STRFROMG IN INTO STRING TO ; IF AN INTEGER COUNT LEN IS SPECIFIED, THEN ONLY LEN ; CHARACTERS WILL BE COPIED, ELSE ALL OF FROM WILL BE ; COPIED (INCLUDING THE TERMINTING <0> ; IF A STARTING POINT IS GIVEN, IT WILL COPY EITHER FROM OR TO ; CHARACTER NUMBER "STARTING PT" IN THE ARRAY. ; ; CAUTION: WHEN USED IN THE PROGRAM ZIPSOR, IT CRASHED WITH AN ; ERROR MESSAGE ABOUT STACK ERROR. REPLACING IT WITH AN EQUIVALENT ; FORTRAN SUBROUTINE SOLVED THE PROBLEM. ; ; As of 9 15 83, it was changed so that you have to specify a length ; and it will transfer that many characters irregardless of whether ; nulls exist. .TITLE SCOPY .GLOBL SCOPY SCOPY: MOV 2(R5),R0 ; ADDRESS OF IN STRING MOV 4(R5),R1 ; ADDRESS OF OUT STRING MOV #-1,R2 ; R2 = -1 UNLESS LENGTH GIVEN CMPB #2,(R5) ; ARE THERE ONLY 2 ARGUMENTS BEQ 1$ ; YES TST 6(R5) ; WAS 3RD ARGUMENT A DEFAULT BLE 3$ ; YES SO, DON'T USE MOV @6(R5),R2 ; USE THE LENGTH 3$: CMPB (R5),#4 ; ARE THERE 4 ARGUMENTS BLT 1$ ; NO THERE ISN'T TST 10(R5) ; WAS 4TH ARGUMENT A DEFAULT? BLE 4$ ; YES IT WAS ADD @10(R5),R0 ; ADD THIS TO ADDRESS OF FROM STRING DEC R0 4$: CMPB (R5),#5 ; ARE THERE 5 ARGUMENTS BLT 1$ ; NO ADD @12(R5),R1 ; ADD THIS TO ADDRESS OF TO STRING DEC R1 1$: MOVB (R0)+,(R1)+ ; BEQ 2$ DEC R2 BGT 1$ 2$: RTS PC .END