📄 fft.lst
字号:
FFT PAGE 1
1 $mod51
2 $nolist
117 $list
4000 118 codeseg equ tpa
5000 119 tableseg equ codeseg + (4*1024)
5200 120 arrayseg equ tableseg + 512
121
0024 122 celct data 24h ; cell counter
0025 123 celnum data 25h ; number of cells
0026 124 pairnm data 26h ; pairs per cell
0027 125 celdis data 27h ; span between pairs
0028 126 delta data 28h ; angle increment
0029 127 sclfct data 29h ; multiply output amplitude by 2^sclfct
002A 128 sine data 2Ah
002B 129 cosine data 2Bh
002C 130 treal data 2Ch
002D 131 timag data 2Dh
002E 132 lctr1 data 2Eh ; loop counter 1
133 ; since all arrays are on page boundaries
134 ; only the low byte is used for indexing
004B 135 rlpt1 data 4Bh ; real ptr 1
004C 136 rlpt2 data 4Ch ; real ptr 2
004D 137 impt1 data 4Dh ; imag ptr 1
004E 138 impt2 data 4Eh ; imag ptr 2
004F 139 sinpt data 4Fh ; sine table ptr
140
141
4000 142 cseg at codeseg
4000 143 start:
4000 024211 144 jmp main
145 ;
146 ; bit reverse r1 to r0
4003 7B08 147 bitrev: mov r3,#8
4005 E9 148 mov a,r1
4006 13 149 brv1: rrc a
4007 C8 150 xch a,r0
4008 33 151 rlc a
4009 C8 152 xch a,r0
400A DBFA 153 djnz r3,brv1
400C 22 154 ret
155 ;
156 ;
=1 157 $include(wave.asm) ; create test data
=1 158 ; divide by r7 shifts value in dptr
400D C3 =1 159 bdiv: clr c
400E E583 =1 160 mov a,dph
4010 13 =1 161 rrc a
4011 F583 =1 162 mov dph,a
4013 E582 =1 163 mov a,dpl
4015 13 =1 164 rrc a
4016 F582 =1 165 mov dpl,a
4018 DFF3 =1 166 djnz r7,bdiv
401A 22 =1 167 ret
=1 168 ;
401B =1 169 wave:
=1 170 ; initialize input data to center line
401B 905200 =1 171 mov dptr,#inpd
401E 7B00 =1 172 mov r3,#0
FFT PAGE 2
4020 7400 =1 173 clrid: mov a,#0
4022 F0 =1 174 movx @dptr,a
4023 A3 =1 175 inc dptr
4024 DBFA =1 176 djnz r3,clrid
=1 177
4026 75480A =1 178 mov radix,#10
4029 754905 =1 179 mov radsiz,#5
402C 120112 =1 180 call ilprt
402F 46726571 =1 181 db 'Frequency: ',0
4033 75656E63
4037 793A2000
403B 120130 =1 182 call getln
403E 7942 =1 183 mov r1,#42h ; result
4040 7830 =1 184 mov r0,#30h ; buffer
4042 120145 =1 185 call getrad
4045 E542 =1 186 mov a,42h
4047 F582 =1 187 mov dpl,a ; lo freq
4049 E543 =1 188 mov a,43h
404B F583 =1 189 mov dph,a ; hi freq
404D 12011B =1 190 call prtaddr
=1 191
=1 192 ; number of steps there will be in 256 samples
4050 7F06 =1 193 mov r7,#6
4052 110D =1 194 call bdiv
4054 C0E0 =1 195 push acc ; save steps
=1 196
=1 197 ; number of cycles that can fit in 256 samples
4056 7E00 =1 198 mov r6,#low 256
4058 7F01 =1 199 mov r7,#high 256
405A FB =1 200 mov r3,a
405B 120127 =1 201 call dvide8
405E EE =1 202 mov a,r6 ; get quotient
405F FD =1 203 mov r5,a ; save number of cycles
=1 204 ;
4060 D0E0 =1 205 pop acc
4062 FC =1 206 mov r4,a ; get steps
4063 120115 =1 207 call prtrad
4066 7420 =1 208 mov a,#' '
4068 12010C =1 209 call sndchr
406B ED =1 210 mov a,r5 ; show cycles
406C 120115 =1 211 call prtrad
406F 12012D =1 212 call crlf
=1 213 ;
4072 754903 =1 214 mov radsiz,#3
4075 C004 =1 215 push 4
4077 C005 =1 216 push 5
4079 120112 =1 217 doover: call ilprt
407C 30292043 =1 218 db '0) Centerline',cr,lf
4080 656E7465
4084 726C696E
4088 650D0A
408B 31292053 =1 219 db '1) Sine wave',cr,lf
408F 696E6520
4093 77617665
4097 0D0A
4099 32292053 =1 220 db '2) Square wave',cr,lf
409D 71756172
40A1 65207761
FFT PAGE 3
40A5 76650D0A
40A9 0D0A =1 221 db cr,lf
40AB 53656C65 =1 222 db 'Select: ',0
40AF 63743A20
40B3 00
40B4 120109 =1 223 call getchr
40B7 C0E0 =1 224 push acc
40B9 12010C =1 225 call sndchr
40BC 12012D =1 226 call crlf
40BF D0E0 =1 227 pop acc
40C1 D005 =1 228 pop 5
40C3 D004 =1 229 pop 4
40C5 C3 =1 230 clr c
40C6 9430 =1 231 subb a,#'0'
40C8 B40001 =1 232 cjne a,#0,notctr
40CB 22 =1 233 ret
40CC B40203 =1 234 notctr: cjne a,#2,notsqr
40CF 02412A =1 235 jmp dosqr
40D2 B40103 =1 236 notsqr: cjne a,#1,notsin
40D5 0240FD =1 237 jmp dosin
40D8 120112 =1 238 notsin: call ilprt
40DB 496E7661 =1 239 db 'Invalid selection, try again.',cr,lf,0
40DF 6C696420
40E3 73656C65
40E7 6374696F
40EB 6E2C2074
40EF 72792061
40F3 6761696E
40F7 2E0D0A00
40FB 0179 =1 240 jmp doover
=1 241
=1 242 ; sine wave
40FD 120112 =1 243 Dosin: call ilprt
4100 43726561 =1 244 db 'Creating sine wave.',cr,lf,0
4104 74696E67
4108 2073696E
410C 65207761
4110 76652E0D
4114 0A00
=1 245
4116 905200 =1 246 mov dptr,#inpd
4119 75A051 =1 247 mov p2,#high stadr
411C 7800 =1 248 mov r0,#0
411E E2 =1 249 sinw2: movx a,@r0 ; get sine data from table
=1 250 ; mov c,acc.7
=1 251 ; rrc a ; arithmetic divide by 2
411F F0 =1 252 movx @dptr,a
4120 E8 =1 253 mov a,r0
4121 2D =1 254 add a,r5 ; next sine cell
4122 F8 =1 255 mov r0,a
4123 0582 =1 256 inc dpl
4125 E582 =1 257 mov a,dpl
4127 70F5 =1 258 jnz sinw2
4129 22 =1 259 ret
=1 260 ;
=1 261 ; square wave
412A 120112 =1 262 Dosqr: call ilprt
412D 43726561 =1 263 db 'Creating square wave.',cr,lf,0
FFT PAGE 4
4131 74696E67
4135 20737175
4139 61726520
413D 77617665
4141 2E0D0A00
=1 264
4145 905200 =1 265 mov dptr,#inpd
4148 EC =1 266 sqrw: mov a,r4
4149 C3 =1 267 clr c
414A 13 =1 268 rrc a
414B FC =1 269 mov r4,a ; half steps
414C 12415B =1 270 sqrw2: call locyc
414F 124157 =1 271 call hicyc
4152 E582 =1 272 mov a,dpl
4154 70F6 =1 273 jnz sqrw2 ; do cycles till end of buffer
4156 22 =1 274 ret
=1 275
=1 276 ;arc equ 117
0028 =1 277 arc equ 40
0080 =1 278 mid equ 128
=1 279
4157 74A8 =1 280 hicyc: mov a,#mid+arc
4159 8002 =1 281 sjmp hilo
415B 7458 =1 282 locyc: mov a,#mid-arc
415D AB04 =1 283 hilo: mov r3,4 ; half steps
415F F8 =1 284 mov r0,a
4160 E8 =1 285 wave3: mov a,r0
4161 F0 =1 286 movx @dptr,a
4162 0582 =1 287 inc dpl
4164 E582 =1 288 mov a,dpl
4166 6002 =1 289 jz wave4
4168 DBF6 =1 290 djnz r3,wave3 ; do half steps
416A 22 =1 291 wave4: ret
292 ;
=1 293 $include(power.asm) ; power spectrum
=1 294 ; power calculation
=1 295 ; p = sqrt( (real * real) + (imag * imag) )
=1 296 ;
416B 120112 =1 297 power: call ilprt
416E 506F7765 =1 298 db 'Power calculation',cr,lf,0
4172 72206361
4176 6C63756C
417A 6174696F
417E 6E0D0A00
=1 299
4182 905300 =1 300 mov dptr,#real
4185 797F =1 301 mov r1,#low pabuf ; 'E'
4187 E0 =1 302 pwr1: movx a,@dptr ; get (HL)
4188 F8 =1 303 mov r0,a ; 'C' index into square table
4189 75A050 =1 304 mov p2,#high sqadr ; 'B'
418C E2 =1 305 movx a,@r0 ; get (BC)
418D 75A055 =1 306 mov p2,#high pabuf ; 'D'
4190 F3 =1 307 movx @r1,a ; put (DE)
4191 09 =1 308 inc r1
4192 A3 =1 309 inc dptr
4193 E9 =1 310 mov a,r1
4194 70F1 =1 311 jnz pwr1
=1 312 ;
FFT PAGE 5
4196 905400 =1 313 mov dptr,#imag
4199 797F =1 314 mov r1,#low pabuf
419B E0 =1 315 pwr2: movx a,@dptr ; get (HL)
419C F8 =1 316 mov r0,a
419D 75A050 =1 317 mov p2,#high sqadr
41A0 E2 =1 318 movx a,@r0 ; get (BC)
41A1 FA =1 319 mov r2,a
41A2 75A055 =1 320 mov p2,#high pabuf
41A5 E3 =1 321 movx a,@r1 ; get (DE)
41A6 2A =1 322 add a,r2
41A7 5002 =1 323 jnc pwr3
41A9 74FF =1 324 mov a,#-1
41AB F3 =1 325 pwr3: movx @r1,a ; put (DE)
41AC 09 =1 326 inc r1
41AD A3 =1 327 inc dptr
41AE E9 =1 328 mov a,r1
41AF 70EA =1 329 jnz pwr2
41B1 12012D =1 330 call crlf
41B4 22 =1 331 ret
332 ;
333 ;$include(reorder.asm)
334 ;
=1 335 $include(scale.asm)
=1 336 ; Scale over-range data
=1 337 ; Scale real and imag if -52 > any data >= 52
=1 338
41B5 75A053 =1 339 scale: mov p2,#high real
41B8 7800 =1 340 mov r0,#low real
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -