.PSECT ALWAYS 30APR2 COPY ;30APR2 .MCALL DIR$ ;************************************************************************ ;* * ;* MODULE: COPY - COPY A SPECIFIED RANGE OF VIRTUAL MEMORY * ;* * ;* AUTHOR: KEVIN ANGLEY * ;* * ;* DATE: 02-SEP-80 * ;* * ;* INPUT PARAMETERS: * ;* * ;* R0 POINTS TO THE COMMAND LINE IN PROCESS * ;* * ;* OUTPUT PARAMETERS: * ;* * ;* R0 POINTS JUST BEYOND THE LAST CHARACTER OF THE COPY * ;* * ;* DESTROYS: R1,R2,R3,R4 * ;30APR2 ;* * ;30APR2 ;************************************************************************ ;30APR2 ;30APR2 ;30APR2 ; 30APR2 KEVIN ANGLEY ADDED PARAMETERS EVEN AND ODD TO ALLOW COPYING ;30APR2 ; ONLY THOSE FROM ADDRESSES THAT ARE EVEN/ODD TO ;30APR2 ; THE TARGET. THIS WILL ALLOW BREAKING UP MEMORY ;30APR2 ; INTO EVEN AND ODD PARTS (E.G. FOR 16-BIT ;30APR2 ; MICROPROCESSORS). ;30APR2 ; ;30APR2 ; ;30APR2 ; 30APR2 KEVIN ANGLEY CORRECTED INCORRECT USAGE OF FLAGS AFTER THE ;30APR2 ; GETKEY MACRO. SHOULD USE Z-FLAG TO DETERMINE ;30APR2 ; MATCH (Z SET) OR NO MATCH (Z CLEAR). ;30APR2 ; ;30APR2 ;30APR2 CPALL = 100000 ; MASK TO INDICATE COPYING ALL BYTES ;30APR2 CPEVEN = 000000 ; MASK TO INDICATE COPYING EVEN BYTES ;30APR2 CPODD = 000001 ; MASK TO INDICATE COPYING ODD BYTES ;30APR2 ;30APR2 COPY:: ;30APR2 ;30APR2 MOV #CPALL,MASK ; ASSUME COPYING ALL BYTES (DEFAULT) ;30APR2 GETKEY EVEN ; TRY FOR "EVEN" KEYWORD ;30APR2 BNE 3$ ; NE: NOT EVEN, TRY ODD ;30APR2 MOV #CPEVEN,MASK ; SET UP EVEN MASK ;30APR2 BR 4$ ; EVEN/ODD MUTUALLY EXCLUSIVE 3$: ;30APR2 GETKEY ODD ; TRY FOR ODD ;30APR2 BNE 4$ ; NE: NOT EVEN OR ODD, USE DEFAULT OF ALL ;30APR2 MOV #CPODD,MASK ; SET UP ODD MASK ;30APR2 4$: ;30APR2 CALL FROMTH ; COLLECT FROM/THRU ARGUMENTS BCS 250$ ; CS: FAILED MOV R1,R2 ; SAVE FROM IN R2 GETKEY TO ; GET KEYWORD TO BEQ 10$ ; EQ: GOT IT ;30APR2 OUTPUT MSK ; MISSING KEYWORD ;**-1 BR 250$ ; TAKE ERROR EXIT 10$: CALL GETHX4 ; GET TO ADDRESS BCS 250$ ; CS: FAILURE - TAKE ERROR EXIT ADD #MEMORY,R2 ; MAKE R2 POINT TO THE ACTUAL LOCATION 20$: CALL VALID ; VALIDATE TARGET ADDRESS BCS 250$ ; CS: INVALID - TAKE ERROR EXIT ;30APR2 TST MASK ; IS MASK SET FOR EVEN/ODD? ;30APR2 BMI 30$ ; MI: NO, NORMAL COPY ;30APR2 MOV MASK,R4 ; SET UP TO TEST EVEN-EVEN OR ODD-ODD ;30APR2 XOR R2,R4 ; BIT 0 NOW SET IF OPPOSITE SENSE ;30APR2 ; CLEARED IF SAME SENSE ;30APR2 ROR R4 ; SET CARRY FLAG FROM ABOVE ;30APR2 BCS 40$ ; OPPOSITE SENSE - DO NOT COPY THIS ONE ;30APR2 30$: ;30APR2 ;30APR2 MOVB (R2),MEMORY(R1) ; COPY IT ;30APR2 ADD OFFST,R1 ; UN-OFFSET AND INCREMENT TO POINTER ;30APR2 INC R1 ;30APR2 40$: ;30APR2 ; ALWAYS... ;30APR2 INC R2 ; INCREMENT FROM LOCATION ;30APR2 SOB R3,20$ ; LET'S DO IT AGAIN 250$: ; ERROR EXIT 255$: ; SUCCESS EXIT CALL$R EXTRA ; PURGE EXTRA & RETURN .PAGE ;30APR2 .SBTTL COPY - DATA AREAS ;30APR2 ;30APR2 MASK: .BLKW ; MASK TO INDICATE ALL/EVEN/ODD COPY ;30APR2 ; BIT 7 = 1 ----> COPY ALL ;30APR2 ; BIT 7 = 0 ----> COPY ACCORDING TO: ;30APR2 ; BIT 0 = 0 ---> COPY EVEN ;30APR2 ; BIT 0 = 1 ---> COPY ODD ;30APR2 ;30APR2 .END