;This source code was written by Greg Garner on a Commodore Amiga. ;I release this source code to the public domain with the restraint ;that my name be included in any source this is used in. ;Binary to decimal ;convertor. ;Call this with word to convert in D0. ;And address of Free memory to put BCD ;String at in A0. Bindec Move.b #' ',D1 ;Assume we have a positive binary value. Tst.l D0 ;See if we have a negatice number. Bpl Notneg Move.b #'-',D1 ;Put a minus sign in front of number. Neg.l D0 ;Convert it to a positive number. Notneg Move.b D1,(A0)+ ;Save the sign of the BCD number. Adda.l #$0A,A0 ;Point to 1 past end of string area. Move.b #$00,(A0) ;Make sure the string is NULL terminated. Move.w #$09,D6 ;Count register for highest number digits. Bcdloop Move.l #10,D1 ;Divide by ten to find remainder. Bsr Londivu ;D0=D0/D1. Remainder in D1, ans in D0. Move.b D1,-(A0) ;Move Binary remainder to BCD area. Add.b #'0',(A0) ;Adjust it to ASCII. Dbra D6,Bcdloop ;Do the division until done. Rts ;Binary to ASCII hex string. Call with long word in D0 and string addr in A0. Binhex Move.l #$07,D1 ;Do 8 Hex digits. Move.b #$20,(a0)+ ;Start with ascii spaces. Move.b #$20,(a0)+ Add.l #8,A0 ;Point to end of string. Move.b #$00,(a0) ;Terminate with a 0 hex. Hexloop Move.b D0,D2 ;Get lo byte. And.b #$0F,D2 ;Look at lo order nibble. Cmpi.b #$0a,D2 ;Is the nibble>=A? Bcc Hexalph Ori.b #'0',D2 ;Convert it to 0-9 ascii. Bra Hexskip Hexalph Add.b #'A'-10,D2 ;Convert it to Alpha digit. Hexskip Move.b D2,-(A0) ;Save digit Asr.l #$04,D0 ;Shift it right 4 bits. Dbra D1,Hexloop Rts ;32 bit division. D0/D1, answer in D0, remainder in D1. ;This routine uses the shift and subtract algorythm. ;Unsigned division. Londivu Move.l #$00,D7 ;Start with a positive number. Bra Postiv ;Signed division. Londivs Move.l #$00,D7 ;Assume we have two positive numbers. Tst.l D1 ;See if we are dividing by zero. Beq Badexit Bpl Posone ;At least this number is positive. Not.l D7 ;Show that we have a negative number. Neg.l D1 ;Change D1 to a positive number. Posone Tst.l D0 Bpl Postiv ;Is this a positive number? Not.l D7 ;Two negs make positive. Neg.l D0 ;Turn it into a positive number. Postiv Move.l #32,D4 ;Number of bits-1 in quotient. Clr.l D2 ;Clear two temporary registers. Clr.l D3 Clrcr Move.b #0,Ccr ;Clear carry for first time. Dv Roxl.l #$01,D0 ;Rotate the left bit into the Extend bit. Roxl.l #$01,D2 ;Rotate the Extend bit into temp register. Move.l D2,D3 ;Move D2 into temporary D3. Sub.l D1,D3 ;D3=D3-D1. Is D3>D1? Eori.b #$ff,Ccr ;Invert the carry. Bcc Dccnt ;No, shift some more into D2. Extend=0. Move.l D3,D2 ;Save the remainder. Extend=1. Dccnt Move.b Sr,D5 ;Save the Extend bit. Subq.l #$01,D4 ;Decrement the bit count. Beq Okexit ;If we are done, then leave. Move.b D5,Ccr ;Get the Extend bit back. Bra Dv Okexit Move.b D5,Ccr ;Get last Extend bit. Roxl.l #$01,D0 ;Rotate it into the answer. Move.l D2,D1 ;Put the remainder in D1. Move.b #$00,Ccr ;Clear the carry to show success. Exend Tst.l D7 ;Is the answer positive or negative? Bpl Goodby Neg.l D0 ;Change the answer to a negative number. Goodby Rts Badexit Move.b #$ff,Ccr ;Set the carry to show failure. Bra Exend ;Leave via single rts. ;Add a decimal point to the string pointed to by A0. # of dec places is in D0. Decpt Cmp.b #$00,(A0)+ ;Are we at the end of the string yet? Bne Decpt ;Look some more if we haven't found end. Mcloop Move.b -(A0),1(A0) ;Move each byte over one. Dbra D0,Mcloop ;Have we done all the digits? Move.b #'.',(A0) ;Move the decimal point into the string. Rts ;Clear all leading zero places in string. Killz Adda.l #$01,A0 ;Skip the first place. Killp Cmp.b #'0',(A0) ;Is this a zero? Bne Killrt ;No zero here, we are done. Move.b #' ',(A0)+ ;Move a blank into string. Bra Killp ;Do another byte. Killrt Rts