.TITLE CDBOM .IDENT /1.0/ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; CONVERT DOUBLE PRECISION BINARY TO ASCII UNSIGNED OCTAL ; ; THIS ROUTINE CONVERTS AN UNSIGNED, DOUBLE PRECISION BINARY NUMBER TO AN ASCII ; OCTAL NUMBER STRING OF UP TO 11 DIGITS. ; ; TO CALL THE CBDOM ROUTINE: ; ; 1.) SUPPLY THREE INPUT ARGUMENTS IN THE TASK'S SOURCE CODE: ; ; IN R0, THE STARTING ADDRESS OF THE OUTPUT AREA IN ; WHICH THE CONVERTED 1 TO 11 DIGIT NUMBER IS TO BE ; STORED. ; ; IN R1, THE ADDRESS OF THE TWO-WORD INPUT AREA WHICH ; CONTAINS THE DOUBLE PRECISION BINARY NUMBER. ; ; IN R2, THE ZERO SUPPRESSION INDICATOR, WHERE: ; ; R2=0 TO SPECIFY THAT LEADING ZEROES ARE TO BE ; SUPPRESSED AND THE NUMBER LEFT-JUSTIFIED. ; ; R2=N WHERE 0 < N =< 11, TO SPECIFY LEADING ZERO ; SUPPRESSION WITH THE NUMBER RIGHT-JUSTIFIED ; IN A FIELD OF LENGTH N. IF THE CONVERTED ; NUMBER HAS MORE THAN N DIGITS, THE ROUTINE ; INSERTS A STRING OF N ASTERISKS IN THE OUTPUT ; AREA. ; ; R2=M WHERE -11 =< M < 0, TO SPECIFY NO SUPPRESSION ; OF LEADING ZEROES AND A FIELD LENGTH OF M. IF ; THE CONVERTED NUMBER HAS MORE THAN M DIGITS, A ; STRING OF M ASTERISKS WILL BE INSERTED IN THE ; OUTPUT AREA. ; ; NOTE: FOR EITHER MODE OF ZERO SUPPRESSION, IF THE NUMBER IS ZERO THERE WILL ; BE ONE ASCII ZERO INSERTED IN THE OUTPUT AREA. ; ; ; 2.) INCLUDE THE STATEMENT ; ; CALL CDBOM ; ; IN THE SOURCE PROGRAM. ; ; THE CDBOM ROUTINE CALLS $SAVRG TO SAVE AND RESTORE REGISTERS 3-5 OF THE ; CALLING TASK. REGISTERS 1 AND 2 ARE NOT PRESERVED. ; ; OUTPUTS FROM THE CDBOM ROUTINE ARE: ; ; 1.) THE CONVERTED NUMBER, A STRING OF 1 TO 11 DIGITS, IN THE ; OUTPUT AREA. ; ; 2.) R0 = THE NEXT AVAILABLE ADDRESS IN THE OUTPUT AREA. ; ; ; THE CDBOM ROUTINE DOES NOT RETURN ANY ERROR INDICATIONS TO THE CALLER. ; ; ; DATE: 15-AUG-78 ; ; AUTHOR: M. C. ARMSTRONG ; BADGER METER, INC. - ELECTRONICS DIV. ; RICHMOND, CA ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; CDBOM DATA AND DEFINITIONS SECTION ; LDCHAR: .ASCII / 0/ OVFTAB: 10,0 ; 1 DIGIT FIELD SIZE 100,0 ; 2 1000,0 ; 3 10000,0 ; 4 100000,0 ; 5 0,4 ; 6 0,40 ; 7 0,400 ; 8 0,4000 ; 9 0,40000 ; 10 ; ; OFFSET DEFINITIONS FOR STACK VARIABLES ; BUFSAV = 2 ; SAVED OUTPUT BUFFER ADDRESS PKCTRL = 4 ; USED TO PASS OVER UNWANTED ZEROS FOR ; NO-ZS AND ZS,RJ MODES ; ; CDBOM CODE SECTION ; CDBOM:: JSR R5,$SAVRG ; SAVE R3-R5 SUB #6,SP ; ALLOCATE SPACE FOR STACK VARIABLES MOV (R1)+,R4 ; GET DOUBLE PRECISION INPUT NUMBER MOV (R1),R5 ; WHERE IT IS HANDIER (R5=LO, R4=HI) CLR R1 ; INIT MODE REG. TO '0 SUPPRESS, LEFT JUSTIFY' CLR R3 ; AND CLEAR DIGIT REG FOR FIRST PASS TST R2 ; IS MODE '0 SUPPRESS, LEFT JUSTIFY'? BNE 1$ ; NO IF NE MOV #11.,R2 ; YES, SET TO MAX. DIGIT COUNT BR CVSTRT ; AND GO BEGIN CONVERSION WITH 2 HI-ORDER BITS 1$: BPL 2$ ; IF R2 > 0, MODE IS '0 SUPPRESS, RIGHT JUSTIFY' INC R1 ; OTHERWISE ZEROES ARE NOT TO BE SUPPRESSED NEG R2 ; MAKE FIELD SIZE POSITIVE 2$: INC R1 ; (R1=1 => [ZS,RJ]; R1=2 => [NO-ZS]) ; ; CHECK WHETHER NUMBER WILL FIT IN FIELD OF SPECIFIED SIZE ; ASH #2,R2 ; CONVERT FIELD SIZE TO INDEX INTO ; TEST TABLE CMP R4,OVFTAB-2(R2) ; HI-ORDER PART TOO BIG? BHI 3$ ; YES IF HI BNE 5$ ; NO IF NE CMP R5,OVFTAB-4(R2) ; OTHERWISE, IS LO-ORDER PART TOO BIG? BLO 5$ ; NO IF LO 3$: ASH #-2,R2 ; CHANGE R2 FROM TBL INDEX BACK TO FLD SIZE 4$: MOVB #'*,(R0)+ ; PACK ASTERISKS INTO OUTPUT AREA SOB R2,4$ ; UNTIL FILLED BR CVEXIT ; THEN EXIT 5$: MOV R0,BUFSAV(SP) ; SAVE BFR ADR FOR BFR-EMPTY-TEST LATER CLR (SP) ; SET NO SIGNIFICANT-DIGIT-SEEN FLAG ON STACK ASH #-2,R2 ; RESTORE R2 BACK TO FIELD SIZE SPEC AGAIN MOV #12.,PKCTRL(SP) ; INIT LOOP CTR FOR PASSING OVER UNWANTED SUB R2,PKCTRL(SP) ; ZEROS IN NO-ZS AND ZS,RJ MODES BR CVSTRT ; GET THE FIRST DIGIT (TWO BITS ONLY) ; ; BEGIN THE CONVERSION ; CVLOOP: CLR R3 ; CLEAR THE DIGIT REG ASHC #1,R4 ROL R3 CVSTRT: ASHC #1,R4 ROL R3 ASHC #1,R4 ROL R3 TST (SP) ; ANY SIG. DIG.'S YET? BNE 7$ ; YES IF NE TST R3 ; NO, IS THIS DIGIT A ZERO? BNE 6$ TST R1 ; YES, ARE WE IN ZS,LJ MODE? BEQ CVLOOP ; YES IF EQ - GO LOOK FOR SIGNIFICANCE IN LIFE DEC PKCTRL(SP) ; NO - PASSED OVER ALL UNWANTED ZEROS YET? BNE CVLOOP ; NO IF NE - DON'T PACK ANYTHING YET THEN MOVB LDCHAR-1(R1),R3 ; YES, OUTPUT SPACE OR ZERO AS REQUIRED INC PKCTRL(SP) ; (FORCES UNWANTED ZEROS TEST INTO HERE AGAIN) BR 10$ 6$: INC (SP) ; SET SIG.-DIG.-SEEN 7$: BISB #'0,R3 ; MAKE DIGIT ASCII 10$: MOVB R3,(R0)+ ; PACK THE CHARACTER SOB R2,CVLOOP ; DO IT UNTIL ALL DIGITS ARE DONE TST (SP) ; DID WE EVER FIND MEANING IN ALL THIS? BNE CVEXIT ; YES IN NE CMP BUFSAV(SP),R0 ; NO, WAS ANYTHING PACKED (ZS,RJ MODE)? BEQ 11$ ; NO IF EQ DEC R0 ; YES, BACK PTR UP OVER LAST SPACE 11$: MOVB #'0,(R0)+ ; AND PACK ONE ZERO REGARDLESS OF MODE CVEXIT: ADD #6,SP ; CLEAN THE STACK RETURN ; AND EXIT .END