📄 spk208pw.s
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////
//////// Speak E0C33208-PWM (Data : unsigned 10-bit)
////////
//////// 1998 Oct. 29 H.Matsuoka Ver.0.1
//////// 1999 Mar. 9 H.Matsuoka Ver.0.2
//////// 2003 Dec. 03 CH.Yoon Ver.0.3 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 SpkIntr0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkIntr
//////
SpkIntr0:
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 10-bit
xld.w %r1,COMPARE_A16_1 // PWM data write reg
ld.h [%r1],%r3 // Data : unsigned 10-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 + -