📄 spkintr4.s
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////
//////// SpkIntr4.s (input unsigned 16-bit, output unsigned 9bit)
////////
//////// 1998 Oct. 29 H.Matsuoka Ver.0.1
//////// 1999 Mar. 9 H.Matsuoka Ver.0.2
//////// 1999 Nov. 24 H.Matsuoka Ver.0.3
//////// 2003 Dec. 03 CH.Yoon Ver.0.4 port to GNU33
////////
#include "slcomm.def"
#include "slintr.def"
#define TIMER16_ODD_UNDERFLOW 0x40
#define COMPARE_A16_1 0x00048188 // 16bit Timer 1 (Output)
#define TIMER16_5_IFLAG 0x00040284 // 16bit Timer 5
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// Global Symbols
//////
.global SpkIntr4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkIntr4
//////
SpkIntr4:
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
ld.uh %r3,[%r2]+ // Data : unsigned 16-bit
xadd %r3,0x40
srl %r3,7 // Data >>= 7// Change 16bit to 9bit
xld.w %r1,COMPARE_A16_1 // PWM data write reg
ld.h [%r1],%r3 // Data : unsigned 9bit
// 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 + -