Mercurial > hg > Members > kono > nitros9-code
annotate 3rdparty/packages/coyota/bin_dec32.as @ 3054:22ddd48b4ec2
level1 krn: Fix scheduler bug that only affected 6309
The original 6809 binary was correct, but it was disassembled
and interpreted wrongly, so that reassembly went wrong on 6309.
author | Tormod Volden <debian.tormod@gmail.com> |
---|---|
date | Sun, 25 Jan 2015 22:36:02 +0100 (2015-01-25) |
parents | 9306e2875040 |
children |
rev | line source |
---|---|
1909 | 1 ************************************************ |
2 * | |
3 * Binary to decimal conversion (32 bit) | |
4 | |
5 * OTHER MODULES NEEDED: DECTAB$ | |
6 | |
7 * ENTRY: X=buffer for ascii string | |
8 * Y=bits 31-16 of binary value to convert | |
9 * D=bits 15-0 of binary value to convert | |
10 | |
11 * EXIT: all registers (except cc) preserved | |
12 | |
13 | |
14 nam 32 bit Binary to Decimal Conversion | |
15 ttl Assembler Library Module | |
16 | |
17 | |
2952
9306e2875040
coyota: Port to lwtools
Tormod Volden <debian.tormod@gmail.com>
parents:
2951
diff
changeset
|
18 BIN_DEC32 EXPORT |
1909 | 19 |
2952
9306e2875040
coyota: Port to lwtools
Tormod Volden <debian.tormod@gmail.com>
parents:
2951
diff
changeset
|
20 SECTION code |
1909 | 21 |
22 Base fcb $3B,$9A,$CA,$00 1,000,000,000 | |
23 fcb $05,$F5,$E1,$00 100,000,000 | |
24 fcb $00,$98,$96,$80 10,000,000 | |
25 fcb $00,$0F,$42,$40 1,000,000 | |
26 fcb $00,$01,$86,$A0 100,000 | |
27 fcb $00,$00,$27,$10 10,000 | |
28 fcb $00,$00,$03,$E8 1,000 | |
29 fcb $00,$00,$00,$64 100 | |
30 fcb $00,$00,$00,$0A 10 | |
31 fcb $00,$00,$00,$01 1 | |
32 | |
33 | |
34 * Entry: | |
35 * A = format flag (0 = write leading zeros, 1 = do not) | |
36 * X = address of buffer to hold number | |
37 * Y = address of 32 bit value | |
38 * Exit: | |
39 * X = address of buffer holding number | |
40 BIN_DEC32: | |
41 pshs d,x,y,u | |
42 tfr x,u | |
43 tfr y,x | |
44 ldb #10 max number of numbers (10^9) | |
45 pshs b save count on stack | |
46 leay <Base,pcr point to base of numbers | |
47 s@ lda #$30 put #'0 | |
48 sta ,u at U | |
49 s1@ bsr Sub32 ,X=,X-,Y | |
50 inc ,u | |
51 bcc s1@ if X>0, continue | |
52 bsr Add32 add back in | |
53 dec ,u+ | |
54 dec ,s decrement counter | |
55 beq done@ | |
56 lda ,s | |
57 cmpa #$09 | |
58 beq comma@ | |
59 cmpa #$06 | |
60 beq comma@ | |
61 cmpa #$03 | |
62 bne s2@ | |
63 comma@ ldb #', | |
64 stb ,u+ | |
65 s2@ leay 4,y point to next | |
66 bra s@ | |
67 done@ leas 1,s | |
68 clr ,u put nil byte at end | |
69 * 1,234,567,890 | |
70 tst ,s format flag | |
71 beq ex2@ | |
72 ldb #14 length of string with commas + 1 | |
73 ldx 2,s get pointer to buffer | |
74 a@ decb | |
75 beq ex@ | |
76 lda ,x+ get byte | |
77 cmpa #'0 | |
78 beq a@ | |
79 cmpa #', | |
80 beq a@ | |
81 ex@ leax -1,x | |
82 stx 2,s | |
83 ex2@ puls d,x,y,u,pc | |
84 | |
85 * Entry: | |
86 * X = address of 32 bit minuend | |
87 * Y = address of 32 bit subtrahend | |
88 * Exit: | |
89 * X = address of 32 bit difference | |
90 Sub32 ldd 2,x | |
91 subd 2,y | |
92 std 2,x | |
93 ldd ,x | |
94 sbcb 1,y | |
95 sbca ,y | |
96 std ,x | |
97 rts | |
98 | |
99 | |
100 * Entry: | |
101 * X = address of 32 bit number | |
102 * Y = address of 32 bit number | |
103 * Exit: | |
104 * X = address of 32 bit sum | |
105 Add32 ldd 2,x | |
106 addd 2,y | |
107 std 2,x | |
108 ldd ,x | |
109 adcb 1,y | |
110 adca ,y | |
111 std ,x | |
112 rts | |
113 | |
2952
9306e2875040
coyota: Port to lwtools
Tormod Volden <debian.tormod@gmail.com>
parents:
2951
diff
changeset
|
114 ENDSECT |