⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft.lst

📁 FFT asm version.A zip file of all the files is provided in FFT.ZIP
💻 LST
📖 第 1 页 / 共 4 页
字号:
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 + -