.TITLE ACNVT .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: ACNVT ; ; DATE: 11-JUN-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; CALL ACNVT(INTEGER,STRING,ILEN,[RADIX],[FILL],[ISW]) ; ; INTEGER = INTEGER TO BE CONVERTED INTO AN ASCII STRING. ; ; STRING = VARIABLE OR ARRAY TO RECEIVE THE ASCII STRING ; GENERATED BY ACNVT. ; ; ILEN = INTEGER ARGUMENT SPECIFYING THE LENGTH OF THE ; ASCII STRING TO BE GENERATED. ; ; RADIX = OPTIONAL ARGUMENT SPECIFYING THE RADIX (2-16) TO USE ; DURING CONVERSION. (DEFAULT=10) ; ; FILL = OPTIONAL FILL CHARACTER TO USE ON THE STRING. ; (DEFAULT IS BLANK FILLED) ; ; ISW = VARIABLE TO RECEIVE THE INTEGER STATUS WORD. ; ; 00 = CONVERSION SUCCESSFUL ; -01 = STRING OVERFLOW ; ; ; DESCRIPTION: ; ; "ACNVT" CONVERTS A BINARY INTEGER TO ITS ASCII STRING EQUIVALENT ; USING AN OPTIONALLY SPECIFIED RADIX (2-16) AND FILL CHARACTER. IF THE ; INTEGER CONVERSION EXCEEDS ILEN, THE OPTIONAL ERROR FLAG IS SET AND THE ; STRING IS PACKED WITH ASTERISKS. ; ; ; EXAMPLES: ; ; CALL ACNVT(1999,STR1,10) ; CALL ACNVT(1023,STR2,10,8) ; CALL ACNVT(1023,STR3,10,16) ; CALL ACNVT(1999,STR4,10,,'0') ; CALL ACNVT(1999,STR5, 2,,,ISW5) ; ; STR1 = ' 1999' ; STR2 = ' 1777' ; STR3 = ' 3FF' ; STR4 = '0000001999' ; STR5 = '**' ISW5 = -1 ; ; .SBTTL ENTRY POINT -- FORTRAN INTERFACE TO INTEGER/ASCII CONVERSION ; ; ; .PSECT ; ; ACNVT:: ; ; MOV @2(R5),R0 ; INTEGER TO R0 MOV 4(R5),R1 ; BUFFER ADDRESS TO R1 MOV @6(R5),R2 ; BUFFER LENGTH TO R2 CLR R3 ; CLEAR R3 (RADIX) CLR R4 ; CLEAR R4 (FILLER) CMPB #4,(R5) ; FOUR ARGUMENTS? BGT 4$ ; NO, USE DEFAULT RADIX AND FILLER TST 10(R5) ; NULL ARGUMENT? BLT 2$ ; YES, USE DEFAULT RADIX MOV @10(R5),R3 ; NO, MOVE RADIX TO R3 2$: CMPB #5,(R5) ; FIVE ARGUMENTS? BGT 4$ ; NO, USE DEFAULT FILLER TST 12(R5) ; NULL ARGUMENT? BLT 4$ ; YES, USE DEFAULT FILLER MOV @12(R5),R4 ; NO, MOVE FILLER TO R4 ; 4$: JSR PC,C$ACVT ; CALL INTEGER TO ASCII CONVERSION ; BCC .+10 ; ERROR? MOV #-1,R4 ; YES, SET ISW = -1 BR .+4 ; CLR R4 ; NO, CLEAR ISW ; RTN: CMPB #6,(R5) ; SIX ARGUMENTS? BGT 2$ ; NO, RETURN WITHOUT ISW TST 14(R5) ; NULL ARGUMENT? BLT 2$ ; YES, RETURN WITHOUT ISW MOV R4,@14(R5) ; NO, RETURN ERROR STATUS 2$: RTS PC ; RETURN TO CALLER ; .SBTTL ENTRY POINT -- INTEGER TO ASCII CONVERSION ; ; ; REGISTER USAGE: ; ; R0 = INTEGER ; R1 = ASCII STRING ADDRESS (POINTS TO NEXT CHARACTER UPON RETURN) ; R2 = STRING LENGTH ; R3 = RADIX ; R4 = FILLER CHARACTER ; ; 'C-BIT' SET ON ERROR ; ; ; .PSECT ; ; C$ACVT:: ; ; MOV R5,-(SP) ; PRESERVE SCRATCH REGISTER TST R4 ; TEST FILLER CHARACTER BNE .+6 ; USE DEFAULT? MOV #040,R4 ; YES, SET FILLER = SPACE MOV R4,-(SP) ; PRESERVE FILLER TST R3 ; TEST RADIX BNE .+6 ; USE DEFAULT? MOV #10.,R3 ; YES, SET RADIX = 10 MOV R3,-(SP) ; PRESERVE RADIX MOV R2,-(SP) ; PRESERVE BUFFER LENGTH ; 2$: MOVB R4,(R1)+ ; MOVE FILLER TO ASCII BUFFER SOB R2,2$ ; UNTIL BUFFER IS FULL MOV (SP),R2 ; RESTORE BUFFER LENGTH MOV R1,-(SP) ; PRESERVE UPDATED BUFFER ADDRESS ; R1 POINTS ONE BYTE PAST END-OF-STRING ; MOV R0,R4 ; MOVE INTEGER TO WORKING SPACE 4$: MOV R4,R5 ; JUSTIFY NUMBER CLR R4 ; CLEAR UPPER WORD DIV R3,R4 ; DIVIDE BY RADIX BISB #060,R5 ; CONVERT REMAINDER TO ASCII CMPB #072,R5 ; NUMERIC RESULT? BGT .+6 ; YES, SKIP OFFSET ADD #101-072,R5 ; NO, OFFSET TO 'A' MOVB R5,-(R1) ; AND MOVE TO ASCII BUFFER TST R4 ; QUOTIENT ZERO? BEQ 10$ ; YES, RETURN TO CALLER SOB R2,4$ ; NO, CONVERT NEXT CHARACTER ; MOV 2(SP),R2 ; ERROR; RESTORE BUFFER LENGTH 6$: MOVB #052,(R1)+ ; MOVE ASTERISKS TO ASCII BUFFER SOB R2,6$ ; UNTIL BUFFER IS FULL SEC ; SET 'C-BIT' BR 12$ ; AND RETURN ; 10$: CLC ; SUCCESS; CLEAR 'C-BIT' ; 12$: MOV (SP)+,R1 ; RESTORE UPDATED BUFFER ADDRESS MOV (SP)+,R2 ; RESTORE BUFFER LENGTH MOV (SP)+,R3 ; RESTORE RADIX MOV (SP)+,R4 ; RESTORE FILLER CHARACTER MOV (SP)+,R5 ; RESTORE SCRATCH REGISTER RTS PC ; RETURN TO CALLER .END ;