;------------------------------------------------------------------------
;
; FILE :10_bit_fir.src
; DATE :Thu, Oct 23, 2003
; DESCRIPTION :Main Program
; CPU TYPE :H8/3664F
;
; This file is generated by Hitachi Project Generator (Ver.2.1).
;
;------------------------------------------------------------------------
;サンプリング周波数は、実測で 5.3KHzになりました、訂正します。 m(__)m


ADDRA .equ H'FFB0
ADCSR .equ H'FFB8
ADF .bequ 7,ADCSR
ADST .bequ 5,ADCSR

PDRB .equ H'FFDD

PCR5 .equ H'FFE8
PDR5 .equ H'FFD8

PCR1 .equ H'FFE4
PCR2 .equ H'FFE5
PCR7 .equ H'FFEA
PCR8 .equ H'FFEB

fir .equ 61 ;fir_filterを変更する時は、係数の数を、ここで、変更する。



.export _main
_main:

mov.b #255,r0l
mov.b r0l,@PCR5 ;set mode output

mov.b r0l,@PCR1 ;空きI/Oポートの処理 Port1を出力に設定して置く。
mov.b r0l,@PCR8 ;Port8
mov.b #H'07,r0l
mov.b r0l,@PCR2 ;Port2
mov.b #H'70,r0l
mov.b r0l,@PCR7 ;Port7

mov.b #B'00000000,r0l
mov.b r0l,@ADCSR ;set AD MODE ,AN0=in, ADIE=no
bset ADST

loop: bsr to_da
bra loop


to_da:
btst ADST
beq kaishi
rts
kaishi:
mov.w @ADDRA,r1
sub.w #h'8e00,r1 ;中点、無入力の時の入力値を引く

shar.w r1
shar.w r1
shar.w r1
shar.w r1
shar.w r1
shar.w r1 ;10ビットフルで計算してみる

;----kakunou subroutine------
kakunou:
or.b r0l,r0l
bne kakunou_suru
mov.b #fir,r0l ;バッファ用カウンタ
mov.l #buffer_0,er2 ;er2=buffer_0 address+1
mov.l #buffer_1,er3 ;er3=buffer_1 address+1
kakunou_suru:
mov.w r1,@-er2 ;buffer_0に格納--- dataは16ビットに変更
mov.w r1,@-er3 ;buffer_1に格納
;プレデクリメントである事に注意!

dec.b r0l

;----fir_keisan subroutine------
fir_keisan:
push.w r0
push.w r2    ;er2、3は、どうせ、上位2バイトはゼロ
push.w r3
;er3は、プレデクリメントだから、
;kakunouした後の、er3は、そのままの位置でよい筈や。

mov.l #fir_data,er2 ;er2 = fir dataの始めaddress
;前準備
sub.l er5,er5 ;総和に使用する er5=0
mov.b #fir,r0l ;計算用カウンター

; fir 計算開始
mokkai:
mov.w @er3+,r4 ;r4=buffer data
mov.w @er2+,r6 ;r6=fir data

mulxs.w r6,er4

add.l er4,er5 ;総和=er5をとる

addx.b #0,r0h ;加算結果にオーバーフローがあれば、キャリーをr0hに保管する

dec.b r0l
bne mokkai

shar.l er5
shar.l er5
shar.l er5
shar.l er5
shar.l er5
shar.l er5
shar.l er5 ;Q7
shar.l er5 ;Q8
shar.l er5 ;Q9
shar.l er5 ;Q10
okuru:
add.l #127,er5

not.b r5l
mov.b r5l,@PDR5

pop.w r3
pop.w r2
pop.w r0

bset ADST
out:
rts
;----- data section ------------------------------------

.section mydata,data,align=2

init_buffer:

.DATAB.w fir, 0 ;data格納用バッファ1 
buffer_1:

.DATAB.w fir, 0 ;バッファ0
buffer_0:

fir_data:
; ----------------------------------------------------------
; 61 Q10 Band(1) Low:0.00000 High:0.10000 R= -103.3078
; Band(2) Low:0.20000 High:0.30000 R= 5.934998E-05
; Band(3) Low:0.40000 High:0.50000 R= -103.3078
;----------------------------------------------------------

.DATA.W 0,0,0,0 ; 4
.DATA.W 0,0,1,0 ; 8
.DATA.W -2,0,0,0 ; 12
.DATA.W 7,0,-6,0 ; 16
.DATA.W -12,0,26,0 ; 20
.DATA.W 2,0,-58,0 ; 24
.DATA.W 52,0,91,0 ; 28
.DATA.W -304,0,407,0 ; 32
.DATA.W -304,0,91,0 ; 36
.DATA.W 52,0,-58,0 ; 40
.DATA.W 2,0,26,0 ; 44
.DATA.W -12,0,-6,0 ; 48
.DATA.W 7,0,0,0 ; 52
.DATA.W -2,0,1,0 ; 56
.DATA.W 0,0,0,0 ; 60
.DATA.W 0 ; 61

   .end