; BINHEX - CONVERT FROM BINARY TO HEXADECIMAL ; ; CALL BINHEX(IN,OUT,NBYTES) ; ; OR INTEGER*2 BINHEX ; ... = BINHEX(IN) ; ; BINHEX MAY BE CALLED AS A SUBROUTINE WITH THREE ARGUMENTS, OR MAY ; BE USED AS A FUNCTION WITH ONE ARGUMENT. ; ; IN - BYTE STRING TO CONVERT ; OUT - HEXADECIMAL CHARACTER RESULT (NOTE THAT STORE FOR OUT ; SHOULD BE 2 * NBYTES.) ; NBYTES - NUMBER OF BYTES IN INPUT BYTE STRING TO CONVERT ; BINHEX (FUNCTION) - RETURNED VALUE IS TWO HEXADECIMAL CHARACTERS ; RESULTING FROM THE CONVERSION OF ONE BYTE ; ; THIS ROUTINE DOES NOTHING IF PASSED THE WRONG NUMBER OF ARGUMENTS OR ; IF THE NUMBER OF BYTES IS ZERO OR NEGATIVE. ; ; WRITTEN BY BOB TURKELSON, NASA/GSFC CODE 626 ; ; DATE OF THIS VERSION: 13-JUN-78 ; ; .TITLE BINHEX .IDENT /V001/ BINHEX:: MOV 2(R5),R0 ; SOURCE ADDRESS CMPB #1,(R5) ; DOES ROUTINE HAVE JUST 1 ARG? BNE $10 ; NE IF NO MOVB (R0),R3 ; A FUNCTION CALL - GET BYTE CALL HEXCOD ; CONVERT BYTE TO HEX MOV R3,R0 ; RETURN AS FUNCTION VALUE BR RETURN ; $10: CMPB #3,(R5) ; DOES ROUTINE HAVE 3 ARGS? BNE RETURN ; RETURN IF NO - INVALID CALL MOV 4(R5),R1 ; DESTINATION ADDRESS MOV @6(R5),R2 ; NUMBER OF BYTES TO CONVERT BLE RETURN ; RETURN IF <= 0 BYTES $20: MOVB (R0)+,R3 ; MOVE NEXT BYTE INTO R3 CALL HEXCOD ; CONVERT BYTE INTO HEX DIGITS MOVB R3,(R1)+ ; MOVE BOTH HEX DIGITS INTO OUTPUT SWAB R3 ; ONE BY ONE MOVB R3,(R1)+ SOB R2,$20 ; LOOP BACK IF MORE BYTES TO CONVERT ; RETURN: RETURN ; ; HEXCOD CONVERTS BYTE IN R3 TO TWO HEXADECIMAL DIGITS, RETURNED ; IN R3. HEXCOD: BIC #177400,R3 ; RESET UPPER BYTE ASH #4,R3 ; SHIFT WORD LEFT 4 BITS CLC RORB R3 ; SHIFT 4 BITS IN RIGHT RORB R3 ; BYTE BACK RORB R3 RORB R3 ; SEPARATE DIGIT FIELD NOW IN EACH BYTE SWAB R3 ; PROCESS BYTES IN CORRECT ORDER CALL @PC ; PROCESS TWO DIGITS ADD #48.,R3 ; DEFAULT CONVERSION TO ASCII 0-9 CMPB R3,#57. ; OK IF ORIGINAL BYTE <= 9. BLE 10$ ; BR IF LE ADD #7.,R3 ; RESET FOR ASCII A-F 10$: SWAB R3 ; DO OTHER CHAR NEXT TIME THROUGH RETURN .END