📄 box_car.asm
字号:
;=====================================================================================
; File name: BOX_CAR.ASM
;
; Originator: Digital Control Systems Group
; Texas Instruments
;
; Description: Averaging box car
;
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 9-15-2000 Release Rev 1.0
;================================================================================
; Applicability: F240,F241,C242,F243,F24xx. (Peripheral Independent).
;================================================================================
; Routine Name: bc_calc Type: C Callable
;
; C prototype : void bc_calc(struct BOXCAR *p);
;
; The struct object is defined in the header file "box_car.h" as follows:
;
; typedef struct { int BC_IN; /* Input: Box-Car input (Q15) */
; int BC_PTR; /* Variable: Box-car buffer pointer */
; int BC_BUFFER[64]; /* Variable: Box-car buffer (Q15) */
; int BC_OUT; /* Output: Box-car output (Q15) */
; int bc_scaler; /* Parameter: Box-car scaler (Q15) */
; int (*calc)(); /* Pointer to calculation function */
; } BOXCAR;
;
; Frame Usage Details:
; step | a | b | c | d
;____________|_____________|______________|______________|_____________
; AR0 | BC_PTR | | |
;
; NOTE: The AR0 here is keeping the buffer pointer value, BC_PTR, rather than the
; frame pointer address, FR0, as usual.
;
;================================================================================
.def _bc_calc
;================================================================================
BC_SIZE_ .set 64
; This BC_SIZE_ here is changed corresponding to the BC_SIZE in the header file
; of BOX_CAR.H. Then, the module library (e.g., clib_010.lib) must be rebuilt to take
; the effect.
;================================================================================
__bc_calc_framesize .set 0000h
;================================================================================
_bc_calc:
; Assume now ARP=AR1
POPD *+ ; Keep return address
SAR AR0,*+ ; Keep old frame pointer (FP)
SAR AR1,* ; Keep old stack pointer (SP)
LARK AR0,__bc_calc_framesize ; Load AR0 with frame size
LAR AR0,*0+,AR0 ; AR0->FP0 (new FP), ARP=AR0
;================================================================================
SBRK #3 ; ARP=AR0, AR0->FR0-3 (1st argument)
;----------------------------------------------------------------------------------
LAR AR2,* ; ARP=AR0, AR0->BC_IN, AR2->BC_IN
;----------------------------------------------------------------------------------
LAR AR3,* ; ARP=AR0, AR0->BC_IN, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
ADRK #3 ; ARP=AR0, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
MAR *,AR2 ; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
SETC SXM ; Turn sign extension mode on
; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
SETC OVM ; Set overflow mode
; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
SPM 0 ; Reset product mode
; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
ADRK #1 ; ARP=AR2, AR0->FR0, AR2->BC_PTR, AR3->BC_IN
;----------------------------------------------------------------------------------
LAR AR0,*+ ; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0], AR3->BC_IN
;----------------------------------------------------------------------------------
MAR *0+,AR2 ; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_IN
;----------------------------------------------------------------------------------
MAR *,AR3 ; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_IN
;----------------------------------------------------------------------------------
LACL *+,AR2 ; ACC = BC_IN (Q15)
; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR, ARP=AR2
;----------------------------------------------------------------------------------
SACL *,AR3 ; BC_BUFFER[BC_PTR] = BC_IN (Q15)
; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR, ARP=AR3
;----------------------------------------------------------------------------------
LACL * ; ACC = BC_PTR
; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
ADD #0001h ; ACC = BC_PTR + 1
; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
AND #003Fh ; ACC = BC_PTR + 1
; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
SACL * ; BC_PTR = BC_PTR + 1
; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
LACL #0000h ; ACC = 0 (Q15)
; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
MAR *,AR2 ; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
MAR *0-,AR2 ; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0], AR3->BC_PTR
;----------------------------------------------------------------------------------
RPT #(BC_SIZE_-1) ; Repeat next instruction 64 times (BC_SIZE_ = 64)
; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0], AR3->BC_PTR
;----------------------------------------------------------------------------------
ADD *+ ; ACC = sum of BC_BUFFER[0...63]
; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0...63], AR3->BC_PTR
;----------------------------------------------------------------------------------
; **** # of SFR's is log2(BC_SIZE_) ****
SFR ; ACC = sum of BC_BUFFER[0...63]/2
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SFR ; ACC = sum of BC_BUFFER[0...63]/4
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SFR ; ACC = sum of BC_BUFFER[0...63]/8
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SFR ; ACC = sum of BC_BUFFER[0...63]/16
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SFR ; ACC = sum of BC_BUFFER[0...63]/32
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SFR ; ACC = sum of BC_BUFFER[0...63]/64
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SACL * ; BC_OUT = sum of BC_BUFFER[0...63]/64
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
LT *+ ; TREG = BC_OUT (Q15)
; ARP=AR2, AR0=BC_PTR, AR2->bc_scaler, AR3->BC_PTR
;----------------------------------------------------------------------------------
MPY *- ; PREG = BC_OUT*bc_scaler (Q30)
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
PAC ; ACC = BC_OUT*bc_scaler (Q30)
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
SACH *,1,AR1 ; BC_OUT = BC_OUT*bc_scaler (Q31)
; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR, ARP=AR1
;----------------------------------------------------------------------------------
_bc_calc_exit:
;; MAR *,AR1 ; can be removed if this condition is met on
; every path to this code. (i.e., ARP=AR1 here)
CLRC OVM
CLRC SXM
SBRK #(__bc_calc_framesize +1)
LAR AR0,*-
PSHD *
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -