📄 tcosold.asm
字号:
.version 50
.mmregs
.BSS TLSP_0,1
.BSS TLSP_1,1
.BSS TLSP_2,1
.BSS TLSP_0_M,1
.BSS TLSP_1_M,1
.BSS IBUF,1
.BSS LOW,1
.BSS LEVELS,1
.BSS ERRORDN,1
.BSS ERRORUP,1
;--------
FLEN .SET 240
P10 .SET 10
P10_1 .SET 9
;-----------
TEMPLSP .USECT "WARRAY",10
FINDEX .USECT "WARRAY",10
.data
LSP .INT 34eh,8ceh,1093h,171eh,24a6h,27b3h,2d4dh,34b3h,39b5h,3b57h
;// 2, 10, 10, 10, 15, 6, 7, 7, 7, 6,
LSPTAB .COPY "LSPTAB.DAT"
BITS_1 .INT 7,15,15,15,15,7,7,7,7,7 ;//{3, 4, 4, 4, 4, 3, 3, 3, 3, 3};
;----------
.text
CALL C50_INIT
CALL LSP34
HERE: NOP
B HERE
;=================================
LSP34
LDP #IBUF
LAR AR7,#P10_1
LAR AR0,#FINDEX
LAR AR1,#LSPTAB
LAR AR2,#LSP
LAR AR3,#BITS_1
LAR AR4,#TEMPLSP
LACC #2
SAMM INDX
;=================================
; for (i = 0; i < no; i++)
; { levels = (1 << bits[i]) - 1;
; low = dist = fabs(freq[i] - *newlsptab[i] );
; findex[i] = 0;
;=================================
LACC #0
SACL IBUF
MAR *,AR3
LSP34_FOR
LACC *+,0,AR5
SACL LEVELS
LACC #LSPTAB
ADD IBUF,4
SAMM AR5
MAR *,AR5
LACC *+,0,AR2
SUB *,0,AR0
ABS
SACL LOW
LACC #0
SACL *,0,AR2
;=========================================
; for (j = 1; j <= levels; j++)
; { dist = fabs(freq[i] - newlsptab[i][j]);
; if (dist < low)
; { low = dist; findex[i] = j; TEMPLSP[i]=newlsptab[i][j]; } }
;=========ARP=2================================
LACC LEVELS
SUB #1
SAMM BRCR
RPTB LSP34_FOR_J-1
LACC *,0,AR5
SUB *+,0,AR0
ABS
SACB
LACC LOW
EXAR
CRLT
BCND LSP34_FOR_J_1,NC ;jump if DIST>=LOW.. low<=dist
SACL LOW
LAMM BRCR
SUB LEVELS
ABS
SACL *,0,AR5
MAR *-
LACC *+,0,AR4
SACL *,0,AR2
LSP34_FOR_J_1
MAR *,AR2
NOP
LSP34_FOR_J
;=========================================
; if (i > 0)
; { if (newlsptab[i][findex[i]] <= newlsptab[i - 1][findex[i - 1]])
; {tlsp_0=newlsptab[i][findex[i]];
; tlsp_1=newlsptab[i-1][findex[i-1]];
; //tlsp_2=newlsptab[i-2][findex[i-2]];
; tlsp_0_m=newlsptab[i][mmin(findex[i] + 1, levels)];
; tlsp_1_m=newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)];
;=========================================
LACC IBUF
BCND LSP34_NEXT_FOR,EQ
MAR *,AR4
LACC *-
SACL TLSP_0
SACB
LACC *0+
SACL TLSP_1
CRLT ;jump if TLSP_1<TLSP_0
BCND LSP34_NEXT_FOR,C
SBRK #3
LACC *0+ ;INDX=2
SACL TLSP_2
MAR *+,AR0
;-------------
LACC *-,0,AR5 ;tlsp_0_m=newlsptab[i][mmin(findex[i] + 1, levels)];
ADD #1
SACB
LACC LEVELS
CRLT
LACC #LSPTAB
ADD IBUF,4
ADDB
SAMM AR5
LACC *,0,AR0
SACL TLSP_0_M
;------------
LACC *+,0,AR5 ;tlsp_1_m=newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)];
SUB #1
SACB
LACC #0
CRGT
LACC #LSPTAB-16
ADD IBUF,4
ADDB
SAMM AR5
LACC *,0,AR2
SACL TLSP_1_M
;=========================================
; errorup = fabs(freq[i] - newlsptab[i][mmin(findex[i] + 1, levels)])
; + fabs(freq[i - 1] - newlsptab[i - 1][findex[i - 1]]);
;=========================================
LACC *-,0
SUB TLSP_0_M
ABS
SACB
LACC *+,0
SUB TLSP_1
ABS
ADDB
SACL ERRORUP
;=========================================
; errordn = fabs(freq[i] - newlsptab[i][findex[i]]) +
; fabs(freq[i - 1] - newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]);
;=========================================
LACC *-,0
SUB TLSP_0
ABS
SACB
LACC *+,0,AR0
SUB TLSP_1_M
ABS
ADDB
SACL ERRORDN
;=========================================
; if (errorup < errordn)
; { //findex[i] = mmin(findex[i] + 1, levels);
;=======ARP=0==================================; jump if errorup>=errordn
LACC ERRORDN
SACB
LACC ERRORUP
CRGT
BCND LSP34_DN,C
;=========================================
; { findex[i] = mmin(findex[i] + 1, levels);
; while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
; findex[i] = mmin(findex[i] + 1, levels); }
;=======ARP=0==================================;
LSP34_UP
MAR *,AR0
LACC *,0
ADD #1
SACB
LACC LEVELS
CRLT
SACL *,0
;=========================================
; while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
; findex[i] = mmin(findex[i] + 1, levels); }
;=======ARP=0==================================
LSP34_UP_WHILE
LACC #LSPTAB ;tlsp_0=newlsptab[i][findex[i]];
ADD IBUF,4
ADD *-,0,AR5
SAMM AR5
LACC *,0,AR0
SACL TLSP_0
;--------------------------
LACC #LSPTAB-16 ;tlsp_1=newlsptab[i-1][findex[i-1]];
ADD IBUF,4
ADD *+,0,AR5
SAMM AR5
LACC *,0,AR0
SACL TLSP_1
;-------------------------jump if tlsp_0>=tlsp_1
SACB
LACC TLSP_0
CRGT
BCND LSP34_NEXT_FOR,C
LACC *,0
ADD #1
SACB
LACC LEVELS
CRLT
SACL *,0,AR0
B LSP34_UP_WHILE
LSP34_DN
;=========================================
; else if (i == 1) findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;=========================================
LACC IBUF
SUB #1
BCND LSP34_DN_NOT1,GT
LSP34_DN_1
MAR *,AR0
MAR *-
LACC *,0
SUB #1
SACB
LACC #0
CRGT
SACL *+,0
B LSP34_NEXT_FOR
;=========================================
; else if(newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]
; > newlsptab[i - 2][findex[i - 2]])
; findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;=========================================
LSP34_DN_NOT1
LACC TLSP_1_M
SACB ;jump if tlsp_2>=tlsp_1_m
LACC TLSP_2
CRGT
BCND LSP34_UP,C
B LSP34_DN_1
;=========================================
LSP34_NEXT_FOR
LACC IBUF
ADD #1
SACL IBUF
MAR *,AR0
MAR *+,AR2
MAR *+,AR4
MAR *+,AR7
BANZ LSP34_FOR,*-,AR3
;=========================================
nop
NOP
LSP34_END
RET
;=================================
.include "c50_init.asm"
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -