; MOVE.MAC 25-JUL-78 ; .TITLE MOVE .IDENT /V01/ ; ; * * * * * * * * * ; ; MOVE - BYTE TRANSFER ; ; THIS IS ONE OF A SET OF BYTE MANIPULATION ROUTINES IN WHICH THE ; BEGINNING OF A STRING IS SPECIFIED BY AN ADDRESS,COUNT PAIR A,K WHERE ; A IS A BASE ADDRESS (OF A VARIABLE OR ARRAY) AND K IS A TWO-BYTE ; INTEGER WORD SPECIFYING AT WHICH BYTE OF A THE STRING BEGINS. K MAY BE ; POSITIVE, ZERO, OR NEGATIVE. K=1 MEANS THE FIRST BYTE OF A. ; ; CALL MOVE(A1,K1,A2,K2,L) ; ; THIS ROUTINE MOVES L BYTES FROM A1,K1 TO A2,K2. ; ; A1,K1 - SPECIFIES THE BEGINNING OF THE SOURCE STRING. A1 MAY BE ; A LITERAL CONSTANT. ; A2,K2 - SPECIFIES THE BEGINNING OF THE DESTINATION STRING. ; L - A TWO-BYTE INTEGER COUNT OF THE NUMBER OF BYTES TO MOVE. ; IF L IS ZERO OR NEGATIVE, NO BYTES ARE MOVED. ; ; THIS ROUTINE DOES NOTHING IF PASSED THE WRONG NUMBER OF ARGUMENTS. ; ; THE SOURCE AND DESTINATION STRINGS MAY OVERLAP. FOR EXAMPLE, BYTES ; IN AN ARRAY MAY BE SHIFTED EITHER "FORWARD" OR "BACKWARD" INTACT. THE ; ROUTINE DECIDES WHETHER TO START THE MOVE WITH THE FIRST BYTE OR THE LAST ; BYTE. ; ; * * * * * * * * * ; ; FILL - BYTE FILL ; ; THIS IS ONE OF A SET OF BYTE MANIPULATION ROUTINES IN WHICH THE ; BEGINNING OF A STRING IS SPECIFIED BY AN ADDRESS,COUNT PAIR A,K WHERE ; A IS A BASE ADDRESS (OF A VARIABLE OR ARRAY) AND K IS A TWO-BYTE ; INTEGER WORD SPECIFYING AT WHICH BYTE OF A THE STRING BEGINS. K MAY BE ; POSITIVE, ZERO, OR NEGATIVE. K=1 MEANS THE FIRST BYTE OF A. ; ; CALL FILL(A1,K1,A2,K2,L) ; ; THIS ROUTINE STORES THE BYTE AT A1,K1 INTO EVERY BYTE OF THE STRING ; OF LENGTH L BEGINNING AT A2,K2. ; ; A1,K1 - SPECIFIES THE BYTE TO STORE. A1 MAY BE A LITERAL ; CONSTANT. ; A2,K2 - SPECIFIES THE BEGINNING OF THE DESTINATION STRING. ; L - A TWO-BYTE INTEGER COUNT OF THE NUMBER OF BYTES TO STORE. ; IF L IS ZERO OR NEGATIVE, NO BYTES ARE STORED. ; ; THIS ROUTINE DOES NOTHING IF PASSED THE WRONG NUMBER OF ARGUMENTS. ; ; * * * * * * * * * ; ; CAPS - CONVERSION TO UPPER CASE ; ; THIS IS ONE OF A SET OF BYTE MANIPULATION ROUTINES IN WHICH THE ; BEGINNING OF A STRING IS SPECIFIED BY AN ADDRESS,COUNT PAIR A,K WHERE ; A IS A BASE ADDRESS (OF A VARIABLE OR ARRAY) AND K IS A TWO-BYTE ; INTEGER WORD SPECIFYING AT WHICH BYTE OF A THE STRING BEGINS. K MAY BE ; POSITIVE, ZERO, OR NEGATIVE. K=1 MEANS THE FIRST BYTE OF A. ; ; CALL CAPS(A1,K1,A2,K2,L) ; ; THIS ROUTINE MOVES L BYTES FROM A1,K1 TO A2,K2, CONVERTING ALL ; LOWER CASE ASCII CHARACTERS TO UPPER CASE. ; ; A1,K1 - SPECIFIES THE BEGINNING OF THE SOURCE STRING. A1 MAY BE ; A LITERAL CONSTANT. ; A2,K2 - SPECIFIES THE BEGINNING OF THE DESTINATION STRING. ; L - A TWO-BYTE INTEGER COUNT OF THE NUMBER OF BYTES TO MOVE. ; IF L IS ZERO OR NEGATIVE, NO BYTES ARE MOVED. ; ; THIS ROUTINE DOES NOTHING IF PASSED THE WRONG NUMBER OF ARGUMENTS. ; ; THE SOURCE AND DESTINATION STRINGS MAY OVERLAP. FOR EXAMPLE, BYTES ; IN AN ARRAY MAY BE SHIFTED EITHER "FORWARD" OR "BACKWARD" INTACT. THE ; ROUTINE DECIDES WHETHER TO START THE MOVE WITH THE FIRST BYTE OR THE LAST ; BYTE. ; ; IF THE SOURCE AND DESTINATION STRINGS ARE THE SAME, THEN THE UPPER ; CASE CONVERSION IS DONE IN PLACE. ; ; * * * * * * * * * ; ; ; WRITTEN BY BOB TURKELSON, NASA/GSFC CODE 626 ; ; NOTE: SYMBOL CAPREV SHOULD BE DEFINED AS: ; NON-ZERO TO ASSEMBLE CODE WHICH PROCESSES STRINGS IN ; THE CAPS ROUTINE IN REVERSE ORDER WHEN THE SOURCE ; STRING ADDRESS IS LOWER THAN THE DESTINATION STRING ; ADDRESS (IN CASE THE STRINGS OVERLAP); ; ZERO TO EXCLUDE THAT CODE. CAPREV=0 ; MOVE:: MOV #MPROC,R3 ; MOVE PROCESSING ADDRESS BR PASS FILL:: MOV #FPROC,R3 ; FILL PROCESSING ADDRESS BR PASS CAPS:: MOV #CPROC,R3 ; CAPS PROCESSING ADDRESS PASS: CMPB #5,(R5) ; ARE 5 ARGUMENTS PASSED? BNE RTR ; IF NE NO MOV @12(R5),R0 ; GET NO. OF BYTES TO PROCESS (ARG 5) BLE RTR ; IF LE ZERO RETURN TST (R5)+ ; ADVANCE POINTER TO ARGUMENT 1 MOV (R5)+,R1 ; GET BASE ADDRESS OF SOURCE (ARG 1) ADD @(R5)+,R1 ; ADD SOURCE BYTE NUMBER (ARG 2) DEC R1 ; SUBTRACT 1 FOR ADDRESS OF 1ST SOURCE BYTE MOV (R5)+,R2 ; GET BASE ADDRESS OF DESTINATION (ARG 3) ADD @(R5)+,R2 ; ADD DESTINATION BYTE NUMBER (ARG 4) DEC R2 ; SUBTRACT 1 FOR ADDR OF 1ST DESTINATION BYTE CMP R1,R2 ; COMPARE STARTING ADDRESSES OF SOURCE ; ; AND DESTINATION JMP (R3) ; PROCESS ACCORDING TO ENTRY POINT ; ; MOVE PROCESSING ; MPROC: BLO REVERS ; IF LO SOURCE ADDR LOWER THAN DESTINATION RPT: MOVB (R1)+,(R2)+ ; MOVE NEXT BYTE SOB R0,RPT ; REPEAT IF MORE BYTES TO PROCESS BR RTR ; DONE REVERS: ADD R0,R1 ; PROCESS STRING IN REVERSE ORDER, ADD R0,R2 ; STARTING WITH LAST BYTE RPTN: MOVB -(R1),-(R2) ; MOVE "NEXT" BYTE SOB R0,RPTN ; REPEAT IF MORE BYTES TO PROCESS BR RTR ; DONE ; ; FILL PROCESSING ; FPROC: MOVB (R1),(R2)+ ; MOVE FILL BYTE TO NEXT DESTINATION BYTE SOB R0,FPROC ; REPEAT IF MORE BYTES TO PROCESS BR RTR ; DONE ; ; CAPS PROCESSING ; CPROC: .IF NE,CAPREV ; ASSEMBLE BLOCK IF CAPREV NON-ZERO BHI CRPT ; IF HI SOURCE ADDR HIGHER THAN DESTINATION ADD R0,R1 ; PROCESS STRING IN REVERSE ORDER, ADD R0,R2 ; STARTING WITH LAST BYTE CRPTN: MOVB -(R1),-(R2) ; MOVE "NEXT" BYTE CMPB (R2),#141 ; CHAR IN LOWER CASE RANGE? BLO DOWN ; IF LO NO CMPB (R2),#172 ; CHAR OUTSIDE LOWER CASE RANGE? BHI DOWN ; IF HI YES BICB #40,(R2) ; CONVERT TO UPPER CASE DOWN: SOB R0,CRPTN ; REPEAT IF MORE BYTES TO PROCESS BR RTR ; DONE .ENDC CRPT: MOVB (R1)+,(R2) ; MOVE NEXT BYTE CMPB (R2),#141 ; CHAR IN LOWER CASE RANGE? BLO UP ; IF LO NO CMPB (R2),#172 ; CHAR OUTSIDE LOWER CASE RANGE? BHI UP ; IF HI YES BICB #40,(R2) ; CONVERT TO UPPER CASE UP: TSTB (R2)+ ; POINT TO NEXT DESTINATION BYTE SOB R0,CRPT ; REPEAT IF MORE BYTES TO PROCESS ; RTR: RTS PC .END