1706
|
1 *
|
|
2 * Arithmetic routines for VIEW
|
|
3 *
|
|
4 *
|
|
5 ifp1
|
1912
|
6 use os9defs.d
|
1706
|
7 endc
|
|
8
|
|
9 psect view_arith_a,0,0,0,0,0
|
|
10 *
|
|
11 * Divide A by B, return fixed-point result in A.B, rounded.
|
|
12 *
|
|
13 divAB:
|
|
14 pshs b Put divisor on stack
|
|
15 ldb #17 17-bit result, with last bit in C.
|
|
16 pshs b
|
|
17 clrb
|
|
18 pshs b
|
|
19 divABloop
|
|
20 rol ,s
|
|
21 rola
|
|
22 rolb Shift into B.
|
|
23 cmpb 2,s
|
|
24 blo divAB1
|
|
25 subb 2,s
|
|
26 orcc #Carry
|
|
27 bra divAB2
|
|
28 divAB1
|
|
29 andcc #^Carry
|
|
30 divAB2
|
|
31 dec 1,s
|
|
32 bne divABloop
|
|
33 puls b Get fraction part into B
|
|
34 adcb #0 Round by adding in extra decimal place.
|
|
35 adca #0
|
|
36 leas 2,s Clear up stack.
|
|
37 rts
|
|
38
|
|
39 * Divide 16-bit value in X by 8-bit value in A, return 16-bit result in D.
|
|
40 *
|
|
41 div168:
|
|
42 pshs x The division we want is (XH * 256 + XL) / A
|
|
43 pshs d
|
|
44 lda 3,s First, calculate XL / A
|
|
45 ldb ,s
|
|
46 bsr divAB
|
|
47 sta 1,s Save it.
|
|
48 lda 2,s Now do (XH/A) *256
|
|
49 ldb ,s
|
|
50 clr ,s
|
|
51 bsr divAB
|
|
52 addd ,s Add them to get answer.
|
|
53 std ,s
|
|
54 puls d
|
|
55 puls x,pc
|
|
56
|
|
57 endsect
|