[Coco] Divide by 10 on a Motorola MC6809(E)
Don Barber
don at dgb3.net
Thu Mar 21 16:51:03 EDT 2024
Neat. If you want another generic 16b divide, Leventhal also made a
version in his book (page 54 of
https://colorcomputerarchive.com/repo/Documents/Books/6809%20Assembly%20Language%20Subroutines%20%28Lance%20Leventhal%29.pdf).
Its also available on github at
https://github.com/jmatzen/leventhal-6809/blob/master/6809_DIV16.s
I also wrote a multiple-precision-byte integer version when I wrote
cocorsa. This is available at:
https://github.com/barberd/cocorsa/blob/main/src/sub/MPBDIV.s
Thanks,
Don
On 3/21/24 12:10, M. David Johnson via Coco wrote:
> Rather than just make a special routine for Divide By 10, I decided a more general 16 x 16 Divide would be more useful for my purposes. Adjust the "ORG $4325" to suit your own needs. For what it's worth:
>
> *****
> *
> * DU1616.ASM
> * MDJ 2023/02/02
> *
> * 16-BIT BY 16-BIT
> * UNSIGNED DIVIDE
> *
> * ENTRY CONDITIONS:
> * X = DIVIDEND
> * Y = DIVISOR
> *
> * EXIT CONDITIONS:
> * X = QUOTIENT
> * Y = REMAINDER
> *
> * ON EXIT, IF
> * DIVIDE BY ZERO
> * ERROR:
> * X = #$FFFF
> * Y = #$FFFF
> * AN IMPOSSIBLE RESULT
> *
> *****
> *
> * THIS FUNCTION WAS
> * ADAPTED FROM:
> * BARROW, DAVID (1984).
> * 6809 MACHINE CODE
> * PROGRAMMING.
> * LONDON: GRANADA
> * TECHNICAL BOOKS,
> * PAGES 29-33.
> *
> *****
>
> ORG $4325
>
> DU1616 PSHS A,B,X,Y,CC
> CMPY #0 IS IT DIVIDE-BY-ZERO?
> BEQ LBL003 GO IF YES (ERROR)
> LDB #16 NUMBER OF 16-BIT SHIFTS
> PSHS B SAVE THE COUNT
> CLRA CLEAR ACCUMULATOR D
> CLRB
>
> * 16 SHIFTS - TRY TO SUBTRACT DIVISOR AT EACH SHIFT,
> * FORMING QUOTIENT ONE BIT AT A TIME.
> * QUOTIENT SHIFTS IN AS DIVIDEND SHIFTS OUT.
> LBL001 ASL 5,S SHIFT NEXT DIVIDEND BIT THROUGH
> ROL 4,S INTO REMAINDER (D), CLEARING
> ROLB NEXT QUOTIENT BIT AT BIT 0 5,S
> ROLA
> CMPD 6,S CAN DIVISOR BE SUBTRACTED?
> BLO LBL002 GO IF NO
> SUBD 6,S SUBTRACT AND SET QUOTIENT BIT
> INC 5,S AT CORRESPONDING BIT LOCATION
> LBL002 DEC ,S REPEAT TIL ENTIRE DIVIDEND SHIFTED
> BNE LBL001 (D IS NOW THE REMAINDER)
>
> * PUT REMAINDER INTO STACKED Y.
> * CLEAR COUNT BYTE OFF STACK.
> * PULL RESULTS (X AND Y) AND CLEAN THE STACK
> STD 6,S REMAINDER TO STACKED Y
> LEAS 1,S REMOVE COUNT FROM STACK
> PULS A,B,X,Y,CC
> BRA LBL004 GO TO EXIT
>
> * ERROR HANDLING
> LBL003 PULS A,B,X,Y,CC
> LDX #$FFFF SET ERROR CODING
> LDY #$FFFF
>
> * EXIT
> LBL004 RTS
>
> END
>
>
> --
> M. David Johnson
> mdj at bds-soft.com
>
>
> -----Original Message-----
> From: Coco <coco-bounces at maltedmedia.com> On Behalf Of Don Barber via Coco
> Sent: Wednesday, March 20, 2024 5:02 PM
> To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com>
> Cc: Don Barber <don at dgb3.net>
> Subject: Re: [Coco] Divide by 10 on a Motorola MC6809(E)
>
> Sorry yes arithmetic shift was incorrect, my bad. Should clear the carry bit with the right ANDCC and then do LSRA instead.
>
> Don
>
> Sent from my iPhone
>
>> On Mar 20, 2024, at 3:48 PM, Sean Conner via Coco <coco at maltedmedia.com> wrote:
>>
>> It was thus said that the Great Don Barber via Coco once stated:
>>> A trick I use to divide 8 bit integers by 10 is to MUL by 205, then
>>> shift the A register down by 3 bits (ASRA three times). This works
>>> out to
>>> 205/2048 which is close enough precision to 1/10 for 8 bit integers.
>> Nice, although when I tried it, it gave very ... odd ... results for
>> higher values of A. Up through 150 it gave the right answers, but
>> starting with 160, it started returning (mostly incorrect) negative answers:
>>
>> 160 -16
>> 170 -15
>> 180 -14
>> 190 -13
>> ...
>> 240 -8
>> 250 -9
>>
>> change the ASRA to LSRA and the results are what you would expect for
>> unsigned division. Also, after the sequence:
>>
>> ldb #205
>> mul
>> lsra
>> lsra
>> lsra
>>
>> the C flag is 1 for remainders of 5 through 9; clear otherwise. I
>> found that interesting.
>>
>> -spc
>>
>>
>> --
>> Coco mailing list
>> Coco at maltedmedia.com
>> https://pairlist5.pair.net/mailman/listinfo/coco
>
> --
> Coco mailing list
> Coco at maltedmedia.com
> https://pairlist5.pair.net/mailman/listinfo/coco
>
>
More information about the Coco
mailing list