.TITLE CBTA .IDENT /04/ ; ; BINARY TO ASCII CONVERSION ; ; LOCAL MACROS ; ; SETUP CONVERSION CONTROL WORD ON STACK ; ; STCVT RADIX,WIDTH,SIGNED,COMPR,BLANKS ; ; WHERE ; ; RADIX=NUMERIC VALUE SPECIFYING CONVERSION RADIX ; WIDTH=NUMERIC VALUE FROM 1 TO 7 SPECIFYING FIELD WIDTH ; SIGNED= SIGN OR MAGNITUDE FLAG. ASCII STRING 'SIGN' SPECI- ; FIES SIGNED CONVERSION. ANYTHING ELSE SPECIFIES MAGNI- ; TUDE. ; ; COMPR=COMPRESS LEADING ZEROS FLAG. ASCII STRING 'COMPRES' SPE- ; CIFIES COMPRESSION OF LEADING ZEROS. ANYTHING ELSE MEANS ; INCLUDE LEADING ZEROS OR SPACES IN CONVERSION. ; ; BLANK=REPLACE LEADING ZEROS WITH BLANKS (SPACES). ASCII STRING ; 'BLANKS' MEANS BLANK REPLACEMENT IF ZERO COMPRESS IS DISABLED. ; ANYTHING ELSE SPECIFIES ZERO PADDING. ; .MACRO STCVT RADIX,WIDTH,SIGN,COMPR,BLANK $$$BLK= 0 $$$SGN= 0 $$$SUP= 1*1000 .IF IDN , $$$BLK= 1*2000 .ENDC .IF IDN , $$$SGN= 1*400 .ENDC .IF IDN , $$$SUP= 0*1000 .ENDC MOV #!$$$BLK!$$$SGN!$$$SUP!RADIX,-(SP) .ENDM ;+ ; **-$CBDAT-CONVERT DATE TO TWO DIGIT DECIMAL MAGNITUDE ; **-$CBDMG-CONVERT BINARY TO DECIMAL MAGNITUDE ; **-$CBDSG-CONVERT BINARY TO DECIMAL SIGNED ; **-$CBOMG-CONVERT BINARY TO OCTAL MAGNITUDE ; **-$CBTA-GENERAL PURPOSE BINARY TO ASCII CONVERSION ; **-$CBOSG-CONVERT BINARY TO OCTAL SIGNED ; **$CBTMG-CONVERT BINARY BYTE TO OCTAL MAGNITUDE ; ; INPUTS: ; ; R0=ADDRESS TO STORE FIRST BYTE IN OUTPUT STRING ; R1=NUMBER TO BE CONVERTED ; R2=ZERO SUPPRESSION INDICATOR ; IF R2 EQ 0, THEN SUPPRESS ZEROS. ; IF R2 NE 0, THEN SUPPRESS ZEROS. ; ; IF $CBTA IS CALLED THEN R2 MUST CONTAIN THE FOLLOWING INFORMATION ; ; LOW BYTE=CONVERSION RADIX (2-10.) ; BIT 8=MAGNITUDE/SIGNED CONVERSION (1=SIGNED) ; ; BIT 9=ZERO COMPRESS FLAG (0=COMPRESS LEADING ZEROS) ; ; BIT 10=BLANK FILL FLAG (1=REPLACE LEADING ZEROS WITH BLANKS ; IF ZERO COMPRESS DISABLED, 0=ZERO FILL). ; ; BIT 10=BLANK FILL FLAG (1=REPLACE LEADING ZEROS WITH BLANKS ; IF ZERO COMPRESS DISABLED, 0=ZERO FILL). ; ; BIT 11-15=FIELD WIDTH (1-32) ; ; ; OUTPUTS: ; ; R0=ADDRESS OF NEXT BYTE AFTER LAST DIGIT STORED. ; ; IF THE CONVERTED DIGIT EXCEEDS 9, THE RESULT IS BIASED TO FALL ; IN THE RANGE A-Z. ; ;+ ; ; CONVERT TWO-DIGIT DATE TO ASCII ; .ENABL LSB $CBDAT:: STCVT 10.,2.,MAGN,NOCOMP,NOBLANK ;PUSH CONVERSION PARAMETERS BR 10$ ;CONVERT NUMBER ; ; CONVERT 5-DIGIT UNSIGNED DECIMAL TO ASCII ; $CBDMG:: STCVT 10.,5.,MAGN,NOCOMP,NOBLAN ;PUSH CONVERSION PARAMETERS BR 10$ ; ; CONVERT 5-DIGIT SIGNED DECIMAL TO ASCII ; $CBDSG:: STCVT 10.,5.,SIGNED,NOCOMP,NOBLANK ;CONVERSION PARAMETERS BR 10$ ; ; CONVERT BINARY TO OCTAL MAGNITUDE ; $CBOMG:: STCVT 8.,6.,MAGN,NOCOMP,NOBLANK ;PUSH CONVERSION PARAMETERS BR 10$ ; ; CONVERT BINARY TO OCTAL SIGNED ; $CBOSG:: STCVT 8.,6.,SIGNED,NOCOMP,NOBLANK ;PUSH CONVERSION PARAMETERS BR 10$ ;CONVERT TO ASCII ; ; CONVERT BINARY BYTE TO OCTAL MAGNITUDE ; $CBTMG:: BIC #177400,R1 ;ENSURE THAT HIGH BYTE IS CLEAR STCVT 8.,3.,MAGN,NOCOMP,NOBLANK ;PUSH CONVERSION PARAMETERS ; ; SET OR CLEAR ZERO SUPPRESS FLAG ; 10$: TST R2 ;SUPPRESS ZEROS BNE 20$ ;IF NE NO BIC #1*1000,(SP) ;ENABLE ZERO SUPPRESS 20$: MOV (SP)+,R2 ;SET CONTROL WORD .DSABL LSB ; ; GENERAL BINARY TO ASCII CONVERSION ; $CBTA:: JSR R5,$SAVRG ;SAVE THE NON-VOLATILE REGISTERS MOVB R2,R5 ;COPY RADIX BYTE SWAB R2 ;POSITION REMAINING DATA TO LOW BYTE ASRB R2 ;SHIFT OFF MAGNITUDE FLAG BCC 10$ ;IF C/C UNSIGNED CONVERSION TST R1 ;POSITIVE VALUE? BPL 10$ ;IF PL YES NEG R1 ;MAKE VALUE POSITIVE MOVB #'-,(R0)+ ;INSERT A MINUS SIGN 10$: MOV R0,R4 ;COPY STRING POINTER CLC ;CLEAR CARRY RORB R2 ;SHIFT OFF SUPPRESS FLAG ROR R2 ;TRANSFER TO R2 ROR R3 ;GET BLANK/ZERO PAD FLAG CLRB R3 ;CLEAR COUNT BYTE BISB R2,R3 ;TRANSFER COUNT BYTE CLRB R2 ;CLEAR FILL BYTE BISB #'0,R2 ;SET FILL BYTE MOV R1,R0 ;DIVIDEND TO R0 .IF DF V1145 1$: MOV R0,R1 ;DIVIDENT TO R1 CLR R0 ;CLEAR HIGH PART DIV R5,R0 ;DIVIDE EM UP .ENDC .IF NDF V1145 1$: MOV R5,R1 ;SET CONVERSION RADIX CALL $DIV ;DIVIDE EM UP .ENDC CMP R1,#9. ;RESULT EXCEED NUMERICS BLOS 15$ ;IF LOS NO ADD #7,R1 ;BIAS TO FALL IN U/C ALPHABETIC 15$: ADD R2,R1 ;ADD CHARACTER BIAS MOV R1,-(SP) ;SAVE CHARACTER DECB R3 ;DECREMENT CHARACTER COUNT BLE 3$ ;IF LE NO DIGITS LEFT TST R0 ;ZERO QUOTIENT BNE 2$ ;IF NE YES, GO AGAIN TST R2 ;SUPPRESS ZEROS BPL 3$ ;IF PL YES, ALL DONE TST R3 ;SUBSTITUTE BLANKS? BPL 2$ ;IF PL NO BIC #20,R2 ;CONVERT FILL TO BLANKS 2$: CALL 1$ ;DIVIDE AGAIN 3$: ; MOVB (SP)+,(R4)+ ;STORE A DIGIT MOV R4,R0 ;STORE TERMINAL ADDRESS RETURN .END