home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / falcon / m_analyz / source / dsp.asm < prev    next >
Assembly Source File  |  1995-01-03  |  24KB  |  978 lines

  1. ;                   Music Analyzer
  2. ;               by Roel van de Kraats
  3. ;                       1995
  4. ;                   DSP Program
  5.  
  6. ;tabsize=8
  7.  
  8. I_SSIRD     equ    $000C
  9. I_SSIRDE    equ    $000E
  10.  
  11. M_BCR        equ    $FFFE
  12. M_PBC        equ    $FFE0
  13. M_PCC        equ    $FFE1
  14. HCR        equ    $FFE8
  15. HSR        equ    $FFE9
  16. HRX        equ    $FFEB
  17. HTX        equ    $FFEB
  18.  
  19. M_RX        equ    $FFEF
  20. M_CRA        equ    $FFEC
  21. M_CRB        equ    $FFED
  22. M_SR        equ    $FFEE
  23. M_IPR        equ    $FFFF
  24. M_UU        equ    $FFEA    ;unused memory
  25.  
  26. VMAIN        equ    $0040
  27. POINTS        equ    $400
  28.  
  29. maxncoef    equ    80
  30. ncoef2K     equ    80
  31. ncoef500    equ    80
  32. ncoef125    equ    80
  33. ncoef30     equ    64
  34. ncoef48     equ    48
  35. ncoef78     equ    32
  36. ncoef126    equ    70
  37. ncoef202    equ    48
  38. ncoef328    equ    32
  39. ncoef528    equ    64
  40. ncoef852    equ    48
  41. ncoef1K4    equ    32
  42. ncoef2K2    equ    80
  43. ncoef3K6    equ    64
  44. ncoef5K8    equ    50
  45. ncoef9K3    equ    32
  46. ncoef15K    equ    25
  47.  
  48.         ORG    X:0
  49. states        dsm    maxncoef
  50. LeftBuf     dsm    POINTS*4
  51. RightBuf    dsm    POINTS*4
  52.  
  53.         ORG    Y:0
  54.  
  55. ;coefficients for fir filter, made using the routines of 'firdemo'
  56.  
  57. coef2K
  58. ;Lowpass Filter, upper frequency: 2000 Hz.
  59. ;Sample frequency: 32780 Hz.
  60. ;80 coefficients
  61. ;Using Bartlett Windowing
  62.         dc $113994,$109896,$0f3253,$0d2894,$0aa9f6,$07ecf0,$052a38,$029722,$0060a5,$fea77d
  63.         dc $fd7dd3,$fce68f,$fcd659,$fd360e,$fde646,$fec37c,$ffaa55,$007b78,$011ea1,$018494
  64.         dc $01a7d6,$018c30,$013d1c,$00cb6f,$004a9c,$ffcde3,$ff65d7,$ff1e76,$fefe10,$ff0503
  65.         dc $ff2e49,$ff70ad,$ffc077,$001140,$0057b3,$008b03,$00a5e2,$00a6ea,$00906e,$0067d2
  66.         dc $003480,$fffeb0,$ffce30,$ffa951,$ff942a,$ff9036,$ff9c60,$ffb560,$ffd66f,$fffa13
  67.         dc $001afd,$0034c4,$004476,$0048dd,$004284,$003377,$001ecb,$000817,$fff2db,$ffe1fc
  68.         dc $ffd769,$ffd3eb,$ffd724,$ffdfbf,$ffebc3,$fff8ee,$00051f,$000ea1,$00146c,$001633
  69.         dc $00145d,$000fdd,$0009f5,$0003ef,$fffee8,$fffb99,$fffa43,$fffab2,$fffc52,$fffe5a
  70. coef500
  71. ;Lowpass Filter, upper frequency: 500 Hz.
  72. ;Sample frequency: 8195 Hz.
  73. ;80 coefficients
  74. ;Using Bartlett Windowing
  75.         dc $113994,$109896,$0f3253,$0d2894,$0aa9f6,$07ecf0,$052a38,$029722,$0060a5,$fea77d
  76.         dc $fd7dd3,$fce68f,$fcd659,$fd360e,$fde646,$fec37c,$ffaa55,$007b78,$011ea1,$018494
  77.         dc $01a7d6,$018c30,$013d1c,$00cb6f,$004a9c,$ffcde3,$ff65d7,$ff1e76,$fefe10,$ff0503
  78.         dc $ff2e49,$ff70ad,$ffc077,$001140,$0057b3,$008b03,$00a5e2,$00a6ea,$00906e,$0067d2
  79.         dc $003480,$fffeb0,$ffce30,$ffa951,$ff942a,$ff9036,$ff9c60,$ffb560,$ffd66f,$fffa13
  80.         dc $001afd,$0034c4,$004476,$0048dd,$004284,$003377,$001ecb,$000817,$fff2db,$ffe1fc
  81.         dc $ffd769,$ffd3eb,$ffd724,$ffdfbf,$ffebc3,$fff8ee,$00051f,$000ea1,$00146c,$001633
  82.         dc $00145d,$000fdd,$0009f5,$0003ef,$fffee8,$fffb99,$fffa43,$fffab2,$fffc52,$fffe5a
  83. coef9K3
  84. ;Bandpass Filter, lower frequency: 9000 Hz. upper frequency: 10000 Hz.
  85. ;Sample frequency: 32780 Hz.
  86. ;32 coefficients
  87. ;Using Bartlett Windowing
  88.         dc $0f1766,$fc62f6,$f3a95c,$0932de,$06f486,$f45ee8,$ff3076,$0abfa4,$fbba42,$f89379
  89.         dc $071aae,$031b27,$f89647,$00bfeb,$05c40b,$fcd4cb,$fccb48,$03e246,$00c9b7,$fcbd94
  90.         dc $00cb98,$01ff76,$fea267,$ff3729,$012cea,$00071c,$ff545f,$0037a4,$003bcc,$ffd9e2
  91.         dc $fff86c,$0006dd
  92. coef3K6
  93. ;Bandpass Filter, lower frequency: 3500 Hz. upper frequency: 3800 Hz.
  94. ;Sample frequency: 32780 Hz.
  95. ;64 coefficients
  96. ;Using Bartlett Windowing
  97.         dc $06ada8,$05076b,$011a95,$fccbf5,$fa1df1,$fa401a,$fd091f,$011628,$047b2c,$05acc3
  98.         dc $04341f,$00db42,$fd422a,$fb14cb,$fb440c,$fd9e5a,$00f3e5,$03af4d,$049645,$035694
  99.         dc $00a051,$fdc6e9,$fc1b62,$fc50ae,$fe31fd,$00c8a3,$02d9a8,$037b59,$027bfb,$006cb6
  100.         dc $fe518f,$fd21a4,$fd5633,$febbf8,$0097cc,$02075d,$026c7f,$01b05a,$004260,$fed93f
  101.         dc $fe1851,$fe4648,$ff35a3,$006550,$0144d2,$01787e,$00fdd0,$002234,$ff5584,$fef1ed
  102.         dc $ff14f2,$ff9a10,$003552,$009cde,$00ab79,$006c11,$000c0f,$ffbeeb,$ffa39d,$ffb939
  103.         dc $ffe641,$000bca,$001817,$000e43
  104.  
  105.  
  106.         ORG    Y:2048
  107. buf        dsm    POINTS
  108.  
  109. leftbuffaddr    ds    1
  110. rightbuffaddr    ds    1
  111. leftspec    ds    14
  112. rightspec    ds    14
  113.  
  114. coef125
  115. ;Lowpass Filter, upper frequency: 125 Hz.
  116. ;Sample frequency: 2049 Hz.
  117. ;80 coefficients
  118. ;Using Bartlett Windowing
  119.         dc $113932,$10983d,$0f3215,$0d287c,$0aaa09,$07ed2e,$052a99,$029799,$006122,$fea7ef
  120.         dc $fd7e2a,$fce6c0,$fcd65f,$fd35e9,$fde5fc,$fec319,$ffa9e8,$007b10,$011e4d,$01845e
  121.         dc $01a7c7,$018c48,$013d55,$00cbc1,$004afb,$ffce40,$ff6625,$ff1eab,$fefe25,$ff04f6
  122.         dc $ff2e1d,$ff706a,$ffc028,$0010f0,$00576d,$008ad1,$00a5cb,$00a6ef,$00908d,$006806
  123.         dc $0034c0,$fffef4,$ffce6c,$ffa97e,$ff9442,$ff9037,$ff9c4a,$ffb539,$ffd63d,$fff9de
  124.         dc $001acc,$00349f,$004460,$0048d9,$004291,$003392,$001eef,$00083f,$fff2ff,$ffe219
  125.         dc $ffd77b,$ffd3f0,$ffd71d,$ffdfaf,$ffebac,$fff8d5,$000507,$000e8e,$001460,$00162e
  126.         dc $00145f,$000fe5,$0009ff,$0003fb,$fffef2,$fffba0,$fffa47,$fffab3,$fffc51,$fffe5a
  127. coef15K
  128. ;Bandpass Filter, lower frequency: 14000 Hz. upper frequency: 15000 Hz.
  129. ;Sample frequency: 32780 Hz.
  130. ;25 coefficients
  131. ;Using Bartlett Windowing
  132.         dc $116a0c,$f0642d,$0bec60,$f8f799,$01bb9d,$033187,$f8e729,$098d40,$f599cd,$09be93
  133.         dc $f8177f,$05592f,$fd6eff,$0004ae,$01f4bf,$fcd3ca,$039c5b,$fc9cac,$02b6e3,$fe2a22
  134.         dc $00fa2d,$ffb1e3,$ffe6c9,$003c03,$ffd4f0
  135. coef5K8
  136. ;Bandpass Filter, lower frequency: 5500 Hz. upper frequency: 6000 Hz.
  137. ;Sample frequency: 32780 Hz.
  138. ;50 coefficients
  139. ;Using Bartlett Windowing
  140.         dc $0909fd,$03ffe5,$fadf01,$f7a5b8,$fd8707,$05c550,$076c36,$010e84,$f9eaf6,$f9ad27
  141.         dc $002e16,$061461,$0522a3,$fecffd,$fa335e,$fc1040,$01efa8,$054b1f,$02cc89,$fd9530
  142.         dc $fb602f,$fe37bb,$02a467,$03dbdf,$00ee2e,$fd5c37,$fcefdd,$ffbb12,$0273c0,$024bcd
  143.         dc $ffce83,$fddebc,$fe64b4,$007773,$01ba28,$010782,$ff6cfb,$feb436,$ff6a9f,$008cfd
  144.         dc $00e1ec,$0045e8,$ff903d,$ff7a3a,$ffe97e,$004628,$003d6f,$0001b3,$ffe5ba,$fff463
  145. coef2K2
  146. ;Bandpass Filter, lower frequency: 2100 Hz. upper frequency: 2300 Hz.
  147. ;Sample frequency: 32780 Hz.
  148. ;80 coefficients
  149. ;Using Bartlett Windowing
  150.         dc $053fa9,$04ba8e,$0366e8,$01850b,$ff6c73,$fd7be0,$fc088c,$fb4f87,$fb6bb1,$fc51fb
  151.         dc $fdd46b,$ffab30,$0181f1,$0306f5,$03f954,$0433ca,$03b258,$0291de,$0109ef,$ff6234
  152.         dc $fde54e,$fcd3b1,$fc58be,$fc83f2,$fd4745,$fe7abe,$ffe47e,$014394,$025ba6,$02ff50
  153.         dc $031771,$02a63c,$01c5b2,$00a202,$ff70ee,$fe67ec,$fdb2cb,$fd6c81,$fd9b4b,$fe30ab
  154.         dc $ff0d0a,$000637,$00ef66,$01a137,$020050,$02017c,$01aaa3,$0110ac,$0052da,$ff9492
  155.         dc $fef6d3,$fe9282,$fe749a,$fe9cb4,$fefe1f,$ff8318,$001163,$008f65,$00e8ad,$011135
  156.         dc $0106d4,$00d0b2,$007d1e,$001e32,$ffc617,$ff839f,$ff5fd7,$ff5cf3,$ff76ac,$ffa3d9
  157.         dc $ffd8dd,$000a4b,$002f37,$0042c6,$0044ab,$00389e,$0024f4,$0010c9,$00021f,$fffc72
  158. coef1K4
  159. ;Bandpass Filter, lower frequency: 1350 Hz. upper frequency: 1450 Hz.
  160. ;Sample frequency: 8195 Hz.
  161. ;32 coefficients
  162. ;Using Bartlett Windowing
  163.         dc $0c683a,$05bbcd,$f9abbb,$f4d0c0,$fb9a2f,$0655a4,$09de75,$033227,$f9deaa,$f78005
  164.         dc $fdd8e6,$05bbcd,$071dfb,$014941,$fad4fe,$fa3db9,$ff6497,$047631,$047608,$001e83
  165.         dc $fc5a73,$fcbe95,$002e50,$02c1ee,$022b61,$ffb256,$fe2b88,$fec69a,$0043ba,$00e642
  166.         dc $006f5b,$ffe9f5
  167. coef852
  168. ;Bandpass Filter, lower frequency: 840 Hz. upper frequency: 870 Hz.
  169. ;Sample frequency: 8195 Hz.
  170. ;48 coefficients
  171. ;Using Bartlett Windowing
  172.         dc $082e8a,$0659c2,$020372,$fd0b0e,$f97dda,$f8be04,$faf930,$ff239d,$037400,$062779
  173.         dc $06399e,$03c599,$ffec7e,$fc5182,$fa67b3,$fadce8,$fd5dd3,$00c6f0,$03a815,$04dfa8
  174.         dc $040c05,$01a6e4,$fec4cb,$fc9928,$fbf64c,$fcfe98,$ff23f8,$017048,$02f2f6,$032347
  175.         dc $020f3a,$004792,$fe974a,$fda9aa,$fdc6a1,$fec00d,$001303,$012972,$019c33,$01589e
  176.         dc $009c32,$ffcd36,$ff4664,$ff2f62,$ff732d,$ffd590,$00195d,$002227
  177. coef528
  178. ;Bandpass Filter, lower frequency: 510 Hz. upper frequency: 545 Hz.
  179. ;Sample frequency: 8195 Hz.
  180. ;64 coefficients
  181. ;Using Bartlett Windowing
  182.         dc $064086,$05a85d,$042e34,$0215a6,$ffb998,$fd7cd7,$fbb9e6,$fab4b3,$fa9064,$fb4ac9
  183.         dc $fcbe06,$fea7f5,$00b5d0,$029234,$03f2f5,$04a4b5,$04923d,$03c6bf,$026aaa,$00bbf0
  184.         dc $ff030f,$fd86e9,$fc815a,$fc1672,$fc4fa4,$fd1b82,$fe51e3,$ffbb88,$011bdc,$023b18
  185.         dc $02ef11,$032159,$02d1c9,$02153d,$0110ea,$fff346,$feebd2,$fe2339,$fdb513,$fdac35
  186.         dc $fe021b,$fea139,$ff69b8,$00378f,$00e8ee,$0163c1,$019977,$01887f,$013b5b,$00c5b1
  187.         dc $003ff1,$ffc28e,$ff6196,$ff2987,$ff1dd9,$ff3957,$ff7020,$ffb2c9,$fff1e3,$002136
  188.         dc $003a02,$003be9,$002c5f,$0014d1
  189. coef328
  190. ;Bandpass Filter, lower frequency: 320 Hz. upper frequency: 340 Hz.
  191. ;Sample frequency: 2049 Hz.
  192. ;32 coefficients
  193. ;Using Bartlett Windowing
  194.         dc $0c45a9,$064d78,$faf791,$f4f4c8,$f964ba,$0382a2,$09b19e,$06a04e,$fdd227,$f7b9d6
  195.         dc $f99e5b,$0111a4,$06d634,$05e687,$ffccc8,$fa915f,$fac7fd,$ff9554,$041b67,$046096
  196.         dc $00c7c7,$fd18db,$fc944b,$ff19ba,$01dac9,$02655e,$00ca92,$ff02be,$fea66a,$ff84e5
  197.         dc $005352,$0053f5
  198. coef202
  199. ;Bandpass Filter, lower frequency: 195 Hz. upper frequency: 210 Hz.
  200. ;Sample frequency: 2049 Hz.
  201. ;48 coefficients
  202. ;Using Bartlett Windowing
  203.         dc $0851dd,$06a006,$029303,$fdc180,$f9f923,$f8917d,$f9f256,$fd7846,$01bdab,$052826
  204.         dc $0682cb,$056b00,$0269c8,$feb45f,$fbb074,$fa6d54,$fb44f2,$fdc5cd,$00e9b7,$038049
  205.         dc $04a21b,$040120,$01fa72,$ff6733,$fd42c2,$fc4b0a,$fcbf50,$fe539a,$005942,$0208e7
  206.         dc $02cef0,$027d5a,$01524c,$ffd502,$fe9ab0,$fe0c82,$fe453f,$ff1152,$000d6e,$00d410
  207.         dc $0125c7,$00fc7e,$008455,$00006e,$ffa9c2,$ff976a,$ffb9f5,$ffe9ca
  208. coef126
  209. ;Bandpass Filter, lower frequency: 120 Hz. upper frequency: 134 Hz.
  210. ;Sample frequency: 2049 Hz.
  211. ;70 coefficients
  212. ;Using Bartlett Windowing
  213.         dc $05fadc,$0573e4,$04220f,$023d89,$0012ca,$fdf67b,$fc3885,$fb1832,$fabb35,$fb28d1
  214.         dc $fc49c3,$fdeccc,$ffcef8,$01a650,$032d3a,$042cc1,$04844c,$042da6,$033ce4,$01dc4a
  215.         dc $004509,$feb602,$fd6a0d,$fc8f50,$fc40db,$fc837b,$fd460c,$fe6521,$ffb145,$00f6c2
  216.         dc $0205a8,$02b8d8,$02fb0c,$02c929,$0231b1,$015182,$004e9c,$ff51c5,$fe802a,$fdf5f1
  217.         dc $fdc284,$fde716,$fe5776,$fefce1,$ffba51,$00716c,$010758,$01689b,$018b85,$0170e5
  218.         dc $0122f3,$00b2e0,$00356d,$ffbf44,$ff61a3,$ff27ea,$ff165b,$ff2a2c,$ff5ac7,$ff9bf1
  219.         dc $ffe054,$001bfd,$004658,$005b56,$005ba3,$004be8,$00335b,$0019f1,$00068b,$fffd8b
  220. coef78
  221. ;Bandpass Filter, lower frequency: 73 Hz. upper frequency: 85 Hz.
  222. ;Sample frequency: 512 Hz.
  223. ;32 coefficients
  224. ;Using Bartlett Windowing
  225.         dc $0dc1ff,$07887f,$fb5ff7,$f3f7c1,$f73572,$0186f5,$09a9bb,$09013d,$00f432,$f8f9b8
  226.         dc $f7af90,$fd5fa9,$047b33,$06f8f4,$0371e9,$fdabd0,$fab58a,$fc7fa6,$00c0ce,$039428
  227.         dc $02fd91,$003000,$fde902,$fdd697,$ff7224,$00fc0e,$0143e8,$007f6d,$ffaf7b,$ff7f04
  228.         dc $ffc8cf,$000790
  229. coef48
  230. ;Bandpass Filter, lower frequency: 44 Hz. upper frequency: 54 Hz.
  231. ;Sample frequency: 512 Hz.
  232. ;48 coefficients
  233. ;Using Bartlett Windowing
  234.         dc $0a177b,$08249f,$0378ce,$fdd387,$f936da,$f72e7e,$f84a21,$fbf85f,$00caa6,$0503cd
  235.         dc $0739c9,$06cf5b,$041cbb,$003e37,$fca104,$fa7c70,$fa6959,$fc3ade,$ff20c0,$020070
  236.         dc $03dfc0,$043920,$031d63,$011c4a,$ff0299,$fd8a60,$fd1c03,$fdb4bc,$fef704,$005951
  237.         dc $015dc3,$01bd01,$01765b,$00c366,$fff84a,$ff6005,$ff22e1,$ff3f0d,$ff92cd,$fff0d1
  238.         dc $003477,$004ddf,$004289,$0024d8,$000849,$fff86f,$fff638,$fffb3e
  239. coef30
  240. ;Bandpass Filter, lower frequency: 20 Hz. upper frequency: 32 Hz.
  241. ;Sample frequency: 512 Hz.
  242. ;64 coefficients
  243. ;Using Bartlett Windowing
  244.         dc $09c0c5,$091b9a,$078fbe,$054f28,$029db2,$ffc8c8,$fd1e46,$fae3b1,$f94ec0,$f88021
  245.         dc $f880ed,$f94303,$faa413,$fc72d2,$fe75a2,$0071bb,$0231f9,$038c7f,$046692,$04b659
  246.         dc $04826e,$03df85,$02ec91,$01ce08,$00a8f7,$ff9e7d,$fec845,$fe364d,$fdee2a,$fdebb6
  247.         dc $fe22ea,$fe8286,$fef716,$ff6dd5,$ffd723,$002827,$005b93,$00717a,$006e67,$0059e7
  248.         dc $003cd4,$001fa8,$000925,$fffd6d,$fffdb0,$000861,$0019e6,$002d85,$003e71,$0048ba
  249.         dc $0049fc,$0041b3,$003135,$001b4a,$000391,$ffedc5,$ffdd09,$ffd35e,$ffd159,$ffd61f
  250.         dc $ffdfa8,$ffeb37,$fff5ee,$fffd5e
  251.  
  252.         ORG    P:0
  253.         jmp    VMAIN
  254.  
  255.         ORG    P:I_SSIRD
  256.         jsr    Receive
  257.  
  258.         ORG    P:I_SSIRDE
  259.         jsr    RecErr
  260.  
  261.         ORG    P:VMAIN
  262.         jmp    DoMain
  263.  
  264. RecErr        movep    x:M_SR,x:M_UU
  265.         rti
  266. Receive
  267.         jclr    #3,X:M_SR,RecRight
  268.         movep    x:M_RX,x:(r0)+
  269.         rti
  270. RecRight
  271.         movep    x:M_RX,x:(r1)+
  272.         rti
  273.  
  274. ;#ncoef-1 in n5
  275. ;#coef in x1
  276. ;input in r6
  277. ;coef in r5
  278. do_spec:
  279.         move    n5,m3
  280.         move    #states,r3
  281.         ;rep    x1        ;using the repeat instruction gives
  282.                     ;problems with the SSI interrupt,
  283.                     ;because the rep instruction is not
  284.                     ;interruptable. this is a little slower,
  285.                     ;but at least it works
  286.         do    x1,rep_spec1_1
  287.         move    r7,x:(r3)+
  288. rep_spec1_1    move    r6,r2
  289.         move    r7,y1
  290.         move    #buf,r6
  291.         do    #POINTS/4,LoopSpec1_1
  292.         move    r5,r4
  293.         move    x:(r2)+,x0
  294.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  295.         ;rep    n5
  296.         do    n5,rep_spec1_2
  297.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  298. rep_spec1_2    macr    x0,y0,a     (r3)-
  299.         move    a,y:(r6)+
  300. LoopSpec1_1
  301.         move    #POINTS/16,n6
  302.         move    #buf,r6
  303.         nop
  304.         move    y:(r6)+n6,x0
  305.         do    #POINTS/16*3,LoopSpec1_2
  306.         move    y:(r6)+,a
  307.         abs    a
  308.         cmp    y1,a
  309.         jmi    Spec1NotMore
  310.         move    a,y1            ;get maximum value
  311. Spec1NotMore
  312.         nop
  313. LoopSpec1_2
  314.         rts
  315.  
  316. ;#ncoef-1 in n5
  317. ;#coef in x1
  318. ;input in r6
  319. ;coef in r5
  320. do_spec2:
  321.         move    n5,m3
  322.         move    #states,r3
  323.         ;rep    x1
  324.         do    x1,rep_spec2_1
  325.         move    r7,x:(r3)+
  326. rep_spec2_1    move    r6,r2
  327.         move    r7,y1
  328.         move    #buf,r6
  329.         move    #4,n2
  330.         do    #POINTS/8,LoopSpec2_1
  331.         move    r5,r4
  332.         move    x:(r2)+n2,x0
  333.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  334.         ;rep    n5
  335.         do    n5,rep_spec2_2
  336.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  337. rep_spec2_2    macr    x0,y0,a     (r3)-
  338.         move    a,y:(r6)+
  339. LoopSpec2_1
  340.         move    #POINTS/32,n6
  341.         move    #buf,r6
  342.         nop
  343.         move    y:(r6)+n6,x0
  344.         do    #POINTS/32*3,LoopSpec2_2
  345.         move    y:(r6)+,a
  346.         abs    a
  347.         cmp    y1,a
  348.         jmi    Spec2NotMore
  349.         move    a,y1
  350. Spec2NotMore
  351.         nop
  352. LoopSpec2_2
  353.         rts
  354.  
  355. ;#ncoef-1 in n5
  356. ;#coef in x1
  357. ;input in r6
  358. ;coef in r5
  359. do_spec3:
  360.         move    n5,m3
  361.         move    #states,r3
  362.         ;rep    x1
  363.         do    x1,rep_spec3_1
  364.         move    r7,x:(r3)+
  365. rep_spec3_1    move    r6,r2
  366.         move    r7,y1
  367.         move    #buf,r6
  368.         move    #16,n2
  369.         do    #POINTS/16,LoopSpec3_1
  370.         move    r5,r4
  371.         move    x:(r2)+n2,x0
  372.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  373.         ;rep    n5
  374.         do    n5,rep_spec3_2
  375.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  376. rep_spec3_2    macr    x0,y0,a     (r3)-
  377.         move    a,y:(r6)+
  378. LoopSpec3_1
  379.         move    #POINTS/64,n6
  380.         move    #buf,r6
  381.         nop
  382.         move    y:(r6)+n6,x0
  383.         do    #POINTS/64*3,LoopSpec3_2
  384.         move    y:(r6)+,a
  385.         abs    a
  386.         cmp    y1,a
  387.         jmi    Spec3NotMore
  388.         move    a,y1
  389. Spec3NotMore
  390.         nop
  391. LoopSpec3_2
  392.         rts
  393. ;#ncoef-1 in n5
  394. ;#coef in x1
  395. ;input in r6
  396. ;coef in r5
  397. do_spec4:
  398.         move    n5,m3
  399.         move    #states,r3
  400.         ;rep    x1
  401.         do    x1,rep_spec4_1
  402.         move    r7,x:(r3)+
  403. rep_spec4_1    move    r6,r2
  404.         move    r7,y1
  405.         move    #buf,r6
  406.         move    #64,n2
  407.         do    #POINTS/64,LoopSpec4_1
  408.         move    r5,r4
  409.         move    x:(r2)+n2,x0
  410.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  411.         ;rep    n5
  412.         do    n5,rep_spec4_2
  413.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  414. rep_spec4_2    macr    x0,y0,a     (r3)-
  415.         move    a,y:(r6)+
  416. LoopSpec4_1
  417.         move    #2,n6
  418.         move    #buf,r6
  419.         nop
  420.         move    y:(r6)+n6,x0
  421.         do    #POINTS/64-2,LoopSpec4_2
  422.         move    y:(r6)+,a
  423.         abs    a
  424.         cmp    y1,a
  425.         jmi    Spec4NotMore
  426.         move    a,y1
  427. Spec4NotMore
  428.         nop
  429. LoopSpec4_2
  430.         rts
  431.  
  432.  
  433. ;32780 Hz -> 8195 Hz
  434. low_pass1
  435.         ;left channel
  436.         move    #ncoef2K-1,m3
  437.         move    #states,r3
  438.     ;    rep    #ncoef2K
  439.         do    #ncoef2K,repl_lp1_1
  440.         move    r7,x:(r3)+
  441. repl_lp1_1
  442.         move    y:leftbuffaddr,r2
  443.         move    #.5,y1
  444.         move    #coef2K,r5
  445.         do    #POINTS,Loopl_lp1
  446.         move    r5,r4
  447.         move    x:(r2),x0
  448.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  449.     ;    rep    #ncoef2K-1
  450.         do    #ncoef2K-1,repl_lp1_2
  451.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  452. repl_lp1_2    mac    x0,y0,a     (r3)-
  453.         move    a,x0
  454.         macr    y1,x0,a
  455.         move    a,X:(r2)+
  456. Loopl_lp1
  457.  
  458.         ;right channel
  459.         move    #ncoef2K-1,m3
  460.         move    #states,r3
  461.     ;    rep    #ncoef2K
  462.         do    #ncoef2K,repr_lp1_1
  463.         move    r7,x:(r3)+
  464. repr_lp1_1
  465.         move    y:rightbuffaddr,r2
  466.         move    #.5,y1
  467.         move    #coef2K,r5
  468.         do    #POINTS,Loopr_lp1
  469.         move    r5,r4
  470.         move    x:(r2),x0
  471.         clr    a        x0,x:(r3)+    y:(r4)+,y0
  472.     ;    rep    #ncoef2K-1
  473.         do    #ncoef2K-1,repr_lp1_2
  474.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  475. repr_lp1_2    mac    x0,y0,a     (r3)-
  476.         move    a,x0
  477.         macr    y1,x0,a
  478.         move    a,X:(r2)+
  479. Loopr_lp1
  480.         rts
  481.  
  482.  
  483. ;8195 Hz -> 2049 Hz
  484. low_pass2
  485.         move    #ncoef500-1,m3
  486.         move    #states,r3
  487.         ;rep    #ncoef500
  488.         do    #ncoef500,repl_lp2_1
  489.         move    r7,x:(r3)+
  490. repl_lp2_1
  491.         move    y:leftbuffaddr,r2
  492.         move    #4,n2
  493.         move    #.5,y1
  494.         do    #POINTS/4,Loopl_lp2
  495.         move    #coef500,r4
  496.         move    x:(r2),x0
  497.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  498.         ;rep    #ncoef500-1
  499.         do    #ncoef500-1,repl_lp2_2
  500.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  501. repl_lp2_2    mac    x0,y0,a     (r3)-
  502.         move    a,x0
  503.         macr    y1,x0,a
  504.         move    a,X:(r2)+n2
  505. Loopl_lp2
  506.  
  507.  
  508.         move    #ncoef500-1,m3
  509.         move    #states,r3
  510.         ;rep    #ncoef500
  511.         do    #ncoef500,repr_lp2_1
  512.         move    r7,x:(r3)+
  513. repr_lp2_1
  514.         move    y:rightbuffaddr,r2
  515.         move    #4,n2
  516.         move    #.5,y1
  517.         do    #POINTS/4,Loopr_lp2
  518.         move    #coef500,r4
  519.         move    x:(r2),x0
  520.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  521.         ;rep    #ncoef500-1
  522.         do    #ncoef500-1,repr_lp2_2
  523.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  524. repr_lp2_2    mac    x0,y0,a     (r3)-
  525.         move    a,x0
  526.         macr    y1,x0,a
  527.         move    a,X:(r2)+n2
  528. Loopr_lp2
  529.         rts
  530.  
  531. ;2049 Hz -> 512 Hz
  532. low_pass3
  533.         move    #ncoef125-1,m3
  534.         move    #states,r3
  535.         ;rep    #ncoef125
  536.         do    #ncoef125,repl_lp3_1
  537.         move    r7,x:(r3)+
  538. repl_lp3_1
  539.         move    y:leftbuffaddr,r2
  540.         move    #16,n2
  541.         ;move    #.5,y1
  542.         do    #POINTS/16,Loopl_lp3
  543.         move    #coef125,r4
  544.         move    x:(r2),x0
  545.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  546.         ;rep    #ncoef125-1
  547.         do    #ncoef125-1,repl_lp3_2
  548.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  549. repl_lp3_2    mac    x0,y0,a     (r3)-
  550.         move    a,x0
  551.         ;macr    y1,x0,a
  552.         add    x0,a
  553.         move    a,x:(r2)+n2
  554. Loopl_lp3
  555.  
  556.  
  557.         move    #ncoef125-1,m3
  558.         move    #states,r3
  559.         ;rep    #ncoef125
  560.         do    #ncoef125,repr_lp3_1
  561.         move    r7,x:(r3)+
  562. repr_lp3_1
  563.         move    y:rightbuffaddr,r2
  564.         move    #16,n2
  565.         ;move    #.5,y1
  566.         do    #POINTS/16,Loopr_lp3
  567.         move    #coef125,r4
  568.         move    X:(R2),X0
  569.         clr    a        x0,x:(r3)+    y:(r4)+,y0    
  570.         ;rep    #ncoef125-1
  571.         do    #ncoef125-1,repr_lp3_2
  572.         mac    x0,y0,a     x:(r3)+,x0    y:(r4)+,y0
  573. repr_lp3_2    mac    x0,y0,a     (r3)-
  574.         move    a,x0
  575.         ;macr    y1,x0,a
  576.         add    x0,a
  577.         move    a,x:(r2)+n2
  578. Loopr_lp3
  579.         rts
  580.  
  581.  
  582.  
  583. DoMain        reset
  584.         ori    #$03,MR
  585.         move    #LeftBuf,r0
  586.         move    #RightBuf,r1
  587.         move    #POINTS*4-1,m0
  588.         move    m0,m1
  589.         move    m0,m2
  590.         move    m0,m3
  591.         move    #0,r7
  592.         move    #leftspec,r5
  593.         rep    #14
  594.         move    r7,y:(r5)+        ;clear spectrum
  595.         move    #rightspec,r5
  596.         rep    #14
  597.         move    r7,y:(r5)+
  598.         movep    #$1,x:M_PBC
  599.         movep    #$3000,x:M_IPR
  600.         movep    #$4100,x:M_CRA
  601.         movep    #$A800,x:M_CRB
  602.         movep    #$0000,x:M_PCC
  603.         movep    #$01F8,x:M_PCC
  604.         movep    x:M_SR,x:M_UU
  605.         movep    x:M_RX,x:M_SR
  606.         andi    #$FC,MR            ;enable interrupts
  607.  
  608. MainLoop
  609.         jclr    #0,x:<<HSR,*        ;wait for command
  610.         movep    x:<<HRX,a
  611.  
  612.         move    #$123456,x0
  613.         cmp    x0,a
  614.         jne    MainLoop
  615.  
  616.         ;get values for vu
  617.         move    r0,r2
  618.         move    r1,r3
  619.         move    #POINTS*3,n2
  620.         move    n2,n3
  621.         move    x:(r2)+n2,x0
  622.         move    x:(r3)+n3,x0
  623.         move    r7,x0
  624.         move    x0,x1
  625.         move    x0,y0
  626.         move    x0,y1
  627.         do    #POINTS,LoopMax
  628.         move    x:(r2)+,a
  629.         sub    y0,a
  630.         rep    #4
  631.         asr    a            ;kind of a lowpass filter
  632.         add    y0,a
  633.         move    a,y0
  634.         abs    a
  635.         cmp    x0,a
  636.         jmi    NotMoreL
  637.         move    a,x0            ;get maximum value
  638. NotMoreL    move    x:(r3)+,a
  639.         sub    y1,a
  640.         rep    #4
  641.         asr    a
  642.         add    y1,a
  643.         move    a,y1
  644.         abs    a
  645.         cmp    x1,a
  646.         jmi    NotMoreR
  647.         move    a,x1            ;for right channel too
  648. NotMoreR
  649.         nop
  650. LoopMax
  651.  
  652.         jclr    #1,x:<<HSR,*
  653.         movep    x0,x:<<HTX
  654.         jclr    #1,x:<<HSR,*
  655.         movep    x1,x:<<HTX
  656.  
  657.  
  658.  
  659.         ;send data for scope
  660.  
  661.         ;Full Range
  662.         move    #POINTS*3,n2
  663.         move    n2,n3
  664.         move    r0,r2
  665.         move    r1,r3
  666.         move    x:(r2)+n2,x0
  667.         move    x:(r3)+n3,x0
  668.         move    #4,n2
  669.         move    n2,n3
  670.  
  671.         do    #POINTS/4,LoopSendScL
  672.         move    x:(r2)+n2,a
  673.         asr    a
  674.         jclr    #1,x:<<HSR,*
  675.         movep    a,x:<<HTX
  676. LoopSendScL
  677.         do    #POINTS/4,LoopSendScR
  678.         move    x:(r3)+n3,a
  679.         asr    a
  680.         jclr    #1,x:<<HSR,*
  681.         movep    a,x:<<HTX
  682. LoopSendScR
  683.  
  684.         ;Small Range
  685.         move    #POINTS*3,n2
  686.         move    n2,n3
  687.         ;move    r0,r2
  688.         ;move    r1,r3
  689.         move    x:(r2)+n2,x0
  690.         move    x:(r3)+n3,x0
  691.  
  692.         do    #POINTS/4,LoopSendScL2
  693.         move    x:(r2)+,a
  694.         asr    a
  695.         jclr    #1,x:<<HSR,*
  696.         movep    a,x:<<HTX
  697. LoopSendScL2
  698.         do    #POINTS/4,LoopSendScR2
  699.         move    x:(r3)+,a
  700.         asr    a
  701.         jclr    #1,x:<<HSR,*
  702.         movep    a,x:<<HTX
  703. LoopSendScR2
  704.  
  705.         ;calculate values for spectrum
  706.  
  707.         move    r0,r2
  708.         move    #POINTS*3,n2
  709.         move    r1,r3
  710.         move    n2,n3
  711.         move    x:(r2)+n2,x0
  712.         move    x:(r3)+n3,x0
  713.         move    r2,y:leftbuffaddr
  714.         move    r3,y:rightbuffaddr
  715.  
  716.         move    #>ncoef15K,x1
  717.         move    #>ncoef15K-1,n5
  718.         move    y:leftbuffaddr,r6
  719.         move    #coef15K,r5
  720.         jsr    do_spec
  721.         move    y1,y:leftspec+13
  722.  
  723.         move    #>ncoef9K3,x1
  724.         move    #>ncoef9K3-1,n5
  725.         move    y:leftbuffaddr,r6
  726.         move    #coef9K3,r5
  727.         jsr    do_spec
  728.         move    y1,y:leftspec+12
  729.  
  730.         move    #>ncoef5K8,x1
  731.         move    #>ncoef5K8-1,n5
  732.         move    y:leftbuffaddr,r6
  733.         move    #coef5K8,r5
  734.         jsr    do_spec
  735.         move    y1,y:leftspec+11
  736.  
  737.         move    #>ncoef3K6,x1
  738.         move    #>ncoef3K6-1,n5
  739.         move    y:leftbuffaddr,r6
  740.         move    #coef3K6,r5
  741.         jsr    do_spec
  742.         move    y1,y:leftspec+10
  743.  
  744.         move    #>ncoef2K2,x1
  745.         move    #>ncoef2K2-1,n5
  746.         move    y:leftbuffaddr,r6
  747.         move    #coef2K2,r5
  748.         jsr    do_spec
  749.         move    y1,y:leftspec+9
  750.  
  751.  
  752.  
  753.  
  754.         move    #>ncoef15K,x1
  755.         move    #>ncoef15K-1,n5
  756.         move    y:rightbuffaddr,r6
  757.         move    #coef15K,r5
  758.         jsr    do_spec
  759.         move    y1,y:rightspec+13
  760.  
  761.         move    #>ncoef9K3,x1
  762.         move    #>ncoef9K3-1,n5
  763.         move    y:rightbuffaddr,r6
  764.         move    #coef9K3,r5
  765.         jsr    do_spec
  766.         move    y1,y:rightspec+12
  767.  
  768.         move    #>ncoef5K8,x1
  769.         move    #>ncoef5K8-1,n5
  770.         move    y:rightbuffaddr,r6
  771.         move    #coef5K8,r5
  772.         jsr    do_spec
  773.         move    y1,y:rightspec+11
  774.  
  775.         move    #>ncoef3K6,x1
  776.         move    #>ncoef3K6-1,n5
  777.         move    y:rightbuffaddr,r6
  778.         move    #coef3K6,r5
  779.         jsr    do_spec
  780.         move    y1,y:rightspec+10
  781.  
  782.         move    #>ncoef2K2,x1
  783.         move    #>ncoef2K2-1,n5
  784.         move    y:rightbuffaddr,r6
  785.         move    #coef2K2,r5
  786.         jsr    do_spec
  787.         move    y1,y:rightspec+9
  788.  
  789.  
  790.         jsr    low_pass1
  791.  
  792.  
  793.  
  794.         move    #>ncoef1K4,x1
  795.         move    #>ncoef1K4-1,n5
  796.         move    y:leftbuffaddr,r6
  797.         move    #coef1K4,r5
  798.         jsr    do_spec2
  799.         move    y1,y:leftspec+8
  800.  
  801.         move    #>ncoef852,x1
  802.         move    #>ncoef852-1,n5
  803.         move    y:leftbuffaddr,r6
  804.         move    #coef852,r5
  805.         jsr    do_spec2
  806.         move    y1,y:leftspec+7
  807.  
  808.         move    #>ncoef528,x1
  809.         move    #>ncoef528-1,n5
  810.         move    y:leftbuffaddr,r6
  811.         move    #coef528,r5
  812.         jsr    do_spec2
  813.         move    y1,y:leftspec+6
  814.  
  815.  
  816.  
  817.  
  818.         move    #>ncoef1K4,x1
  819.         move    #>ncoef1K4-1,n5
  820.         move    y:rightbuffaddr,r6
  821.         move    #coef1K4,r5
  822.         jsr    do_spec2
  823.         move    y1,y:rightspec+8
  824.  
  825.         move    #>ncoef852,x1
  826.         move    #>ncoef852-1,n5
  827.         move    y:rightbuffaddr,r6
  828.         move    #coef852,r5
  829.         jsr    do_spec2
  830.         move    y1,y:rightspec+7
  831.  
  832.         move    #>ncoef528,x1
  833.         move    #>ncoef528-1,n5
  834.         move    y:rightbuffaddr,r6
  835.         move    #coef528,r5
  836.         jsr    do_spec2
  837.         move    y1,y:rightspec+6
  838.  
  839.  
  840.         jsr    low_pass2
  841.  
  842.  
  843.  
  844.         move    #>ncoef328,x1
  845.         move    #>ncoef328-1,n5
  846.         move    y:leftbuffaddr,r6
  847.         move    #coef328,r5
  848.         jsr    do_spec3
  849.         move    y1,y:leftspec+5
  850.  
  851.         move    #>ncoef202,x1
  852.         move    #>ncoef202-1,n5
  853.         move    y:leftbuffaddr,r6
  854.         move    #coef202,r5
  855.         jsr    do_spec3
  856.         move    y1,y:leftspec+4
  857.  
  858.         move    #>ncoef126,x1
  859.         move    #>ncoef126-1,n5
  860.         move    y:leftbuffaddr,r6
  861.         move    #coef126,r5
  862.         jsr    do_spec3
  863.         move    y1,y:leftspec+3
  864.  
  865.  
  866.  
  867.  
  868.         move    #>ncoef328,x1
  869.         move    #>ncoef328-1,n5
  870.         move    y:rightbuffaddr,r6
  871.         move    #coef328,r5
  872.         jsr    do_spec3
  873.         move    y1,y:rightspec+5
  874.  
  875.         move    #>ncoef202,x1
  876.         move    #>ncoef202-1,n5
  877.         move    y:rightbuffaddr,r6
  878.         move    #coef202,r5
  879.         jsr    do_spec3
  880.         move    y1,y:rightspec+4
  881.  
  882.         move    #>ncoef126,x1
  883.         move    #>ncoef126-1,n5
  884.         move    y:rightbuffaddr,r6
  885.         move    #coef126,r5
  886.         jsr    do_spec3
  887.         move    y1,y:rightspec+3
  888.  
  889.  
  890.         jsr    low_pass3
  891.  
  892.  
  893.  
  894.         move    #>ncoef78,x1
  895.         move    #>ncoef78-1,n5
  896.         move    y:leftbuffaddr,r6
  897.         move    #coef78,r5
  898.         jsr    do_spec4
  899.         move    y1,y:leftspec+2
  900.  
  901.         move    #>ncoef48,x1
  902.         move    #>ncoef48-1,n5
  903.         move    y:leftbuffaddr,r6
  904.         move    #coef48,r5
  905.         jsr    do_spec4
  906.         move    y1,a
  907.         move    #.1,x1            ;pump it up a little
  908.         macr    y1,x1,a
  909.         move    a,y:leftspec+1
  910.  
  911.         move    #>ncoef30,x1
  912.         move    #>ncoef30-1,n5
  913.         move    y:leftbuffaddr,r6
  914.         move    #coef30,r5
  915.         jsr    do_spec4
  916.         move    y1,a
  917.         move    #.3,x1
  918.         macr    y1,x1,a
  919.         move    a,y:leftspec
  920.  
  921.  
  922.  
  923.         move    #>ncoef78,x1
  924.         move    #>ncoef78-1,n5
  925.         move    y:rightbuffaddr,r6
  926.         move    #coef78,r5
  927.         jsr    do_spec4
  928.         move    y1,y:rightspec+2
  929.  
  930.         move    #>ncoef48,x1
  931.         move    #>ncoef48-1,n5
  932.         move    y:rightbuffaddr,r6
  933.         move    #coef48,r5
  934.         jsr    do_spec4
  935.         move    y1,a
  936.         move    #.1,x1
  937.         macr    y1,x1,a
  938.         move    a,y:rightspec+1
  939.  
  940.         move    #>ncoef30,x1
  941.         move    #>ncoef30-1,n5
  942.         move    y:rightbuffaddr,r6
  943.         move    #coef30,r5
  944.         jsr    do_spec4
  945.         move    y1,a
  946.         move    #.3,x1
  947.         macr    y1,x1,a
  948.         move    a,y:rightspec
  949.  
  950.  
  951.  
  952.         move    m0,m3
  953.  
  954.         ;wait for command and send data for spectrum
  955.  
  956.         jclr    #0,x:<<HSR,*
  957.         movep    x:<<HRX,x0
  958.  
  959.         move    #leftspec,r5
  960.         do    #14,LoopSendBarsL
  961.         move    y:(r5)+,a
  962.         rep    #5
  963.         asr    a
  964.         jclr    #1,x:<<HSR,*
  965.         movep    a,x:<<HTX
  966. LoopSendBarsL
  967.  
  968.         move    #rightspec,r5
  969.         do    #14,LoopSendBarsR
  970.         move    y:(r5)+,a
  971.         rep    #5
  972.         asr    a
  973.         jclr    #1,x:<<HSR,*
  974.         movep    a,x:<<HTX
  975. LoopSendBarsR
  976.  
  977.         jmp    MainLoop
  978.