📄 fixed.asm
字号:
.version 50
.mmregs
; following varibles must be placed in same block with same DP value
.bss LOOPNUM,1
.bss SLK,1
.bss SEK,1
.bss SRK,1
.bss SRK1,1
.bss SRK2,1
.bss SEZK,1
.bss DK,1
.bss DQK,1
.bss DQK1,1
.bss DQK2,1
.bss DQK3,1
.bss DQK4,1
.bss DQK5,1
.bss DQK6,1
.bss PK,1
.bss PK1,1
.bss PK2,1
.bss S0,1
.bss S1,1
.bss S2,1
.bss S3,1
.bss S4,1
.bss S5,1
.bss S6,1
.bss TRK,1
.bss TDK,1
.bss YLKFL,1
.bss YLKFH,1
.bss YLK1FL,1
.bss YLK1FH,1
;long ylkf,ylk1f;//3,...,-15
.bss YKF,1
.bss YUKF,1
.bss YUK1F,1
.bss ALKF,1
.bss APKF,1
.bss APK1F,1
.bss FIKF,1
.bss FA1K1F,1
;int ykf,yukf,yuk1f,alkf,apkf,apk1f,fikf,fa1k1f;
.bss DMSKF,1
.bss DMLKF,1
.bss DMSK1F,1
.bss DMLK1F,1
;int dmskf,dmlkf,dmsk1f,dmlk1f;
.bss A1KF,1
.bss A1K1F,1
.bss A2KF,1
.bss A2K1F,1
.bss WIKF,1
;int a1kf,a1k1f,a2kf,a2k1f,wikf;
.bss B1KF,1
.bss B2KF,1
.bss B3KF,1
.bss B4KF,1
.bss B5KF,1
.bss B6KF,1
.bss B1K1F,1
.bss B2K1F,1
.bss B3K1F,1
.bss B4K1F,1
.bss B5K1F,1
.bss B6K1F,1
;int b1kf,b2kf,b3kf,b4kf,b5kf,b6kf,b1k1f,b2k1f,b3k1f,b4k1f,b5k1f,b6k1f;
.bss I0K,1
.bss I1K,1
;unsigned char i0k,i1k;
.bss TEMP1,1
.bss TEMP2,1
.bss TEMP3,1
.bss TEMP4,1
.text
CALL C50_INIT
CALL ADPCM_INIT
SPLK #0,LOOPNUM
M1 CALL RECONSTRUCT
CALL DELTASIGNAL
CALL SPEEDCTL
CALL QUANTIZERSCALE
CALL ADAPTIVEQUANTIZER
CALL INVERSEQUANTIZER
CALL UPDATE
LACC LOOPNUM
ADD #1
SACL LOOPNUM
B M1
RET
ADPCM_INIT
LDP #YUK1F
LACC #544
SACL YUK1F
LACC #0
SACL YLK1FH
LACC #34816
SACL YLK1FL
LACC #0
SACL APK1F
SACL DMSK1F
SACL DMLK1F
SACL PK1
SACL PK2
SACL A1K1F
SACL A2K1F
SACL B1K1F
SACL B2K1F
SACL B3K1F
SACL B4K1F
SACL B5K1F
SACL B6K1F
SACL DQK1
SACL DQK2
SACL DQK3
SACL DQK4
SACL DQK5
SACL DQK6
SACL SRK1
SACL SRK2
RET
UPDATE
LDP #SRK
LACC SEK
ADD DQK
SACL SRK ;srk=sek+dqk
LACC DQK
ADD SEZK
SACL PK ;pk=dqk+sezk
XC 2,GT
SPLK #1,S0
XC 2,EQ
SPLK #0,S0
XC 2,LT
SPLK #-1,S0
LACC PK1
NOP
XC 2,GEQ
SPLK #1,S1
XC 2,LT
SPLK #-1,S1
LACC PK2
NOP
XC 2,GEQ
SPLK #1,S2
XC 2,LT
SPLK #-1,S2
U7 LACC A1K1F
ABS
SUB #2000h
BCND U8,GT
LACC A1K1F
SFR
SFL
SFL
SACL FA1K1F
B U9
U8 LACC A1K1F
BCND U10,LT
SPLK #4000h,FA1K1F
B U9
U10 SPLK #-4000h,FA1K1F
U9 SPM 0
LT S0
MPY S1
SPL TEMP1
LT TEMP1
MPY FA1K1F
SPL TEMP2 ;TEMP2=FA1K1F*S0*S1
LT S0
MPY S2
SPL TEMP1
LACC TEMP1,13
SUB TEMP2
SFL
LT A2K1F
MPY #127
APAC
BSAR 7
SACL A2KF
LACC A2KF
SACB
LACC #3000h
CRLT
SACL A2KF
SACB ;ACC=ACCB=A2KF
LACC #-3000h
CRGT
SACL A2KF
U13 SPM 0
LT S0
MPY S1
SPL TEMP1
LT TEMP1
MPY #3
SPL TEMP1
LACC TEMP1,14 ;ACC=(3*S0*S1)<<14
LT A1K1F
MPY #255
APAC
BSAR 8
SACL A1KF
SACB ;ACCB=A1KF
LACC #3C00h
SUB A2KF
SACL TEMP1 ;TEMP1=ACC=0X3C00-A2KF
CRLT
SACL A1KF
SACB ;ACCB=A1KF
LACC TEMP1
NEG ;ACC=-TEMP1
CRGT
SACL A1KF
; acc=3*s0*s1;
; acc=acc<<14;
; p=255*(long)a1k1f;
; acc=acc+p;
; a1kf=acc>>8;
; temp1=0x3c00-(long)a2kf;//temp1:s,0,...,-14
; if( (long)a1kf>temp1 ) a1kf=temp1; else if( (long)a1kf<-temp1 ) a1kf=-temp1;
;used for quantizerscale
SPM 0
LACC I0K
SUB I1K
NOP
XC 2,EQ
SPLK #-22,WIKF
XC 2,NEQ
SPLK #439,WIKF
LACC WIKF,5
LT YKF
MPY #31
APAC
BSAR 5
SACL YUKF
SACB ;ACCB=YUKF
LACC #5120
CRLT
SACL YUKF
SACB
LACC #542
CRGT
SACL YUKF
; //wik s,6,...,-4 yk:3,...,-9 yuk:3,...,-9
; if( i0k==i1k ) wikf=-22; else wikf=439;
; acc=(long)wikf<<5;
; p=31*(long)ykf;
; acc=acc+p;
; yukf=acc>>5;
; if(yukf>5120) yukf=5120;
; else if(yukf<542) yukf=542;
SPM 0
LT YLK1FH
MPY #63
SPL TEMP1
LACC TEMP1,16
LT YLK1FL
SPLK #63,TEMP2
MPYU TEMP2
APAC
SACB
LACC YUKF,6
ADDB
BSAR 6
SACH YLKFH
SACL YLKFL
; //ylk1 3,...,-15 yuk 3,...,-9
; acc=(long)yukf<<6;
; p=63*(long)ylk1f;
; acc=acc+p;
; ylkf=acc>>6;
;tone and transition detector
LACC A2KF
ADD #11776
NOP
XC 2,LT
SPLK #1,TDK
XC 2,GEQ
SPLK #0,TDK
LACC YLKFH,16
OR YLKFL ;ACC=YLKF
BSAR 8
SACL TEMP4 ;TEMP4=YLKF>>8
BSAR 7 ;ACC=TEMP4=YLKF>>8
AND #0Fh
SUB #14
NEG
SAMM TREG1 ;TREG1=14-(TEMP4>>7)&0X0F
LACC TEMP4
AND #7Fh
ADD #80h
SACL TEMP3 ;TEMP3=0X80+TEMP4&0X7F
LACC TEMP3,7
SATL
SACL TEMP2
LACC TEMP4
NOP
XC 2,LT
SPLK #1,TEMP2 ;TEMP2=POW(2,TEMP4)
SPM 0
LT TEMP2
MPY #24
LACC DQK
ABS
SPAC
BCND U14,LEQ
LACC TDK
SACL TRK
B U15
U14 SPLK #0,TRK
U15
; if(a2kf<-11776) tdk=1; else tdk=0;
; if(ylkf<0) temp2=1;
; else {
; temp4=ylkf>>8; //temp4:3,...,-7
; temp1=(temp4>>7) & 0x0f;//4bit exponent
; temp3=temp4 & 0x7f;//7bit mantissa
; temp2=((0x080+temp3)<<7) >> (14-temp1);
; }
; p=24*(long)temp2;
;
; if( (a2kf<-11776) && ((long)abs(dqk)>p) ) trk=1;
; else trk=0;
;used for speedctl
LACC I0K
SUB I1K
NOP
XC 2,EQ
SPLK #0,FIKF
XC 2,NEQ
SPLK #7,FIKF
SPM 0
LACC FIKF,9
LT DMSK1F
MPY #31
APAC
BSAR 5
SACL DMSKF
; if( i0k==i1k ) fikf=0; else fikf=7;
; acc=fikf<<9;
; p=31*(long)dmsk1f;
; acc=acc+p;
; dmskf=acc>>5;
LACC FIKF,11
LT DMLK1F
MPY #127
APAC
BSAR 7
SACL DMLKF
SACL DMLK1F
LACC DMSKF
SACL DMSK1F
; acc=fikf<<11;
; acc=acc+127*(long)dmlk1f;
; dmlkf=acc>>7;
; dmsk1f=dmskf;
; dmlk1f=dmlkf;
LACC DMLKF
BSAR 2
SUB DMSKF
ABS
SACB
LACC DMLKF
BSAR 5
SBB
BCND U16,LEQ
LACC YKF
SUB #600h
BCND U16,LT
LACC TDK
BCND U16,NEQ
LACC TRK
BCND U17,EQ
SPLK #100h,APKF
B U18
U17 LT APK1F
MPY #15
PAC
BSAR 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -