📄 spkintr1.s
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////
//////// SpkIntr1.s (input unsigned 16-bit, output unsigned 15bit)
////////
//////// 1998 Oct. 29 H.Matsuoka Ver.0.1
//////// 1999 Mar. 9 H.Matsuoka Ver.0.2
//////// 1999 Aug. 24 H.Matsuoka Ver.0.3 PCM15
//////// 1999 Nov. 16 H.Matsuoka Data unsigned 16bit
//////// 2003 Dec. 03 CH.Yoon Ver.0.4 port to GNU33
//////// 2004 Mar. 10 David.ji Ver.0.5 port to L05DMT(SEE)
////////
#include "slcomm.def"
#include "slintr.def"
#define TIMER16_ODD_UNDERFLOW 0x40
#define COMPARE_A16_0 0x00048180
#define COMPARE_A16_1 0x00048188
#define COMPARE_A16_2 0x00048190
#define COMPARE_A16_3 0x00048198
#define COMPARE_A16_4 0x000481a0
#define TIMER16_5_IFLAG 0x00040284 // 16bit Timer 5 trigar
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// Global Symbols
//////
.global SpkIntr1
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkIntr
//////
SpkIntr1:
pushn %r3
xld.w %r0,SPK_DATA_0 // SPK_DATA_#
ld.w %r2,[%r0] // Read HEAD
xld.w %r3,TIMER16_ODD_UNDERFLOW
xld.w %r1,TIMER16_5_IFLAG // Int factor flag reg
ld.b [%r1],%r3 // clear Int factor flag
// *** input data : unsigned 16-bit stereo ***
// *** output data : unsigned 15-bit stereo ***
ld.uh %r3,[%r2]
add %r3,0x1 // Change 16bit to 15bit
srl %r3,7 // Data >>=1 and Data>>=6
xld.w %r1,COMPARE_A16_1 // PWM data write reg
ld.h [%r1],%r3 // upper 9-bit, Write output data
ld.uh %r3,[%r2]+
add %r3,0x1 // Change 16bit to 15bit
srl %r3,0x1 // Data >>= 1
xand %r3,0x3f
xld.w %r1,COMPARE_A16_0 // PWM data write reg
ld.h [%r1],%r3 // lower 6-bit, Write output data
ext OFFSET_TAIL // read TAIL
ld.w %r3,[%r0]
cmp %r2,%r3 // if (HEAD >= TAIL) Next
jruge PacketEnd
ld.w [%r0],%r2 // update HEAD
popn %r3
reti
PacketEnd: // Next
popn %r3
pushn %r15
ld.w %r0,%ahr
ld.w %r1,%alr
pushn %r1
xld.w %r6,SPK_PARAMS_0 // SpkParams
xld.w %r7,TIMER16_5_IFLAG // IFlagReg
xld.w %r8,TIMER16_ODD_UNDERFLOW // IFlag MaskData
ld.w %r9,[%sp+0x12] // OldPSR
xcall QueueNext
popn %r1
ld.w %alr,%r1
ld.w %ahr,%r0
popn %r15
reti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -