.TITLE DBTAS ;CALL DBTAS(ISGNWD,IASA) ;ISGNWD IS THE WORD CONTAINING THE SIGN AND THE HIGH ;ORDER PART OF THE DOUBLE WORD INTEGER ;THE LOW ORDER PART IS AT ISGNWD+2 ;IASA IS AN ASCII ARRAY AT LEAST 6 WORDS LONG WHICH ; WILL BE FILLED WITH BLANK,SIGN,AND ; 10 CHARACTER NUMBER. ;CALLABLE IN ASSEMBLER ALSO VIA ; JSR R5,DBTAS. WITH R0=HIGH ORDER PART ; R1= LOW ORDER PART, R2=ADDRESS OF 12 BYTE BUFFER ; FOR OUTPUT CHARACTERS .GLOBL DBTAS,DBTAS. R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 DBTAS: MOV R5,R4 ;COPY LINK TST(R4)+ ;SKIP BR MOV (R4)+,R1 ;ADDRESS OF SIGNWORD MOV (R1)+,R0 ;SIGNWORD VALUE MOV (R1),R1 ;LOW ORDER VALUE MOV (R4),R2 ;ADDRESS ARRAY DBTAS.: MOVB #' ,(R2)+ ;BLANK OUT MOVB #' ,(R2)+ ;ASSUME PLUS TST R0 ;NEGATIVE? BGE POS ;YES/NO MOVB #'-,-(R2) ;YEP TSTB (R2)+ ;BUMP TO POINT TO NEXT PLACE COM R0 ;CONSTRUCT TWO'S COMPLEMENT COM R1 ADD #1,R1 ;INC DOES NOT SET CARRY ADC R0 ; POS: MOV #DIGTAB,R3 ;SET UP ADDRESS OF DIGIT TABLE MOV #10.,R4 ;10 CHARACTERS TO CONVERT START: MOVB #'0,(R2) ;ASSUME OUTPUT OF ZERO CTDWN: SUB 2(R3),R1 ;LOW PART SBC R0 ;CARRY SUB (R3),R0 ;HIGH BLT NEXT ;DONE IF <0 INCB (R2) ;TRY NEXT ASCII DIGIT BR CTDWN ;AND GO CHECK IT NEXT: DEC R4 BLE END ;DON'T DO FOLLOWING FOR LAST CHAR CMPB #' ,-1(R2) ;PREVIOUS CHAR A SIGN? BEQ ZERO ;YES /NO CMPB #'-,-1(R2) ;HOW BOUT THIS SIGN? BNE GOON ;YES/NO ZERO: CMPB #'0,(R2) ;IS THIS CHARACTER A ZERO? BNE GOON ; YES/NO MOVB -1(R2),(R2) ;EXCHANGE SIGN AND ZERO MOVB #' ,-1(R2) ;BLANK OUT ZERO GOON: ADD 2(R3),R1 ;WE OVER DID IT ADC R0 ADD (R3),R0 ;BOTH PARTS ADD #4,R3 ;POINT TO NEXT BASE 10 TSTB (R2)+ ;NEXT PLACE FOR CHARACTER BR START END: RTS R5 DIGTAB: .WORD 35632,145000 ;10 T0 THE NINTH .WORD 2765,160400 ;10 TO THE EIGTH .WORD 230,113200 ;TEN TO THE 7TH .WORD 17,41100 ; TEN TO THE 6TH .WORD 1,103240 ;TEN TO THE 5TH .WORD 0,23420 ;TEN TO THE 4TH .WORD 0,1750 ;TEN TO THE 3RD .WORD 0,144 ;TEN TO THE 2ND .WORD 0,12 ;TEN TO THE FIRST .WORD 0,1 ;TEN TO THE 0 .END