📄 convol.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;****************************************************************
; Function: convol.asm
; Description: positive convolution of two vectors
;----------------------------------------------------------------
; Revision History:
; 1.00, Original Beta Release 6/98.
;****************************************************************
.mmregs
.global _convol
_convol
; Far-mode adjustment
.if __far_mode
OFFSET .set 2
.else
OFFSET .set 1
.endif
.if __far_mode
FRAME_SZ .set 0
.else
FRAME_SZ .set 0
.endif
REG_SAVE_SZ .set 3
PARAM_OFFSET .set OFFSET + REG_SAVE_SZ + FRAME_SZ
.asg 0 + FRAME_SZ, SAVE_AR1
.asg 0 + FRAME_SZ + REG_SAVE_SZ, RETURN_ADDR
.asg 0 + PARAM_OFFSET, h
.asg 1 + PARAM_OFFSET, r
.asg 2 + PARAM_OFFSET, nh
.asg 3 + PARAM_OFFSET, nr
.asg AR0, count
.asg AR1, h_save
.asg AR2, r_ptr
.asg AR3, x_ptr
.asg AR4, h_ptr
.asg AR5, x_save
PSHM AR1 ; 1 cycle
PSHM ST0 ; 1 cycle
PSHM ST1 ; 1 cycle
RSBX OVA ; 1 cycle
RSBX OVB ; 1 cycle
FRAME #-FRAME_SZ ; 1 cycle
SSBX SXM ; 1 cycle
SSBX FRCT ; 1 cycle
;
; Copy arguments to their local locations as necessary
;----------------------------------------------------------------
STLM A, x_ptr ; 1 cycle
MVDK *sp(h), h_ptr ; 2 cycles
MVDK *sp(r), r_ptr ; 2 cycles
LD *sp(nr), A ; 1 cycle
SUB #1, A ; 2 cycles
STLM A, BRC ; 1 cycle
LD *sp(nh), A ; 1 cycle
STLM A, count ; 1 cycle
MVMM h_ptr, h_save ; 1 cycle
;
; Calculate starting address for x[ncoeffs - 1]
;----------------------------------------------------------------
LDM x_ptr, B ; 1 cycle
ADD *sp(nh), B ; 1 cycle
SUB #1, B ; 1 cycle
STLM B, x_save ; 1 cycle
STLM B, x_ptr ; 1 cycle
;
; Begin outer loop on outputs to generate
;----------------------------------------------------------------
L1: RPTBD END_LOOP - 1 ; 2 cycles
MAR *+count(-3) ; 2 cycles
;
; Store starting address for pointer into vector b
; Note: This is one less than actual since this is
; pre-incremented in the repeat block loop
;----------------------------------------------------------------
MAR *x_save+ ; 1 cycle
MPY *h_ptr+, *x_ptr- , A ; 1 cycle
RPT *(count) ; 1 cycle
MAC *h_ptr+, *x_ptr-, A ; nh-2 cycles
MACR *h_ptr , *x_ptr , A ; 1 cycle
MVMM h_save, h_ptr ; 1 cycle
MVMM x_save, x_ptr ; 1 cycle
;
; Zero the accumulator before calculating next sum.
; Reset to point to first element in vector a
;----------------------------------------------------------------
STH A, *r_ptr+ ; 1 cycle
END_LOOP:
;
; Return to calling function, restoring C environment first
; If necessary
;----------------------------------------------------------------
LD #0, A ; 1 cycle
XC 1, AOV ; 1 cycle
LD #1, A ; 1 cycle
FRAME #FRAME_SZ ; 1 cycle
POPM ST1 ; 1 cycle
POPM ST0 ; 1 cycle
POPM AR1 ; 1 cycle
.if __far_mode
FRETD ; 4 cycles
.else
RETD ; 3 cycles
.endif
NOP ; 1 cycle
NOP ; 1 cycle
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -