00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <sys/dsound.h>
00030
00031 #ifdef CONF_DSOUND
00032
00033 #include <sys/bitops.h>
00034 #include <sys/h8.h>
00035 #include <sys/irq.h>
00036
00037 #include <conio.h>
00038 #include <sys/tm.h>
00039
00041
00042
00043
00045
00047 static const unsigned pitch2freq[]={
00048 0x8d03, 0x8603, 0x7d03, 0x7703, 0x7003, 0x6a03, 0x6303, 0x5e03,
00049 0x5903, 0x5403, 0x4f03, 0x4a03, 0x4603, 0x4203, 0xfd83, 0xee83,
00050 0xe083, 0xd483, 0xc783, 0xbc83, 0xb283, 0xa883, 0x9e83, 0x9583,
00051 0x8d83, 0x8583, 0x7e83, 0x7683, 0x7083, 0x6983, 0x6383, 0x5e83,
00052 0x5983, 0x5383, 0x4f83, 0x4a83, 0x4683, 0x4283, 0xfc02, 0xee02,
00053 0xe102, 0xd402, 0xc802, 0xbd02, 0xb202, 0xa802, 0x9e02, 0x9502,
00054 0x8d02, 0x8502, 0xfc82, 0xee82, 0xe082, 0xd482, 0xc882, 0xbd82,
00055 0xb282, 0xa882, 0x9e82, 0x9682, 0x8d82, 0x8582, 0x7e82, 0x7682,
00056 0x7082, 0x6982, 0x6382, 0x5e82, 0x5882, 0x5382, 0x4f82, 0x4a82,
00057 0x4682, 0x4282, 0xfc01, 0xee01, 0xe001, 0xd401, 0xc801, 0xbd01,
00058 0xb201, 0xa801, 0x9e01, 0x9501, 0x8d01, 0x8501, 0x7e01, 0x7601,
00059 0x7001, 0x6901, 0x6301, 0x5e01, 0x5801, 0x5301, 0x4f01, 0x4a01,
00060 0x4601
00061 };
00062
00064 static const note_t sys_beep[]={
00065 {PITCH_A4 , 1}, {PITCH_END, 0}
00066 };
00067
00069 const note_t *dsound_system_sounds[]={
00070 sys_beep
00071 };
00072
00073 unsigned dsound_16th_ms;
00074 unsigned dsound_internote_ms;
00075 volatile note_t *dsound_next_note;
00076 volatile time_t dsound_next_time;
00077
00078 static volatile int internote;
00079
00080
00082
00083
00084
00086
00088 static inline void play_freq(unsigned freq) {
00089 unsigned char CKSmask = freq & 0xff;
00090 unsigned char match = freq >> 8;
00091
00092 T0_CR = 0x00;
00093 T0_CNT = 0x00;
00094
00095 #if 0
00096 bit_load(CKSmask,0x7);
00097 bit_store(&STCR,0x0);
00098 #else
00099 if (CKSmask & 0x80)
00100 STCR |= 0x01;
00101 else
00102 STCR &= ~0x01;
00103 #endif
00104
00105 T0_CORA = match;
00106 T0_CR = CR_CLEAR_ON_A | (CKSmask &0x3);
00107 }
00108
00110 static inline void play_pause() {
00111 T0_CR = 0x00;
00112 }
00113
00114
00116
00117
00118
00120
00122 #ifdef CONF_RCX_COMPILER
00123 void dsound_handler(void) {
00124 #else
00125 HANDLER_WRAPPER("dsound_handler","dsound_core");
00127 void dsound_core(void) {
00128 #endif
00129 if (get_system_up_time() >= dsound_next_time) {
00130
00131 if(internote) {
00132 play_pause();
00133 dsound_next_time = get_system_up_time() + dsound_internote_ms;
00134
00135 internote=0;
00136 return;
00137 }
00138
00139 if(dsound_next_note) {
00140 unsigned char pitch =dsound_next_note->pitch;
00141
00142 if(pitch<PITCH_MAX) {
00143 if(pitch!=PITCH_PAUSE)
00144 play_freq(pitch2freq[pitch]);
00145 else
00146 play_pause();
00147
00148 dsound_next_time = get_system_up_time() + dsound_16th_ms * dsound_next_note->length
00149 - dsound_internote_ms;
00150 dsound_next_note++;
00151 internote=1;
00152 return;
00153 }
00154 }
00155
00156 dsound_stop();
00157 }
00158 }
00159
00161 void dsound_init() {
00162 dsound_16th_ms=DSOUND_DEFAULT_16th_ms;
00163 dsound_internote_ms=DSOUND_DEFAULT_internote_ms;
00164 dsound_stop();
00165 T0_CSR = CSR_TOGGLE_ON_A;
00166 }
00167
00169 void dsound_shutdown() {
00170 dsound_stop();
00171 }
00172
00173
00175
00176
00177
00179
00181 void dsound_stop(void) {
00182 play_pause();
00183 dsound_next_note=0;
00184 dsound_next_time=0xffffffff;
00185 internote=0;
00186 }
00187
00189 wakeup_t dsound_finished(wakeup_t data) {
00190 return !dsound_playing();
00191 }
00192
00193 #endif // CONF_DSOUND