.TITLE SWAPB .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: SWAPB ; ; DATE: 05-JUN-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; CALL SWAPB(VAR1,[VAR2,[NBYTE]]) ; ; VAR1,VAR2 ; ; = VARIABLES OR ARRAYS TO BE SWAPPED. ; ; NBYTE = NUMBER OF BYTES TO SWAP (DEFAULT=1). ; ; = 1 BYTE LOGICAL*1 ; = 2 LOGICAL INTEGER ; = 4 INTEGER*4 REAL ; = 8 REAL*8 COMPLEX DOUBLE PRECISION ; ; ; DESCRIPTION: ; ; "SWAPB" PERFORMS A BYTE-FOR-BYTE SWAP OF TWO VARIABLES. THE ; NUMBER OF BYTES TO BE SWAPPED IS OPTIONALLY SET THROUGH THE "NBYTE" ; PARAMETER (DEFAULT=1). THE NUMBER OF BYTES TO BE SWAPPED IS NORMALLY ; DEPENDENT UPON THE INPUT VARIABLE TYPES (SEE TABLE ABOVE). CALLING ; SWAPB WITH A SINGLE ARGUMENT CAUSES THE HIGH AND LOW ORDER BYTES OF ; THAT ARGUMENT TO BE SWAPPED (EQUIVALENT TO THE MACRO SWAB INSTRUCTION). ; ; EXAMPLES: ; ; CALL SWAPB(INT1, INT2, 2) SWAP INTEGER VARIABLES ; CALL SWAPB(REAL1, REAL2, 4) SWAP REAL VARIABLES ; CALL SWAPB(ARRAY1,ARRAY2,80) SWAP 80-BYTE ARRAYS ; ; CALL SWAPB(INTEGER) SWAP HI/LO BYTES ; ; .SBTTL ENTRY POINT -- BYTE-FOR-BYTE SWAP ; ; ; .PSECT ; ; SWAPB:: ; ; MOV 2(R5),R1 ; ADDRESS OF VAR1 TO R1 CMPB #1,(R5) ; SINGLE ARGUMENT? BEQ 4$ ; YES, ASSUME BYTE SWAP (SWAB) MOV 4(R5),R2 ; ADDRESS OF VAR2 TO R2 MOV #1,R0 ; DEFAULT BYTE COUNT TO R0 CMPB #3,(R5) ; THREE ARGUMENTS? BGT 2$ ; NO, USE DEFAULT BYTE COUNT TST 6(R5) ; NULL ARGUMENT? BEQ 2$ ; YES, USE DEFAULT BYTE COUNT MOV @6(R5),R0 ; BYTE COUNT TO R0 ; 2$: MOVB (R1),R3 ; VAR1 BYTE TO TEMP MOVB (R2),(R1)+ ; VAR2 BYTE TO VAR1 MOVB R3,(R2)+ ; TEMP BYTE TO VAR2 SOB R0,2$ ; DECREMENT BYTE COUNT AND BRANCH RTS PC ; RETURN TO CALLER ; 4$: SWAB (R1) ; BYTE SWAP RTS PC ; RETURN TO CALLER .END ;