.TITLE CONVERSION FROM A BINARY WORD TO DECIMAL STRING .PSECT DECPRT .MCALL $REGS ; ;ROUTINE TO CONVERT A BINARY WORD TO A SIGNED DECIMAL CHARACTER STRING. ; THE STRING IS OF THE FORM: " SXXXXX " WHERE "S" IS "-" OR BLANK ; DEPENDING ON THE SIGN, "XXXXX" IS THE DECIMAL VALUE WITH LEADING ; ZEROES, AND THERE IS A BLANK ON EITHER SIDE OF THE NUMBER. ; THE CONVERSION IS DOUBLE BUFFERED INTO STATIC STRINGS ; WHICH ARE OUTPUT BY "MSGE". "MSGE" RETURNS TO "DEPRT" WHEN A STRING ; HAS BEGUN PRINTING. THEREFORE THE DOUBLE BUFFER GUARANTEES THAT ; EACH NUMBER STRING WILL PRINT BEFORE ANOTHER NUMBER IS BUILT INTO ; THE SAME BUFFER. ; .GLOBL DECPRT .GLOBL MSGE $REGS ; ; DECPRT: MOV R4,-(SP) ;STACK REGISTERS USED MOV R3,-(SP) MOV R2,-(SP) MOV R1,-(SP) MOV R0,-(SP) MOV @DBLTOG,R1 ;GET THE STRING ADDRESS TO BUILD INTO INC R1 ;INCR PAST LEADING BLANK MOV #POWER,R2 ;GET ADDRESS OF DECIMAL POWER TABLE MOV @(R5)+,R4 ;GET BINARY VALUE TO BE CONVERTED BGE POSITIVE MOVB #'-,(R1)+ ;NO, THEN PUT MINUS SIGN IN STRING NEG R4 BR CONVRT POSITIVE: MOVB #40,(R1)+ ;YES, THEN PUT BLANK IN STRING CONVRT: CLR R0 ;CLEAR QUOTIENT MOV R4,R3 SUB: SUB (R2),R3 BMI STORCHAR MOV R3,R4 INC R0 BR SUB STORCHAR:ADD #60,R0 ;CONVERT QUOTIENT TO ASCII MOVB R0,(R1)+ ;STORE CHAR IN NEXT STRING TST (R2)+ ;GET NEXT POWER TST (R2) ;IS THIS POWER ZERO? DONE? BNE CONVRT ;NO, LOOP JSR R5,MSGE ;PRINT CHARACTER STRING DBLTOG: .WORD SDESC1 ;STATIC STRING DESC - TOGGLED CMP #SDESC1,DBLTOG ;CHECK WHICH DESC WAS LAST USED BEQ SETOGL MOV #SDESC1,DBLTOG ;RESET TO DESCRIPTOR 1 BR EXIT SETOGL: MOV #SDESC2,DBLTOG ;RESET TO DESCRIPTOR 2 EXIT: MOV (SP)+,R0 ;RESTORE REGISTERS USED MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ; ; SDESC1: .WORD DECP1 ;STATIC STRING DESC FOR 1ST BUFFER SDESC2: .WORD DECP2 ;STATIC STRING DESC FOR 2ND BUFFER .WORD DECP3 ;; DECP1: .ASCII ' ' .ASCII '-12345' DECP2: .ASCII ' ' .ASCII ' 12345' DECP3: .ASCII ' ' ;; .EVEN POWER: .WORD 10000.,1000.,100.,10.,1,0 ; .END