nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Thu Aug 21 00:44:22 2014 +0000
Revision:
9:834e9eed0d72
Parent:
8:88c89fd324bd
Child:
10:b8d41133e499
Fixed GPIO stuff.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bkc_mbed 8:88c89fd324bd 1 //
bkc_mbed 8:88c89fd324bd 2 // NLGPLAY : NLG file player for mbed
bkc_mbed 8:88c89fd324bd 3 //
bkc_mbed 8:88c89fd324bd 4
bkc_mbed 0:2053640461b5 5 #include "mbed.h"
bkc_mbed 0:2053640461b5 6 #include "SDFileSystem.h"
bkc_mbed 0:2053640461b5 7 #include "lcd.h"
bkc_mbed 0:2053640461b5 8
bkc_mbed 8:88c89fd324bd 9 #define USE_NBV3
bkc_mbed 8:88c89fd324bd 10 #define USE_FASTIO
bkc_mbed 7:7e183b33c3f9 11
bkc_mbed 6:e48296dca6bb 12
bkc_mbed 6:e48296dca6bb 13 // (pinname, mode)
bkc_mbed 5:27f193e21222 14 DigitalIn sw_play(dp24, PullUp);
bkc_mbed 5:27f193e21222 15 DigitalIn sw_next(dp10, PullUp);
bkc_mbed 6:e48296dca6bb 16 DigitalIn sw_prev(dp9, PullUp);
bkc_mbed 0:2053640461b5 17
bkc_mbed 6:e48296dca6bb 18 // LED
bkc_mbed 1:ec416e6d5739 19 DigitalOut led1(LED1);
bkc_mbed 1:ec416e6d5739 20 DigitalOut led2(LED2);
bkc_mbed 0:2053640461b5 21
bkc_mbed 6:e48296dca6bb 22 // SPI: MOSI, MISO, SCLK, CS
bkc_mbed 0:2053640461b5 23 SDFileSystem sd(dp2, dp1, dp6, dp25, "sd");
bkc_mbed 0:2053640461b5 24
bkc_mbed 0:2053640461b5 25 //
bkc_mbed 0:2053640461b5 26 // nlg_emb.c
bkc_mbed 0:2053640461b5 27 //
bkc_mbed 0:2053640461b5 28
bkc_mbed 0:2053640461b5 29 #define CMD_PSG 0x00
bkc_mbed 0:2053640461b5 30 #define CMD_OPM 0x01
bkc_mbed 0:2053640461b5 31 #define CMD_OPM2 0x02
bkc_mbed 0:2053640461b5 32 #define CMD_IRQ 0x80
bkc_mbed 0:2053640461b5 33
bkc_mbed 0:2053640461b5 34 #define CMD_CTC0 0x81
bkc_mbed 0:2053640461b5 35 #define CMD_CTC3 0x82
bkc_mbed 0:2053640461b5 36
bkc_mbed 0:2053640461b5 37 #define NLG_VER (110)
bkc_mbed 0:2053640461b5 38 #define NLG_BASECLK (4000000)
bkc_mbed 0:2053640461b5 39
bkc_mbed 0:2053640461b5 40 FILE *nlg_file;
bkc_mbed 0:2053640461b5 41
bkc_mbed 3:aed228fa3ae4 42 char nlg_title[65];
bkc_mbed 0:2053640461b5 43 int nlg_baseclk;
bkc_mbed 0:2053640461b5 44 int nlg_tick;
bkc_mbed 0:2053640461b5 45 int nlg_length;
bkc_mbed 0:2053640461b5 46 int nlg_loop_ptr;
bkc_mbed 0:2053640461b5 47 int nlg_version;
bkc_mbed 0:2053640461b5 48
bkc_mbed 0:2053640461b5 49 int nlg_ctc0;
bkc_mbed 0:2053640461b5 50 int nlg_ctc3;
bkc_mbed 0:2053640461b5 51
bkc_mbed 8:88c89fd324bd 52 #define _WAIT for(int wcnt=0; wcnt < 2; wcnt++)
bkc_mbed 8:88c89fd324bd 53
bkc_mbed 8:88c89fd324bd 54 #ifndef USE_FASTIO
bkc_mbed 8:88c89fd324bd 55 // 通常IO
bkc_mbed 8:88c89fd324bd 56
bkc_mbed 9:834e9eed0d72 57 #define RCK io04 // pin4 , P0_11
bkc_mbed 9:834e9eed0d72 58 #define SCK io03 // pin17, P1_8
bkc_mbed 9:834e9eed0d72 59 #define DBS io01 // pin13, P1_4
bkc_mbed 9:834e9eed0d72 60 #define CTS io02 // pin26, P0_3
bkc_mbed 0:2053640461b5 61
bkc_mbed 7:7e183b33c3f9 62 #define IO_A0 io05
bkc_mbed 7:7e183b33c3f9 63 #define IO_WR io06
bkc_mbed 7:7e183b33c3f9 64
bkc_mbed 8:88c89fd324bd 65 // (pinname, initial value)
bkc_mbed 8:88c89fd324bd 66 DigitalOut io01(dp13, 0); // P1_4
bkc_mbed 8:88c89fd324bd 67 DigitalOut io02(dp26, 0); // P0_3
bkc_mbed 8:88c89fd324bd 68 DigitalOut io03(dp17, 0); // P1_8
bkc_mbed 8:88c89fd324bd 69 DigitalOut io04(dp4, 0); // P0_11
bkc_mbed 7:7e183b33c3f9 70
bkc_mbed 8:88c89fd324bd 71 DigitalOut io05(dp18, 0); // P1_9
bkc_mbed 9:834e9eed0d72 72 DigitalOut io06(dp11, 0); // P1_2
bkc_mbed 8:88c89fd324bd 73
bkc_mbed 8:88c89fd324bd 74 void ioInit()
bkc_mbed 8:88c89fd324bd 75 {
bkc_mbed 8:88c89fd324bd 76 }
bkc_mbed 2:f0b7779b03c7 77
bkc_mbed 0:2053640461b5 78 // 16bit output
bkc_mbed 8:88c89fd324bd 79 void ioShiftOut(unsigned int data)
bkc_mbed 0:2053640461b5 80 {
bkc_mbed 0:2053640461b5 81 int i;
bkc_mbed 0:2053640461b5 82
bkc_mbed 0:2053640461b5 83 for(i = 0; i < 8; i++)
bkc_mbed 0:2053640461b5 84 {
bkc_mbed 0:2053640461b5 85 /* 2ビット分のデータをそれぞれ出力 */
bkc_mbed 0:2053640461b5 86 if (data & 0x80)
bkc_mbed 0:2053640461b5 87 CTS = 1;
bkc_mbed 0:2053640461b5 88 else
bkc_mbed 0:2053640461b5 89 CTS = 0;
bkc_mbed 0:2053640461b5 90
bkc_mbed 0:2053640461b5 91 if (data & 0x8000)
bkc_mbed 0:2053640461b5 92 DBS = 1;
bkc_mbed 0:2053640461b5 93 else
bkc_mbed 0:2053640461b5 94 DBS = 0;
bkc_mbed 0:2053640461b5 95
bkc_mbed 0:2053640461b5 96 data <<= 1;
bkc_mbed 0:2053640461b5 97
bkc_mbed 0:2053640461b5 98 SCK = 1;
bkc_mbed 3:aed228fa3ae4 99 // _WAIT;
bkc_mbed 0:2053640461b5 100 SCK = 0;
bkc_mbed 3:aed228fa3ae4 101 // _WAIT;
bkc_mbed 0:2053640461b5 102 }
bkc_mbed 0:2053640461b5 103
bkc_mbed 0:2053640461b5 104 RCK = 1;
bkc_mbed 3:aed228fa3ae4 105 // _WAIT;
bkc_mbed 0:2053640461b5 106 RCK = 0;
bkc_mbed 3:aed228fa3ae4 107 // _WAIT;
bkc_mbed 2:f0b7779b03c7 108 }
bkc_mbed 8:88c89fd324bd 109 #else
bkc_mbed 8:88c89fd324bd 110
bkc_mbed 8:88c89fd324bd 111 // 高速IO
bkc_mbed 8:88c89fd324bd 112
bkc_mbed 8:88c89fd324bd 113 #define RCK IO_04
bkc_mbed 8:88c89fd324bd 114 #define SCK IO_03
bkc_mbed 8:88c89fd324bd 115 #define DBS IO_01
bkc_mbed 8:88c89fd324bd 116 #define CTS IO_02
bkc_mbed 8:88c89fd324bd 117
bkc_mbed 8:88c89fd324bd 118
bkc_mbed 8:88c89fd324bd 119 #define IO_A0 io05
bkc_mbed 8:88c89fd324bd 120 #define IO_WR io06
bkc_mbed 8:88c89fd324bd 121
bkc_mbed 9:834e9eed0d72 122 DigitalOut io01(dp13, 0); // P1_4
bkc_mbed 9:834e9eed0d72 123 DigitalOut io02(dp26, 0); // P0_3
bkc_mbed 9:834e9eed0d72 124 DigitalOut io03(dp17, 0); // P1_8
bkc_mbed 9:834e9eed0d72 125 DigitalOut io04(dp4, 0); // P0_11
bkc_mbed 9:834e9eed0d72 126
bkc_mbed 8:88c89fd324bd 127 DigitalOut io05(dp18, 0); // P1_9
bkc_mbed 9:834e9eed0d72 128 DigitalOut io06(dp11, 0); // P1_2
bkc_mbed 8:88c89fd324bd 129
bkc_mbed 8:88c89fd324bd 130
bkc_mbed 9:834e9eed0d72 131 #define IO_01 (1<<4) // DBS P1_4
bkc_mbed 9:834e9eed0d72 132 #define IO_02 (1<<3) // CTS P0_3
bkc_mbed 9:834e9eed0d72 133 #define IO_03 (1<<8) // SCK P1_8
bkc_mbed 9:834e9eed0d72 134 #define IO_04 (1<<11) // RCK P0_11
bkc_mbed 8:88c89fd324bd 135
bkc_mbed 8:88c89fd324bd 136
bkc_mbed 8:88c89fd324bd 137 void ioInit()
bkc_mbed 8:88c89fd324bd 138 {
bkc_mbed 8:88c89fd324bd 139 // 出力
bkc_mbed 8:88c89fd324bd 140 LPC_GPIO0->DIR |= (IO_02 | IO_04);
bkc_mbed 8:88c89fd324bd 141 LPC_GPIO1->DIR |= (IO_01 | IO_03);
bkc_mbed 8:88c89fd324bd 142 }
bkc_mbed 8:88c89fd324bd 143
bkc_mbed 8:88c89fd324bd 144 // 16bit output
bkc_mbed 8:88c89fd324bd 145 void ioShiftOut(unsigned int data)
bkc_mbed 8:88c89fd324bd 146 {
bkc_mbed 8:88c89fd324bd 147 int i;
bkc_mbed 8:88c89fd324bd 148
bkc_mbed 8:88c89fd324bd 149 for(i = 0; i < 8; i++)
bkc_mbed 8:88c89fd324bd 150 {
bkc_mbed 8:88c89fd324bd 151 /* 2ビット分のデータをそれぞれ出力 */
bkc_mbed 8:88c89fd324bd 152 if (data & 0x80)
bkc_mbed 8:88c89fd324bd 153 LPC_GPIO0->DATA |= CTS;
bkc_mbed 8:88c89fd324bd 154 else
bkc_mbed 8:88c89fd324bd 155 LPC_GPIO0->DATA &= ~CTS;
bkc_mbed 8:88c89fd324bd 156
bkc_mbed 8:88c89fd324bd 157 if (data & 0x8000)
bkc_mbed 8:88c89fd324bd 158 LPC_GPIO1->DATA |= DBS;
bkc_mbed 8:88c89fd324bd 159 else
bkc_mbed 9:834e9eed0d72 160 LPC_GPIO1->DATA &= ~DBS;
bkc_mbed 8:88c89fd324bd 161
bkc_mbed 8:88c89fd324bd 162 data <<= 1;
bkc_mbed 8:88c89fd324bd 163
bkc_mbed 8:88c89fd324bd 164 LPC_GPIO1->DATA |= SCK;
bkc_mbed 9:834e9eed0d72 165 LPC_GPIO1->DATA &= ~SCK;
bkc_mbed 8:88c89fd324bd 166 }
bkc_mbed 8:88c89fd324bd 167
bkc_mbed 8:88c89fd324bd 168 LPC_GPIO0->DATA |= RCK;
bkc_mbed 8:88c89fd324bd 169 LPC_GPIO0->DATA &= ~RCK;
bkc_mbed 8:88c89fd324bd 170
bkc_mbed 8:88c89fd324bd 171 }
bkc_mbed 8:88c89fd324bd 172
bkc_mbed 8:88c89fd324bd 173
bkc_mbed 8:88c89fd324bd 174 #endif
bkc_mbed 8:88c89fd324bd 175
bkc_mbed 2:f0b7779b03c7 176
bkc_mbed 2:f0b7779b03c7 177
bkc_mbed 0:2053640461b5 178 /* 制御信号定義 */
bkc_mbed 0:2053640461b5 179 #define CS_PSG (1 << 1)
bkc_mbed 0:2053640461b5 180 #define CS_FM1 (1 << 2)
bkc_mbed 0:2053640461b5 181 #define CS_FM2 (1 << 3)
bkc_mbed 0:2053640461b5 182 #define A0 (1 << 4)
bkc_mbed 0:2053640461b5 183 #define WR (1 << 5)
bkc_mbed 0:2053640461b5 184 #define ICL (1 << 6)
bkc_mbed 0:2053640461b5 185
bkc_mbed 0:2053640461b5 186 /* アクティブローの制御信号 */
bkc_mbed 0:2053640461b5 187 #define ACTLOW (CS_PSG | CS_FM1 | CS_FM2 | WR | ICL)
bkc_mbed 0:2053640461b5 188
bkc_mbed 7:7e183b33c3f9 189 #ifdef USE_NBV3
bkc_mbed 7:7e183b33c3f9 190 /* 16bit出力 */
bkc_mbed 7:7e183b33c3f9 191 void regOutBase(int addr, int data,int select)
bkc_mbed 7:7e183b33c3f9 192 {
bkc_mbed 7:7e183b33c3f9 193 /* アドレスを出力 */
bkc_mbed 7:7e183b33c3f9 194 /* A0をローにして待つ */
bkc_mbed 7:7e183b33c3f9 195 IO_A0 = 0;
bkc_mbed 7:7e183b33c3f9 196 ioShiftOut((addr << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 7:7e183b33c3f9 197 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 7:7e183b33c3f9 198
bkc_mbed 7:7e183b33c3f9 199
bkc_mbed 7:7e183b33c3f9 200 /* チップ側の処理を待つ */
bkc_mbed 7:7e183b33c3f9 201
bkc_mbed 7:7e183b33c3f9 202 /* データを出力 */
bkc_mbed 7:7e183b33c3f9 203 /* A0をハイにして待つ */
bkc_mbed 7:7e183b33c3f9 204 IO_A0 = 1;
bkc_mbed 7:7e183b33c3f9 205 ioShiftOut((data << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 7:7e183b33c3f9 206 ioShiftOut((data << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 207
bkc_mbed 7:7e183b33c3f9 208 /* 処理を待つ */
bkc_mbed 7:7e183b33c3f9 209 }
bkc_mbed 7:7e183b33c3f9 210 #else
bkc_mbed 7:7e183b33c3f9 211 /* NBV2互換出力 */
bkc_mbed 0:2053640461b5 212 void regOutBase(int addr, int data,int select)
bkc_mbed 0:2053640461b5 213 {
bkc_mbed 0:2053640461b5 214 /* アドレスを出力 */
bkc_mbed 0:2053640461b5 215 /* A0をローにして待つ */
bkc_mbed 0:2053640461b5 216 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 217 ioShiftOut((addr << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 0:2053640461b5 218 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 219
bkc_mbed 7:7e183b33c3f9 220 /* チップ処理待ち */
bkc_mbed 0:2053640461b5 221
bkc_mbed 0:2053640461b5 222 /* データを出力 */
bkc_mbed 0:2053640461b5 223 /* A0をハイにして待つ */
bkc_mbed 0:2053640461b5 224 ioShiftOut((data << 8) | A0 | (ACTLOW));
bkc_mbed 0:2053640461b5 225 ioShiftOut((data << 8) | A0 | (ACTLOW & ~(select | WR)));
bkc_mbed 0:2053640461b5 226 ioShiftOut((data << 8) | A0 | (ACTLOW));
bkc_mbed 0:2053640461b5 227
bkc_mbed 7:7e183b33c3f9 228 /* チップ処理待ち */
bkc_mbed 0:2053640461b5 229 }
bkc_mbed 7:7e183b33c3f9 230 #endif
bkc_mbed 0:2053640461b5 231
bkc_mbed 0:2053640461b5 232 /* PSG出力 */
bkc_mbed 0:2053640461b5 233 void regPSGOut(int addr, int data)
bkc_mbed 0:2053640461b5 234 {
bkc_mbed 0:2053640461b5 235 regOutBase(addr, data, CS_PSG);
bkc_mbed 0:2053640461b5 236 }
bkc_mbed 0:2053640461b5 237
bkc_mbed 0:2053640461b5 238 /* FM2出力 */
bkc_mbed 0:2053640461b5 239 void regFM2Out(int addr, int data)
bkc_mbed 0:2053640461b5 240 {
bkc_mbed 0:2053640461b5 241 regOutBase(addr, data, CS_FM2);
bkc_mbed 0:2053640461b5 242 }
bkc_mbed 0:2053640461b5 243
bkc_mbed 0:2053640461b5 244 /* FM音源にデータを出力 */
bkc_mbed 0:2053640461b5 245 void regFMOut(int addr,int data)
bkc_mbed 0:2053640461b5 246 {
bkc_mbed 0:2053640461b5 247 regOutBase(addr, data, CS_FM1);
bkc_mbed 0:2053640461b5 248 }
bkc_mbed 0:2053640461b5 249
bkc_mbed 0:2053640461b5 250 /* ボード消音 */
bkc_mbed 0:2053640461b5 251 void boardMute(void)
bkc_mbed 0:2053640461b5 252 {
bkc_mbed 0:2053640461b5 253 int i;
bkc_mbed 0:2053640461b5 254
bkc_mbed 0:2053640461b5 255 /* PSG初期化 */
bkc_mbed 0:2053640461b5 256 regPSGOut(0x00,0);
bkc_mbed 0:2053640461b5 257 regPSGOut(0x01,0);
bkc_mbed 0:2053640461b5 258
bkc_mbed 3:aed228fa3ae4 259 regPSGOut(0x06, 0x00);
bkc_mbed 3:aed228fa3ae4 260 regPSGOut(0x07, 0x3f); // ALL OFF
bkc_mbed 3:aed228fa3ae4 261 regPSGOut(0x08, 0x00); // CH.A 0
bkc_mbed 3:aed228fa3ae4 262 regPSGOut(0x09, 0x00); // CH.B 0
bkc_mbed 3:aed228fa3ae4 263 regPSGOut(0x0a, 0x00); // CH.C 0
bkc_mbed 0:2053640461b5 264
bkc_mbed 7:7e183b33c3f9 265 /* MUTE(disable) */
bkc_mbed 0:2053640461b5 266 for(i = 0x20; i < 0x28; i++)
bkc_mbed 3:aed228fa3ae4 267 {
bkc_mbed 0:2053640461b5 268 regFMOut(i, 0x00);
bkc_mbed 3:aed228fa3ae4 269 regFM2Out(i, 0x00);
bkc_mbed 3:aed228fa3ae4 270 }
bkc_mbed 0:2053640461b5 271
bkc_mbed 7:7e183b33c3f9 272 // KEYOFF
bkc_mbed 3:aed228fa3ae4 273 for(i = 0x00; i < 0x08; i++)
bkc_mbed 3:aed228fa3ae4 274 {
bkc_mbed 3:aed228fa3ae4 275 regFMOut(0x08, i & 0x07);
bkc_mbed 3:aed228fa3ae4 276 regFM2Out(0x08, i & 0x07);
bkc_mbed 3:aed228fa3ae4 277 }
bkc_mbed 7:7e183b33c3f9 278
bkc_mbed 7:7e183b33c3f9 279 // FORCE RELEASE
bkc_mbed 7:7e183b33c3f9 280 for(i= 0x00; i < 0x20; i++)
bkc_mbed 7:7e183b33c3f9 281 {
bkc_mbed 7:7e183b33c3f9 282 regFMOut(0xE0 + i, 0x0f);
bkc_mbed 7:7e183b33c3f9 283 regFM2Out(0xE0 + i, 0x0f);
bkc_mbed 7:7e183b33c3f9 284 }
bkc_mbed 0:2053640461b5 285 }
bkc_mbed 0:2053640461b5 286
bkc_mbed 0:2053640461b5 287
bkc_mbed 0:2053640461b5 288 /* ボード初期化 */
bkc_mbed 0:2053640461b5 289 void boardInit(void)
bkc_mbed 0:2053640461b5 290 {
bkc_mbed 1:ec416e6d5739 291 wait_ms(20);
bkc_mbed 0:2053640461b5 292 /* ICLのみをLOW(アクティブ)にする */
bkc_mbed 0:2053640461b5 293 ioShiftOut(ACTLOW & ~(ICL));
bkc_mbed 6:e48296dca6bb 294 wait_ms(150);
bkc_mbed 0:2053640461b5 295
bkc_mbed 0:2053640461b5 296 /* 元に戻す */
bkc_mbed 0:2053640461b5 297 ioShiftOut(ACTLOW);
bkc_mbed 1:ec416e6d5739 298 wait_ms(10);
bkc_mbed 0:2053640461b5 299 }
bkc_mbed 0:2053640461b5 300
bkc_mbed 0:2053640461b5 301 typedef unsigned char byte;
bkc_mbed 0:2053640461b5 302 typedef unsigned short word;
bkc_mbed 0:2053640461b5 303 typedef unsigned long dword;
bkc_mbed 0:2053640461b5 304
bkc_mbed 0:2053640461b5 305
bkc_mbed 0:2053640461b5 306 // 変数読み出し(WORD)
bkc_mbed 0:2053640461b5 307 word ReadWORD(byte *p)
bkc_mbed 0:2053640461b5 308 {
bkc_mbed 0:2053640461b5 309 return
bkc_mbed 0:2053640461b5 310 ((word)p[0]) |
bkc_mbed 0:2053640461b5 311 ((word)p[1])<<8;
bkc_mbed 0:2053640461b5 312 }
bkc_mbed 0:2053640461b5 313
bkc_mbed 0:2053640461b5 314 // 変数読み出し(DWORD)
bkc_mbed 0:2053640461b5 315 dword ReadDWORD(byte *p)
bkc_mbed 0:2053640461b5 316 {
bkc_mbed 0:2053640461b5 317 return
bkc_mbed 0:2053640461b5 318 ((dword)p[0]) |
bkc_mbed 0:2053640461b5 319 ((dword)p[1])<<8 |
bkc_mbed 0:2053640461b5 320 ((dword)p[2])<<16 |
bkc_mbed 0:2053640461b5 321 ((dword)p[3])<<24;
bkc_mbed 0:2053640461b5 322 }
bkc_mbed 0:2053640461b5 323
bkc_mbed 0:2053640461b5 324 // NLGファイルを開く
bkc_mbed 0:2053640461b5 325 int OpenNLG(const char *file)
bkc_mbed 0:2053640461b5 326 {
bkc_mbed 3:aed228fa3ae4 327 byte nlg_hdr[0x60];
bkc_mbed 1:ec416e6d5739 328
bkc_mbed 0:2053640461b5 329 nlg_file = fopen(file, "rb");
bkc_mbed 0:2053640461b5 330
bkc_mbed 0:2053640461b5 331 if (!nlg_file)
bkc_mbed 0:2053640461b5 332 {
bkc_mbed 0:2053640461b5 333 printf("File open error:%s\n", file);
bkc_mbed 0:2053640461b5 334 return -1;
bkc_mbed 0:2053640461b5 335 }
bkc_mbed 0:2053640461b5 336
bkc_mbed 0:2053640461b5 337 fread(nlg_hdr, 0x60, 1, nlg_file);
bkc_mbed 0:2053640461b5 338
bkc_mbed 6:e48296dca6bb 339 if (memcmp(nlg_hdr, "NLG1", 4) != 0)
bkc_mbed 0:2053640461b5 340 {
bkc_mbed 0:2053640461b5 341 printf("Unknown format!\n");
bkc_mbed 0:2053640461b5 342 fclose(nlg_file);
bkc_mbed 0:2053640461b5 343 return -1;
bkc_mbed 0:2053640461b5 344 }
bkc_mbed 0:2053640461b5 345
bkc_mbed 0:2053640461b5 346 nlg_version = ReadWORD(nlg_hdr + 4);
bkc_mbed 0:2053640461b5 347
bkc_mbed 0:2053640461b5 348 memcpy(nlg_title, nlg_hdr + 8, 64);
bkc_mbed 0:2053640461b5 349 nlg_title[64]=0;
bkc_mbed 0:2053640461b5 350
bkc_mbed 0:2053640461b5 351 nlg_baseclk = ReadDWORD(nlg_hdr + 72);
bkc_mbed 0:2053640461b5 352 nlg_tick = ReadDWORD(nlg_hdr + 76);
bkc_mbed 0:2053640461b5 353
bkc_mbed 0:2053640461b5 354 nlg_length = ReadDWORD(nlg_hdr + 88);
bkc_mbed 0:2053640461b5 355 nlg_loop_ptr = (long)ReadDWORD(nlg_hdr + 92);
bkc_mbed 0:2053640461b5 356
bkc_mbed 0:2053640461b5 357 fseek(nlg_file, 0x60, SEEK_SET);
bkc_mbed 0:2053640461b5 358
bkc_mbed 0:2053640461b5 359 nlg_ctc0 = nlg_ctc3 = 0;
bkc_mbed 0:2053640461b5 360
bkc_mbed 0:2053640461b5 361 return 0;
bkc_mbed 0:2053640461b5 362 }
bkc_mbed 0:2053640461b5 363
bkc_mbed 2:f0b7779b03c7 364 #if 0
bkc_mbed 2:f0b7779b03c7 365
bkc_mbed 8:88c89fd324bd 366
bkc_mbed 8:88c89fd324bd 367 // 変数書き出し(WORD)
bkc_mbed 8:88c89fd324bd 368 inline void WriteWORD(byte *p,word val)
bkc_mbed 8:88c89fd324bd 369 {
bkc_mbed 8:88c89fd324bd 370 p[0] = (val & 0xff);
bkc_mbed 8:88c89fd324bd 371 p[1] = ((val>>8) & 0xff);
bkc_mbed 8:88c89fd324bd 372 }
bkc_mbed 8:88c89fd324bd 373
bkc_mbed 8:88c89fd324bd 374 // 変数書き出し(DWORD)
bkc_mbed 8:88c89fd324bd 375 inline void WriteDWORD(byte *p,dword val)
bkc_mbed 8:88c89fd324bd 376 {
bkc_mbed 8:88c89fd324bd 377 p[0] = (val & 0xff);
bkc_mbed 8:88c89fd324bd 378 p[1] = ((val>>8) & 0xff);
bkc_mbed 8:88c89fd324bd 379 p[2] = ((val>>16) & 0xff);
bkc_mbed 8:88c89fd324bd 380 p[3] = ((val>>24) & 0xff);
bkc_mbed 8:88c89fd324bd 381 }
bkc_mbed 8:88c89fd324bd 382
bkc_mbed 0:2053640461b5 383 // 書き込み用NLGファイルを開く
bkc_mbed 0:2053640461b5 384 int CreateNLG(const char *file)
bkc_mbed 0:2053640461b5 385 {
bkc_mbed 0:2053640461b5 386 byte hdr[0x80];
bkc_mbed 0:2053640461b5 387
bkc_mbed 0:2053640461b5 388 nlg_file = fopen(file, "wb");
bkc_mbed 0:2053640461b5 389
bkc_mbed 0:2053640461b5 390 if (!nlg_file)
bkc_mbed 0:2053640461b5 391 {
bkc_mbed 0:2053640461b5 392 printf("File open error:%s\n", file);
bkc_mbed 0:2053640461b5 393 return -1;
bkc_mbed 0:2053640461b5 394 }
bkc_mbed 0:2053640461b5 395
bkc_mbed 0:2053640461b5 396 memset(hdr, 0, 0x80);
bkc_mbed 0:2053640461b5 397 memcpy(hdr,"NLG1",4);
bkc_mbed 0:2053640461b5 398
bkc_mbed 0:2053640461b5 399 WriteWORD(hdr + 4, NLG_VER); // Version
bkc_mbed 0:2053640461b5 400 WriteDWORD(hdr + 72, NLG_BASECLK); // BaseCLK
bkc_mbed 0:2053640461b5 401 WriteDWORD(hdr + 76, 0); // Tick
bkc_mbed 0:2053640461b5 402 WriteDWORD(hdr + 88, 0); // Length
bkc_mbed 0:2053640461b5 403 WriteDWORD(hdr + 92, 0); // Loop Pointer
bkc_mbed 0:2053640461b5 404
bkc_mbed 0:2053640461b5 405 fwrite(hdr, 0x60, 1, nlg_file);
bkc_mbed 0:2053640461b5 406
bkc_mbed 0:2053640461b5 407 nlg_ctc0 = nlg_ctc3 = 0;
bkc_mbed 0:2053640461b5 408
bkc_mbed 0:2053640461b5 409 return 0;
bkc_mbed 0:2053640461b5 410 }
bkc_mbed 0:2053640461b5 411
bkc_mbed 0:2053640461b5 412
bkc_mbed 0:2053640461b5 413 // コマンドの書き込み
bkc_mbed 0:2053640461b5 414 void WriteNLG_CMD(int cmd)
bkc_mbed 0:2053640461b5 415 {
bkc_mbed 0:2053640461b5 416 if (!nlg_file)
bkc_mbed 0:2053640461b5 417 return;
bkc_mbed 0:2053640461b5 418
bkc_mbed 0:2053640461b5 419 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 420 }
bkc_mbed 0:2053640461b5 421
bkc_mbed 0:2053640461b5 422 // CTC定数の書き込み
bkc_mbed 0:2053640461b5 423 void WriteNLG_CTC(int cmd,int ctc)
bkc_mbed 0:2053640461b5 424 {
bkc_mbed 0:2053640461b5 425 if (!nlg_file)
bkc_mbed 0:2053640461b5 426 return;
bkc_mbed 0:2053640461b5 427
bkc_mbed 0:2053640461b5 428 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 429 fputc(ctc, nlg_file);
bkc_mbed 0:2053640461b5 430 }
bkc_mbed 0:2053640461b5 431
bkc_mbed 0:2053640461b5 432 // データの書き込み
bkc_mbed 0:2053640461b5 433 void WriteNLG_Data(int cmd,int addr,int data)
bkc_mbed 0:2053640461b5 434 {
bkc_mbed 0:2053640461b5 435 if (!nlg_file)
bkc_mbed 0:2053640461b5 436 return;
bkc_mbed 0:2053640461b5 437
bkc_mbed 0:2053640461b5 438 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 439 fputc(addr, nlg_file);
bkc_mbed 0:2053640461b5 440 fputc(data, nlg_file);
bkc_mbed 0:2053640461b5 441 }
bkc_mbed 0:2053640461b5 442
bkc_mbed 2:f0b7779b03c7 443 #endif
bkc_mbed 2:f0b7779b03c7 444
bkc_mbed 2:f0b7779b03c7 445 // ファイルを閉じる
bkc_mbed 2:f0b7779b03c7 446 void CloseNLG(void)
bkc_mbed 2:f0b7779b03c7 447 {
bkc_mbed 2:f0b7779b03c7 448 if (!nlg_file)
bkc_mbed 2:f0b7779b03c7 449 return;
bkc_mbed 2:f0b7779b03c7 450
bkc_mbed 2:f0b7779b03c7 451 fclose(nlg_file);
bkc_mbed 8:88c89fd324bd 452
bkc_mbed 2:f0b7779b03c7 453 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
bkc_mbed 2:f0b7779b03c7 454 free(nlg_file);
bkc_mbed 2:f0b7779b03c7 455 #endif
bkc_mbed 2:f0b7779b03c7 456
bkc_mbed 2:f0b7779b03c7 457 nlg_file = NULL;
bkc_mbed 2:f0b7779b03c7 458 }
bkc_mbed 2:f0b7779b03c7 459
bkc_mbed 0:2053640461b5 460 // データの読み出し
bkc_mbed 8:88c89fd324bd 461 inline int ReadNLG(void)
bkc_mbed 0:2053640461b5 462 {
bkc_mbed 0:2053640461b5 463 return fgetc(nlg_file);
bkc_mbed 0:2053640461b5 464 }
bkc_mbed 0:2053640461b5 465
bkc_mbed 0:2053640461b5 466 // ファイルポインタの位置を取得
bkc_mbed 8:88c89fd324bd 467 inline long TellNLG(void)
bkc_mbed 0:2053640461b5 468 {
bkc_mbed 0:2053640461b5 469 return ftell(nlg_file);
bkc_mbed 0:2053640461b5 470 }
bkc_mbed 0:2053640461b5 471
bkc_mbed 0:2053640461b5 472 // ファイルポインタの位置を設定
bkc_mbed 8:88c89fd324bd 473 inline void SeekNLG(long pos)
bkc_mbed 0:2053640461b5 474 {
bkc_mbed 0:2053640461b5 475 fseek(nlg_file, pos, SEEK_SET);
bkc_mbed 0:2053640461b5 476 }
bkc_mbed 0:2053640461b5 477
bkc_mbed 0:2053640461b5 478 // タイトルの取得
bkc_mbed 8:88c89fd324bd 479 inline char *GetTitleNLG(void)
bkc_mbed 0:2053640461b5 480 {
bkc_mbed 0:2053640461b5 481 return nlg_title;
bkc_mbed 0:2053640461b5 482 }
bkc_mbed 0:2053640461b5 483
bkc_mbed 0:2053640461b5 484 // ティックの取得
bkc_mbed 8:88c89fd324bd 485 inline int GetTickNLG(void)
bkc_mbed 0:2053640461b5 486 {
bkc_mbed 0:2053640461b5 487 return nlg_tick;
bkc_mbed 0:2053640461b5 488 }
bkc_mbed 0:2053640461b5 489
bkc_mbed 3:aed228fa3ae4 490 // Set Tick
bkc_mbed 3:aed228fa3ae4 491 inline void SetTick(void)
bkc_mbed 3:aed228fa3ae4 492 {
bkc_mbed 3:aed228fa3ae4 493 nlg_tick = ((nlg_ctc0 * 256) * nlg_ctc3);
bkc_mbed 3:aed228fa3ae4 494 // printf("nlg_tick=%d\n", nlg_tick);
bkc_mbed 3:aed228fa3ae4 495 }
bkc_mbed 3:aed228fa3ae4 496
bkc_mbed 0:2053640461b5 497 // CTC0値の設定
bkc_mbed 0:2053640461b5 498 void SetCTC0_NLG(int value)
bkc_mbed 0:2053640461b5 499 {
bkc_mbed 0:2053640461b5 500 nlg_ctc0 = value;
bkc_mbed 3:aed228fa3ae4 501 SetTick();
bkc_mbed 0:2053640461b5 502 }
bkc_mbed 0:2053640461b5 503
bkc_mbed 0:2053640461b5 504 // CTC3値の設定
bkc_mbed 0:2053640461b5 505 void SetCTC3_NLG(int value)
bkc_mbed 0:2053640461b5 506 {
bkc_mbed 0:2053640461b5 507 nlg_ctc3 = value;
bkc_mbed 3:aed228fa3ae4 508 SetTick();
bkc_mbed 0:2053640461b5 509 }
bkc_mbed 0:2053640461b5 510
bkc_mbed 0:2053640461b5 511 // 曲の長さを得る
bkc_mbed 0:2053640461b5 512 int GetLengthNLG(void)
bkc_mbed 0:2053640461b5 513 {
bkc_mbed 0:2053640461b5 514 return nlg_length;
bkc_mbed 0:2053640461b5 515 }
bkc_mbed 0:2053640461b5 516
bkc_mbed 0:2053640461b5 517 // ループポインタを得る
bkc_mbed 0:2053640461b5 518 int GetLoopPtrNLG(void)
bkc_mbed 0:2053640461b5 519 {
bkc_mbed 0:2053640461b5 520 return nlg_loop_ptr;
bkc_mbed 0:2053640461b5 521 }
bkc_mbed 0:2053640461b5 522
bkc_mbed 0:2053640461b5 523 // ベースクロックを得る
bkc_mbed 0:2053640461b5 524 int GetBaseClkNLG(void)
bkc_mbed 0:2053640461b5 525 {
bkc_mbed 0:2053640461b5 526 return nlg_baseclk;
bkc_mbed 0:2053640461b5 527 }
bkc_mbed 0:2053640461b5 528
bkc_mbed 0:2053640461b5 529 #define CMD_PSG 0x00
bkc_mbed 0:2053640461b5 530 #define CMD_OPM 0x01
bkc_mbed 0:2053640461b5 531 #define CMD_OPM2 0x02
bkc_mbed 0:2053640461b5 532 #define CMD_IRQ 0x80
bkc_mbed 0:2053640461b5 533
bkc_mbed 0:2053640461b5 534 #define CMD_CTC0 0x81
bkc_mbed 0:2053640461b5 535 #define CMD_CTC3 0x82
bkc_mbed 0:2053640461b5 536
bkc_mbed 0:2053640461b5 537
bkc_mbed 0:2053640461b5 538 /* 単位を扱いやすいように */
bkc_mbed 0:2053640461b5 539 typedef unsigned char byte;
bkc_mbed 0:2053640461b5 540 typedef unsigned short word;
bkc_mbed 0:2053640461b5 541 typedef unsigned long dword;
bkc_mbed 0:2053640461b5 542
bkc_mbed 0:2053640461b5 543 /* NLGを処理するための構造体 */
bkc_mbed 0:2053640461b5 544 typedef struct
bkc_mbed 0:2053640461b5 545 {
bkc_mbed 0:2053640461b5 546 int base_clk;
bkc_mbed 0:2053640461b5 547 int clk_per_sample;
bkc_mbed 0:2053640461b5 548
bkc_mbed 0:2053640461b5 549 int freeze;
bkc_mbed 0:2053640461b5 550 int total_samples;
bkc_mbed 0:2053640461b5 551
bkc_mbed 0:2053640461b5 552 int total_sec;
bkc_mbed 0:2053640461b5 553
bkc_mbed 0:2053640461b5 554 int current_samples;
bkc_mbed 0:2053640461b5 555 int tick;
bkc_mbed 0:2053640461b5 556 int tick_sec;
bkc_mbed 0:2053640461b5 557
bkc_mbed 0:2053640461b5 558 int irq_count;
bkc_mbed 0:2053640461b5 559 int irq_loop;
bkc_mbed 0:2053640461b5 560 long loop_address;
bkc_mbed 2:f0b7779b03c7 561
bkc_mbed 1:ec416e6d5739 562 int irq_counter;
bkc_mbed 1:ec416e6d5739 563 int irq_counter2;
bkc_mbed 1:ec416e6d5739 564
bkc_mbed 0:2053640461b5 565 } NLG_R;
bkc_mbed 0:2053640461b5 566
bkc_mbed 0:2053640461b5 567
bkc_mbed 0:2053640461b5 568 /* 初期化 */
bkc_mbed 0:2053640461b5 569 int initNLG(NLG_R *np, const char *nlg_name)
bkc_mbed 0:2053640461b5 570 {
bkc_mbed 0:2053640461b5 571 if (OpenNLG(nlg_name) < 0)
bkc_mbed 0:2053640461b5 572 return -1;
bkc_mbed 0:2053640461b5 573
bkc_mbed 0:2053640461b5 574 np->base_clk = GetBaseClkNLG();
bkc_mbed 0:2053640461b5 575
bkc_mbed 0:2053640461b5 576 /* printf("Title:%s %d %d %dsec %d\n",
bkc_mbed 0:2053640461b5 577 GetTitleNLG(),
bkc_mbed 0:2053640461b5 578 GetBaseClkNLG(),
bkc_mbed 0:2053640461b5 579 GetTickNLG(),
bkc_mbed 0:2053640461b5 580 GetLengthNLG(),
bkc_mbed 0:2053640461b5 581 GetLoopPtrNLG());
bkc_mbed 0:2053640461b5 582 */
bkc_mbed 0:2053640461b5 583
bkc_mbed 0:2053640461b5 584 np->total_samples = 0;
bkc_mbed 0:2053640461b5 585 np->current_samples = 0;
bkc_mbed 0:2053640461b5 586
bkc_mbed 0:2053640461b5 587 np->total_sec = 0;
bkc_mbed 0:2053640461b5 588
bkc_mbed 0:2053640461b5 589 np->tick = 0;
bkc_mbed 0:2053640461b5 590 np->tick_sec = 0;
bkc_mbed 0:2053640461b5 591
bkc_mbed 0:2053640461b5 592 np->freeze = 0;
bkc_mbed 0:2053640461b5 593
bkc_mbed 0:2053640461b5 594 np->irq_count = 0;
bkc_mbed 0:2053640461b5 595 np->irq_loop = GetLoopPtrNLG();
bkc_mbed 0:2053640461b5 596 np->loop_address = -1;
bkc_mbed 2:f0b7779b03c7 597
bkc_mbed 1:ec416e6d5739 598 np->irq_counter = 0;
bkc_mbed 1:ec416e6d5739 599 np->irq_counter2 = 0;
bkc_mbed 0:2053640461b5 600
bkc_mbed 0:2053640461b5 601 return 0;
bkc_mbed 0:2053640461b5 602 }
bkc_mbed 0:2053640461b5 603
bkc_mbed 0:2053640461b5 604 /* PSGへの出力 */
bkc_mbed 0:2053640461b5 605 void WritePSG(int addr,int value)
bkc_mbed 0:2053640461b5 606 {
bkc_mbed 0:2053640461b5 607 regPSGOut(addr, value);
bkc_mbed 0:2053640461b5 608 }
bkc_mbed 0:2053640461b5 609
bkc_mbed 0:2053640461b5 610 /* FM1への出力 */
bkc_mbed 0:2053640461b5 611 void WriteOPM(int addr,int value)
bkc_mbed 0:2053640461b5 612 {
bkc_mbed 0:2053640461b5 613 regFMOut(addr, value);
bkc_mbed 0:2053640461b5 614 }
bkc_mbed 0:2053640461b5 615
bkc_mbed 0:2053640461b5 616 /* FM2への出力 */
bkc_mbed 0:2053640461b5 617 void WriteOPM2(int addr,int value)
bkc_mbed 0:2053640461b5 618 {
bkc_mbed 0:2053640461b5 619 regFM2Out(addr, value);
bkc_mbed 0:2053640461b5 620 }
bkc_mbed 0:2053640461b5 621
bkc_mbed 6:e48296dca6bb 622 // stop flag
bkc_mbed 6:e48296dca6bb 623 bool g_stop = false;
bkc_mbed 6:e48296dca6bb 624 bool g_prev = false;
bkc_mbed 0:2053640461b5 625
bkc_mbed 0:2053640461b5 626 void DispNLG(NLG_R *np)
bkc_mbed 0:2053640461b5 627 {
bkc_mbed 1:ec416e6d5739 628 // printf("Time %02d:%02d\r",np->total_sec / 60, np->total_sec % 60);
bkc_mbed 1:ec416e6d5739 629 // fflush(stdout);
bkc_mbed 0:2053640461b5 630
bkc_mbed 0:2053640461b5 631 char buf[16];
bkc_mbed 2:f0b7779b03c7 632 sprintf(buf, "%02d:%02d",
bkc_mbed 2:f0b7779b03c7 633 np->total_sec / 60,
bkc_mbed 2:f0b7779b03c7 634 np->total_sec % 60);
bkc_mbed 0:2053640461b5 635
bkc_mbed 2:f0b7779b03c7 636 lcd_setCursor(3,1);
bkc_mbed 2:f0b7779b03c7 637 lcd_printStr(buf);
bkc_mbed 0:2053640461b5 638 }
bkc_mbed 0:2053640461b5 639
bkc_mbed 6:e48296dca6bb 640 // wait until release buttons
bkc_mbed 6:e48296dca6bb 641 void waitButtonRelease(void)
bkc_mbed 6:e48296dca6bb 642 {
bkc_mbed 6:e48296dca6bb 643 while(!sw_next || !sw_play || !sw_prev);
bkc_mbed 6:e48296dca6bb 644 }
bkc_mbed 6:e48296dca6bb 645
bkc_mbed 6:e48296dca6bb 646 // wait until press buttons
bkc_mbed 6:e48296dca6bb 647 void waitButtonPress(void)
bkc_mbed 6:e48296dca6bb 648 {
bkc_mbed 6:e48296dca6bb 649 while(sw_next && sw_play && sw_prev);
bkc_mbed 6:e48296dca6bb 650 }
bkc_mbed 6:e48296dca6bb 651
bkc_mbed 0:2053640461b5 652 /* NLGの再生 */
bkc_mbed 0:2053640461b5 653 int PlayNLG(NLG_R *np, int sec)
bkc_mbed 0:2053640461b5 654 {
bkc_mbed 0:2053640461b5 655 int cmd;
bkc_mbed 0:2053640461b5 656 int addr, data;
bkc_mbed 0:2053640461b5 657 int result = 0;
bkc_mbed 0:2053640461b5 658
bkc_mbed 0:2053640461b5 659 int tick;
bkc_mbed 0:2053640461b5 660 int total_us = 0;
bkc_mbed 0:2053640461b5 661 int us_tick = np->base_clk / 1000000;
bkc_mbed 0:2053640461b5 662
bkc_mbed 2:f0b7779b03c7 663 printf("start play\n");
bkc_mbed 0:2053640461b5 664 Timer t;
bkc_mbed 0:2053640461b5 665
bkc_mbed 0:2053640461b5 666 t.start();
bkc_mbed 0:2053640461b5 667 total_us = 0;
bkc_mbed 0:2053640461b5 668
bkc_mbed 0:2053640461b5 669 // wait until release buttons
bkc_mbed 6:e48296dca6bb 670 waitButtonRelease();
bkc_mbed 0:2053640461b5 671
bkc_mbed 0:2053640461b5 672 DispNLG(np);
bkc_mbed 0:2053640461b5 673
bkc_mbed 0:2053640461b5 674 while(np->total_sec < sec && !g_stop)
bkc_mbed 0:2053640461b5 675 {
bkc_mbed 0:2053640461b5 676 // push next
bkc_mbed 0:2053640461b5 677 if (!sw_next)
bkc_mbed 0:2053640461b5 678 break;
bkc_mbed 6:e48296dca6bb 679
bkc_mbed 6:e48296dca6bb 680 // push prev
bkc_mbed 6:e48296dca6bb 681 if (!sw_prev)
bkc_mbed 6:e48296dca6bb 682 {
bkc_mbed 6:e48296dca6bb 683 g_prev = true;
bkc_mbed 6:e48296dca6bb 684 break;
bkc_mbed 6:e48296dca6bb 685 }
bkc_mbed 0:2053640461b5 686
bkc_mbed 0:2053640461b5 687 // push play
bkc_mbed 0:2053640461b5 688 if (!sw_play)
bkc_mbed 0:2053640461b5 689 {
bkc_mbed 6:e48296dca6bb 690 g_stop = true;
bkc_mbed 0:2053640461b5 691 break;
bkc_mbed 0:2053640461b5 692 }
bkc_mbed 0:2053640461b5 693
bkc_mbed 0:2053640461b5 694 /* ウエイトの処理 */
bkc_mbed 0:2053640461b5 695 while (np->tick >= us_tick)
bkc_mbed 0:2053640461b5 696 {
bkc_mbed 0:2053640461b5 697 int us = np->tick / us_tick;
bkc_mbed 0:2053640461b5 698 np->tick -= (us * us_tick);
bkc_mbed 0:2053640461b5 699
bkc_mbed 0:2053640461b5 700 while(t.read_us() < total_us + us);
bkc_mbed 3:aed228fa3ae4 701
bkc_mbed 0:2053640461b5 702 total_us += us;
bkc_mbed 0:2053640461b5 703
bkc_mbed 3:aed228fa3ae4 704 // reset timer
bkc_mbed 0:2053640461b5 705 if (total_us >= 1000000)
bkc_mbed 0:2053640461b5 706 {
bkc_mbed 0:2053640461b5 707 total_us -= t.read_us();
bkc_mbed 0:2053640461b5 708 t.reset();
bkc_mbed 0:2053640461b5 709 }
bkc_mbed 0:2053640461b5 710 // DELAY_NEXT(us);
bkc_mbed 0:2053640461b5 711
bkc_mbed 0:2053640461b5 712 // printf("delay : %dus\n",us);
bkc_mbed 0:2053640461b5 713 }
bkc_mbed 0:2053640461b5 714
bkc_mbed 0:2053640461b5 715 /* コマンドの読み出し */
bkc_mbed 0:2053640461b5 716 cmd = ReadNLG();
bkc_mbed 0:2053640461b5 717 if (cmd == EOF)
bkc_mbed 0:2053640461b5 718 {
bkc_mbed 0:2053640461b5 719 if (np->loop_address >= 0)
bkc_mbed 0:2053640461b5 720 {
bkc_mbed 0:2053640461b5 721 SeekNLG(np->loop_address);
bkc_mbed 0:2053640461b5 722 cmd = ReadNLG();
bkc_mbed 0:2053640461b5 723 }
bkc_mbed 0:2053640461b5 724 else
bkc_mbed 0:2053640461b5 725 {
bkc_mbed 0:2053640461b5 726 result = EOF;
bkc_mbed 0:2053640461b5 727 break;
bkc_mbed 0:2053640461b5 728 }
bkc_mbed 0:2053640461b5 729 }
bkc_mbed 0:2053640461b5 730
bkc_mbed 0:2053640461b5 731 /* コマンドの処理 */
bkc_mbed 0:2053640461b5 732 switch (cmd)
bkc_mbed 0:2053640461b5 733 {
bkc_mbed 0:2053640461b5 734 case CMD_PSG:
bkc_mbed 0:2053640461b5 735 addr = ReadNLG();
bkc_mbed 0:2053640461b5 736 data = ReadNLG();
bkc_mbed 0:2053640461b5 737 WritePSG(addr, data);
bkc_mbed 0:2053640461b5 738 break;
bkc_mbed 0:2053640461b5 739 case CMD_OPM:
bkc_mbed 0:2053640461b5 740 addr = ReadNLG();
bkc_mbed 0:2053640461b5 741 data = ReadNLG();
bkc_mbed 0:2053640461b5 742 WriteOPM(addr, data);
bkc_mbed 0:2053640461b5 743 break;
bkc_mbed 0:2053640461b5 744 case CMD_OPM2:
bkc_mbed 0:2053640461b5 745 addr = ReadNLG();
bkc_mbed 0:2053640461b5 746 data = ReadNLG();
bkc_mbed 0:2053640461b5 747 WriteOPM2(addr, data);
bkc_mbed 0:2053640461b5 748 break;
bkc_mbed 0:2053640461b5 749 case CMD_IRQ:
bkc_mbed 0:2053640461b5 750 tick = GetTickNLG();
bkc_mbed 0:2053640461b5 751 np->tick_sec += tick;
bkc_mbed 0:2053640461b5 752 np->tick += tick;
bkc_mbed 0:2053640461b5 753 np->irq_count++;
bkc_mbed 0:2053640461b5 754 if (np->irq_count == np->irq_loop)
bkc_mbed 0:2053640461b5 755 {
bkc_mbed 0:2053640461b5 756 /* ループ位置の設定 */
bkc_mbed 0:2053640461b5 757 np->loop_address = TellNLG();
bkc_mbed 0:2053640461b5 758 np->loop_address -= 1;
bkc_mbed 0:2053640461b5 759 }
bkc_mbed 1:ec416e6d5739 760 np->irq_counter++;
bkc_mbed 1:ec416e6d5739 761 if (np->irq_counter >= 48)
bkc_mbed 1:ec416e6d5739 762 {
bkc_mbed 1:ec416e6d5739 763 np->irq_counter = 0;
bkc_mbed 1:ec416e6d5739 764 led1 = !led1;
bkc_mbed 1:ec416e6d5739 765
bkc_mbed 1:ec416e6d5739 766 np->irq_counter2++;
bkc_mbed 1:ec416e6d5739 767 if (np->irq_counter2 >= 4)
bkc_mbed 1:ec416e6d5739 768 {
bkc_mbed 1:ec416e6d5739 769 np->irq_counter2 = 0;
bkc_mbed 1:ec416e6d5739 770 led2 = !led2;
bkc_mbed 1:ec416e6d5739 771 }
bkc_mbed 1:ec416e6d5739 772 }
bkc_mbed 0:2053640461b5 773 break;
bkc_mbed 0:2053640461b5 774 case CMD_CTC0:
bkc_mbed 0:2053640461b5 775 SetCTC0_NLG(ReadNLG());
bkc_mbed 0:2053640461b5 776 break;
bkc_mbed 0:2053640461b5 777 case CMD_CTC3:
bkc_mbed 0:2053640461b5 778 SetCTC3_NLG(ReadNLG());
bkc_mbed 0:2053640461b5 779 break;
bkc_mbed 0:2053640461b5 780
bkc_mbed 0:2053640461b5 781 }
bkc_mbed 0:2053640461b5 782 /* 秒情報の表示 */
bkc_mbed 0:2053640461b5 783 while (np->tick_sec >= np->base_clk)
bkc_mbed 0:2053640461b5 784 {
bkc_mbed 0:2053640461b5 785 np->tick_sec -= np->base_clk;
bkc_mbed 0:2053640461b5 786 np->total_sec++;
bkc_mbed 0:2053640461b5 787
bkc_mbed 0:2053640461b5 788 DispNLG(np);
bkc_mbed 0:2053640461b5 789 }
bkc_mbed 0:2053640461b5 790 }
bkc_mbed 0:2053640461b5 791
bkc_mbed 0:2053640461b5 792 return result;
bkc_mbed 0:2053640461b5 793 }
bkc_mbed 0:2053640461b5 794
bkc_mbed 0:2053640461b5 795 NLG_R n;
bkc_mbed 0:2053640461b5 796
bkc_mbed 2:f0b7779b03c7 797 int nlg_play(const char *nlg_file)
bkc_mbed 0:2053640461b5 798 {
bkc_mbed 1:ec416e6d5739 799 printf("nlg_play:%s\n",nlg_file);
bkc_mbed 0:2053640461b5 800
bkc_mbed 0:2053640461b5 801 /* NLGの初期化 */
bkc_mbed 0:2053640461b5 802 if (initNLG(&n, nlg_file) < 0)
bkc_mbed 0:2053640461b5 803 {
bkc_mbed 7:7e183b33c3f9 804 lcd_printStrY(1, " ERROR!!");
bkc_mbed 0:2053640461b5 805 printf("Failed to init.\n");
bkc_mbed 0:2053640461b5 806 return -1;
bkc_mbed 0:2053640461b5 807 }
bkc_mbed 2:f0b7779b03c7 808
bkc_mbed 2:f0b7779b03c7 809 printf("Play..\n");
bkc_mbed 1:ec416e6d5739 810
bkc_mbed 0:2053640461b5 811 /* 再生する */
bkc_mbed 0:2053640461b5 812 PlayNLG(&n, 360);
bkc_mbed 0:2053640461b5 813
bkc_mbed 6:e48296dca6bb 814 /* mute */
bkc_mbed 0:2053640461b5 815 boardMute();
bkc_mbed 0:2053640461b5 816
bkc_mbed 0:2053640461b5 817 /* NLGファイルを閉じる */
bkc_mbed 0:2053640461b5 818 CloseNLG();
bkc_mbed 0:2053640461b5 819
bkc_mbed 0:2053640461b5 820 return 0;
bkc_mbed 0:2053640461b5 821 }
bkc_mbed 0:2053640461b5 822
bkc_mbed 6:e48296dca6bb 823 int get_nlg_file(char *dest, int index)
bkc_mbed 0:2053640461b5 824 {
bkc_mbed 0:2053640461b5 825 char *cwd = "/sd/";
bkc_mbed 0:2053640461b5 826 int count = -1;
bkc_mbed 0:2053640461b5 827 DIR *dir = opendir(cwd);
bkc_mbed 0:2053640461b5 828
bkc_mbed 0:2053640461b5 829 dest[0] = 0;
bkc_mbed 0:2053640461b5 830
bkc_mbed 0:2053640461b5 831 if (dir == NULL)
bkc_mbed 0:2053640461b5 832 {
bkc_mbed 6:e48296dca6bb 833 lcd_printStr2("SD CARD", "ERROR!");
bkc_mbed 0:2053640461b5 834 return -1;
bkc_mbed 0:2053640461b5 835 }
bkc_mbed 0:2053640461b5 836 struct dirent *dent;
bkc_mbed 0:2053640461b5 837
bkc_mbed 0:2053640461b5 838 while(1)
bkc_mbed 0:2053640461b5 839 {
bkc_mbed 0:2053640461b5 840 dent = readdir(dir);
bkc_mbed 0:2053640461b5 841 if (!dent)
bkc_mbed 0:2053640461b5 842 break;
bkc_mbed 0:2053640461b5 843
bkc_mbed 0:2053640461b5 844 // resource or hidden file
bkc_mbed 0:2053640461b5 845 if (dent->d_name[0] == '.')
bkc_mbed 0:2053640461b5 846 continue;
bkc_mbed 0:2053640461b5 847
bkc_mbed 0:2053640461b5 848 char *ext = strrchr(dent->d_name, '.');
bkc_mbed 0:2053640461b5 849 if (!ext)
bkc_mbed 0:2053640461b5 850 continue;
bkc_mbed 0:2053640461b5 851
bkc_mbed 0:2053640461b5 852 if (strcasecmp(ext, ".nlg") != 0)
bkc_mbed 0:2053640461b5 853 continue;
bkc_mbed 0:2053640461b5 854
bkc_mbed 0:2053640461b5 855 if (count < 0)
bkc_mbed 0:2053640461b5 856 count = 0;
bkc_mbed 0:2053640461b5 857
bkc_mbed 0:2053640461b5 858 count++;
bkc_mbed 0:2053640461b5 859
bkc_mbed 0:2053640461b5 860 if (index < 0)
bkc_mbed 0:2053640461b5 861 continue;
bkc_mbed 0:2053640461b5 862
bkc_mbed 0:2053640461b5 863 if (count <= index)
bkc_mbed 0:2053640461b5 864 continue;
bkc_mbed 0:2053640461b5 865
bkc_mbed 0:2053640461b5 866 strcpy(dest, dent->d_name);
bkc_mbed 0:2053640461b5 867 break;
bkc_mbed 0:2053640461b5 868 }
bkc_mbed 0:2053640461b5 869 closedir(dir);
bkc_mbed 0:2053640461b5 870 return count;
bkc_mbed 0:2053640461b5 871 }
bkc_mbed 0:2053640461b5 872
bkc_mbed 6:e48296dca6bb 873
bkc_mbed 6:e48296dca6bb 874 //
bkc_mbed 6:e48296dca6bb 875 // title
bkc_mbed 6:e48296dca6bb 876 //
bkc_mbed 6:e48296dca6bb 877 void putTitle()
bkc_mbed 6:e48296dca6bb 878 {
bkc_mbed 9:834e9eed0d72 879 lcd_printStr2("NBCTRL", "Ver 1.12");
bkc_mbed 7:7e183b33c3f9 880 wait(1.5);
bkc_mbed 6:e48296dca6bb 881 }
bkc_mbed 6:e48296dca6bb 882
bkc_mbed 6:e48296dca6bb 883 //
bkc_mbed 6:e48296dca6bb 884 // main
bkc_mbed 6:e48296dca6bb 885 //
bkc_mbed 0:2053640461b5 886 int main()
bkc_mbed 0:2053640461b5 887 {
bkc_mbed 0:2053640461b5 888 char file[32];
bkc_mbed 3:aed228fa3ae4 889 char path[48];
bkc_mbed 0:2053640461b5 890
bkc_mbed 0:2053640461b5 891 led1 = 0;
bkc_mbed 1:ec416e6d5739 892 led2 = 0;
bkc_mbed 1:ec416e6d5739 893
bkc_mbed 8:88c89fd324bd 894 ioInit();
bkc_mbed 8:88c89fd324bd 895
bkc_mbed 6:e48296dca6bb 896 wait_ms(20);
bkc_mbed 6:e48296dca6bb 897
bkc_mbed 6:e48296dca6bb 898 // reset SHIFT REGISTER
bkc_mbed 7:7e183b33c3f9 899 ioShiftOut((0xFF << 8) | (ACTLOW));
bkc_mbed 4:4dc67a366727 900
bkc_mbed 0:2053640461b5 901 lcd_init();
bkc_mbed 6:e48296dca6bb 902
bkc_mbed 6:e48296dca6bb 903 putTitle();
bkc_mbed 5:27f193e21222 904
bkc_mbed 0:2053640461b5 905 boardInit();
bkc_mbed 0:2053640461b5 906
bkc_mbed 0:2053640461b5 907 int files = 0;
bkc_mbed 0:2053640461b5 908 int disp_mode = 0;
bkc_mbed 0:2053640461b5 909
bkc_mbed 0:2053640461b5 910 if (!sw_next)
bkc_mbed 0:2053640461b5 911 disp_mode = 1;
bkc_mbed 0:2053640461b5 912
bkc_mbed 0:2053640461b5 913 files = get_nlg_file(file, -1);
bkc_mbed 0:2053640461b5 914
bkc_mbed 0:2053640461b5 915 if (disp_mode)
bkc_mbed 3:aed228fa3ae4 916 {
bkc_mbed 0:2053640461b5 917 char buf[16];
bkc_mbed 3:aed228fa3ae4 918 Timer t;
bkc_mbed 3:aed228fa3ae4 919 int result_us = 0;
bkc_mbed 4:4dc67a366727 920 t.reset();
bkc_mbed 3:aed228fa3ae4 921 t.start();
bkc_mbed 3:aed228fa3ae4 922
bkc_mbed 7:7e183b33c3f9 923 // actual timing
bkc_mbed 7:7e183b33c3f9 924 regFMOut(0x20, 0x00);
bkc_mbed 3:aed228fa3ae4 925
bkc_mbed 3:aed228fa3ae4 926 result_us = t.read_us();
bkc_mbed 3:aed228fa3ae4 927 t.stop();
bkc_mbed 4:4dc67a366727 928
bkc_mbed 6:e48296dca6bb 929 printf("result_us=%dus\n", result_us);
bkc_mbed 8:88c89fd324bd 930 sprintf(buf, "R:%dus", result_us);
bkc_mbed 8:88c89fd324bd 931 lcd_printStrY(1, buf);
bkc_mbed 8:88c89fd324bd 932 wait(3);
bkc_mbed 8:88c89fd324bd 933
bkc_mbed 1:ec416e6d5739 934 sprintf(buf, "%8s", __DATE__);
bkc_mbed 1:ec416e6d5739 935 lcd_printStrYscr(1, buf);
bkc_mbed 1:ec416e6d5739 936 wait(3);
bkc_mbed 3:aed228fa3ae4 937
bkc_mbed 0:2053640461b5 938 if (files < 0)
bkc_mbed 1:ec416e6d5739 939 lcd_printStrY(1, "NO FILES");
bkc_mbed 0:2053640461b5 940 else
bkc_mbed 0:2053640461b5 941 {
bkc_mbed 0:2053640461b5 942 char buf[16];
bkc_mbed 1:ec416e6d5739 943 sprintf(buf, "%3dfiles", files);
bkc_mbed 1:ec416e6d5739 944 lcd_printStrY(1, buf);
bkc_mbed 0:2053640461b5 945 }
bkc_mbed 0:2053640461b5 946 wait(3);
bkc_mbed 0:2053640461b5 947 lcd_cls();
bkc_mbed 0:2053640461b5 948 }
bkc_mbed 1:ec416e6d5739 949
bkc_mbed 7:7e183b33c3f9 950 bool repeat_flag = false;
bkc_mbed 0:2053640461b5 951 int idx = 0;
bkc_mbed 0:2053640461b5 952 while(files > 0)
bkc_mbed 0:2053640461b5 953 {
bkc_mbed 2:f0b7779b03c7 954 char buf[16];
bkc_mbed 2:f0b7779b03c7 955
bkc_mbed 0:2053640461b5 956 get_nlg_file(file, idx);
bkc_mbed 0:2053640461b5 957
bkc_mbed 0:2053640461b5 958 sprintf(path, "/sd/%s", file);
bkc_mbed 0:2053640461b5 959 printf("path=%s\n",path);
bkc_mbed 0:2053640461b5 960
bkc_mbed 2:f0b7779b03c7 961 lcd_cls();
bkc_mbed 1:ec416e6d5739 962 lcd_printStrY(0, file);
bkc_mbed 0:2053640461b5 963
bkc_mbed 3:aed228fa3ae4 964 sprintf(buf, "%2d ", idx + 1);
bkc_mbed 2:f0b7779b03c7 965 lcd_printStrY(1, buf);
bkc_mbed 2:f0b7779b03c7 966
bkc_mbed 2:f0b7779b03c7 967 nlg_play(path);
bkc_mbed 0:2053640461b5 968
bkc_mbed 2:f0b7779b03c7 969 // wait for chattering
bkc_mbed 1:ec416e6d5739 970 wait(0.25);
bkc_mbed 6:e48296dca6bb 971
bkc_mbed 6:e48296dca6bb 972 // wait release
bkc_mbed 6:e48296dca6bb 973 waitButtonRelease();
bkc_mbed 6:e48296dca6bb 974
bkc_mbed 6:e48296dca6bb 975 // if play button is pressed
bkc_mbed 0:2053640461b5 976 if (g_stop)
bkc_mbed 0:2053640461b5 977 {
bkc_mbed 6:e48296dca6bb 978 g_stop = false;
bkc_mbed 6:e48296dca6bb 979 g_prev = false;
bkc_mbed 6:e48296dca6bb 980
bkc_mbed 2:f0b7779b03c7 981 lcd_printStrY(1, " STOP ");
bkc_mbed 1:ec416e6d5739 982
bkc_mbed 6:e48296dca6bb 983 // wait any button is pressed
bkc_mbed 6:e48296dca6bb 984 waitButtonPress();
bkc_mbed 1:ec416e6d5739 985
bkc_mbed 7:7e183b33c3f9 986 //
bkc_mbed 7:7e183b33c3f9 987 if (!sw_prev) {
bkc_mbed 2:f0b7779b03c7 988 lcd_printStrY(1, " PREV ");
bkc_mbed 6:e48296dca6bb 989 g_prev = true;
bkc_mbed 2:f0b7779b03c7 990 }
bkc_mbed 7:7e183b33c3f9 991 if (!sw_play)
bkc_mbed 7:7e183b33c3f9 992 {
bkc_mbed 7:7e183b33c3f9 993 lcd_printStrY(1, " PLAY ");
bkc_mbed 7:7e183b33c3f9 994 repeat_flag = true;
bkc_mbed 7:7e183b33c3f9 995 }
bkc_mbed 7:7e183b33c3f9 996 if (!sw_next)
bkc_mbed 2:f0b7779b03c7 997 {
bkc_mbed 2:f0b7779b03c7 998 lcd_printStrY(1, " NEXT ");
bkc_mbed 7:7e183b33c3f9 999 repeat_flag = false;
bkc_mbed 2:f0b7779b03c7 1000 }
bkc_mbed 1:ec416e6d5739 1001
bkc_mbed 1:ec416e6d5739 1002 // wait release
bkc_mbed 6:e48296dca6bb 1003 waitButtonRelease();
bkc_mbed 1:ec416e6d5739 1004
bkc_mbed 1:ec416e6d5739 1005 // reset board
bkc_mbed 1:ec416e6d5739 1006 boardInit();
bkc_mbed 0:2053640461b5 1007 }
bkc_mbed 6:e48296dca6bb 1008
bkc_mbed 6:e48296dca6bb 1009 // play prev or next song
bkc_mbed 6:e48296dca6bb 1010 if (g_prev)
bkc_mbed 1:ec416e6d5739 1011 {
bkc_mbed 6:e48296dca6bb 1012 g_prev = false;
bkc_mbed 6:e48296dca6bb 1013
bkc_mbed 1:ec416e6d5739 1014 if (idx - 1 >= 0)
bkc_mbed 1:ec416e6d5739 1015 idx--;
bkc_mbed 1:ec416e6d5739 1016 else
bkc_mbed 1:ec416e6d5739 1017 idx = files - 1;
bkc_mbed 7:7e183b33c3f9 1018
bkc_mbed 7:7e183b33c3f9 1019 continue;
bkc_mbed 1:ec416e6d5739 1020 }
bkc_mbed 7:7e183b33c3f9 1021
bkc_mbed 7:7e183b33c3f9 1022 if (!repeat_flag)
bkc_mbed 1:ec416e6d5739 1023 {
bkc_mbed 1:ec416e6d5739 1024 if (idx + 1 < files)
bkc_mbed 1:ec416e6d5739 1025 idx++;
bkc_mbed 1:ec416e6d5739 1026 else
bkc_mbed 1:ec416e6d5739 1027 idx = 0;
bkc_mbed 1:ec416e6d5739 1028 }
bkc_mbed 7:7e183b33c3f9 1029 repeat_flag = false;
bkc_mbed 0:2053640461b5 1030 }
bkc_mbed 0:2053640461b5 1031 }