.TITLE SPYCVT - OUTPUT CONVERSION ROUTINE ; ; SPY VS02.0 OCTOBER 23, 1979 FOR IAS VERSION 3.0 ; ; AERONAUTICAL RESEARCH ASSOCIATES OF PRINCETON (A.R.A.P.) ; BOX 2229, PRINCETON, NJ 08540 (609) 452-2950 ; ; AUTHOR: J.D. LEONARD ; ; ; CALL SPYCVT (BUF, NDO, NWORD, NLWORD, MODE) ; ; WHERE - ; BUF - BUFFER TO OUTPUT TO ; NDO - # DIGITS TO OUPUT (FIELD LENGTH) ; NWORD - I*2 OR I*4 BINARY NUMBER TO CONVERT ; NLWORD - MUST BE 2 FOR I*2 AND 4 FOR I*4 ; MODE - 10. FOR DECIMAL, 8. FOR OCTAL CONVERSION ; SPYCVT:: MOV 6(R5),R0 ; ADDR OF DATA TO CONVERT MOV (R0)+,R2 ; LOW ORDER PART TOO R2 FOR $DDIV CLR R1 ; CLEAR HIGH ORDER IF I*2 CMP #2,@10(R5) ; I*2 ? BEQ COMMON ; YEP SKIP NEXT INSTRUCTION MOV (R0),R1 ; HIGH ORDER PART TO R1 FOR $DDIV COMMON: MOV 2(R5),R3 ; BUFFER ADDRESS MOV @4(R5),R4 ; # DIGITS IN OUTPUT FIELD ADD R4,R3 ; POINT TO RIGHT-MOST POSITION TO START MOV R3,-(SP) ; AND SAVE IT FOR LATER ; ; BEGIN LOOP ; START: TST R2 ; DIVISOR ZERO BNE DOIT ; NO TST R1 ; MAYBE BNE DOIT ; DEFINITELY NOT ! MOVB #' ,-(R3) ; MAKE IT A BLANK BR EOLOOP ; AND GET NEXT DIGIT (WHICH WILL BE BLANK) ; DOIT: MOV @12(R5),R0 ; CONVERSION MODE TO DIVIDE BY CALL $DDIV ; DO THE DIVISION ADD #'0,R0 ; ADD '0' TO REMAINDER TO TURN IT INTO ASCII MOVB R0,-(R3) ; PUT IT TO BUFFER EOLOOP: SOB R4,START ; ; MOV (SP)+,R3 ; CLEAN UP STACK AND GET RIGHTMOST BUF ADR CMPB #' ,-(R3) ; IS IT A BLANK ? BNE RETURN ; NOPE MOVB #'0,(R3) ; ELSE MAKE IT A ZERO RETURN: RETURN .END