This repository has been archived by the owner on Jan 19, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
print16.asm
158 lines (143 loc) · 2.18 KB
/
print16.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; print16 从内存打印16位int(十进制5位),空位补0
; 以BE方式存储以便打印
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
print16:
.scope
.data zp
.space _num 4
.space _num_dec 6
.text
pha
txa
pha
lda #0
ldx #6
* sta _num_dec-1, x
dex
bne -
`splitbyte s, 3
`splitbyte s + 1, 1
`carry
`print _num_dec
pla
tax
pla
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; mod函数处理的数据为打印方便均使用大端序存储
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mod_4: ; 高字节低4位若大于10,则向高位进1
lda _num + 3
cmp #10
bcc +
sbc #10 ; 此时c为1
tax
lda #1
sta _num_dec + 3 ; 进位
txa
* sta _num_dec + 4
rts
mod_3: ; 高字节高4位的值相当于个位加6,十位加1
ldx _num + 2
bne + ; 如果为0直接返回
rts
* lda #6
`carry10 4
lda #1
`carry10 3
dex
bne -
rts
mod_2: ; 低字节低4位的值相当于个位加6,十位加5,百位加2
ldx _num + 1
bne + ; 如果为0直接返回
rts
* lda #6
`carry10 4
lda #5
`carry10 3
lda #2
`carry10 2
dex
bne -
rts
mod_1: ; 低字节低4位的值相当于个位加6,十位加9,百位加0,千位加4
ldx _num
bne + ; 如果为0直接返回
rts
* lda #6
`carry10 4
lda #9
`carry10 3
lda #4
`carry10 1
dex
bne -
rts
.scend
.macro carry10
clc
adc _num_dec + _1
bcc _skip
pha
lda #$10 ; 进位相当于100
clc
adc _num_dec + _1 - 1
sta _num_dec + _1 - 1
pla
_skip:
sta _num_dec + _1
.macend
.macro splitbyte
lda _1
sta _num + _2
lsr
lsr
lsr
lsr
sta _num + _2 - 1
lda #$0f
and _num + _2
sta _num + _2
.macend
.macro carry
tya
pha
sed ; 设置为bcd加减法
jsr mod_4
jsr mod_3
jsr mod_2
jsr mod_1 ; 此时结果中有些位可能大于10,需要进行进位处理
ldx #5
_loop:
ldy #0 ; y记录进位数
txa
lda _num_dec-1, x
cmp #10
bcc _skip ; 小于10不进位
pha
and #$f0
lsr
lsr
lsr
lsr
adc _num_dec-2, x
sta _num_dec-2, x
pla
and #$0f
sta _num_dec-1, x
_skip:
dex
bne _loop
cld ; 退出bcd模式
ldx #5
_up:
lda _num_dec - 1, x
ora #$30 ; 转化为可显示字符
sta _num_dec - 1, x
dex
bne _up
pla
tay
.macend