summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2020-07-15 19:40:55 -0400
committerSolomon Peachy <pizza@shaftnet.org>2020-07-24 21:20:13 +0000
commit092c340a2062fa98b7387fc5fd63578ddae7d0b6 (patch)
tree98ec96946eeb2ae709cb0528cc6998e21bb9b290 /apps/plugins
parent17f7cc92c258bc456a27c3e7c5a19c9409851879 (diff)
downloadrockbox-092c340a2062fa98b7387fc5fd63578ddae7d0b6.tar.gz
rockbox-092c340a2062fa98b7387fc5fd63578ddae7d0b6.zip
[1/4] Remove SH support and all archos targets
This removes all code specific to SH targets Change-Id: I7980523785d2596e65c06430f4638eec74a06061
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/SOURCES35
-rw-r--r--apps/plugins/SUBDIRS7
-rw-r--r--apps/plugins/alpine_cdc.c1195
-rw-r--r--apps/plugins/battery_bench.c35
-rw-r--r--apps/plugins/beatbox/beatbox.c14
-rw-r--r--apps/plugins/blackjack.c32
-rw-r--r--apps/plugins/brickmania.c25
-rw-r--r--apps/plugins/bubbles.c1
-rw-r--r--apps/plugins/calculator.c25
-rw-r--r--apps/plugins/calendar.c26
-rw-r--r--apps/plugins/chessbox/chessbox_pgn.h32
-rw-r--r--apps/plugins/chessclock.c35
-rw-r--r--apps/plugins/chip8.c24
-rw-r--r--apps/plugins/chopper.c11
-rw-r--r--apps/plugins/credits.c7
-rw-r--r--apps/plugins/cube.c34
-rw-r--r--apps/plugins/euroconverter.c599
-rw-r--r--apps/plugins/firmware_flash.c1033
-rw-r--r--apps/plugins/flipit.c53
-rw-r--r--apps/plugins/fractals/cpu_sh7043.h96
-rw-r--r--apps/plugins/fractals/fractal.h28
-rw-r--r--apps/plugins/fractals/mandelbrot_set.h9
-rw-r--r--apps/plugins/goban/goban.h21
-rw-r--r--apps/plugins/goban/goban.make9
-rw-r--r--apps/plugins/greyscale.c18
-rw-r--r--apps/plugins/imageviewer/imageviewer_button.h27
-rw-r--r--apps/plugins/imageviewer/jpeg/jpeg_decoder.c18
-rw-r--r--apps/plugins/jewels.c22
-rw-r--r--apps/plugins/lib/SOURCES2
-rw-r--r--apps/plugins/lib/grey_core.c30
-rw-r--r--apps/plugins/lib/grey_draw.c3
-rw-r--r--apps/plugins/lib/grey_sh.S137
-rw-r--r--apps/plugins/lib/helper.c14
-rw-r--r--apps/plugins/lib/pluginlib_actions.c39
-rw-r--r--apps/plugins/lib/xlcd_scroll.c143
-rw-r--r--apps/plugins/lrcplayer.c6
-rw-r--r--apps/plugins/lua/Makefile5
-rw-r--r--apps/plugins/lua/lua.make8
-rw-r--r--apps/plugins/lua/rocklib.c7
-rw-r--r--apps/plugins/minesweeper.c27
-rw-r--r--apps/plugins/nim.c285
-rw-r--r--apps/plugins/oscilloscope.c28
-rw-r--r--apps/plugins/pegbox.c36
-rw-r--r--apps/plugins/pictureflow/pictureflow.c16
-rw-r--r--apps/plugins/pictureflow/pictureflow.make8
-rw-r--r--apps/plugins/plugin.lds2
-rw-r--r--apps/plugins/pong.c18
-rw-r--r--apps/plugins/reversi/reversi-gui.h24
-rw-r--r--apps/plugins/rockblox.c37
-rw-r--r--apps/plugins/rockbox_flash.c967
-rw-r--r--apps/plugins/rockboy/lcd.c153
-rw-r--r--apps/plugins/rockboy/rockboy.c10
-rw-r--r--apps/plugins/rockboy/sys_rockbox.c54
-rw-r--r--apps/plugins/sliding_puzzle.c31
-rw-r--r--apps/plugins/snake.c20
-rw-r--r--apps/plugins/snake2.c22
-rw-r--r--apps/plugins/sokoban.c57
-rw-r--r--apps/plugins/solitaire.c47
-rw-r--r--apps/plugins/spacerocks.c22
-rw-r--r--apps/plugins/splitedit.c64
-rw-r--r--apps/plugins/star.c38
-rw-r--r--apps/plugins/starfield.c12
-rw-r--r--apps/plugins/stopwatch.c26
-rw-r--r--apps/plugins/sudoku/sudoku.h27
-rw-r--r--apps/plugins/test_scanrate.c6
-rw-r--r--apps/plugins/text_viewer/tv_button.h40
-rw-r--r--apps/plugins/video.c1030
-rw-r--r--apps/plugins/vu_meter.c38
-rw-r--r--apps/plugins/wavplay.c3676
-rw-r--r--apps/plugins/wavrecord.c3811
-rw-r--r--apps/plugins/wormlet.c32
-rw-r--r--apps/plugins/xobox.c18
-rw-r--r--apps/plugins/zxbox/keymaps.h18
-rw-r--r--apps/plugins/zxbox/zxbox_keyb.c28
74 files changed, 83 insertions, 14510 deletions
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 9e153a3c96..197f58ef5c 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -86,7 +86,7 @@ wolf3d.c
86 86
87#if PLUGIN_BUFFER_SIZE <= 0x20000 && defined(HAVE_LCD_BITMAP) 87#if PLUGIN_BUFFER_SIZE <= 0x20000 && defined(HAVE_LCD_BITMAP)
88 88
89#if CONFIG_KEYPAD != ONDIO_PAD && CONFIG_KEYPAD != SANSA_M200_PAD \ 89#if CONFIG_KEYPAD != SANSA_M200_PAD \
90 && CONFIG_KEYPAD != HM60X_PAD 90 && CONFIG_KEYPAD != HM60X_PAD
91/* not enough buttons for rockboy */ 91/* not enough buttons for rockboy */
92rockboy.c 92rockboy.c
@@ -106,44 +106,16 @@ pictureflow.c
106splitedit.c 106splitedit.c
107#endif 107#endif
108 108
109#if CONFIG_LCD == LCD_SSD1815
110video.c
111#endif
112
113#endif /* HWCODEC */ 109#endif /* HWCODEC */
114 110
115
116#if defined(ARCHOS_PLAYER) || defined(ARCHOS_RECORDER) || \
117 defined(ARCHOS_FMRECORDER) || defined(ARCHOS_RECORDERV2)
118alpine_cdc.c
119#endif
120
121#if defined(ARCHOS_PLAYER) || defined(ARCHOS_RECORDER) || \
122 defined(ARCHOS_FMRECORDER) || defined(ARCHOS_RECORDERV2) || \
123 defined(ARCHOS_ONDIOFM) || defined(ARCHOS_ONDIOSP)
124firmware_flash.c
125#endif
126
127#if defined(IRIVER_H100_SERIES) 111#if defined(IRIVER_H100_SERIES)
128iriver_flash.c 112iriver_flash.c
129#endif 113#endif
130 114
131#if (CONFIG_CPU == SH7034)
132rockbox_flash.c
133#endif /* CONFIG_CPU */
134
135#if defined(IPOD_NANO2G) 115#if defined(IPOD_NANO2G)
136crypt_firmware.c 116crypt_firmware.c
137#endif 117#endif
138 118
139#if ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F))
140wavplay.c
141#endif
142
143#if (CONFIG_CODEC == MAS3587F)
144wavrecord.c
145#endif
146
147#endif /* PLATFORM_NATIVE */ 119#endif /* PLATFORM_NATIVE */
148 120
149metronome.c 121metronome.c
@@ -217,11 +189,6 @@ rocklife.c
217 189
218#endif /* HAVE_LCD_BITMAP */ 190#endif /* HAVE_LCD_BITMAP */
219 191
220#ifdef HAVE_LCD_CHARCELLS /* Archos Player model only */
221euroconverter.c
222nim.c
223#endif /* HAVE_LCD_CHARCELLS */
224
225#if LCD_DEPTH > 1 /* non-mono bitmap targets */ 192#if LCD_DEPTH > 1 /* non-mono bitmap targets */
226 193
227matrix.c 194matrix.c
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index ecface0e40..5fd2d433c7 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -24,8 +24,7 @@ sdl
24puzzles 24puzzles
25#endif 25#endif
26 26
27#if (CONFIG_KEYPAD != ONDIO_PAD) /* not enough buttons */ \ 27#if (CONFIG_KEYPAD != SANSA_M200_PAD) /* not enough buttons */ \
28 && (CONFIG_KEYPAD != SANSA_M200_PAD) /* not enough buttons */ \
29 && (CONFIG_KEYPAD != HM60X_PAD) /* not enough buttons */ \ 28 && (CONFIG_KEYPAD != HM60X_PAD) /* not enough buttons */ \
30 && (LCD_PIXELFORMAT != HORIZONTAL_PACKING) /* TODO */ \ 29 && (LCD_PIXELFORMAT != HORIZONTAL_PACKING) /* TODO */ \
31 && (LCD_PIXELFORMAT != VERTICAL_INTERLEAVED) /* TODO */ \ 30 && (LCD_PIXELFORMAT != VERTICAL_INTERLEAVED) /* TODO */ \
@@ -48,11 +47,7 @@ imageviewer
48sudoku 47sudoku
49reversi 48reversi
50goban 49goban
51
52/* setjmp/longjmp are not implemented on sh */
53#if (CONFIG_CPU != SH7034)
54frotz 50frotz
55#endif
56 51
57#ifndef OLYMPUS_MROBE_500 52#ifndef OLYMPUS_MROBE_500
58#if PLUGIN_BUFFER_SIZE > 0x40000 || PLUGIN_BUFFER_SIZE <= 0x20000 /* overlay */ 53#if PLUGIN_BUFFER_SIZE > 0x40000 || PLUGIN_BUFFER_SIZE <= 0x20000 /* overlay */
diff --git a/apps/plugins/alpine_cdc.c b/apps/plugins/alpine_cdc.c
deleted file mode 100644
index 93d9418f65..0000000000
--- a/apps/plugins/alpine_cdc.c
+++ /dev/null
@@ -1,1195 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 *
11 * Copyright (C) 2003-2005 Jörg Hohensohn
12 *
13 * Alpine CD changer Project
14 * This is a feasibility study for Archos emulating an Alpine M-Bus CD changer.
15 *
16 * Currently it will do seeks and change tracks, but nothing like disks.
17 * The debug version shows a dump of the M-Bus communication on screen.
18 *
19 * Usage: Start plugin, it will stay in the background and do the emulation.
20 * You need to make an adapter with an 8-pin DIN plug for the radio at one end
21 * and a 4-ring 3.5 mm plug for the Archos headphone jack at the other.
22 * The Archos remote pin connects to the M-Bus, audio as usual.
23 *
24 * This program is free software; you can redistribute it and/or
25 * modify it under the terms of the GNU General Public License
26 * as published by the Free Software Foundation; either version 2
27 * of the License, or (at your option) any later version.
28 *
29 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
30 * KIND, either express or implied.
31 *
32 ****************************************************************************/
33
34#include "plugin.h"
35
36#ifdef HAVE_LCD_CHARCELLS /* player model */
37#define LINES 2
38#define COLUMNS 11
39#else /* recorder models */
40#define LINES 8
41#define COLUMNS 32 /* can't really tell for proportional font */
42#endif
43
44/****************** imports ******************/
45
46#include "sh7034.h"
47#include "system.h"
48
49/****************** constants ******************/
50
51/* measured bit time on the M-Bus is 3.075 ms = 325.2 Hz */
52#define MBUS_BAUDRATE 3252 /* make it 10 * bittime */
53#define MBUS_STEP_FREQ (MBUS_BAUDRATE/2) /* 5 steps per bit */
54#define MBUS_BIT_FREQ (MBUS_BAUDRATE/10) /* the true bit frequency again */
55
56#define MBUS_MAX_SIZE 16 /* maximum length of an M-Bus packet, incl. checksum */
57#define MBUS_RCV_QUEUESIZE 4 /* how many packets can be queued by receiver */
58
59#define ERI1 (*((volatile unsigned long*)0x090001A0)) /* RX error */
60#define RXI1 (*((volatile unsigned long*)0x090001A4)) /* RX */
61
62#define PB10 0x0400
63
64/* receive status */
65#define RX_BUSY 0 /* reception in progress */
66#define RX_RECEIVED 1 /* valid data available */
67#define RX_FRAMING 2 /* frame error */
68#define RX_OVERRUN 3 /* receiver overrun */
69#define RX_PARITY 4 /* parity error */
70#define RX_SYMBOL 5 /* invalid bit timing */
71#define RX_OVERFLOW 6 /* buffer full */
72#define RX_OVERLAP 7 /* receive interrupt while transmitting */
73
74/* timer operation mode */
75#define TM_OFF 0 /* not in use */
76#define TM_TRANSMIT 1 /* periodic timer to transmit */
77#define TM_RX_TIMEOUT 2 /* single shot for receive timeout */
78
79/* emulation play state */
80#define EMU_IDLE 0
81#define EMU_PREPARING 1
82#define EMU_STOPPED 2
83#define EMU_PAUSED 3
84#define EMU_PLAYING 4
85#define EMU_SPINUP 5
86#define EMU_FF 6
87#define EMU_FR 7
88
89
90/****************** prototypes ******************/
91
92void timer_init(unsigned hz, unsigned to); /* setup static timer registers and values */
93void timer_set_mode(int mode); /* define for what the timer should be used right now */
94void timer4_isr(void); /* IMIA4 ISR */
95
96void transmit_isr(void); /* 2nd level ISR for M-Bus transmission */
97
98void uart_init(unsigned baudrate); /* UART setup */
99void uart_rx_isr(void) __attribute__((interrupt_handler)); /* RXI1 ISR */
100void uart_err_isr(void) __attribute__((interrupt_handler)); /* ERI1 ISR */
101void receive_timeout_isr(void); /* 2nd level ISR for receiver timeout */
102
103void mbus_init(void); /* prepare the M-Bus layer */
104int mbus_send(unsigned char* p_msg, int digits); /* packet send */
105int mbus_receive(unsigned char* p_msg, unsigned bufsize, int timeout); /* packet receive */
106
107unsigned char calc_checksum(unsigned char* p_msg, int digits); /* make M-Bus checksum */
108bool bit_test(unsigned char* buf, unsigned bit); /* test one bit of M-Bus packet */
109void bit_set(unsigned char* buf, unsigned bit, bool val); /* set/clear one bit of M-Bus packet */
110
111void print_scroll(char* string); /* implements a scrolling screen */
112void dump_packet(char* dest, int dst_size, char* src, int n); /* convert packet to ASCII */
113
114void emu_init(void); /* init changer emulation */
115void emu_process_packet(unsigned char* mbus_msg, int msg_size); /* feed a received radio packet */
116void emu_tick(void); /* for regular actions of the emulator */
117
118int get_playtime(void); /* return the current track time in seconds */
119int get_tracklength(void); /* return the total length of the current track */
120void set_track(int selected);
121int get_track(void); /* return the track number */
122void set_play(void); /* start or resume playback */
123void set_pause(void); /* pause playback */
124void set_stop(void); /* stop playback */
125void set_position(int seconds); /* seek */
126void get_playmsg(void); /* update the play message with Rockbox info */
127void get_diskmsg(void); /* update the disk status message with Rockbox info */
128
129void sound_neutral(void); /* set to everything flat and 0 dB volume */
130void sound_normal(void); /* return to user settings */
131
132void thread(void); /* the thread running it all */
133int main(const void* parameter); /* main loop */
134enum plugin_status plugin_start(const void* parameter); /* entry */
135
136
137/****************** data types ******************/
138
139/* one entry in the receive queue */
140typedef struct
141{
142 unsigned char buf[MBUS_MAX_SIZE]; /* message buffer */
143 unsigned size; /* length of data in the buffer */
144 unsigned error; /* error code from reception */
145} t_rcv_queue_entry;
146
147
148/****************** globals ******************/
149
150
151/* information owned by the timer transmit ISR */
152struct
153{
154 unsigned char send_buf[MBUS_MAX_SIZE]; /* M-Bus message */
155 unsigned send_size; /* current length of data in the buffer */
156 unsigned index; /* index for which byte to send */
157 unsigned byte; /* which byte to send */
158 unsigned bitmask; /* which bit to send */
159 unsigned step; /* where in the pulse are we */
160 bool bit; /* currently sent bit */
161 bool collision; /* set if a collision happened */
162 bool busy; /* flag if in transmission */
163} gSendIRQ;
164
165
166/* information owned by the UART receive ISR */
167struct
168{
169 t_rcv_queue_entry queue[MBUS_RCV_QUEUESIZE]; /* M-Bus message queue */
170 unsigned buf_read; /* readout maintained by the user application */
171 unsigned buf_write; /* writing maintained by ISR */
172 bool overflow; /* indicate queue overflow */
173 unsigned byte; /* currently assembled byte */
174 unsigned bit; /* which bit to receive */
175} gRcvIRQ;
176
177
178/* information owned by the timer */
179struct
180{
181 unsigned mode; /* off, transmit, receive timout */
182 unsigned transmit; /* value for transmit */
183 unsigned timeout; /* value for receive timeout */
184} gTimer;
185
186
187/* information owned by the changer emulation */
188struct
189{
190 unsigned char playmsg[15]; /* current play state msg */
191 unsigned char changemsg[11]; /* changing message */
192 unsigned char diskmsg[12]; /* disk status message */
193 long poll_interval; /* call the emu each n ticks */
194 int time; /* seconds within the song */
195 int set_state; /* the desired state to change into */
196} gEmu;
197
198
199/* communication to the worker thread */
200struct
201{
202 bool foreground; /* set as long as we're owning the UI */
203 bool exiting; /* signal to the thread that we want to exit */
204 unsigned int thread; /* worker thread id */
205} gTread;
206
207
208/****************** implementation ******************/
209
210
211/* setup static timer registers and values */
212void timer_init(unsigned hz, unsigned to)
213{
214 rb->memset(&gTimer, 0, sizeof(gTimer));
215
216 gTimer.transmit = TIMER_FREQ / hz; /* time for bit transitions */
217 gTimer.timeout = TIMER_FREQ / to; /* time for receive timeout */
218}
219
220
221/* define for what the timer should be used right now */
222void timer_set_mode(int mode)
223{
224 TCNT4 = 0; /* start counting at 0 */
225 gTimer.mode = mode; /* store the mode */
226
227 if (mode == TM_RX_TIMEOUT)
228 {
229 rb->timer_register(1, NULL, gTimer.timeout, timer4_isr IF_COP(, CPU));
230 IPRD = (IPRD & 0xFF0F) | 11 << 4; /* interrupt priority */
231 }
232 else if (mode == TM_TRANSMIT)
233 {
234 rb->timer_register(1, NULL, gTimer.transmit, timer4_isr IF_COP(, CPU));
235 IPRD = (IPRD & 0xFF0F) | 14 << 4; /* interrupt priority */
236 }
237 else
238 {
239 rb->timer_unregister();
240 }
241}
242
243
244void timer4_isr(void) /* IMIA4 */
245{
246 switch (gTimer.mode)
247 { /* distribute the interrupt */
248 case TM_TRANSMIT:
249 transmit_isr();
250 break;
251 case TM_RX_TIMEOUT:
252 receive_timeout_isr();
253 rb->timer_unregister(); /* single shot */
254 break;
255 default:
256 timer_set_mode(TM_OFF); /* spurious interrupt */
257 } /* switch */
258}
259
260
261/* About Alpine M-Bus
262 * ------------------
263 *
264 * The protocol uses a single wire in half duplex mode.
265 * A bit like I2C, this wire is either pulled low or left floating high.
266 * Bit time is ~3 ms, a "zero" is coded as ~0.6 ms low, a "one" as ~1.8 ms low.
267 * Nice to view in a 0.6 ms grid:
268 *
269 * 0 0.6 1.2 1.8 2.4 3.0
270 * | | | | | |
271 * __ ___________________
272 * \____/ \ "zero" bit
273 * __ _________
274 * \______________/ \ "one" bit
275 *
276 * So I send out the data in a timer interrupt spawned to 0.6 ms.
277 * In phases where the line is floating high, I can check for collisions.
278 * (happens if the other side driving it low, too.)
279 *
280 * Data is transmitted in multiples of 4 bit, to ease BCD representation.
281 */
282
283
284/* 2nd level ISR for M-Bus transmission */
285void transmit_isr(void)
286{
287 bool exit = false;
288
289 TSR4 &= ~0x01; /* clear the interrupt */
290
291 switch(gSendIRQ.step++)
292 {
293 case 0:
294 and_b(~0x04, &PBDRH); /* low (read-modify-write access may have changed it while it was input) */
295 or_b(0x04, &PBIORH); /* drive low (output) */
296 break;
297 case 1: /* 0.6 ms */
298 if (!gSendIRQ.bit) /* sending "zero"? */
299 and_b(~0x04, &PBIORH); /* float (input) */
300 break;
301 case 2: /* 1.2 ms */
302 if (!gSendIRQ.bit && ((PBDR & PB10) == 0))
303 gSendIRQ.collision = true;
304 break;
305 case 3: /* 1.8 ms */
306 if (gSendIRQ.bit) /* sending "one"? */
307 and_b(~0x04, &PBIORH); /* float (input) */
308 else if ((PBDR & PB10) == 0)
309 gSendIRQ.collision = true;
310 break;
311 case 4: /* 2.4 ms */
312 if ((PBDR & PB10) == 0)
313 gSendIRQ.collision = true;
314
315 /* prepare next round */
316 gSendIRQ.step = 0;
317 gSendIRQ.bitmask >>= 1;
318 if (gSendIRQ.bitmask)
319 { /* new bit */
320 gSendIRQ.bit = (gSendIRQ.byte & gSendIRQ.bitmask) != 0;
321 }
322 else
323 { /* new byte */
324 if (++gSendIRQ.index < gSendIRQ.send_size)
325 {
326 gSendIRQ.bitmask = 0x08;
327 gSendIRQ.byte = gSendIRQ.send_buf[gSendIRQ.index];
328 gSendIRQ.bit = (gSendIRQ.byte & gSendIRQ.bitmask) != 0;
329 }
330 else
331 exit = true; /* done */
332 }
333 break;
334 }
335
336 if (exit || gSendIRQ.collision)
337 { /* stop transmission */
338 or_b(0x20, PBCR1_ADDR+1); /* RxD1 again for PB10 */
339 timer_set_mode(TM_OFF); /* stop the timer */
340 gSendIRQ.busy = false; /* do this last, to avoid race conditions */
341 }
342}
343
344
345/* For receiving, I use the "normal" serial RX feature of the CPU,
346 * so we can receive within an interrupt, no line polling necessary.
347 * Luckily, the M-Bus bit always starts with a falling edge and ends with a high,
348 * this matches with the start bit and the stop bit of a serial transmission.
349 * The baudrate is set such that the M-Bus bit time (ca. 3ms) matches
350 * the serial reception time of one byte, so we receive one byte per
351 * M-Bus bit.
352 * Start bit, 8 data bits and stop bit (total=10) nicely fall into the 5
353 * phases like above:
354 *
355 * 0 0.6 1.2 1.8 2.4 3.0 ms
356 * | | | | | | time
357 * __ _______________________________
358 * \_______/ \ "zero" bit
359 * __ _______________
360 * \_______________________/ \ "one" bit
361 *
362 * | | | | | | | | | | | serial sampling interval
363 * Start 0 1 2 3 4 5 6 7 Stop bit (LSB first!)
364 *
365 * By looking at the bit pattern in the serial byte we can distinguish
366 * the short low from the longer low, tell "zero" and "one" apart.
367 * So we receive 0xFE for a "zero", 0xE0 for a "one".
368 * It may be necessary to treat the bits next to transitions as don't care,
369 * in case the timing is not so accurate.
370 * Bits are always sent "back-to-back", so I detect the packet end by timeout.
371 */
372
373
374void uart_init(unsigned baudrate)
375{
376 RXI1 = (unsigned long)uart_rx_isr; /* install ISR */
377 ERI1 = (unsigned long)uart_err_isr; /* install ISR */
378
379 SCR1 = 0x00; /* disable everything; select async mode with SCK pin as I/O */
380 SMR1 = 0x00; /* async, 8N1, NoMultiProc, sysclock/1 */
381 BRR1 = ((FREQ/(32*baudrate))-1);
382
383 IPRE = (IPRE & ~0xf000) | 0xc000; /* interrupt on level 12 */
384
385 rb->sleep(1); /* hardware needs to settle for at least one bit interval */
386
387 and_b(~(SCI_RDRF | SCI_ORER | SCI_FER | SCI_PER), &SSR1); /* clear any receiver flag */
388 or_b(SCI_RE | SCI_RIE , &SCR1); /* enable the receiver with interrupt */
389}
390
391
392void uart_rx_isr(void) /* RXI1 */
393{
394 unsigned char data;
395 t_rcv_queue_entry* p_entry = &gRcvIRQ.queue[gRcvIRQ.buf_write]; /* short cut */
396
397 data = RDR1; /* get data */
398
399 and_b(~SCI_RDRF, &SSR1); /* clear data received flag */
400
401 if (gTimer.mode == TM_TRANSMIT)
402 p_entry->error = RX_OVERLAP; /* oops, we're also transmitting, stop */
403 else
404 timer_set_mode(TM_RX_TIMEOUT); /* (re)spawn timeout */
405
406 if (p_entry->error != RX_BUSY)
407 return;
408
409 if ((data & ~0x00) == 0xFE) /* 01111111 in line order (reverse) */
410 { /* "zero" received */
411 gRcvIRQ.byte <<= 1;
412 }
413 else if ((data & ~0x00) == 0xE0) /* 00000111 in line order (reverse) */
414 { /* "one" received */
415 gRcvIRQ.byte = gRcvIRQ.byte << 1 | 0x01;
416 }
417 else
418 { /* unrecognized pulse */
419 p_entry->error = RX_SYMBOL;
420 }
421
422 if (p_entry->error == RX_BUSY)
423 {
424 if (++gRcvIRQ.bit >= 4)
425 { /* byte completed */
426 if (p_entry->size >= sizeof(p_entry->buf))
427 {
428 p_entry->error = RX_OVERFLOW; /* buffer full */
429 }
430 else
431 {
432 p_entry->buf[p_entry->size] = gRcvIRQ.byte;
433 gRcvIRQ.byte = 0;
434 gRcvIRQ.bit = 0;
435 p_entry->size++;
436 }
437 }
438 }
439}
440
441
442void uart_err_isr(void) /* ERI1 */
443{
444 t_rcv_queue_entry* p_entry = &gRcvIRQ.queue[gRcvIRQ.buf_write]; /* short cut */
445
446 if (p_entry->error == RX_BUSY)
447 { /* terminate reception in case of error */
448 if (SSR1 & SCI_FER)
449 p_entry->error = RX_FRAMING;
450 else if (SSR1 & SCI_ORER)
451 p_entry->error = RX_OVERRUN;
452 else if (SSR1 & SCI_PER)
453 p_entry->error = RX_PARITY;
454 }
455
456 /* clear any receiver flag */
457 and_b(~(SCI_RDRF | SCI_ORER | SCI_FER | SCI_PER), &SSR1);
458}
459
460
461/* 2nd level ISR for receiver timeout, this finalizes reception */
462void receive_timeout_isr(void)
463{
464 t_rcv_queue_entry* p_entry = &gRcvIRQ.queue[gRcvIRQ.buf_write]; /* short cut */
465
466 timer_set_mode(TM_OFF); /* single shot */
467
468 if (p_entry->error == RX_BUSY) /* everthing OK so far? */
469 p_entry->error = RX_RECEIVED; /* end with valid data */
470
471 /* move to next queue entry */
472 gRcvIRQ.buf_write++;
473 if (gRcvIRQ.buf_write >= MBUS_RCV_QUEUESIZE)
474 gRcvIRQ.buf_write = 0;
475 p_entry = &gRcvIRQ.queue[gRcvIRQ.buf_write];
476
477 if (gRcvIRQ.buf_write == gRcvIRQ.buf_read)
478 { /* queue overflow */
479 gRcvIRQ.overflow = true;
480 /* what can I do? Continueing overwrites the oldest. */
481 }
482
483 gRcvIRQ.byte = 0;
484 gRcvIRQ.bit = 0;
485 p_entry->size = 0;
486 p_entry->error = RX_BUSY; /* enable receive on new entry */
487}
488
489
490/* generate the checksum */
491unsigned char calc_checksum(unsigned char* p_msg, int digits)
492{
493 int chk = 0;
494 int i;
495
496 for (i=0; i<digits; i++)
497 {
498 chk ^= p_msg[i];
499 }
500 chk = (chk+1) % 16;
501
502 return chk;
503}
504
505
506/****************** high-level M-Bus functions ******************/
507
508void mbus_init(void)
509{
510 /* init the send object */
511 rb->memset(&gSendIRQ, 0, sizeof(gSendIRQ));
512 timer_init(MBUS_STEP_FREQ, (MBUS_BIT_FREQ*10)/15); /* setup frequency and timeout (1.5 bit) */
513
514 /* init receiver */
515 rb->memset(&gRcvIRQ, 0, sizeof(gRcvIRQ));
516 uart_init(MBUS_BAUDRATE);
517}
518
519
520/* send out a number of BCD digits (one per byte) with M-Bus protocol */
521int mbus_send(unsigned char* p_msg, int digits)
522{
523 /* wait for previous transmit/receive to end */
524 while(gTimer.mode != TM_OFF) /* wait for "free line" */
525 rb->sleep(1);
526
527 /* fill in our part */
528 rb->memcpy(gSendIRQ.send_buf, p_msg, digits);
529
530 /* add checksum */
531 gSendIRQ.send_buf[digits] = calc_checksum(p_msg, digits);
532 digits++;
533
534 /* debug dump, to be removed */
535 if (gTread.foreground)
536 {
537 char buf[MBUS_MAX_SIZE+1];
538 dump_packet(buf, sizeof(buf), gSendIRQ.send_buf, digits);
539 /*print_scroll(buf); */
540 }
541
542 gSendIRQ.send_size = digits;
543
544 /* prepare everything so the ISR can start right away */
545 gSendIRQ.index = 0;
546 gSendIRQ.byte = gSendIRQ.send_buf[0];
547 gSendIRQ.bitmask = 0x08;
548 gSendIRQ.step = 0;
549 gSendIRQ.bit = (gSendIRQ.byte & gSendIRQ.bitmask) != 0;
550 gSendIRQ.collision = false;
551 gSendIRQ.busy = true;
552
553 /* last chance to wait for a new detected receive to end */
554 while(gTimer.mode != TM_OFF) /* wait for "free line" */
555 rb->sleep(1);
556
557 and_b(~0x30, PBCR1_ADDR+1); /* GPIO for PB10 */
558 timer_set_mode(TM_TRANSMIT); /* run */
559
560 /* make the call blocking until sent out */
561 rb->sleep(digits*4*HZ/MBUS_BIT_FREQ); /* should take this long */
562
563 while(gSendIRQ.busy) /* poll in case it lasts longer */
564 rb->sleep(1); /* (should not happen) */
565
566 /* debug output, to be removed */
567 if (gTread.foreground)
568 {
569 if (gSendIRQ.collision)
570 print_scroll("collision");
571 }
572
573 return gSendIRQ.collision;
574}
575
576
577/* returns the size of message copy, 0 if timed out, negative on error */
578int mbus_receive(unsigned char* p_msg, unsigned bufsize, int timeout)
579{
580 int retval = 0;
581
582 do
583 {
584 if (gRcvIRQ.buf_read != gRcvIRQ.buf_write)
585 { /* something in the queue */
586 t_rcv_queue_entry* p_entry = &gRcvIRQ.queue[gRcvIRQ.buf_read]; /* short cut */
587
588 if (p_entry->error == RX_RECEIVED)
589 { /* seems valid */
590 rb->memcpy(p_msg, p_entry->buf, MIN(p_entry->size, bufsize));
591 retval = p_entry->size; /* return message size */
592 }
593 else
594 { /* an error occured */
595 retval = - p_entry->error; /* return negative number */
596 }
597
598 /* next queue readout position */
599 gRcvIRQ.buf_read++;
600 if (gRcvIRQ.buf_read >= MBUS_RCV_QUEUESIZE)
601 gRcvIRQ.buf_read = 0;
602
603 return retval; /* exit */
604 }
605
606 if (timeout != 0 || gTimer.mode != TM_OFF) /* also carry on if reception in progress */
607 {
608 if (timeout != -1 && timeout != 0) /* if not infinite or expired */
609 timeout--;
610
611 rb->sleep(1); /* wait a while */
612 }
613
614 } while (timeout != 0 || gTimer.mode != TM_OFF);
615
616 return 0; /* timeout */
617}
618
619
620/****************** MMI helper fuctions ******************/
621
622
623void print_scroll(char* string)
624{
625 static char screen[LINES][COLUMNS+1]; /* visible strings */
626 static unsigned pos = 0; /* next print position */
627 static unsigned screentop = 0; /* for scrolling */
628
629 if (!gTread.foreground)
630 return; /* just to protect careless callers */
631
632 if (pos >= LINES)
633 { /* need to scroll first */
634 int i;
635 rb->lcd_clear_display();
636 screentop++;
637 for (i=0; i<LINES-1; i++)
638 rb->lcd_puts(0, i, screen[(i+screentop) % LINES]);
639
640 pos = LINES-1;
641 }
642
643 /* no strncpy avail. */
644 rb->snprintf(screen[(pos+screentop) % LINES], sizeof(screen[0]), "%s", string);
645
646 rb->lcd_puts(0, pos, screen[(pos+screentop) % LINES]);
647 rb->lcd_update();
648 pos++;
649}
650
651
652void dump_packet(char* dest, int dst_size, char* src, int n)
653{
654 int i;
655 int len = MIN(dst_size-1, n);
656
657 for (i=0; i<len; i++)
658 { /* convert to hex digits */
659 dest[i] = src[i] < 10 ? '0' + src[i] : 'A' + src[i] - 10;
660 }
661 dest[i] = '\0'; /* zero terminate string */
662}
663
664
665/****************** CD changer emulation ******************/
666
667bool bit_test(unsigned char* buf, unsigned bit)
668{
669 return (buf[bit>>2] & BIT_N(bit&3)) != 0;
670}
671
672
673void bit_set(unsigned char* buf, unsigned bit, bool val)
674{
675 if (val)
676 buf[bit>>2] |= BIT_N(bit&3);
677 else
678 buf[bit>>2] &= ~BIT_N(bit&3);
679}
680
681
682void emu_init(void)
683{
684 rb->memset(&gEmu, 0, sizeof(gEmu));
685
686 gEmu.poll_interval = HZ;
687
688 /* init the play message to 990000000000000 */
689 gEmu.playmsg[0] = gEmu.playmsg[1] = 0x9;
690
691 /* init the changing message to 9B900000001 */
692 gEmu.changemsg[0] = gEmu.changemsg[2] = 0x9;
693 gEmu.changemsg[1] = 0xB;
694 gEmu.changemsg[10] = 0x1;
695
696 /* init the disk status message to 9C1019999990 */
697 rb->memset(&gEmu.diskmsg, 0x9, sizeof(gEmu.diskmsg));
698 gEmu.diskmsg[1] = 0xC;
699 gEmu.diskmsg[2] = gEmu.diskmsg[4] = 0x1;
700 gEmu.diskmsg[3] = gEmu.diskmsg[11] = 0x0;
701}
702
703/* feed a radio command into the emulator */
704void emu_process_packet(unsigned char* mbus_msg, int msg_size)
705{
706 bool playmsg_dirty = false;
707 bool diskmsg_dirty = false;
708
709 if (msg_size == 2 && mbus_msg[0] == 1 && mbus_msg[1] == 8)
710 { /* 18: ping */
711 mbus_send("\x09\x08", 2); /* 98: ping OK */
712 }
713 else if (msg_size == 5 && mbus_msg[0] == 1 && mbus_msg[1] == 1 && mbus_msg[2] == 1)
714 { /* set play state */
715 if (bit_test(mbus_msg, 16))
716 {
717 if (gEmu.set_state == EMU_FF || gEmu.set_state == EMU_FR) /* was seeking? */
718 { /* seek to final position */
719 set_position(gEmu.time);
720 }
721 else if (gEmu.set_state != EMU_PLAYING && gEmu.set_state != EMU_PAUSED)
722 { /* was not playing yet, better send disk message */
723 diskmsg_dirty = true;
724 }
725 set_play();
726 gEmu.set_state = EMU_PLAYING;
727 playmsg_dirty = true;
728 }
729
730 if (bit_test(mbus_msg, 17))
731 {
732 gEmu.set_state = EMU_PAUSED;
733 playmsg_dirty = true;
734 set_pause();
735 }
736
737 if (bit_test(mbus_msg, 14))
738 {
739 gEmu.set_state = EMU_STOPPED;
740 playmsg_dirty = true;
741 set_stop();
742 }
743
744 if (bit_test(mbus_msg, 18))
745 {
746 gEmu.set_state = EMU_FF;
747 playmsg_dirty = true;
748 set_pause();
749 }
750
751 if (bit_test(mbus_msg, 19))
752 {
753 gEmu.set_state = EMU_FR;
754 playmsg_dirty = true;
755 set_pause();
756 }
757
758 if (bit_test(mbus_msg, 12)) /* scan stop */
759 {
760 bit_set(gEmu.playmsg, 51, false);
761 playmsg_dirty = true;
762 }
763
764 if (gEmu.set_state == EMU_FF || gEmu.set_state == EMU_FR)
765 gEmu.poll_interval = HZ/4; /* faster refresh */
766 else
767 gEmu.poll_interval = HZ;
768 }
769 else if (msg_size == 8 && mbus_msg[0] == 1 && mbus_msg[1] == 1 && mbus_msg[2] == 4)
770 { /* set program mode */
771 gEmu.playmsg[11] = mbus_msg[3]; /* copy repeat, random, intro */
772 gEmu.playmsg[12] = mbus_msg[4]; /* ToDo */
773 playmsg_dirty = true;
774 }
775 else if (msg_size ==8 && mbus_msg[0] == 1 && mbus_msg[1] == 1 && mbus_msg[2] == 3)
776 { /* changing */
777 gEmu.time = 0; /* reset playtime */
778 playmsg_dirty = true;
779 if (mbus_msg[3] == 0)
780 { /* changing track */
781 if (mbus_msg[4] == 0xA && mbus_msg[5] == 0x3)
782 { /* next random */
783 gEmu.playmsg[3] = rb->rand() % 10; /* ToDo */
784 gEmu.playmsg[4] = rb->rand() % 10;
785 }
786 else if (mbus_msg[4] == 0xB && mbus_msg[5] == 0x3)
787 { /* previous random */
788 gEmu.playmsg[3] = rb->rand() % 10; /* ToDo */
789 gEmu.playmsg[4] = rb->rand() % 10;
790 }
791 else
792 { /* normal track select */
793 set_track(mbus_msg[4]*10 + mbus_msg[5]);
794 }
795 }
796 else
797 { /* changing disk */
798 diskmsg_dirty = true;
799 gEmu.changemsg[3] = mbus_msg[3]; /* copy disk */
800 gEmu.diskmsg[2] = mbus_msg[3];
801 gEmu.changemsg[7] = gEmu.playmsg[11]; /* copy flags from status */
802 gEmu.changemsg[8] = gEmu.playmsg[12];
803 /*gEmu.playmsg[3] = 0; */ /* reset to track 1 */
804 /*gEmu.playmsg[4] = 1; */
805 mbus_send(gEmu.changemsg, sizeof(gEmu.changemsg));
806 }
807 }
808 else
809 { /* if in doubt, send Ack */
810 mbus_send("\x09\x0F\x00\x00\x00\x00\x00", 7);
811 }
812
813 if (playmsg_dirty)
814 {
815 rb->yield(); /* give the audio thread a chance to process */
816 get_playmsg(); /* force update */
817 mbus_send(gEmu.playmsg, sizeof(gEmu.playmsg));
818 }
819
820 if (diskmsg_dirty)
821 {
822 get_diskmsg(); /* force update */
823 mbus_send(gEmu.diskmsg, sizeof(gEmu.diskmsg));
824 }
825}
826
827
828/* called each second in case the emulator has something to do */
829void emu_tick(void)
830{
831 get_playmsg(); /* force update */
832 if (bit_test(gEmu.playmsg, 56)) /* play bit */
833 {
834 unsigned remain; /* helper as we walk down the digits */
835
836 switch(gEmu.set_state)
837 {
838 case EMU_FF:
839 gEmu.time += 10;
840 case EMU_FR:
841 gEmu.time -= 5;
842
843 if (gEmu.time < 0)
844 gEmu.time = 0;
845 else if (gEmu.time > get_tracklength())
846 gEmu.time = get_tracklength();
847
848 /* convert value to MM:SS */
849 remain = (unsigned)gEmu.time;
850 gEmu.playmsg[7] = remain / (10*60);
851 remain -= gEmu.playmsg[7] * (10*60);
852 gEmu.playmsg[8] = remain / 60;
853 remain -= gEmu.playmsg[8] * 60;
854 gEmu.playmsg[9] = remain / 10;
855 remain -= gEmu.playmsg[9] * 10;
856 gEmu.playmsg[10] = remain;
857 }
858
859 mbus_send(gEmu.playmsg, sizeof(gEmu.playmsg));
860 }
861}
862
863
864/****************** communication with Rockbox playback ******************/
865
866
867/* update the play message with Rockbox info */
868void get_playmsg(void)
869{
870 int track, time;
871
872 if (gEmu.set_state != EMU_FF && gEmu.set_state != EMU_FR)
873 {
874 switch(rb->audio_status())
875 {
876 case AUDIO_STATUS_PLAY:
877 print_scroll("AudioStat Play");
878 if (gEmu.set_state == EMU_FF || gEmu.set_state == EMU_FR)
879 gEmu.playmsg[2] = gEmu.set_state; /* set FF/FR */
880 else
881 gEmu.playmsg[2] = EMU_PLAYING; /* set normal play */
882
883 bit_set(gEmu.playmsg, 56, true); /* set play */
884 bit_set(gEmu.playmsg, 57, false); /* clear pause */
885 bit_set(gEmu.playmsg, 59, false); /* clear stop */
886 break;
887
888 case AUDIO_STATUS_PLAY | AUDIO_STATUS_PAUSE:
889 print_scroll("AudioStat Pause");
890 gEmu.playmsg[2] = EMU_PAUSED;
891 bit_set(gEmu.playmsg, 56, false); /* clear play */
892 bit_set(gEmu.playmsg, 57, true); /* set pause */
893 bit_set(gEmu.playmsg, 59, false); /* clear stop */
894 break;
895
896 default:
897 print_scroll("AudioStat 0");
898 gEmu.playmsg[2] = EMU_STOPPED;
899 bit_set(gEmu.playmsg, 56, false); /* clear play */
900 bit_set(gEmu.playmsg, 57, false); /* clear pause */
901 bit_set(gEmu.playmsg, 59, true); /* set stop */
902 break;
903 }
904
905 /* convert value to MM:SS */
906 time = get_playtime();
907 gEmu.time = time; /* copy it */
908 gEmu.playmsg[7] = time / (10*60);
909 time -= gEmu.playmsg[7] * (10*60);
910 gEmu.playmsg[8] = time / 60;
911 time -= gEmu.playmsg[8] * 60;
912 gEmu.playmsg[9] = time / 10;
913 time -= gEmu.playmsg[9] * 10;
914 gEmu.playmsg[10] = time;
915 }
916 else /* FF/FR */
917 {
918 gEmu.playmsg[2] = gEmu.set_state; /* in FF/FR, report that instead */
919 }
920
921 track = get_track();
922 gEmu.playmsg[3] = track / 10;
923 gEmu.playmsg[4] = track % 10;
924}
925
926/* update the disk status message with Rockbox info */
927void get_diskmsg(void)
928{
929 int tracks = rb->playlist_amount();
930 if (tracks > 99)
931 tracks = 99;
932 gEmu.diskmsg[5] = tracks / 10;
933 gEmu.diskmsg[6] = tracks % 10;
934}
935
936/* return the current track time in seconds */
937int get_playtime(void)
938{
939 struct mp3entry* p_mp3entry;
940
941 p_mp3entry = rb->audio_current_track();
942 if (p_mp3entry == NULL)
943 return 0;
944
945 return p_mp3entry->elapsed / 1000;
946}
947
948/* return the total length of the current track */
949int get_tracklength(void)
950{
951 struct mp3entry* p_mp3entry;
952
953 p_mp3entry = rb->audio_current_track();
954 if (p_mp3entry == NULL)
955 return 0;
956
957 return p_mp3entry->length / 1000;
958}
959
960/* change to a new track */
961void set_track(int selected)
962{
963 if (selected > get_track())
964 {
965 print_scroll("audio_next");
966 rb->audio_next();
967 }
968 else if (selected < get_track())
969 {
970 print_scroll("audio_prev");
971 rb->audio_prev();
972 }
973}
974
975/* return the track number */
976int get_track(void)
977{
978 struct mp3entry* p_mp3entry;
979
980 p_mp3entry = rb->audio_current_track();
981 if (p_mp3entry == NULL)
982 return 0;
983
984 return p_mp3entry->index + 1; /* track numbers start with 1 */
985}
986
987/* start or resume playback */
988void set_play(void)
989{
990 if (rb->audio_status() == AUDIO_STATUS_PLAY)
991 return;
992
993 if (rb->audio_status() == (AUDIO_STATUS_PLAY | AUDIO_STATUS_PAUSE))
994 {
995 print_scroll("audio_resume");
996 rb->audio_resume();
997 }
998 else
999 {
1000 print_scroll("audio_play(0, 0)");
1001 rb->audio_play(0, 0);
1002 }
1003}
1004
1005/* pause playback */
1006void set_pause(void)
1007{
1008 if (rb->audio_status() == AUDIO_STATUS_PLAY)
1009 {
1010 print_scroll("audio_pause");
1011 rb->audio_pause();
1012 }
1013}
1014
1015/* stop playback */
1016void set_stop(void)
1017{
1018 if (rb->audio_status() & AUDIO_STATUS_PLAY)
1019 {
1020 print_scroll("audio_stop");
1021 rb->audio_stop();
1022 }
1023}
1024
1025/* seek */
1026void set_position(int seconds)
1027{
1028 if (rb->audio_status() & AUDIO_STATUS_PLAY)
1029 {
1030 print_scroll("audio_ff_rewind");
1031 rb->audio_ff_rewind(seconds * 1000);
1032 }
1033}
1034
1035/****************** main thread + helper ******************/
1036
1037/* set to everything flat and 0 dB volume */
1038void sound_neutral(void)
1039{ /* neutral sound settings */
1040 rb->sound_set(SOUND_BASS, 0);
1041 rb->sound_set(SOUND_TREBLE, 0);
1042 rb->sound_set(SOUND_BALANCE, 0);
1043 rb->sound_set(SOUND_VOLUME, 0);
1044#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
1045 rb->sound_set(SOUND_LOUDNESS, 0);
1046 rb->sound_set(SOUND_SUPERBASS, 0);
1047 rb->sound_set(SOUND_AVC, 0);
1048#endif
1049}
1050
1051/* return to user settings */
1052void sound_normal(void)
1053{ /* restore sound settings */
1054 rb->sound_set(SOUND_BASS, rb->global_settings->bass);
1055 rb->sound_set(SOUND_TREBLE, rb->global_settings->treble);
1056 rb->sound_set(SOUND_BALANCE, rb->global_settings->balance);
1057 rb->sound_set(SOUND_VOLUME, rb->global_settings->volume);
1058#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
1059 rb->sound_set(SOUND_LOUDNESS, rb->global_settings->loudness);
1060 rb->sound_set(SOUND_SUPERBASS, rb->global_settings->superbass);
1061 rb->sound_set(SOUND_AVC, rb->global_settings->avc);
1062#endif
1063}
1064
1065/* the thread running it all */
1066void thread(void)
1067{
1068 int msg_size;
1069 unsigned char mbus_msg[MBUS_MAX_SIZE];
1070 char buf[32];
1071 bool connected = false;
1072 long last_tick = *rb->current_tick; /* for 1 sec tick */
1073
1074 do
1075 {
1076 msg_size = mbus_receive(mbus_msg, sizeof(mbus_msg), 1);
1077 if (msg_size > 0)
1078 { /* received something */
1079 if(gTread.foreground)
1080 {
1081 dump_packet(buf, sizeof(buf), mbus_msg, msg_size);
1082 /*print_scroll(buf); */
1083 }
1084 if (msg_size > 2 && mbus_msg[0] == 1
1085 && mbus_msg[msg_size-1] == calc_checksum(mbus_msg, msg_size-1))
1086 { /* sanity and checksum OK */
1087 if (!connected)
1088 { /* with the first received packet: */
1089 sound_neutral(); /* set to flat and 0dB volume */
1090 connected = true;
1091 }
1092 emu_process_packet(mbus_msg, msg_size-1); /* pass without chksum */
1093 }
1094 else if(gTread.foreground)
1095 { /* not OK */
1096 print_scroll("bad packet");
1097 }
1098 }
1099 else if (msg_size < 0 && gTread.foreground)
1100 { /* error */
1101 rb->snprintf(buf, sizeof(buf), "rcv error %d", msg_size);
1102 print_scroll(buf);
1103 }
1104
1105 if (*rb->current_tick - last_tick >= gEmu.poll_interval)
1106 { /* call the emulation regulary */
1107 emu_tick();
1108 last_tick += gEmu.poll_interval;
1109 }
1110
1111 } while (!gTread.exiting);
1112}
1113
1114/* callback to end the TSR plugin, called before a new one gets loaded */
1115static bool exit_tsr(bool reenter)
1116{
1117 if (reenter)
1118 return false; /* dont let it start again */
1119 gTread.exiting = true; /* tell the thread to end */
1120 rb->thread_wait(gTread.thread); /* wait until it did */
1121
1122 uart_init(BAUDRATE); /* return to standard baudrate */
1123 IPRE = (IPRE & ~0xF000); /* UART interrupt off */
1124 timer_set_mode(TM_OFF); /* timer interrupt off */
1125
1126 sound_normal(); /* restore sound settings */
1127 return true;
1128}
1129
1130/****************** main ******************/
1131
1132
1133int main(const void* parameter)
1134{
1135 (void)parameter;
1136#ifdef DEBUG
1137 int button;
1138#endif
1139 size_t buf_size;
1140 ssize_t stacksize;
1141 void* stack;
1142
1143 mbus_init(); /* init the M-Bus layer */
1144 emu_init(); /* init emulator */
1145
1146 rb->splash(HZ/5, "Alpine CDC"); /* be quick on autostart */
1147
1148#ifdef DEBUG
1149 print_scroll("Alpine M-Bus Test");
1150 print_scroll("any key to TSR");
1151#endif
1152
1153 /* init the worker thread */
1154 stack = rb->plugin_get_buffer(&buf_size); /* use the rest as stack */
1155 stacksize = buf_size;
1156 stack = (void*)(((unsigned int)stack + 100) & ~3); /* a bit away, 32 bit align */
1157 stacksize = (stacksize - 100) & ~3;
1158 if (stacksize < DEFAULT_STACK_SIZE)
1159 {
1160 rb->splash(HZ*2, "Out of memory");
1161 return -1;
1162 }
1163
1164 rb->memset(&gTread, 0, sizeof(gTread));
1165 gTread.foreground = true;
1166 gTread.thread = rb->create_thread(thread, stack, stacksize, 0, "CDC"
1167 IF_PRIO(, PRIORITY_BACKGROUND)
1168 IF_COP(, CPU));
1169
1170#ifdef DEBUG
1171 do
1172 {
1173 button = rb->button_get(true);
1174 } while (button & BUTTON_REL);
1175#endif
1176
1177 gTread.foreground = false; /* we're in the background now */
1178 rb->plugin_tsr(exit_tsr); /* stay resident */
1179
1180#ifdef DEBUG
1181 return rb->default_event_handler(button);
1182#else
1183 return 0;
1184#endif
1185}
1186
1187
1188/***************** Plugin Entry Point *****************/
1189
1190
1191enum plugin_status plugin_start(const void* parameter)
1192{
1193 /* now go ahead and have fun! */
1194 return (main(parameter)==0) ? PLUGIN_OK : PLUGIN_ERROR;
1195}
diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c
index f24ad579e8..37046af05b 100644
--- a/apps/plugins/battery_bench.c
+++ b/apps/plugins/battery_bench.c
@@ -30,41 +30,12 @@
30 30
31#define EV_EXIT 1337 31#define EV_EXIT 1337
32 32
33/* seems to work with 1300, but who knows... */ 33/* seems to work with 1300, but who knows... */
34#define THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200 34#define THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200
35 35
36#if CONFIG_KEYPAD == RECORDER_PAD 36#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
37
38#define BATTERY_ON BUTTON_PLAY
39#define BATTERY_OFF BUTTON_OFF
40#define BATTERY_ON_TXT "PLAY - start"
41#define BATTERY_OFF_TXT "OFF"
42
43#if BUTTON_REMOTE != 0
44#define BATTERY_RC_ON BUTTON_RC_PLAY
45#define BATTERY_RC_OFF BUTTON_RC_STOP
46#endif
47
48#elif CONFIG_KEYPAD == ONDIO_PAD
49
50#define BATTERY_ON BUTTON_RIGHT
51#define BATTERY_OFF BUTTON_OFF
52#define BATTERY_ON_TXT "RIGHT - start"
53#define BATTERY_OFF_TXT "OFF"
54
55#elif CONFIG_KEYPAD == PLAYER_PAD
56
57#define BATTERY_ON BUTTON_PLAY
58#define BATTERY_OFF BUTTON_STOP
59#define BATTERY_ON_TXT "PLAY - start"
60#define BATTERY_OFF_TXT "STOP"
61
62#define BATTERY_RC_ON BUTTON_RC_PLAY
63#define BATTERY_RC_OFF BUTTON_RC_STOP
64
65#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
66 (CONFIG_KEYPAD == IRIVER_H300_PAD) 37 (CONFIG_KEYPAD == IRIVER_H300_PAD)
67 38
68#define BATTERY_ON BUTTON_ON 39#define BATTERY_ON BUTTON_ON
69#define BATTERY_RC_ON BUTTON_RC_ON 40#define BATTERY_RC_ON BUTTON_RC_ON
70 41
diff --git a/apps/plugins/beatbox/beatbox.c b/apps/plugins/beatbox/beatbox.c
index 914533151e..e7d3225c8b 100644
--- a/apps/plugins/beatbox/beatbox.c
+++ b/apps/plugins/beatbox/beatbox.c
@@ -28,19 +28,7 @@
28 28
29 29
30/* variable button definitions */ 30/* variable button definitions */
31#if CONFIG_KEYPAD == RECORDER_PAD 31#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
32#define BTN_QUIT BUTTON_OFF
33#define BTN_RIGHT BUTTON_RIGHT
34#define BTN_UP BUTTON_UP
35#define BTN_DOWN BUTTON_DOWN
36
37#elif CONFIG_KEYPAD == ONDIO_PAD
38#define BTN_QUIT BUTTON_OFF
39#define BTN_RIGHT BUTTON_RIGHT
40#define BTN_UP BUTTON_UP
41#define BTN_DOWN BUTTON_DOWN
42
43#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
44#define BTN_QUIT BUTTON_OFF 32#define BTN_QUIT BUTTON_OFF
45#define BTN_RIGHT BUTTON_RIGHT 33#define BTN_RIGHT BUTTON_RIGHT
46#define BTN_UP BUTTON_UP 34#define BTN_UP BUTTON_UP
diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c
index d685de9617..93b577462b 100644
--- a/apps/plugins/blackjack.c
+++ b/apps/plugins/blackjack.c
@@ -42,37 +42,7 @@ enum {
42 BJ_END, 42 BJ_END,
43}; 43};
44 44
45#if CONFIG_KEYPAD == RECORDER_PAD 45#if CONFIG_KEYPAD == IRIVER_H10_PAD
46#define BJACK_SELECT_NAME "PLAY"
47#define BJACK_STAY_NAME "F1"
48#define BJACK_QUIT_NAME "OFF"
49#define BJACK_DOUBLE_NAME "F2"
50#define BJACK_SELECT BUTTON_PLAY
51#define BJACK_QUIT BUTTON_OFF
52#define BJACK_MAX (BUTTON_ON|BUTTON_UP)
53#define BJACK_MIN (BUTTON_ON|BUTTON_DOWN)
54#define BJACK_STAY BUTTON_F1
55#define BJACK_DOUBLEDOWN BUTTON_F2
56#define BJACK_UP BUTTON_UP
57#define BJACK_DOWN BUTTON_DOWN
58#define BJACK_RIGHT BUTTON_RIGHT
59#define BJACK_LEFT BUTTON_LEFT
60
61#elif CONFIG_KEYPAD == ONDIO_PAD
62#define BJACK_SELECT_NAME "MENU"
63#define BJACK_STAY_NAME "RIGHT"
64#define BJACK_QUIT_NAME "OFF"
65#define BJACK_DOUBLE_NAME "UP"
66#define BJACK_SELECT BUTTON_MENU
67#define BJACK_QUIT BUTTON_OFF
68#define BJACK_STAY BUTTON_RIGHT
69#define BJACK_DOUBLEDOWN BUTTON_UP
70#define BJACK_UP BUTTON_UP
71#define BJACK_DOWN BUTTON_DOWN
72#define BJACK_RIGHT BUTTON_RIGHT
73#define BJACK_LEFT BUTTON_LEFT
74
75#elif CONFIG_KEYPAD == IRIVER_H10_PAD
76#define BJACK_SELECT_NAME "PLAY" 46#define BJACK_SELECT_NAME "PLAY"
77#define BJACK_STAY_NAME ">>|" 47#define BJACK_STAY_NAME ">>|"
78#define BJACK_QUIT_NAME "POWER" 48#define BJACK_QUIT_NAME "POWER"
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
index 182ba4f040..dd46f98b8e 100644
--- a/apps/plugins/brickmania.c
+++ b/apps/plugins/brickmania.c
@@ -61,23 +61,6 @@
61#define DOWN BUTTON_DOWN 61#define DOWN BUTTON_DOWN
62#define RC_QUIT BUTTON_RC_STOP 62#define RC_QUIT BUTTON_RC_STOP
63 63
64#elif CONFIG_KEYPAD == ONDIO_PAD
65#define CONTINUE_TEXT "MENU To Continue"
66#define QUIT BUTTON_OFF
67#define LEFT BUTTON_LEFT
68#define RIGHT BUTTON_RIGHT
69#define SELECT BUTTON_MENU
70#define UP BUTTON_UP
71#define DOWN BUTTON_DOWN
72
73#elif CONFIG_KEYPAD == RECORDER_PAD
74#define QUIT BUTTON_OFF
75#define LEFT BUTTON_LEFT
76#define RIGHT BUTTON_RIGHT
77#define SELECT BUTTON_PLAY
78#define UP BUTTON_UP
79#define DOWN BUTTON_DOWN
80
81#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 64#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
82 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 65 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
83 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 66 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
@@ -1461,9 +1444,7 @@ static int brickmania_help(void)
1461 "< & >:", 1444 "< & >:",
1462#endif 1445#endif
1463 "Moves", "the", "paddle", "", 1446 "Moves", "the", "paddle", "",
1464#if CONFIG_KEYPAD == ONDIO_PAD 1447#if (CONFIG_KEYPAD == IAUDIO_M3_PAD)
1465 "MENU:",
1466#elif (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == IAUDIO_M3_PAD)
1467 "PLAY:", 1448 "PLAY:",
1468#elif CONFIG_KEYPAD == IRIVER_H300_PAD 1449#elif CONFIG_KEYPAD == IRIVER_H300_PAD
1469 "NAVI:", 1450 "NAVI:",
@@ -1484,9 +1465,7 @@ static int brickmania_help(void)
1484 (CONFIG_KEYPAD == SANSA_FUZE_PAD) 1465 (CONFIG_KEYPAD == SANSA_FUZE_PAD)
1485 "MENU:", 1466 "MENU:",
1486#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 1467#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
1487 (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ 1468 (CONFIG_KEYPAD == IRIVER_H300_PAD)
1488 (CONFIG_KEYPAD == ONDIO_PAD) || \
1489 (CONFIG_KEYPAD == RECORDER_PAD)
1490 "STOP:", 1469 "STOP:",
1491#else 1470#else
1492 "POWER:", 1471 "POWER:",
diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c
index 2d163d8bc9..50de10fa23 100644
--- a/apps/plugins/bubbles.c
+++ b/apps/plugins/bubbles.c
@@ -84,7 +84,6 @@ enum {
84/* these are better off shooting with up */ 84/* these are better off shooting with up */
85#if (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) \ 85#if (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) \
86 || (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) \ 86 || (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) \
87 || (CONFIG_KEYPAD == ONDIO_PAD) \
88 || (CONFIG_KEYPAD == IRIVER_H10_PAD) 87 || (CONFIG_KEYPAD == IRIVER_H10_PAD)
89#define SHOOT_WITH_UP 88#define SHOOT_WITH_UP
90#endif 89#endif
diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c
index d3cf57536d..ac5a6ed7cd 100644
--- a/apps/plugins/calculator.c
+++ b/apps/plugins/calculator.c
@@ -110,29 +110,8 @@ F3: equal to "="
110#endif 110#endif
111 111
112/* variable button definitions */ 112/* variable button definitions */
113#if CONFIG_KEYPAD == RECORDER_PAD 113#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
114#define CALCULATOR_LEFT BUTTON_LEFT 114 (CONFIG_KEYPAD == IRIVER_H300_PAD)
115#define CALCULATOR_RIGHT BUTTON_RIGHT
116#define CALCULATOR_UP BUTTON_UP
117#define CALCULATOR_DOWN BUTTON_DOWN
118#define CALCULATOR_QUIT BUTTON_OFF
119#define CALCULATOR_INPUT BUTTON_PLAY
120#define CALCULATOR_CALC BUTTON_F3
121#define CALCULATOR_OPERATORS BUTTON_F2
122#define CALCULATOR_CLEAR BUTTON_F1
123
124#elif CONFIG_KEYPAD == ONDIO_PAD
125#define CALCULATOR_LEFT BUTTON_LEFT
126#define CALCULATOR_RIGHT BUTTON_RIGHT
127#define CALCULATOR_UP BUTTON_UP
128#define CALCULATOR_DOWN BUTTON_DOWN
129#define CALCULATOR_QUIT BUTTON_OFF
130#define CALCULATOR_INPUT_CALC_PRE BUTTON_MENU
131#define CALCULATOR_INPUT (BUTTON_MENU | BUTTON_REL)
132#define CALCULATOR_CALC (BUTTON_MENU | BUTTON_REPEAT)
133
134#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
135 (CONFIG_KEYPAD == IRIVER_H300_PAD)
136#define CALCULATOR_LEFT BUTTON_LEFT 115#define CALCULATOR_LEFT BUTTON_LEFT
137#define CALCULATOR_RIGHT BUTTON_RIGHT 116#define CALCULATOR_RIGHT BUTTON_RIGHT
138#define CALCULATOR_UP BUTTON_UP 117#define CALCULATOR_UP BUTTON_UP
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index 11a37191af..7e2472ffc9 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -25,30 +25,8 @@
25#include "lib/playback_control.h" 25#include "lib/playback_control.h"
26#include "lib/configfile.h" 26#include "lib/configfile.h"
27 27
28 28#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
29 29 (CONFIG_KEYPAD == IRIVER_H300_PAD)
30#if CONFIG_KEYPAD == RECORDER_PAD
31#define CALENDAR_QUIT BUTTON_OFF
32#define CALENDAR_SELECT BUTTON_PLAY
33#define CALENDAR_NEXT_WEEK BUTTON_DOWN
34#define CALENDAR_PREV_WEEK BUTTON_UP
35#define CALENDAR_NEXT_DAY BUTTON_RIGHT
36#define CALENDAR_PREV_DAY BUTTON_LEFT
37#define CALENDAR_NEXT_MONTH (BUTTON_ON|BUTTON_DOWN)
38#define CALENDAR_PREV_MONTH (BUTTON_ON|BUTTON_UP)
39
40#elif CONFIG_KEYPAD == ONDIO_PAD
41#define CALENDAR_QUIT BUTTON_OFF
42#define CALENDAR_SELECT (BUTTON_MENU|BUTTON_REL)
43#define CALENDAR_NEXT_WEEK BUTTON_DOWN
44#define CALENDAR_PREV_WEEK BUTTON_UP
45#define CALENDAR_NEXT_DAY BUTTON_RIGHT
46#define CALENDAR_PREV_DAY BUTTON_LEFT
47#define CALENDAR_NEXT_MONTH (BUTTON_MENU|BUTTON_DOWN)
48#define CALENDAR_PREV_MONTH (BUTTON_MENU|BUTTON_UP)
49
50#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
51 (CONFIG_KEYPAD == IRIVER_H300_PAD)
52#define CALENDAR_QUIT BUTTON_OFF 30#define CALENDAR_QUIT BUTTON_OFF
53#define CALENDAR_SELECT BUTTON_SELECT 31#define CALENDAR_SELECT BUTTON_SELECT
54#define CALENDAR_NEXT_WEEK BUTTON_DOWN 32#define CALENDAR_NEXT_WEEK BUTTON_DOWN
diff --git a/apps/plugins/chessbox/chessbox_pgn.h b/apps/plugins/chessbox/chessbox_pgn.h
index 9c7693305c..ab0adbb706 100644
--- a/apps/plugins/chessbox/chessbox_pgn.h
+++ b/apps/plugins/chessbox/chessbox_pgn.h
@@ -84,38 +84,6 @@
84#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT) 84#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
85#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT) 85#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
86 86
87#elif CONFIG_KEYPAD == RECORDER_PAD
88#define CB_SELECT BUTTON_PLAY
89#define CB_UP BUTTON_UP
90#define CB_DOWN BUTTON_DOWN
91#define CB_LEFT BUTTON_LEFT
92#define CB_RIGHT BUTTON_RIGHT
93#define CB_PLAY BUTTON_ON
94#define CB_LEVEL BUTTON_F1
95#define CB_RESTART BUTTON_F3
96#define CB_MENU BUTTON_OFF
97#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
98#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
99#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
100#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
101
102#elif CONFIG_KEYPAD == ONDIO_PAD
103#define CB_SELECT_PRE BUTTON_MENU
104#define CB_SELECT (BUTTON_MENU|BUTTON_REL)
105#define CB_UP BUTTON_UP
106#define CB_DOWN BUTTON_DOWN
107#define CB_LEFT BUTTON_LEFT
108#define CB_RIGHT BUTTON_RIGHT
109#define CB_PLAY_PRE BUTTON_MENU
110#define CB_PLAY (BUTTON_MENU|BUTTON_REPEAT)
111#define CB_LEVEL (BUTTON_MENU|BUTTON_OFF)
112#define CB_RESTART (BUTTON_MENU|BUTTON_LEFT)
113#define CB_MENU BUTTON_OFF
114#define CB_SCROLL_UP (BUTTON_UP|BUTTON_REPEAT)
115#define CB_SCROLL_DOWN (BUTTON_DOWN|BUTTON_REPEAT)
116#define CB_SCROLL_LEFT (BUTTON_LEFT|BUTTON_REPEAT)
117#define CB_SCROLL_RIGHT (BUTTON_RIGHT|BUTTON_REPEAT)
118
119#elif (CONFIG_KEYPAD == GIGABEAT_PAD) 87#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
120#define CB_SELECT BUTTON_SELECT 88#define CB_SELECT BUTTON_SELECT
121#define CB_UP BUTTON_UP 89#define CB_UP BUTTON_UP
diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c
index ba8fea4935..6b2d436679 100644
--- a/apps/plugins/chessclock.c
+++ b/apps/plugins/chessclock.c
@@ -24,40 +24,7 @@
24 24
25 25
26/* variable button definitions */ 26/* variable button definitions */
27#if CONFIG_KEYPAD == RECORDER_PAD 27#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
28#define CHC_QUIT BUTTON_OFF
29#define CHC_STARTSTOP BUTTON_PLAY
30#define CHC_RESET BUTTON_LEFT
31#define CHC_MENU BUTTON_F1
32#define CHC_SETTINGS_INC BUTTON_UP
33#define CHC_SETTINGS_DEC BUTTON_DOWN
34#define CHC_SETTINGS_OK BUTTON_PLAY
35#define CHC_SETTINGS_OK2 BUTTON_LEFT
36#define CHC_SETTINGS_CANCEL BUTTON_OFF
37
38#elif CONFIG_KEYPAD == ONDIO_PAD
39#define CHC_QUIT BUTTON_OFF
40#define CHC_STARTSTOP BUTTON_RIGHT
41#define CHC_RESET BUTTON_LEFT
42#define CHC_MENU BUTTON_MENU
43#define CHC_SETTINGS_INC BUTTON_UP
44#define CHC_SETTINGS_DEC BUTTON_DOWN
45#define CHC_SETTINGS_OK BUTTON_RIGHT
46#define CHC_SETTINGS_OK2 BUTTON_LEFT
47#define CHC_SETTINGS_CANCEL BUTTON_MENU
48
49#elif CONFIG_KEYPAD == PLAYER_PAD
50#define CHC_QUIT BUTTON_ON
51#define CHC_STARTSTOP BUTTON_PLAY
52#define CHC_RESET BUTTON_STOP
53#define CHC_MENU BUTTON_MENU
54#define CHC_SETTINGS_INC BUTTON_RIGHT
55#define CHC_SETTINGS_DEC BUTTON_LEFT
56#define CHC_SETTINGS_OK BUTTON_PLAY
57#define CHC_SETTINGS_CANCEL BUTTON_STOP
58#define CHC_SETTINGS_CANCEL2 BUTTON_MENU
59
60#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
61 (CONFIG_KEYPAD == IRIVER_H300_PAD) 28 (CONFIG_KEYPAD == IRIVER_H300_PAD)
62#define CHC_QUIT BUTTON_SELECT 29#define CHC_QUIT BUTTON_SELECT
63#define CHC_STARTSTOP BUTTON_ON 30#define CHC_STARTSTOP BUTTON_ON
diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c
index 8645893820..f861d19caa 100644
--- a/apps/plugins/chip8.c
+++ b/apps/plugins/chip8.c
@@ -944,28 +944,8 @@ STATIC void chip8 (void)
944#endif 944#endif
945 945
946/* variable button definitions */ 946/* variable button definitions */
947#if CONFIG_KEYPAD == RECORDER_PAD /* only 9 out of 16 chip8 buttons */ 947#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
948#define CHIP8_OFF BUTTON_OFF 948 (CONFIG_KEYPAD == IRIVER_H300_PAD)
949#define CHIP8_KEY1 BUTTON_F1
950#define CHIP8_KEY2 BUTTON_UP
951#define CHIP8_KEY3 BUTTON_F3
952#define CHIP8_KEY4 BUTTON_LEFT
953#define CHIP8_KEY5 BUTTON_PLAY
954#define CHIP8_KEY6 BUTTON_RIGHT
955#define CHIP8_KEY7 BUTTON_F2
956#define CHIP8_KEY8 BUTTON_DOWN
957#define CHIP8_KEY9 BUTTON_ON
958
959#elif CONFIG_KEYPAD == ONDIO_PAD /* even more limited */
960#define CHIP8_OFF BUTTON_OFF
961#define CHIP8_KEY2 BUTTON_UP
962#define CHIP8_KEY4 BUTTON_LEFT
963#define CHIP8_KEY5 BUTTON_MENU
964#define CHIP8_KEY6 BUTTON_RIGHT
965#define CHIP8_KEY8 BUTTON_DOWN
966
967#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
968 (CONFIG_KEYPAD == IRIVER_H300_PAD)
969#define CHIP8_OFF BUTTON_OFF 949#define CHIP8_OFF BUTTON_OFF
970#define CHIP8_KEY2 BUTTON_UP 950#define CHIP8_KEY2 BUTTON_UP
971#define CHIP8_KEY4 BUTTON_LEFT 951#define CHIP8_KEY4 BUTTON_LEFT
diff --git a/apps/plugins/chopper.c b/apps/plugins/chopper.c
index a206192974..f42801f10f 100644
--- a/apps/plugins/chopper.c
+++ b/apps/plugins/chopper.c
@@ -86,17 +86,6 @@ Still To do:
86#define ACTION BUTTON_SELECT 86#define ACTION BUTTON_SELECT
87#define ACTIONTEXT "SELECT" 87#define ACTIONTEXT "SELECT"
88 88
89#elif CONFIG_KEYPAD == RECORDER_PAD
90#define QUIT BUTTON_OFF
91#define ACTION BUTTON_PLAY
92#define ACTIONTEXT "PLAY"
93
94#elif CONFIG_KEYPAD == ONDIO_PAD
95#define QUIT BUTTON_OFF
96#define ACTION BUTTON_UP
97#define ACTION2 BUTTON_MENU
98#define ACTIONTEXT "UP"
99
100#elif CONFIG_KEYPAD == GIGABEAT_S_PAD \ 89#elif CONFIG_KEYPAD == GIGABEAT_S_PAD \
101 || CONFIG_KEYPAD == SAMSUNG_YPR0_PAD 90 || CONFIG_KEYPAD == SAMSUNG_YPR0_PAD
102#define QUIT BUTTON_BACK 91#define QUIT BUTTON_BACK
diff --git a/apps/plugins/credits.c b/apps/plugins/credits.c
index d766d45cfd..6e993b5468 100644
--- a/apps/plugins/credits.c
+++ b/apps/plugins/credits.c
@@ -132,11 +132,8 @@ static int update_rowpos(int action, int cur_pos, int rows_per_screen, int tot_r
132static void roll_credits(void) 132static void roll_credits(void)
133{ 133{
134 /* to do: use target defines iso keypads to set animation timings */ 134 /* to do: use target defines iso keypads to set animation timings */
135#if (CONFIG_KEYPAD == RECORDER_PAD) 135#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
136 #define PAUSE_TIME 1.2 136 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
137 #define ANIM_SPEED 35
138#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
139 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
140 #define PAUSE_TIME 0 137 #define PAUSE_TIME 0
141 #define ANIM_SPEED 100 138 #define ANIM_SPEED 100
142#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) 139#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c
index 0f51e44e5c..4cd314a035 100644
--- a/apps/plugins/cube.c
+++ b/apps/plugins/cube.c
@@ -37,39 +37,7 @@
37#define DISP_TIME 30 37#define DISP_TIME 30
38 38
39/* variable button definitions */ 39/* variable button definitions */
40#if CONFIG_KEYPAD == RECORDER_PAD 40#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
41#define CUBE_QUIT BUTTON_OFF
42#define CUBE_NEXT BUTTON_RIGHT
43#define CUBE_PREV BUTTON_LEFT
44#define CUBE_INC BUTTON_UP
45#define CUBE_DEC BUTTON_DOWN
46#define CUBE_MODE BUTTON_F1
47#define CUBE_PAUSE BUTTON_PLAY
48#define CUBE_HIGHSPEED BUTTON_ON
49
50#elif CONFIG_KEYPAD == PLAYER_PAD
51#define CUBE_QUIT BUTTON_STOP
52#define CUBE_INC BUTTON_RIGHT
53#define CUBE_DEC BUTTON_LEFT
54#define CUBE_NEXT (BUTTON_ON | BUTTON_RIGHT)
55#define CUBE_PREV (BUTTON_ON | BUTTON_LEFT)
56#define CUBE_MODE BUTTON_MENU
57#define CUBE_PAUSE BUTTON_PLAY
58#define CUBE_HIGHSPEED_PRE BUTTON_ON
59#define CUBE_HIGHSPEED (BUTTON_ON | BUTTON_REL)
60
61#elif CONFIG_KEYPAD == ONDIO_PAD
62#define CUBE_QUIT BUTTON_OFF
63#define CUBE_NEXT BUTTON_RIGHT
64#define CUBE_PREV BUTTON_LEFT
65#define CUBE_INC BUTTON_UP
66#define CUBE_DEC BUTTON_DOWN
67#define CUBE_MODE_PRE BUTTON_MENU
68#define CUBE_MODE (BUTTON_MENU | BUTTON_REL)
69#define CUBE_PAUSE (BUTTON_MENU | BUTTON_LEFT)
70#define CUBE_HIGHSPEED (BUTTON_MENU | BUTTON_RIGHT)
71
72#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
73 (CONFIG_KEYPAD == IRIVER_H300_PAD) 41 (CONFIG_KEYPAD == IRIVER_H300_PAD)
74#define CUBE_QUIT BUTTON_OFF 42#define CUBE_QUIT BUTTON_OFF
75#define CUBE_NEXT BUTTON_RIGHT 43#define CUBE_NEXT BUTTON_RIGHT
diff --git a/apps/plugins/euroconverter.c b/apps/plugins/euroconverter.c
deleted file mode 100644
index d7aa61f806..0000000000
--- a/apps/plugins/euroconverter.c
+++ /dev/null
@@ -1,599 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2003 Pierre Delore
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22#include "lib/configfile.h"
23#include "lib/pluginlib_exit.h"
24
25/* Euro converter for the player */
26/*
27Use:
28+ : Digit +1
29- : Digit -1
30PLAY : Next digit
31STOP : Prev digit
32ON : RESET
33ON+PLAY : Swap Euro<>Home
34MENU : Display the Menu
35 Currency -> Allows to choose the currency
36 Exit-> Exit the plugin
37
38Notes:
39I don't use float.
40I use signed long long (64 bits).
41A value have 5 digits after the . (123.45 = 12345000)
42
43To do:
44- The Irish currency needs 6 digits after the . to have sufficient precision on big number
45*/
46
47
48
49/* Name and path of the config file*/
50static const char cfg_filename[] = "euroconverter.cfg";
51#define CFGFILE_VERSION 0 /* Current config file version */
52#define CFGFILE_MINVERSION 0 /* Minimum config file version to accept */
53
54/* typedef for simplifying usage of long long type */
55typedef long long int longlong_t;
56
57/*Pattern for the converter*/
58static unsigned char pattern_euro[]={0x07, 0x08, 0x1E, 0x10, 0x1E, 0x08, 0x07}; /* € */
59static unsigned char pattern_home[]={0x04, 0x0A, 0x11, 0x1F, 0x11, 0x11, 0x1F}; /* Home icon*/
60
61/* 1 euro = ... (remenber 5 digits after the .)*/
62static int currency[12]={
63 655957, /*FRF France*/
64 195583, /*DEM Germany*/
65 1376030, /*ATS Austria*/
66 4033990, /*BEF Belgium*/
67 16638600, /*ESP Spain*/
68 594573, /*FIM Finland*/
69 78756, /*IEP Ireland*/
70 193627000, /*ITL Italy*/
71 4033990, /*LUF Luxemburg*/
72 220371, /*NLG Netherlands*/
73 20048200, /*PTE Portugal*/
74 34075100, /*GRD Greece*/
75 };
76
77/* Number of digit of the currency (for the display) */
78static int nb_digit[12]={
79 2, /*FRF France*/
80 2, /*DEM Germany*/
81 2, /*ATS Austria*/
82 2, /*BEF Belgium*/
83 0, /*ESP Spain*/
84 2, /*FIM Finland*/
85 2, /*IEP Ireland*/
86 0, /*ITL Italy*/
87 2, /*LUF Luxemburg*/
88 2, /*NLG Netherlands*/
89 0, /*PTE Portugal*/
90 0 /*GRD Greece*/
91 };
92
93/* max euro to have home currency */
94static longlong_t max_euro[12]={
95 99999999000LL, /*FRF France 999 999.99 */
96 99999999000LL, /*DEM Germany 999 999.99 */
97 99999999000LL, /*ATS Austria 999 999.99 */
98 99999999000LL, /*BEF Belgium 999 999.99 */
99 99999999000LL, /*ESP Spain 99 999 999 */
100 99999999000LL, /*FIM Finland 999 999.99 */
101 99999999000LL, /*IEP Ireland 999 999.99 */
102 51645690000LL, /*ITL Italy 999 999 999 */
103 99999999000LL, /*LUF Luxemburg 999 999.99 */
104 99999999000LL, /*NLG Netherlands 999 999.99 */
105 99999999000LL, /*PTE Portugal 99 999 999 */
106 29347028000LL /*GRD Greece 99 999 999 */
107 };
108
109/* max home to have euro currency */
110/* 92233720300000 Limitation due to the max capacity of long long (2^63)*/
111static longlong_t max_curr[12]={
112 99999999000LL, /*FRF France 152449.02 */
113 99999999000LL, /*DEM Germany 511291.88 */
114 99999999000LL, /*ATS Austria 72672.83 */
115 99999999000LL, /*BEF Belgium 24789.35 */
116 92233720300000LL,/*ESP Spain 5543358.23 */
117 99999999000LL, /*FIM Finland 168187.92 */
118 9999999900LL, /*IEP Ireland 1269744.51 exact value=1269738.07 */
119 92233720300000LL,/*ITL Italy 476347.41 */
120 99999999000LL, /*LUF Luxemburg 24789.35 */
121 99999999000LL, /*NLG Netherlands 453780.21 */
122 92233720300000LL,/*PTE Portugal 4600598.57 */
123 92233720300000LL /*GRD Greece 2706777.69 */
124 };
125
126static unsigned char *abbrev_str[12] = {
127 "...FRF...", /*France*/
128 "...DEM...", /*Germany*/
129 "...ATS...", /*Austria*/
130 "...BEF...", /*Belgium*/
131 "...ESP...", /*Spain*/
132 "...FIM...", /*Finland*/
133 "...IEP...", /*Ireland*/
134 "...ITL...", /*Italy*/
135 "...LUF...", /*Luxemburg*/
136 "...NLG...", /*Netherlands*/
137 "...PTE...", /*Portugal*/
138 "...GRD..." /*Greece*/
139 };
140
141
142static unsigned long heuro,hhome; /*Handles for the new patterns*/
143
144static char *currency_str[12] = {
145 "France",
146 "Germany",
147 "Austria",
148 "Belgium",
149 "Spain",
150 "Finland",
151 "Ireland",
152 "Italy",
153 "Luxemburg",
154 "Netherlands",
155 "Portugal",
156 "Greece"
157};
158
159
160static int country; /*Country selected*/
161static int cur_pos; /*Cursor position*/
162static longlong_t inc;
163
164/* Persistent settings */
165static struct configdata config[] = {
166 { TYPE_ENUM, 0, 12, { .int_p = &country }, "country", currency_str }
167};
168
169
170/* 64bits*64 bits with 5 digits after the . */
171static longlong_t mymul(longlong_t a, longlong_t b)
172{
173 return((a*b)/100000LL);
174}
175
176
177/* 64bits/64 bits with 5 digits after the . */
178static longlong_t mydiv(longlong_t a, longlong_t b)
179{
180 return((a*100000LL)/b);
181}
182
183
184/* 123.45=12345000 split => i=123 f=45000*/
185static void split(longlong_t v, longlong_t* i, longlong_t* f)
186{
187 longlong_t t;
188
189 t=v/100000LL;
190 (*i)=t;
191 (*f)=(v-(t*100000LL));
192}
193
194
195/* result=10^n */
196static longlong_t pow10(int n)
197{
198 int i;
199 longlong_t r;
200
201 r=1;
202 for (i=0;i<n;i++)
203 r=r*10LL;
204 return(r);
205}
206
207
208/* round the i.f at n digit after the . */
209static void round(longlong_t* i, longlong_t* f, int n)
210{
211
212 longlong_t m;
213 int add=0;
214
215 m=(int)pow10(5-n-1);
216 if (((*f)/m)%10>=5)
217 add=1;
218 if (n>0)
219 {
220 (*f)=((*f)/(int)pow10(5-n))+add;
221 if ((*f)==100LL)
222 {
223 (*i)+=1;
224 (*f)=0;
225 }
226 }
227 else
228 {
229 (*i)+=add;
230 (*f)=0;
231 }
232}
233
234
235/* Display the imput and the result
236 pos: false : first line
237 : true : second line
238*/
239static void display(longlong_t euro, longlong_t home, bool pos)
240{
241 longlong_t i,f;
242 unsigned char str[20];
243 unsigned char s1[20];
244 unsigned char s2[20];
245
246 if (pos)
247 { /*Edit the second line*/
248 rb->strcpy(s1," %6d.%02d");
249 if (nb_digit[country]==2)
250 rb->strcpy(s2,"\xee\x84\x90%06d.%02d");
251 else
252 rb->strcpy(s2,"\xee\x84\x90%09d");
253 }
254 else
255 {
256 rb->strcpy(s1,"\xee\x84\x90%06d.%02d");
257 if (nb_digit[country]==2)
258 rb->strcpy(s2," %6d.%02d");
259 else
260 rb->strcpy(s2," %9d");
261 }
262
263 rb->lcd_remove_cursor();
264 /*First line*/
265 rb->lcd_putc(0,0,heuro);
266 split(euro,&i,&f);
267 if (pos)
268 round(&i,&f,2);
269 rb->snprintf(str,sizeof(str),s1,(int)i,(int)f);
270
271 if (!pos)
272 {
273 rb->lcd_puts(1,0,str);
274 rb->lcd_put_cursor(10-cur_pos,0,0x5F);
275 }
276 else
277 rb->lcd_puts_scroll(1,0,str);
278
279 /*Second line*/
280 rb->lcd_putc(0,1,hhome);
281 split(home,&i,&f);
282 if (!pos)
283 round(&i,&f,nb_digit[country]);
284 rb->snprintf(str,sizeof(str),s2,(int)i,(int)f);
285 if (pos)
286 {
287 rb->lcd_puts(1,1,str);
288 rb->lcd_put_cursor(10-cur_pos,1,0x5F);
289 }
290 else
291 rb->lcd_puts_scroll(1,1,str);
292
293 rb->lcd_update();
294}
295
296
297/* Show country Abbreviation */
298static void show_abbrev(void)
299{
300 rb->splash(HZ*3/4,abbrev_str[country]);
301}
302
303
304/* Save the config to disk */
305static void save_config(void)
306{
307 configfile_save(cfg_filename, config, 1, CFGFILE_VERSION);
308}
309
310
311/* Load the config from disk */
312static void load_config(void)
313{
314 configfile_load(cfg_filename, config, 1, CFGFILE_MINVERSION);
315}
316
317
318/*Currency choice*/
319static void currency_menu(void)
320{
321 int c=country;
322
323 rb->lcd_clear_display();
324 while (true)
325 {
326 rb->lcd_puts(0,0,"Currency:");
327 rb->lcd_puts(0,1,currency_str[c]);
328 rb->lcd_update();
329 switch (rb->button_get(true))
330 {
331 case BUTTON_RIGHT|BUTTON_REL:
332 c++;
333 if (c>11)
334 c=0;
335 break;
336 case BUTTON_LEFT|BUTTON_REL:
337 c--;
338 if (c<0)
339 c=11;
340 break;
341 case BUTTON_PLAY|BUTTON_REL:
342 country=c;
343 save_config();
344 return;
345 break;
346 case BUTTON_STOP|BUTTON_REL:
347 return;
348 }
349 }
350}
351
352
353/* Display the choice menu. */
354static int euro_menu(void)
355{
356 int c=0;
357
358
359 while (true)
360 {
361 rb->lcd_clear_display();
362 rb->lcd_puts(0,0," Currency");
363 rb->lcd_puts(0,1," Exit");
364 rb->lcd_putc(0,c,0xe110);
365 rb->lcd_update();
366
367 switch (rb->button_get(true))
368 {
369 case BUTTON_RIGHT|BUTTON_REL:
370 c=1;
371 break;
372 case BUTTON_LEFT|BUTTON_REL:
373 c=0;
374 break;
375 case BUTTON_PLAY|BUTTON_REL:
376 if (c==0)
377 currency_menu();
378 else
379 return 1;
380 break;
381 case BUTTON_STOP|BUTTON_REL:
382 return 0;
383 }
384 }
385}
386
387
388/* Call when the program end */
389static void euro_exit(void)
390{
391 //Restore the old pattern (i don't find another way to do this. An idea?)
392 rb->lcd_unlock_pattern(heuro);
393 rb->lcd_unlock_pattern(hhome);
394
395 //Clear the screen
396 rb->lcd_clear_display();
397 rb->lcd_update();
398}
399
400
401/* this is the plugin entry point */
402enum plugin_status plugin_start(const void* parameter)
403{
404 bool end, pos;
405 longlong_t e,h,old_e,old_h;
406 int button;
407
408 /* if you don't use the parameter, you can do like
409 this to avoid the compiler warning about it */
410 (void)parameter;
411 atexit(euro_exit);
412
413 /*Get the pattern handle*/
414 heuro=rb->lcd_get_locked_pattern();
415 hhome=rb->lcd_get_locked_pattern();
416 rb->lcd_define_pattern(heuro, pattern_euro);
417 rb->lcd_define_pattern(hhome, pattern_home);
418
419 h=0;
420 e=0;
421 end=false;
422 pos=false;
423 country=0;
424 cur_pos=3;
425 inc=100000;
426
427 load_config();
428
429 /*Empty the event queue*/
430 rb->button_clear_queue();
431
432 display(e,h,false);
433 show_abbrev();
434 display(e,h,false);
435
436 /*Main loop*/
437 while(end!=true)
438 {
439 button = rb->button_get(true);
440 switch (button)
441 {
442 case BUTTON_MENU|BUTTON_REL:
443 switch (euro_menu())
444 {
445 case 1:
446 end=true;
447 break;
448 }
449 if (!pos)
450 {
451 if (e>max_euro[country])
452 e=0;
453 cur_pos=3;
454 }
455 else
456 {
457 if (h>max_curr[country])
458 h=0;
459 if (nb_digit[country]==2)
460 cur_pos=3;
461 else
462 cur_pos=0;
463 }
464
465 display(e,h,pos);
466 break;
467
468 case BUTTON_ON | BUTTON_PLAY:
469 pos=!pos;
470
471 case BUTTON_ON | BUTTON_REL:
472 e=0;
473 h=0;
474 if (!pos)
475 {
476 cur_pos=3;
477 inc=100000;
478 }
479 else
480 {
481 inc=100000;
482 if (nb_digit[country]==2)
483 cur_pos=3;
484 else
485 cur_pos=0;
486 }
487 show_abbrev();
488 break;
489
490 case BUTTON_STOP|BUTTON_REL:
491 cur_pos--;
492 if (!pos)
493 {
494 if (cur_pos<0)
495 cur_pos=0;
496 if (cur_pos==2)
497 cur_pos=1;
498 if (cur_pos>2)
499 inc=pow10(3+cur_pos-1);
500 else
501 inc=pow10(3+cur_pos);
502 }
503 else
504 {
505 if (cur_pos<0)
506 cur_pos=0;
507 if (nb_digit[country]==2)
508 {
509 if (cur_pos==2)
510 cur_pos=1;
511 if (cur_pos>2)
512 inc=pow10(3+cur_pos-1);
513 else
514 inc=pow10(3+cur_pos);
515 }
516 else
517 inc=pow10(5+cur_pos);
518
519 }
520 break;
521
522 case BUTTON_PLAY|BUTTON_REL:
523 cur_pos++;
524 if (!pos)
525 {
526 if (cur_pos>8)
527 cur_pos=8;
528 if (cur_pos==2)
529 cur_pos=3;
530 if (cur_pos>2)
531 inc=pow10(3+cur_pos-1);
532 else
533 inc=pow10(3+cur_pos);
534 }
535 else
536 {
537 if (cur_pos>8)
538 cur_pos=8;
539 if (nb_digit[country]==2)
540 {
541 if (cur_pos==2)
542 cur_pos=3;
543 if (cur_pos>2)
544 inc=pow10(3+cur_pos-1);
545 else
546 inc=pow10(3+cur_pos);
547 }
548 else
549 inc=pow10(5+cur_pos);
550 }
551 break;
552
553 case BUTTON_LEFT|BUTTON_REL:
554 case BUTTON_LEFT|BUTTON_REPEAT:
555 if (!pos)
556 {
557 e-=inc;
558 if (e<0)
559 e=0;
560 }
561 else
562 {
563 h-=inc;
564 if (h<0)
565 h=0;
566 }
567 break;
568
569 case BUTTON_RIGHT|BUTTON_REL:
570 case BUTTON_RIGHT|BUTTON_REPEAT:
571 old_e=e;
572 old_h=h;
573 if (!pos)
574 {
575 e+=inc;
576 if (e>max_euro[country])
577 e=old_e;
578 }
579 else
580 {
581 h+=inc;
582 if (h>max_curr[country])
583 h=old_h;
584 }
585 break;
586
587 default:
588 exit_on_usb(button);
589 break;
590 }
591 /*Display*/
592 if (!pos) /*Euro>home*/
593 h=mymul(e,currency[country]);
594 else /*Home>euro*/
595 e=mydiv(h,currency[country]);
596 display(e,h,pos);
597 }
598 return PLUGIN_OK;
599}
diff --git a/apps/plugins/firmware_flash.c b/apps/plugins/firmware_flash.c
deleted file mode 100644
index 36b8873a8c..0000000000
--- a/apps/plugins/firmware_flash.c
+++ /dev/null
@@ -1,1033 +0,0 @@
1/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* Plugin for reprogramming the whole Flash ROM chip with a new content.
11* !!! DON'T MESS WITH THIS CODE UNLESS YOU'RE ABSOLUTELY SURE WHAT YOU DO !!!
12*
13* Copyright (C) 2003 Jörg Hohensohn [IDC]Dragon
14*
15* This program is free software; you can redistribute it and/or
16* modify it under the terms of the GNU General Public License
17* as published by the Free Software Foundation; either version 2
18* of the License, or (at your option) any later version.
19*
20* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21* KIND, either express or implied.
22*
23****************************************************************************/
24#include "plugin.h"
25
26/* define DUMMY if you only want to "play" with the UI, does no harm */
27/* #define DUMMY */
28
29#ifndef UINT8
30#define UINT8 unsigned char
31#endif
32
33#ifndef UINT16
34#define UINT16 unsigned short
35#endif
36
37#ifndef UINT32
38#define UINT32 unsigned long
39#endif
40
41/* platform IDs as I have used them in my firmware templates */
42#define ID_RECORDER 0
43#define ID_FM 1
44#define ID_PLAYER 2
45#define ID_REC_V2 3
46#define ID_ONDIO_FM 4
47#define ID_ONDIO_SP 5
48
49/* Here I have to check for ARCHOS_* defines in source code, which is
50 generally strongly discouraged. But here I'm not checking for a certain
51 feature, I'm checking for the model itself. */
52#if defined(ARCHOS_PLAYER)
53#define FILE_TYPE "player"
54#define KEEP VERSION_ADR /* keep the firmware version */
55#define PLATFORM_ID ID_PLAYER
56#elif defined(ARCHOS_RECORDER)
57#define FILE_TYPE "rec"
58#define KEEP MASK_ADR /* keep the mask value */
59#define PLATFORM_ID ID_RECORDER
60#elif defined(ARCHOS_RECORDERV2)
61#define FILE_TYPE "v2"
62#define KEEP MASK_ADR /* keep the mask value */
63#define PLATFORM_ID ID_REC_V2
64#elif defined(ARCHOS_FMRECORDER)
65#define FILE_TYPE "fm"
66#define KEEP MASK_ADR /* keep the mask value */
67#define PLATFORM_ID ID_FM
68#elif defined(ARCHOS_ONDIOFM)
69#define FILE_TYPE "ondiofm"
70#define KEEP MASK_ADR /* keep the mask value */
71#define PLATFORM_ID ID_ONDIO_FM
72#elif defined(ARCHOS_ONDIOSP)
73#define FILE_TYPE "ondiosp"
74#define KEEP MASK_ADR /* keep the mask value */
75#define PLATFORM_ID ID_ONDIO_SP
76#else
77#error this platform is not (yet) flashable
78#endif
79
80
81
82#if CONFIG_KEYPAD == ONDIO_PAD /* limited keypad */
83#define KEY1 BUTTON_LEFT
84#define KEY2 BUTTON_UP
85#define KEY3 BUTTON_RIGHT
86#define KEYNAME1 "[Left]"
87#define KEYNAME2 "[Up]"
88#define KEYNAME3 "[Right]"
89#else /* recorder keypad */
90#define KEY1 BUTTON_F1
91#define KEY2 BUTTON_F2
92#define KEY3 BUTTON_F3
93#define KEYNAME1 "[F1]"
94#define KEYNAME2 "[F2]"
95#define KEYNAME3 "[F3]"
96#endif
97
98/* result of the CheckFirmwareFile() function */
99typedef enum
100{
101 eOK = 0,
102 eFileNotFound, /* errors from here on */
103 eTooBig,
104 eTooSmall,
105 eReadErr,
106 eBadContent,
107 eCrcErr,
108 eBadPlatform,
109} tCheckResult;
110
111/* result of the CheckBootROM() function */
112typedef enum
113{
114 eBootROM, /* the supported boot ROM(s) */
115 eUnknown, /* unknown boot ROM */
116 eROMless, /* flash mapped to zero */
117} tCheckROM;
118
119typedef struct
120{
121 UINT8 manufacturer;
122 UINT8 id;
123 int size;
124 char name[32];
125} tFlashInfo;
126
127#define MASK_ADR 0xFC /* position of hardware mask value in Flash */
128#define VERSION_ADR 0xFE /* position of firmware version value in Flash */
129#define PLATFORM_ADR 0xFB /* position of my platform ID value in Flash */
130#define SEC_SIZE 4096 /* size of one flash sector */
131static UINT8* sector; /* better not place this on the stack... */
132static volatile UINT8* FB = (UINT8*)0x02000000; /* Flash base address */
133
134
135/***************** Flash Functions *****************/
136
137
138/* read the manufacturer and device ID */
139bool ReadID(volatile UINT8* pBase, UINT8* pManufacturerID, UINT8* pDeviceID)
140{
141 UINT8 not_manu, not_id; /* read values before switching to ID mode */
142 UINT8 manu, id; /* read values when in ID mode */
143
144 pBase = (UINT8*)((UINT32)pBase & 0xFFF80000); /* down to 512k align */
145
146 /* read the normal content */
147 not_manu = pBase[0]; /* should be 'A' (0x41) and 'R' (0x52) */
148 not_id = pBase[1]; /* from the "ARCH" marker */
149
150 pBase[0x5555] = 0xAA; /* enter command mode */
151 pBase[0x2AAA] = 0x55;
152 pBase[0x5555] = 0x90; /* ID command */
153 rb->sleep(HZ/50); /* Atmel wants 20ms pause here */
154
155 manu = pBase[0];
156 id = pBase[1];
157
158 pBase[0] = 0xF0; /* reset flash (back to normal read mode) */
159 rb->sleep(HZ/50); /* Atmel wants 20ms pause here */
160
161 /* I assume success if the obtained values are different from
162 the normal flash content. This is not perfectly bulletproof, they
163 could theoretically be the same by chance, causing us to fail. */
164 if (not_manu != manu || not_id != id) /* a value has changed */
165 {
166 *pManufacturerID = manu; /* return the results */
167 *pDeviceID = id;
168 return true; /* success */
169 }
170 return false; /* fail */
171}
172
173
174/* erase the sector which contains the given address */
175bool EraseSector(volatile UINT8* pAddr)
176{
177#ifdef DUMMY
178 (void)pAddr; /* prevents warning */
179 return true;
180#else
181 volatile UINT8* pBase = (UINT8*)((UINT32)pAddr & 0xFFF80000); /* round down to 512k align */
182 unsigned timeout = 43000; /* the timeout loop should be no less than 25ms */
183
184 pBase[0x5555] = 0xAA; /* enter command mode */
185 pBase[0x2AAA] = 0x55;
186 pBase[0x5555] = 0x80; /* erase command */
187 pBase[0x5555] = 0xAA; /* enter command mode */
188 pBase[0x2AAA] = 0x55;
189 *pAddr = 0x30; /* erase the sector */
190
191 /* I counted 7 instructions for this loop -> min. 0.58 us per round */
192 /* Plus memory waitstates it will be much more, gives margin */
193 while (*pAddr != 0xFF && --timeout); /* poll for erased */
194
195 return (timeout != 0);
196#endif
197}
198
199
200/* address must be in an erased location */
201static inline bool ProgramByte(volatile UINT8* pAddr, UINT8 data)
202{
203#ifdef DUMMY
204 (void)pAddr; /* prevents warnings */
205 (void)data;
206 return true;
207#else
208 unsigned timeout = 35; /* the timeout loop should be no less than 20us */
209
210 if (~*pAddr & data) /* just a safety feature, not really necessary */
211 return false; /* can't set any bit from 0 to 1 */
212
213 FB[0x5555] = 0xAA; /* enter command mode */
214 FB[0x2AAA] = 0x55;
215 FB[0x5555] = 0xA0; /* byte program command */
216
217 *pAddr = data;
218
219 /* I counted 7 instructions for this loop -> min. 0.58 us per round */
220 /* Plus memory waitstates it will be much more, gives margin */
221 while (*pAddr != data && --timeout); /* poll for programmed */
222
223 return (timeout != 0);
224#endif
225}
226
227
228/* this returns true if supported and fills the info struct */
229bool GetFlashInfo(tFlashInfo* pInfo)
230{
231 rb->memset(pInfo, 0, sizeof(tFlashInfo));
232
233 if (!ReadID(FB, &pInfo->manufacturer, &pInfo->id))
234 return false;
235
236 if (pInfo->manufacturer == 0xBF) /* SST */
237 {
238 if (pInfo->id == 0xD6)
239 {
240 pInfo->size = 256* 1024; /* 256k */
241 rb->strcpy(pInfo->name, "SST39VF020");
242 return true;
243 }
244 else if (pInfo->id == 0xD7)
245 {
246 pInfo->size = 512* 1024; /* 512k */
247 rb->strcpy(pInfo->name, "SST39VF040");
248 return true;
249 }
250 else
251 return false;
252 }
253 return false;
254}
255
256/*********** Firmware File Functions + helpers ************/
257
258/* test if the version number is consistent with the platform */
259bool CheckPlatform(int platform_id, UINT16 version)
260{
261 if (version == 200)
262 { /* for my very first firmwares, I foolishly changed it to 200 */
263 return (platform_id == ID_RECORDER || platform_id == ID_FM);
264 }
265 else if (version == 123)
266 { /* it can be a FM or V2 recorder */
267 return (platform_id == ID_FM || platform_id == ID_REC_V2);
268 }
269 else if (version == 132)
270 { /* newer Ondio, and seen on a V2 recorder */
271 return (platform_id == ID_ONDIO_SP || platform_id == ID_ONDIO_FM
272 || platform_id == ID_REC_V2);
273 }
274 else if (version == 104)
275 { /* classic Ondio128 */
276 return (platform_id == ID_ONDIO_FM);
277 }
278 else if (version >= 115 && version <= 129)
279 { /* the range of Recorders seen so far */
280 return (platform_id == ID_RECORDER);
281 }
282 else if (version == 0 || (version >= 300 && version <= 508))
283 { /* for very old players, I've seen zero */
284 return (platform_id == ID_PLAYER);
285 }
286
287 return false; /* unknown */
288}
289
290
291tCheckResult CheckFirmwareFile(char* filename, int chipsize, bool is_romless)
292{
293 int i;
294 int fd;
295 int fileleft; /* size info, how many left for reading */
296 int fileread = 0; /* total size as read from the file */
297 int read_now; /* how many to read for this sector */
298 int got_now; /* how many gotten for this sector */
299 unsigned crc32 = 0xFFFFFFFF; /* CCITT init value */
300 unsigned file_crc; /* CRC value read from file */
301 bool has_crc;
302
303 fd = rb->open(filename, O_RDONLY);
304 if (fd < 0)
305 return eFileNotFound;
306
307 fileleft = rb->filesize(fd);
308 if (fileleft > chipsize)
309 {
310 rb->close(fd);
311 return eTooBig;
312 }
313 else if (fileleft < 20000) /* give it some reasonable lower limit */
314 {
315 rb->close(fd);
316 return eTooSmall;
317 }
318
319 if (fileleft == 256*1024)
320 { /* original dumped firmware file has no CRC nor platform ID */
321 has_crc = false;
322 }
323 else
324 {
325 has_crc = true;
326 fileleft -= sizeof(unsigned); /* exclude the last 4 bytes */
327 }
328
329 /* do some sanity checks */
330
331 got_now = rb->read(fd, sector, SEC_SIZE); /* read first sector */
332 fileread += got_now;
333 fileleft -= got_now;
334 if (got_now != SEC_SIZE)
335 {
336 rb->close(fd);
337 return eReadErr;
338 }
339
340 /* version number in file plausible with this hardware? */
341 if (!CheckPlatform(PLATFORM_ID, *(UINT16*)(sector + VERSION_ADR)))
342 {
343 rb->close(fd);
344 return eBadPlatform;
345 }
346
347 if (has_crc)
348 {
349 crc32 = rb->crc_32(sector, SEC_SIZE, crc32); /* checksum */
350
351 /* in addition to the CRC, my files also have a platform ID */
352 if (sector[PLATFORM_ADR] != PLATFORM_ID) /* for our hardware? */
353 {
354 rb->close(fd);
355 return eBadPlatform;
356 }
357 }
358
359 if (is_romless)
360 { /* in this case, there is not much we can check */
361 if (*(UINT32*)sector != 0x00000200) /* reset vector */
362 {
363 rb->close(fd);
364 return eBadContent;
365 }
366 }
367 else
368 {
369 /* compare some bytes which have to be identical */
370 if (*(UINT32*)sector != 0x41524348) /* "ARCH" */
371 {
372 rb->close(fd);
373 return eBadContent;
374 }
375
376 for (i = 0x30; i<MASK_ADR-2; i++) /* leave two bytes for me */
377 {
378 if (sector[i] != FB[i])
379 {
380 rb->close(fd);
381 return eBadContent;
382 }
383 }
384 }
385
386 /* check if we can read the whole file, and do checksum */
387 do
388 {
389 read_now = MIN(SEC_SIZE, fileleft);
390 got_now = rb->read(fd, sector, read_now);
391 fileread += got_now;
392 fileleft -= got_now;
393
394 if (read_now != got_now)
395 {
396 rb->close(fd);
397 return eReadErr;
398 }
399
400 if (has_crc)
401 {
402 crc32 = rb->crc_32(sector, got_now, crc32); /* checksum */
403 }
404 } while (fileleft);
405
406 if (has_crc)
407 {
408 got_now = rb->read(fd, &file_crc, sizeof(file_crc));
409 if (got_now != sizeof(file_crc))
410 {
411 rb->close(fd);
412 return eReadErr;
413 }
414 }
415
416 /* must be EOF now */
417 got_now = rb->read(fd, sector, SEC_SIZE);
418 rb->close(fd);
419 if (got_now != 0)
420 return eReadErr;
421
422 if (has_crc && file_crc != crc32)
423 return eCrcErr;
424
425 return eOK;
426}
427
428
429/* returns the # of failures, 0 on success */
430unsigned ProgramFirmwareFile(char* filename, int chipsize)
431{
432 int i, j;
433 int fd;
434 int read = SEC_SIZE; /* how many for this sector */
435 UINT16 keep = *(UINT16*)(FB + KEEP); /* we must keep this! */
436 unsigned failures = 0;
437
438 fd = rb->open(filename, O_RDONLY);
439 if (fd < 0)
440 return false;
441
442 for (i=0; i<chipsize; i+=SEC_SIZE)
443 {
444 if (!EraseSector(FB + i))
445 {
446 /* nothing we can do, let the programming count the errors */
447 }
448
449 if (read == SEC_SIZE) /* not EOF yet */
450 {
451 read = rb->read(fd, sector, SEC_SIZE);
452 if (i==0)
453 { /* put original value back in */
454 *(UINT16*)(sector + KEEP) = keep;
455 }
456
457 for (j=0; j<read; j++)
458 {
459 if (!ProgramByte(FB + i + j, sector[j]))
460 {
461 failures++;
462 }
463 }
464 }
465 }
466
467 rb->close(fd);
468
469 return failures;
470}
471
472
473/* returns the # of failures, 0 on success */
474unsigned VerifyFirmwareFile(char* filename)
475{
476 int i=0, j;
477 int fd;
478 int read = SEC_SIZE; /* how many for this sector */
479 unsigned failures = 0;
480
481 fd = rb->open(filename, O_RDONLY);
482 if (fd < 0)
483 return false;
484
485 do
486 {
487 read = rb->read(fd, sector, SEC_SIZE);
488
489 for (j=0; j<read; j++)
490 {
491 /* position of keep value is no error */
492 if (FB[i] != sector[j] && i != KEEP && i != (KEEP+1))
493 {
494 failures++;
495 }
496 i++;
497 }
498 }
499 while (read == SEC_SIZE);
500
501 rb->close(fd);
502
503 return failures;
504}
505
506
507/***************** Support Functions *****************/
508
509/* check if we have "normal" boot ROM or flash mirrored to zero */
510tCheckROM CheckBootROM(void)
511{
512 unsigned boot_crc;
513 unsigned* pFlash = (unsigned*)FB;
514 unsigned* pRom = (unsigned*)0x0;
515 unsigned i;
516
517 boot_crc = rb->crc_32((unsigned char*)0x0, 64*1024, 0xFFFFFFFF);
518 if (boot_crc == 0x56DBA4EE /* the known boot ROM */
519#if PLATFORM_ID == ID_PLAYER
520 /* alternative boot ROM found in one single player so far */
521 || boot_crc == 0x358099E8
522#endif
523 )
524 return eBootROM;
525
526 /* check if ROM is a flash mirror */
527 for (i=0; i<256*1024/sizeof(unsigned); i++)
528 {
529 if (*pRom++ != *pFlash++)
530 { /* difference means no mirror */
531 return eUnknown;
532 }
533 }
534
535 return eROMless;
536}
537
538
539/***************** User Interface Functions *****************/
540
541int WaitForButton(void)
542{
543 int button;
544
545 do
546 {
547 button = rb->button_get(true);
548 } while (IS_SYSEVENT(button) || (button & BUTTON_REL));
549
550 return button;
551}
552
553#ifdef HAVE_LCD_BITMAP
554/* Recorder implementation */
555
556/* helper for DoUserDialog() */
557void ShowFlashInfo(tFlashInfo* pInfo)
558{
559 if (!pInfo->manufacturer)
560 {
561 rb->lcd_puts(0, 0, "Flash: M=?? D=??");
562 rb->lcd_puts(0, 1, "Impossible to program");
563 }
564 else
565 {
566 rb->lcd_putsf(0, 0, "Flash: M=%02x D=%02x",
567 pInfo->manufacturer, pInfo->id);
568
569
570 if (pInfo->size)
571 {
572 rb->lcd_puts(0, 1, pInfo->name);
573 rb->lcd_putsf(0, 2, "Size: %d KB", pInfo->size / 1024);
574 }
575 else
576 {
577 rb->lcd_puts(0, 1, "Unsupported chip");
578 }
579
580 }
581
582 rb->lcd_update();
583}
584
585
586/* Kind of our main function, defines the application flow. */
587void DoUserDialog(char* filename)
588{
589 tFlashInfo FlashInfo;
590 char default_filename[32];
591 int button;
592 int rc; /* generic return code */
593 size_t memleft;
594 tCheckROM result;
595 bool is_romless;
596
597 /* this can only work if Rockbox runs in DRAM, not flash ROM */
598 if ((UINT8*)rb >= FB && (UINT8*)rb < FB + 4096*1024) /* 4 MB max */
599 { /* we're running from flash */
600 rb->splash(HZ*3, "Not from ROM");
601 return; /* exit */
602 }
603
604 /* test if the user is running the correct plugin for this box */
605 if (!CheckPlatform(PLATFORM_ID, *(UINT16*)(FB + VERSION_ADR)))
606 {
607 rb->splash(HZ*3, "Wrong plugin");
608 return; /* exit */
609 }
610
611 /* refuse to work if the power may fail meanwhile */
612 if (!rb->battery_level_safe())
613 {
614 rb->splash(HZ*3, "Battery too low!");
615 return; /* exit */
616 }
617
618 /* check boot ROM */
619 result = CheckBootROM();
620 if (result == eUnknown)
621 { /* no support for any other yet */
622 rb->splash(HZ*3, "Wrong boot ROM");
623 return; /* exit */
624 }
625 is_romless = (result == eROMless);
626
627 /* compose filename if none given */
628 if (filename == NULL)
629 {
630 rb->snprintf(
631 default_filename,
632 sizeof(default_filename),
633 "/firmware_%s%s.bin",
634 FILE_TYPE,
635 is_romless ? "_norom" : "");
636 filename = default_filename;
637 }
638
639 /* "allocate" memory */
640 sector = rb->plugin_get_buffer(&memleft);
641 if (memleft < SEC_SIZE) /* need buffer for a flash sector */
642 {
643 rb->splash(HZ*3, "Out of memory");
644 return; /* exit */
645 }
646
647 rb->lcd_setfont(FONT_SYSFIXED);
648
649 rc = GetFlashInfo(&FlashInfo);
650 ShowFlashInfo(&FlashInfo);
651 if (FlashInfo.size == 0) /* no valid chip */
652 {
653 rb->splash(HZ*3, "Sorry!");
654 return; /* exit */
655 }
656
657 rb->lcd_puts(0, 3, "using file:");
658 rb->lcd_puts_scroll(0, 4, filename);
659 rb->lcd_puts(0, 6, KEYNAME1 " to check file");
660 rb->lcd_puts(0, 7, "other key to exit");
661 rb->lcd_update();
662
663 button = WaitForButton();
664 if (button != KEY1)
665 {
666 return;
667 }
668
669 rb->lcd_clear_display();
670 rb->lcd_puts(0, 0, "checking...");
671 rb->lcd_update();
672
673 rc = CheckFirmwareFile(filename, FlashInfo.size, is_romless);
674 rb->lcd_puts(0, 0, "checked:");
675 switch (rc)
676 {
677 case eOK:
678 rb->lcd_puts(0, 1, "File OK.");
679 break;
680 case eFileNotFound:
681 rb->lcd_puts(0, 1, "File not found.");
682 rb->lcd_puts(0, 2, "Put this in root:");
683 rb->lcd_puts_scroll(0, 4, filename);
684 break;
685 case eTooBig:
686 rb->lcd_puts(0, 1, "File too big,");
687 rb->lcd_puts(0, 2, "larger than chip.");
688 break;
689 case eTooSmall:
690 rb->lcd_puts(0, 1, "File too small.");
691 rb->lcd_puts(0, 2, "Incomplete?");
692 break;
693 case eReadErr:
694 rb->lcd_puts(0, 1, "Read error.");
695 break;
696 case eBadContent:
697 rb->lcd_puts(0, 1, "File invalid.");
698 rb->lcd_puts(0, 2, "Sanity check fail.");
699 break;
700 case eCrcErr:
701 rb->lcd_puts(0, 1, "File invalid.");
702 rb->lcd_puts(0, 2, "CRC check failed,");
703 rb->lcd_puts(0, 3, "checksum mismatch.");
704 break;
705 case eBadPlatform:
706 rb->lcd_puts(0, 1, "Wrong file for");
707 rb->lcd_puts(0, 2, "this hardware.");
708 break;
709 default:
710 rb->lcd_puts(0, 1, "Check failed.");
711 break;
712 }
713
714 if (rc == eOK)
715 {
716 rb->lcd_puts(0, 6, KEYNAME2 " to program");
717 rb->lcd_puts(0, 7, "other key to exit");
718 }
719 else
720 { /* error occured */
721 rb->lcd_puts(0, 6, "Any key to exit");
722 }
723
724 rb->lcd_update();
725
726 button = WaitForButton();
727 if (button != KEY2 || rc != eOK)
728 {
729 return;
730 }
731
732 rb->lcd_clear_display();
733 rb->lcd_puts(0, 0, "Program all Flash?");
734 rb->lcd_puts(0, 1, "Are you sure?");
735 rb->lcd_puts(0, 2, "If it goes wrong,");
736 rb->lcd_puts(0, 3, "it kills your box!");
737 rb->lcd_puts(0, 4, "See documentation.");
738
739 rb->lcd_puts(0, 6, KEYNAME3 " to proceed");
740 rb->lcd_puts(0, 7, "other key to exit");
741 rb->lcd_update();
742
743 button = WaitForButton();
744 if (button != KEY3)
745 {
746 return;
747 }
748
749 rb->lcd_clear_display();
750 rb->lcd_puts(0, 0, "Programming...");
751 rb->lcd_update();
752
753 rc = ProgramFirmwareFile(filename, FlashInfo.size);
754 if (rc)
755 { /* errors */
756 rb->lcd_clear_display();
757 rb->lcd_puts(0, 0, "Panic:");
758 rb->lcd_puts(0, 1, "Programming fail!");
759 rb->lcd_putsf(0, 2, "%d errors", rc);
760 rb->lcd_update();
761 button = WaitForButton();
762 }
763
764 rb->lcd_clear_display();
765 rb->lcd_puts(0, 0, "Verifying...");
766 rb->lcd_update();
767
768 rc = VerifyFirmwareFile(filename);
769
770 rb->lcd_clear_display();
771 if (rc == 0)
772 {
773 rb->lcd_puts(0, 0, "Verify OK.");
774 }
775 else
776 {
777 rb->lcd_puts(0, 0, "Panic:");
778 rb->lcd_puts(0, 1, "Verify fail!");
779 rb->lcd_putsf(0, 2, "%d errors", rc);
780 }
781 rb->lcd_puts(0, 7, "Any key to exit");
782 rb->lcd_update();
783
784 button = WaitForButton();
785}
786
787#else /* HAVE_LCD_BITMAP */
788/* Player implementation */
789
790/* helper for DoUserDialog() */
791void ShowFlashInfo(tFlashInfo* pInfo)
792{
793 char buf[32];
794
795 if (!pInfo->manufacturer)
796 {
797 rb->lcd_puts_scroll(0, 0, "Flash: M=? D=?");
798 rb->lcd_puts_scroll(0, 1, "Impossible to program");
799 rb->lcd_update();
800 WaitForButton();
801 }
802 else
803 {
804 rb->snprintf(buf, sizeof(buf), "Flash: M=%02x D=%02x",
805 pInfo->manufacturer, pInfo->id);
806 rb->lcd_puts_scroll(0, 0, buf);
807
808 if (pInfo->size)
809 {
810 rb->snprintf(buf, sizeof(buf), "Size: %d KB", pInfo->size / 1024);
811 rb->lcd_puts_scroll(0, 1, buf);
812 rb->lcd_update();
813 }
814 else
815 {
816 rb->lcd_puts_scroll(0, 1, "Unsupported chip");
817 rb->lcd_update();
818 WaitForButton();
819 }
820 }
821}
822
823
824void DoUserDialog(char* filename)
825{
826 tFlashInfo FlashInfo;
827 char buf[32];
828 char default_filename[32];
829 int button;
830 int rc; /* generic return code */
831 size_t memleft;
832 tCheckROM result;
833 bool is_romless;
834
835 /* this can only work if Rockbox runs in DRAM, not flash ROM */
836 if ((UINT8*)rb >= FB && (UINT8*)rb < FB + 4096*1024) /* 4 MB max */
837 { /* we're running from flash */
838 rb->splash(HZ*3, "Not from ROM");
839 return; /* exit */
840 }
841
842 /* test if the user is running the correct plugin for this box */
843 if (!CheckPlatform(PLATFORM_ID, *(UINT16*)(FB + VERSION_ADR)))
844 {
845 rb->splash(HZ*3, "Wrong version");
846 return; /* exit */
847 }
848
849 /* refuse to work if the power may fail meanwhile */
850 if (!rb->battery_level_safe())
851 {
852 rb->splash(HZ*3, "Batt. too low!");
853 return; /* exit */
854 }
855
856 /* check boot ROM */
857 result = CheckBootROM();
858 if (result == eUnknown)
859 { /* no support for any other yet */
860 rb->splash(HZ*3, "Wrong boot ROM");
861 return; /* exit */
862 }
863 is_romless = (result == eROMless);
864
865 /* compose filename if none given */
866 if (filename == NULL)
867 {
868 rb->snprintf(
869 default_filename,
870 sizeof(default_filename),
871 "/firmware_%s%s.bin",
872 FILE_TYPE,
873 is_romless ? "_norom" : "");
874 filename = default_filename;
875 }
876
877 /* "allocate" memory */
878 sector = rb->plugin_get_buffer(&memleft);
879 if (memleft < SEC_SIZE) /* need buffer for a flash sector */
880 {
881 rb->splash(HZ*3, "Out of memory");
882 return; /* exit */
883 }
884
885 rc = GetFlashInfo(&FlashInfo);
886 ShowFlashInfo(&FlashInfo);
887
888 if (FlashInfo.size == 0) /* no valid chip */
889 {
890 return; /* exit */
891 }
892
893 rb->lcd_puts_scroll(0, 0, filename);
894 rb->lcd_puts_scroll(0, 1, "[Menu] to check");
895 rb->lcd_update();
896
897 button = WaitForButton();
898 if (button != BUTTON_MENU)
899 {
900 return;
901 }
902
903 rb->lcd_clear_display();
904 rb->lcd_puts(0, 0, "Checking...");
905 rb->lcd_update();
906
907 rc = CheckFirmwareFile(filename, FlashInfo.size, is_romless);
908 rb->lcd_puts(0, 0, "Checked:");
909 switch (rc)
910 {
911 case eOK:
912 rb->lcd_puts(0, 1, "File OK.");
913 break;
914 case eFileNotFound:
915 rb->lcd_puts_scroll(0, 0, "File not found:");
916 rb->lcd_puts_scroll(0, 1, filename);
917 break;
918 case eTooBig:
919 rb->lcd_puts_scroll(0, 0, "File too big,");
920 rb->lcd_puts_scroll(0, 1, "larger than chip.");
921 break;
922 case eTooSmall:
923 rb->lcd_puts_scroll(0, 0, "File too small.");
924 rb->lcd_puts_scroll(0, 1, "Incomplete?");
925 break;
926 case eReadErr:
927 rb->lcd_puts_scroll(0, 0, "Read error.");
928 break;
929 case eBadContent:
930 rb->lcd_puts_scroll(0, 0, "File invalid.");
931 rb->lcd_puts_scroll(0, 1, "Sanity check failed.");
932 break;
933 case eCrcErr:
934 rb->lcd_puts_scroll(0, 0, "File invalid.");
935 rb->lcd_puts_scroll(0, 1, "CRC check failed.");
936 break;
937 case eBadPlatform:
938 rb->lcd_puts_scroll(0, 0, "Wrong file for");
939 rb->lcd_puts_scroll(0, 1, "this hardware.");
940 break;
941 default:
942 rb->lcd_puts_scroll(0, 0, "Check failed.");
943 break;
944 }
945 rb->lcd_update();
946
947 rb->sleep(HZ*3);
948
949 if (rc == eOK)
950 {
951 rb->lcd_puts_scroll(0, 0, "[On] to program,");
952 rb->lcd_puts_scroll(0, 1, "other key to exit.");
953 rb->lcd_update();
954 }
955 else
956 { /* error occured */
957 return;
958 }
959
960 button = WaitForButton();
961
962 if (button != BUTTON_ON)
963 {
964 return;
965 }
966
967 rb->lcd_clear_display();
968 rb->lcd_puts_scroll(0, 0, "Are you sure?");
969 rb->lcd_puts_scroll(0, 1, "[+] to proceed.");
970 rb->lcd_update();
971
972 button = WaitForButton();
973
974 if (button != BUTTON_RIGHT)
975 {
976 return;
977 }
978
979 rb->lcd_clear_display();
980 rb->lcd_puts_scroll(0, 0, "Programming...");
981 rb->lcd_update();
982
983 rc = ProgramFirmwareFile(filename, FlashInfo.size);
984
985 if (rc)
986 { /* errors */
987 rb->lcd_clear_display();
988 rb->lcd_puts_scroll(0, 0, "Programming failed!");
989 rb->snprintf(buf, sizeof(buf), "%d errors", rc);
990 rb->lcd_puts_scroll(0, 1, buf);
991 rb->lcd_update();
992 WaitForButton();
993 }
994
995 rb->lcd_clear_display();
996 rb->lcd_puts_scroll(0, 0, "Verifying...");
997 rb->lcd_update();
998
999 rc = VerifyFirmwareFile(filename);
1000
1001 rb->lcd_clear_display();
1002
1003 if (rc == 0)
1004 {
1005 rb->lcd_puts_scroll(0, 0, "Verify OK.");
1006 }
1007 else
1008 {
1009 rb->snprintf(buf, sizeof(buf), "Verify failed! %d errors", rc);
1010 rb->lcd_puts_scroll(0, 0, buf);
1011 }
1012
1013 rb->lcd_puts_scroll(0, 1, "Press any key to exit.");
1014 rb->lcd_update();
1015 WaitForButton();
1016}
1017
1018#endif /* not HAVE_LCD_BITMAP */
1019
1020
1021/***************** Plugin Entry Point *****************/
1022
1023enum plugin_status plugin_start(const void* parameter)
1024{
1025 int oldmode;
1026
1027 /* now go ahead and have fun! */
1028 oldmode = rb->system_memory_guard(MEMGUARD_NONE); /*disable memory guard */
1029 DoUserDialog((char*) parameter);
1030 rb->system_memory_guard(oldmode); /* re-enable memory guard */
1031
1032 return PLUGIN_OK;
1033}
diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c
index ed288d444d..fab409cc14 100644
--- a/apps/plugins/flipit.c
+++ b/apps/plugins/flipit.c
@@ -23,42 +23,7 @@
23 23
24 24
25/* variable button definitions */ 25/* variable button definitions */
26#if CONFIG_KEYPAD == RECORDER_PAD 26#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
27#define FLIPIT_LEFT BUTTON_LEFT
28#define FLIPIT_RIGHT BUTTON_RIGHT
29#define FLIPIT_UP BUTTON_UP
30#define FLIPIT_DOWN BUTTON_DOWN
31#define FLIPIT_QUIT BUTTON_OFF
32#define FLIPIT_SHUFFLE BUTTON_F1
33#define FLIPIT_SOLVE BUTTON_F2
34#define FLIPIT_STEP_BY_STEP BUTTON_F3
35#define FLIPIT_TOGGLE BUTTON_PLAY
36
37#elif CONFIG_KEYPAD == PLAYER_PAD
38#define FLIPIT_LEFT BUTTON_LEFT
39#define FLIPIT_RIGHT BUTTON_RIGHT
40#define FLIPIT_UP_PRE BUTTON_ON
41#define FLIPIT_UP (BUTTON_ON | BUTTON_REL)
42#define FLIPIT_DOWN BUTTON_MENU
43#define FLIPIT_QUIT BUTTON_STOP
44#define FLIPIT_SHUFFLE (BUTTON_ON | BUTTON_LEFT)
45#define FLIPIT_SOLVE (BUTTON_ON | BUTTON_RIGHT)
46#define FLIPIT_STEP_BY_STEP (BUTTON_ON | BUTTON_PLAY)
47#define FLIPIT_TOGGLE BUTTON_PLAY
48
49#elif CONFIG_KEYPAD == ONDIO_PAD
50#define FLIPIT_LEFT BUTTON_LEFT
51#define FLIPIT_RIGHT BUTTON_RIGHT
52#define FLIPIT_UP BUTTON_UP
53#define FLIPIT_DOWN BUTTON_DOWN
54#define FLIPIT_QUIT BUTTON_OFF
55#define FLIPIT_SHUFFLE (BUTTON_MENU | BUTTON_LEFT)
56#define FLIPIT_SOLVE (BUTTON_MENU | BUTTON_UP)
57#define FLIPIT_STEP_BY_STEP (BUTTON_MENU | BUTTON_RIGHT)
58#define FLIPIT_TOGGLE_PRE BUTTON_MENU
59#define FLIPIT_TOGGLE (BUTTON_MENU | BUTTON_REL)
60
61#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
62 (CONFIG_KEYPAD == IRIVER_H300_PAD) 27 (CONFIG_KEYPAD == IRIVER_H300_PAD)
63#define FLIPIT_LEFT BUTTON_LEFT 28#define FLIPIT_LEFT BUTTON_LEFT
64#define FLIPIT_RIGHT BUTTON_RIGHT 29#define FLIPIT_RIGHT BUTTON_RIGHT
@@ -937,20 +902,8 @@ enum plugin_status plugin_start(const void* parameter)
937 /* print instructions */ 902 /* print instructions */
938 rb->lcd_clear_display(); 903 rb->lcd_clear_display();
939 rb->lcd_setfont(FONT_SYSFIXED); 904 rb->lcd_setfont(FONT_SYSFIXED);
940#if CONFIG_KEYPAD == RECORDER_PAD 905#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
941 rb->lcd_putsxy(2, 8, "[OFF] to stop"); 906 (CONFIG_KEYPAD == IRIVER_H300_PAD)
942 rb->lcd_putsxy(2, 18, "[PLAY] toggle");
943 rb->lcd_putsxy(2, 28, "[F1] shuffle");
944 rb->lcd_putsxy(2, 38, "[F2] solution");
945 rb->lcd_putsxy(2, 48, "[F3] step by step");
946#elif CONFIG_KEYPAD == ONDIO_PAD
947 rb->lcd_putsxy(2, 8, "[OFF] to stop");
948 rb->lcd_putsxy(2, 18, "[MODE] toggle");
949 rb->lcd_putsxy(2, 28, "[M-LEFT] shuffle");
950 rb->lcd_putsxy(2, 38, "[M-UP] solution");
951 rb->lcd_putsxy(2, 48, "[M-RIGHT] step by step");
952#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
953 (CONFIG_KEYPAD == IRIVER_H300_PAD)
954 rb->lcd_putsxy(2, 8, "[STOP] to stop"); 907 rb->lcd_putsxy(2, 8, "[STOP] to stop");
955 rb->lcd_putsxy(2, 18, "[SELECT] toggle"); 908 rb->lcd_putsxy(2, 18, "[SELECT] toggle");
956 rb->lcd_putsxy(2, 28, "[MODE] shuffle"); 909 rb->lcd_putsxy(2, 28, "[MODE] shuffle");
diff --git a/apps/plugins/fractals/cpu_sh7043.h b/apps/plugins/fractals/cpu_sh7043.h
deleted file mode 100644
index 0d773432a8..0000000000
--- a/apps/plugins/fractals/cpu_sh7043.h
+++ /dev/null
@@ -1,96 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Tomer Shalev
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#ifndef _CPU_SH7043_H
23#define _CPU_SH7043_H
24
25inline static short muls16_asr10(short a, short b)
26{
27 short r;
28 asm (
29 "muls %[a],%[b] \n"
30 "sts macl,%[r] \n"
31 "shlr8 %[r] \n"
32 "shlr2 %[r] \n"
33 : /* outputs */
34 [r]"=r"(r)
35 : /* inputs */
36 [a]"r"(a),
37 [b]"r"(b)
38 );
39 return r;
40}
41
42inline static long muls32_asr26(long a, long b)
43{
44 long r, t1, t2, t3;
45 asm (
46 /* Signed 32bit * 32bit -> 64bit multiplication.
47 Notation: xxab * xxcd, where each letter represents 16 bits.
48 xx is the 64 bit sign extension. */
49 "swap.w %[a],%[t1] \n" /* t1 = ba */
50 "mulu %[t1],%[b] \n" /* a * d */
51 "swap.w %[b],%[t3] \n" /* t3 = dc */
52 "sts macl,%[t2] \n" /* t2 = a * d */
53 "mulu %[t1],%[t3] \n" /* a * c */
54 "sts macl,%[r] \n" /* hi = a * c */
55 "mulu %[a],%[t3] \n" /* b * c */
56 "clrt \n"
57 "sts macl,%[t3] \n" /* t3 = b * c */
58 "addc %[t2],%[t3] \n" /* t3 += t2, carry -> t2 */
59 "movt %[t2] \n"
60 "mulu %[a],%[b] \n" /* b * d */
61 "mov %[t3],%[t1] \n" /* t1t3 = t2t3 << 16 */
62 "xtrct %[t2],%[t1] \n"
63 "shll16 %[t3] \n"
64 "sts macl,%[t2] \n" /* lo = b * d */
65 "clrt \n" /* hi.lo += t1t3 */
66 "addc %[t3],%[t2] \n"
67 "addc %[t1],%[r] \n"
68 "cmp/pz %[a] \n" /* ab >= 0 ? */
69 "bt 1f \n"
70 "sub %[b],%[r] \n" /* no: hi -= cd (sign extension of ab is -1) */
71 "1: \n"
72 "cmp/pz %[b] \n" /* cd >= 0 ? */
73 "bt 2f \n"
74 "sub %[a],%[r] \n" /* no: hi -= ab (sign extension of cd is -1) */
75 "2: \n"
76 /* Shift right by 26 and return low 32 bits */
77 "shll2 %[r] \n" /* hi <<= 6 */
78 "shll2 %[r] \n"
79 "shll2 %[r] \n"
80 "shlr16 %[t2] \n" /* (unsigned)lo >>= 26 */
81 "shlr8 %[t2] \n"
82 "shlr2 %[t2] \n"
83 "or %[t2],%[r] \n" /* combine result */
84 : /* outputs */
85 [r] "=&r"(r),
86 [t1]"=&r"(t1),
87 [t2]"=&r"(t2),
88 [t3]"=&r"(t3)
89 : /* inputs */
90 [a] "r" (a),
91 [b] "r" (b)
92 );
93 return r;
94}
95
96#endif
diff --git a/apps/plugins/fractals/fractal.h b/apps/plugins/fractals/fractal.h
index c7a822c2c6..92a0b87c48 100644
--- a/apps/plugins/fractals/fractal.h
+++ b/apps/plugins/fractals/fractal.h
@@ -22,33 +22,7 @@
22#define _FRACTAL_H 22#define _FRACTAL_H
23 23
24/* variable button definitions */ 24/* variable button definitions */
25#if CONFIG_KEYPAD == RECORDER_PAD 25#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
26#define FRACTAL_QUIT BUTTON_OFF
27#define FRACTAL_UP BUTTON_UP
28#define FRACTAL_DOWN BUTTON_DOWN
29#define FRACTAL_LEFT BUTTON_LEFT
30#define FRACTAL_RIGHT BUTTON_RIGHT
31#define FRACTAL_ZOOM_IN BUTTON_PLAY
32#define FRACTAL_ZOOM_OUT BUTTON_ON
33#define FRACTAL_PRECISION_INC BUTTON_F2
34#define FRACTAL_PRECISION_DEC BUTTON_F1
35#define FRACTAL_RESET BUTTON_F3
36
37#elif CONFIG_KEYPAD == ONDIO_PAD
38#define FRACTAL_QUIT BUTTON_OFF
39#define FRACTAL_UP BUTTON_UP
40#define FRACTAL_DOWN BUTTON_DOWN
41#define FRACTAL_LEFT BUTTON_LEFT
42#define FRACTAL_RIGHT BUTTON_RIGHT
43#define FRACTAL_ZOOM_IN_PRE BUTTON_MENU
44#define FRACTAL_ZOOM_IN (BUTTON_MENU | BUTTON_REL)
45#define FRACTAL_ZOOM_IN2 (BUTTON_MENU | BUTTON_UP)
46#define FRACTAL_ZOOM_OUT (BUTTON_MENU | BUTTON_DOWN)
47#define FRACTAL_PRECISION_INC (BUTTON_MENU | BUTTON_RIGHT)
48#define FRACTAL_PRECISION_DEC (BUTTON_MENU | BUTTON_LEFT)
49#define FRACTAL_RESET (BUTTON_MENU | BUTTON_OFF)
50
51#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
52 (CONFIG_KEYPAD == IRIVER_H300_PAD) 26 (CONFIG_KEYPAD == IRIVER_H300_PAD)
53#define FRACTAL_QUIT BUTTON_OFF 27#define FRACTAL_QUIT BUTTON_OFF
54#define FRACTAL_UP BUTTON_UP 28#define FRACTAL_UP BUTTON_UP
diff --git a/apps/plugins/fractals/mandelbrot_set.h b/apps/plugins/fractals/mandelbrot_set.h
index 4eeb68461b..2814d24e58 100644
--- a/apps/plugins/fractals/mandelbrot_set.h
+++ b/apps/plugins/fractals/mandelbrot_set.h
@@ -24,18 +24,13 @@
24#include "fractal_sets.h" 24#include "fractal_sets.h"
25 25
26/* CPU stuff */ 26/* CPU stuff */
27#if CONFIG_CPU == SH7034 27#if defined CPU_COLDFIRE
28#include "cpu_sh7043.h"
29#elif defined CPU_COLDFIRE
30#include "cpu_coldfire.h" 28#include "cpu_coldfire.h"
31#elif defined CPU_ARM 29#elif defined CPU_ARM
32#include "cpu_arm.h" 30#include "cpu_arm.h"
33#endif 31#endif
34 32
35#if CONFIG_CPU == SH7034 33#if defined CPU_COLDFIRE
36#define MULS16_ASR10(a, b) muls16_asr10(a, b)
37#define MULS32_ASR26(a, b) muls32_asr26(a, b)
38#elif defined CPU_COLDFIRE
39/* Needs the EMAC initialised to fractional mode w/o rounding and saturation */ 34/* Needs the EMAC initialised to fractional mode w/o rounding and saturation */
40#define MULS32_INIT() coldfire_set_macsr(EMAC_FRACTIONAL) 35#define MULS32_INIT() coldfire_set_macsr(EMAC_FRACTIONAL)
41#define MULS16_ASR10(a, b) muls16_asr10(a, b) 36#define MULS16_ASR10(a, b) muls16_asr10(a, b)
diff --git a/apps/plugins/goban/goban.h b/apps/plugins/goban/goban.h
index e04b4c2447..8406b540b7 100644
--- a/apps/plugins/goban/goban.h
+++ b/apps/plugins/goban/goban.h
@@ -297,27 +297,6 @@
297#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT 297#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
298/* no next var */ 298/* no next var */
299 299
300#elif (CONFIG_KEYPAD == RECORDER_PAD)
301#define GBN_BUTTON_UP BUTTON_UP
302#define GBN_BUTTON_DOWN BUTTON_DOWN
303#define GBN_BUTTON_LEFT BUTTON_LEFT
304#define GBN_BUTTON_RIGHT BUTTON_RIGHT
305#define GBN_BUTTON_RETREAT BUTTON_F1
306#define GBN_BUTTON_ADVANCE BUTTON_F3
307#define GBN_BUTTON_MENU BUTTON_F2
308#define GBN_BUTTON_PLAY BUTTON_PLAY | BUTTON_REL
309#define GBN_BUTTON_CONTEXT BUTTON_PLAY | BUTTON_REPEAT
310#define GBN_BUTTON_NEXT_VAR BUTTON_ON
311
312#elif (CONFIG_KEYPAD == ONDIO_PAD)
313#define GBN_BUTTON_UP BUTTON_UP
314#define GBN_BUTTON_DOWN BUTTON_DOWN
315#define GBN_BUTTON_LEFT BUTTON_LEFT
316#define GBN_BUTTON_RIGHT BUTTON_RIGHT
317#define GBN_BUTTON_MENU BUTTON_MENU | BUTTON_REPEAT
318#define GBN_BUTTON_PLAY BUTTON_MENU | BUTTON_REL
319#define GBN_BUTTON_NAV_MODE BUTTON_OFF
320
321#elif (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) 300#elif (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD)
322#define GBN_BUTTON_UP BUTTON_UP 301#define GBN_BUTTON_UP BUTTON_UP
323#define GBN_BUTTON_DOWN BUTTON_DOWN 302#define GBN_BUTTON_DOWN BUTTON_DOWN
diff --git a/apps/plugins/goban/goban.make b/apps/plugins/goban/goban.make
index a8b41285f0..2201dc60f4 100644
--- a/apps/plugins/goban/goban.make
+++ b/apps/plugins/goban/goban.make
@@ -16,15 +16,8 @@ GOBAN_OBJ := $(call c2obj, $(GOBAN_SRC))
16OTHER_SRC += $(GOBAN_SRC) 16OTHER_SRC += $(GOBAN_SRC)
17 17
18ifndef APP_TYPE 18ifndef APP_TYPE
19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET))))) 19 ### all targets
20 ### lowmem targets
21 ROCKS += $(GOBAN_BUILDDIR)/goban.ovl
22 GOBAN_OUTLDS = $(GOBAN_BUILDDIR)/goban.link
23 GOBAN_OVLFLAGS = -T$(GOBAN_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
24else
25 ### all other targets
26 ROCKS += $(GOBAN_BUILDDIR)/goban.rock 20 ROCKS += $(GOBAN_BUILDDIR)/goban.rock
27endif
28else 21else
29 ### simulator 22 ### simulator
30 ROCKS += $(GOBAN_BUILDDIR)/goban.rock 23 ROCKS += $(GOBAN_BUILDDIR)/goban.rock
diff --git a/apps/plugins/greyscale.c b/apps/plugins/greyscale.c
index ae873a06ac..70507d989c 100644
--- a/apps/plugins/greyscale.c
+++ b/apps/plugins/greyscale.c
@@ -30,23 +30,7 @@
30 30
31 31
32/* variable button definitions */ 32/* variable button definitions */
33#if CONFIG_KEYPAD == RECORDER_PAD 33#if CONFIG_KEYPAD == IRIVER_H100_PAD
34#define GREYSCALE_SHIFT BUTTON_ON
35#define GREYSCALE_UP BUTTON_UP
36#define GREYSCALE_DOWN BUTTON_DOWN
37#define GREYSCALE_LEFT BUTTON_LEFT
38#define GREYSCALE_RIGHT BUTTON_RIGHT
39#define GREYSCALE_OFF BUTTON_OFF
40
41#elif CONFIG_KEYPAD == ONDIO_PAD
42#define GREYSCALE_SHIFT BUTTON_MENU
43#define GREYSCALE_UP BUTTON_UP
44#define GREYSCALE_DOWN BUTTON_DOWN
45#define GREYSCALE_LEFT BUTTON_LEFT
46#define GREYSCALE_RIGHT BUTTON_RIGHT
47#define GREYSCALE_OFF BUTTON_OFF
48
49#elif CONFIG_KEYPAD == IRIVER_H100_PAD
50#define GREYSCALE_SHIFT BUTTON_ON 34#define GREYSCALE_SHIFT BUTTON_ON
51#define GREYSCALE_UP BUTTON_UP 35#define GREYSCALE_UP BUTTON_UP
52#define GREYSCALE_DOWN BUTTON_DOWN 36#define GREYSCALE_DOWN BUTTON_DOWN
diff --git a/apps/plugins/imageviewer/imageviewer_button.h b/apps/plugins/imageviewer/imageviewer_button.h
index dfdd39ffa4..46813d5e69 100644
--- a/apps/plugins/imageviewer/imageviewer_button.h
+++ b/apps/plugins/imageviewer/imageviewer_button.h
@@ -25,31 +25,8 @@
25#include "plugin.h" 25#include "plugin.h"
26 26
27/* variable button definitions */ 27/* variable button definitions */
28#if CONFIG_KEYPAD == RECORDER_PAD 28#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
29#define IMGVIEW_ZOOM_IN BUTTON_PLAY 29 (CONFIG_KEYPAD == IRIVER_H300_PAD)
30#define IMGVIEW_ZOOM_OUT BUTTON_ON
31#define IMGVIEW_UP BUTTON_UP
32#define IMGVIEW_DOWN BUTTON_DOWN
33#define IMGVIEW_LEFT BUTTON_LEFT
34#define IMGVIEW_RIGHT BUTTON_RIGHT
35#define IMGVIEW_NEXT BUTTON_F3
36#define IMGVIEW_PREVIOUS BUTTON_F2
37#define IMGVIEW_MENU BUTTON_OFF
38
39#elif CONFIG_KEYPAD == ONDIO_PAD
40#define IMGVIEW_ZOOM_PRE BUTTON_MENU
41#define IMGVIEW_ZOOM_IN (BUTTON_MENU | BUTTON_REL)
42#define IMGVIEW_ZOOM_OUT (BUTTON_MENU | BUTTON_DOWN)
43#define IMGVIEW_UP BUTTON_UP
44#define IMGVIEW_DOWN BUTTON_DOWN
45#define IMGVIEW_LEFT BUTTON_LEFT
46#define IMGVIEW_RIGHT BUTTON_RIGHT
47#define IMGVIEW_NEXT (BUTTON_MENU | BUTTON_RIGHT)
48#define IMGVIEW_PREVIOUS (BUTTON_MENU | BUTTON_LEFT)
49#define IMGVIEW_MENU BUTTON_OFF
50
51#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
52 (CONFIG_KEYPAD == IRIVER_H300_PAD)
53#define IMGVIEW_ZOOM_IN BUTTON_SELECT 30#define IMGVIEW_ZOOM_IN BUTTON_SELECT
54#define IMGVIEW_ZOOM_OUT BUTTON_MODE 31#define IMGVIEW_ZOOM_OUT BUTTON_MODE
55#define IMGVIEW_UP BUTTON_UP 32#define IMGVIEW_UP BUTTON_UP
diff --git a/apps/plugins/imageviewer/jpeg/jpeg_decoder.c b/apps/plugins/imageviewer/jpeg/jpeg_decoder.c
index 342b59c6a4..b014fa0ed1 100644
--- a/apps/plugins/imageviewer/jpeg/jpeg_decoder.c
+++ b/apps/plugins/imageviewer/jpeg/jpeg_decoder.c
@@ -39,23 +39,7 @@
39 39
40INLINE unsigned range_limit(int value) 40INLINE unsigned range_limit(int value)
41{ 41{
42#if CONFIG_CPU == SH7034 42#if defined(CPU_COLDFIRE)
43 unsigned tmp;
44 asm ( /* Note: Uses knowledge that only low byte of result is used */
45 "mov #-128,%[t] \n"
46 "sub %[t],%[v] \n" /* value -= -128; equals value += 128; */
47 "extu.b %[v],%[t] \n"
48 "cmp/eq %[v],%[t] \n" /* low byte == whole number ? */
49 "bt 1f \n" /* yes: no overflow */
50 "cmp/pz %[v] \n" /* overflow: positive? */
51 "subc %[v],%[v] \n" /* %[r] now either 0 or 0xffffffff */
52 "1: \n"
53 : /* outputs */
54 [v]"+r"(value),
55 [t]"=&r"(tmp)
56 );
57 return value;
58#elif defined(CPU_COLDFIRE)
59 asm ( /* Note: Uses knowledge that only the low byte of the result is used */ 43 asm ( /* Note: Uses knowledge that only the low byte of the result is used */
60 "add.l #128,%[v] \n" /* value += 128; */ 44 "add.l #128,%[v] \n" /* value += 128; */
61 "cmp.l #255,%[v] \n" /* overflow? */ 45 "cmp.l #255,%[v] \n" /* overflow? */
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index cae3befb5e..f94825650f 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -28,27 +28,7 @@
28#include "pluginbitmaps/jewels.h" 28#include "pluginbitmaps/jewels.h"
29 29
30/* button definitions */ 30/* button definitions */
31#if CONFIG_KEYPAD == RECORDER_PAD 31#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
32#define JEWELS_UP BUTTON_UP
33#define JEWELS_DOWN BUTTON_DOWN
34#define JEWELS_LEFT BUTTON_LEFT
35#define JEWELS_RIGHT BUTTON_RIGHT
36#define JEWELS_SELECT BUTTON_PLAY
37#define JEWELS_CANCEL BUTTON_OFF
38#define HK_SELECT "PLAY"
39#define HK_CANCEL "OFF"
40
41#elif CONFIG_KEYPAD == ONDIO_PAD
42#define JEWELS_UP BUTTON_UP
43#define JEWELS_DOWN BUTTON_DOWN
44#define JEWELS_LEFT BUTTON_LEFT
45#define JEWELS_RIGHT BUTTON_RIGHT
46#define JEWELS_SELECT BUTTON_MENU
47#define JEWELS_CANCEL BUTTON_OFF
48#define HK_SELECT "MENU"
49#define HK_CANCEL "OFF"
50
51#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
52#define JEWELS_UP BUTTON_UP 32#define JEWELS_UP BUTTON_UP
53#define JEWELS_DOWN BUTTON_DOWN 33#define JEWELS_DOWN BUTTON_DOWN
54#define JEWELS_LEFT BUTTON_LEFT 34#define JEWELS_LEFT BUTTON_LEFT
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES
index 1149f35bac..82b9fba4a5 100644
--- a/apps/plugins/lib/SOURCES
+++ b/apps/plugins/lib/SOURCES
@@ -21,8 +21,6 @@ grey_scroll.c
21 21
22#ifdef CPU_COLDFIRE 22#ifdef CPU_COLDFIRE
23grey_coldfire.S 23grey_coldfire.S
24#elif CONFIG_CPU == SH7034
25grey_sh.S
26#endif 24#endif
27 25
28#endif /* HAVE_LCD_BITMAP && LCD_DEPTH < 4 */ 26#endif /* HAVE_LCD_BITMAP && LCD_DEPTH < 4 */
diff --git a/apps/plugins/lib/grey_core.c b/apps/plugins/lib/grey_core.c
index bb6823522d..55d0684103 100644
--- a/apps/plugins/lib/grey_core.c
+++ b/apps/plugins/lib/grey_core.c
@@ -36,35 +36,7 @@
36 36
37#ifndef SIMULATOR 37#ifndef SIMULATOR
38 38
39#if defined ARCHOS_RECORDER /* verified */ \ 39#if defined IAUDIO_M3 /* verified */
40 || defined ARCHOS_FMRECORDER /* should be identical */ \
41 || defined ARCHOS_RECORDERV2 /* should be identical */ \
42 || defined ARCHOS_ONDIOFM /* verified */ \
43 || defined ARCHOS_ONDIOSP /* verified */
44/* Average measurements of a Recorder v1, an Ondio FM, a backlight-modded
45 * Ondio FM, and an Ondio SP. */
46static const unsigned char lcdlinear[256] = {
47 5, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 29, 31, 33, 35,
48 37, 39, 40, 42, 43, 45, 46, 48, 49, 50, 51, 53, 54, 55, 57, 58,
49 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 71, 72,
50 73, 74, 74, 75, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82,
51 83, 84, 84, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91,
52 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 98, 98, 99, 100, 100,
53101, 101, 102, 103, 103, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109,
54110, 110, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 119, 119,
55120, 120, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131,
56132, 132, 133, 134, 135, 135, 136, 137, 138, 138, 139, 140, 140, 141, 141, 142,
57143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156,
58157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170,
59171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 184, 185, 186, 187,
60188, 189, 191, 192, 194, 195, 197, 198, 199, 200, 202, 203, 204, 205, 207, 208,
61209, 210, 212, 213, 215, 216, 218, 219, 220, 221, 222, 223, 225, 226, 227, 228,
62229, 230, 232, 233, 234, 235, 237, 238, 239, 240, 242, 243, 244, 246, 247, 248
63};
64/* The actual LCD scanrate varies a lot with temperature on these targets */
65#define LCD_SCANRATE 67 /* Hz */
66
67#elif defined IAUDIO_M3 /* verified */
68/* Average measurements of 2 iAudio remotes connected to an M3. */ 40/* Average measurements of 2 iAudio remotes connected to an M3. */
69static const unsigned char lcdlinear[256] = { 41static const unsigned char lcdlinear[256] = {
70 5, 9, 13, 17, 21, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62, 66, 42 5, 9, 13, 17, 21, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62, 66,
diff --git a/apps/plugins/lib/grey_draw.c b/apps/plugins/lib/grey_draw.c
index 64dabc2fb3..298ffbe16e 100644
--- a/apps/plugins/lib/grey_draw.c
+++ b/apps/plugins/lib/grey_draw.c
@@ -758,8 +758,7 @@ void grey_ub_gray_bitmap_part(const unsigned char *src, int src_x, int src_y,
758 + (~yc & _GREY_BMASK); 758 + (~yc & _GREY_BMASK);
759#endif /* LCD_PIXELFORMAT */ 759#endif /* LCD_PIXELFORMAT */
760 760
761#if ((LCD_PIXELFORMAT == VERTICAL_PACKING) && (LCD_DEPTH == 1) && (CONFIG_CPU == SH7034)) \ 761#if ((LCD_PIXELFORMAT == VERTICAL_PACKING) && (LCD_DEPTH == 2) && defined(CPU_COLDFIRE)) \
762 || ((LCD_PIXELFORMAT == VERTICAL_PACKING) && (LCD_DEPTH == 2) && defined(CPU_COLDFIRE)) \
763 || ((LCD_PIXELFORMAT == VERTICAL_INTERLEAVED) && defined(CPU_COLDFIRE)) 762 || ((LCD_PIXELFORMAT == VERTICAL_INTERLEAVED) && defined(CPU_COLDFIRE))
764 _grey_line1(width, dst + idx, src, _grey_info.gvalue); 763 _grey_line1(width, dst + idx, src, _grey_info.gvalue);
765#else 764#else
diff --git a/apps/plugins/lib/grey_sh.S b/apps/plugins/lib/grey_sh.S
deleted file mode 100644
index 5714f95f8c..0000000000
--- a/apps/plugins/lib/grey_sh.S
+++ /dev/null
@@ -1,137 +0,0 @@
1/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* New greyscale framework
11* SH1 assembler routines
12*
13* This is a generic framework to display 129 shades of grey on low-depth
14* bitmap LCDs (Archos b&w, Iriver & Ipod 4-grey) within plugins.
15*
16* Copyright (C) 2008 Jens Arnold
17*
18* This program is free software; you can redistribute it and/or
19* modify it under the terms of the GNU General Public License
20* as published by the Free Software Foundation; either version 2
21* of the License, or (at your option) any later version.
22*
23* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
24* KIND, either express or implied.
25*
26****************************************************************************/
27
28#include "config.h"
29/* Plugins should not normally do this, but we need to check a macro, and
30 * plugin.h would confuse the assembler. */
31
32 .text
33 .global __grey_line1
34 .type __grey_line1, @function
35
36#if (LCD_PIXELFORMAT == VERTICAL_PACKING) && (LCD_DEPTH == 1)
37
38/****************************************************************************
39 * void _grey_line1(int width, r4
40 * unsigned char *dst, r5
41 * const unsigned char *src, r6
42 * const unsigned char *lut); r7
43 */
44
45__grey_line1:
46 mov #1, r0
47 tst r0, r6
48 bt .p1_h_end
49
50 mov.b @r6+, r0
51 extu.b r0, r0
52 mov.b @(r0, r7), r0
53 add #-1, r4
54 mov.b r0, @r5
55 add #8, r5
56.p1_h_end:
57
58 mov #2, r0
59 cmp/hs r0, r4
60 bf .p2_t_end
61 tst r0, r6
62 bt .p2_h_end
63
64 mov.w @r6+, r1
65 extu.b r1, r0
66 mov.b @(r0, r7), r0
67 shlr8 r1
68 mov.b r0, @(8, r5)
69 extu.b r1, r0
70 mov.b @(r0, r7), r0
71 add #-2, r4
72 mov.b r0, @r5
73 add #16, r5
74.p2_h_end:
75
76 add #-4, r4
77 cmp/pz r4
78 bf .p4_end
79
80 add r6, r4
81
82.p4_loop:
83 mov.l @r6+, r1
84 swap.w r1, r2
85 extu.b r2, r0
86 mov.b @(r0, r7), r0
87 shlr8 r2
88 mov.b r0, @(8, r5)
89 extu.b r2, r0
90 mov.b @(r0, r7), r2
91 extu.b r1, r0
92 mov.b r2, @r5
93 add #16, r5
94 mov.b @(r0, r7), r0
95 shlr8 r1
96 mov.b r0, @(8, r5)
97 extu.b r1, r0
98 mov.b @(r0, r7), r0
99 cmp/hs r6, r4
100 mov.b r0, @r5
101 add #16, r5
102 bt .p4_loop
103
104 /* No need to correct the count, we're only testing bits from now on. */
105
106.p4_end:
107 mov #2, r0
108 tst r0, r4
109 bt .p2_t_end
110
111 mov.w @r6+, r1
112 extu.b r1, r0
113 mov.b @(r0, r7), r0
114 shlr8 r1
115 mov.b r0, @(8, r5)
116 extu.b r1, r0
117 mov.b @(r0, r7), r0
118 mov.b r0, @r5
119 add #16, r5
120.p2_t_end:
121
122 mov #1, r0
123 tst r0, r4
124 bt .p1_t_end
125
126 mov.b @r6+, r0
127 extu.b r0, r0
128 mov.b @(r0, r7), r0
129 rts
130 mov.b r0, @r5
131.p1_t_end:
132
133 rts
134 nop
135 .size __grey_line1, . - __grey_line1
136
137#endif
diff --git a/apps/plugins/lib/helper.c b/apps/plugins/lib/helper.c
index 506903e808..6eb3498791 100644
--- a/apps/plugins/lib/helper.c
+++ b/apps/plugins/lib/helper.c
@@ -22,20 +22,6 @@
22#include "plugin.h" 22#include "plugin.h"
23#include "helper.h" 23#include "helper.h"
24 24
25#ifdef CPU_SH
26/* Lookup table for using the BIT_N() macro in plugins */
27const unsigned bit_n_table[32] = {
28 1LU<< 0, 1LU<< 1, 1LU<< 2, 1LU<< 3,
29 1LU<< 4, 1LU<< 5, 1LU<< 6, 1LU<< 7,
30 1LU<< 8, 1LU<< 9, 1LU<<10, 1LU<<11,
31 1LU<<12, 1LU<<13, 1LU<<14, 1LU<<15,
32 1LU<<16, 1LU<<17, 1LU<<18, 1LU<<19,
33 1LU<<20, 1LU<<21, 1LU<<22, 1LU<<23,
34 1LU<<24, 1LU<<25, 1LU<<26, 1LU<<27,
35 1LU<<28, 1LU<<29, 1LU<<30, 1LU<<31
36};
37#endif
38
39/* Force the backlight on */ 25/* Force the backlight on */
40void backlight_force_on(void) 26void backlight_force_on(void)
41{ 27{
diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c
index e5b48c2f6a..c580074d5e 100644
--- a/apps/plugins/lib/pluginlib_actions.c
+++ b/apps/plugins/lib/pluginlib_actions.c
@@ -51,16 +51,6 @@ const struct button_mapping pla_remote_ctx[] =
51 { PLA_DOWN_REPEAT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE}, 51 { PLA_DOWN_REPEAT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_NONE},
52 { PLA_LEFT_REPEAT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE}, 52 { PLA_LEFT_REPEAT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE},
53 { PLA_RIGHT_REPEAT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE}, 53 { PLA_RIGHT_REPEAT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE},
54#elif (CONFIG_KEYPAD == PLAYER_PAD) || \
55 (CONFIG_KEYPAD == RECORDER_PAD)
56 { PLA_UP, BUTTON_RC_VOL_UP, BUTTON_NONE},
57 { PLA_DOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE},
58 { PLA_LEFT, BUTTON_RC_LEFT, BUTTON_NONE},
59 { PLA_RIGHT, BUTTON_RC_RIGHT, BUTTON_NONE},
60 { PLA_UP_REPEAT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE},
61 { PLA_DOWN_REPEAT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE},
62 { PLA_LEFT_REPEAT, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_NONE},
63 { PLA_RIGHT_REPEAT, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
64#elif (CONFIG_REMOTE_KEYPAD == MROBE_REMOTE) 54#elif (CONFIG_REMOTE_KEYPAD == MROBE_REMOTE)
65 { PLA_UP, BUTTON_RC_PLAY, BUTTON_NONE}, 55 { PLA_UP, BUTTON_RC_PLAY, BUTTON_NONE},
66 { PLA_DOWN, BUTTON_RC_DOWN, BUTTON_NONE}, 56 { PLA_DOWN, BUTTON_RC_DOWN, BUTTON_NONE},
@@ -101,9 +91,7 @@ const struct button_mapping pla_main_ctx[] =
101 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \ 91 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \
102 || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \ 92 || (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \
103 || (CONFIG_KEYPAD == GIGABEAT_PAD) \ 93 || (CONFIG_KEYPAD == GIGABEAT_PAD) \
104 || (CONFIG_KEYPAD == RECORDER_PAD) \
105 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \ 94 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) \
106 || (CONFIG_KEYPAD == ONDIO_PAD) \
107 || (CONFIG_KEYPAD == SANSA_C200_PAD) \ 95 || (CONFIG_KEYPAD == SANSA_C200_PAD) \
108 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) \ 96 || (CONFIG_KEYPAD == GIGABEAT_S_PAD) \
109 || (CONFIG_KEYPAD == MROBE100_PAD) \ 97 || (CONFIG_KEYPAD == MROBE100_PAD) \
@@ -145,15 +133,6 @@ const struct button_mapping pla_main_ctx[] =
145 { PLA_DOWN_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 133 { PLA_DOWN_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
146 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, 134 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
147 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, 135 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
148#elif (CONFIG_KEYPAD == PLAYER_PAD)
149 { PLA_UP, BUTTON_PLAY, BUTTON_NONE },
150 { PLA_DOWN, BUTTON_STOP, BUTTON_NONE },
151 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE },
152 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
153 { PLA_UP_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
154 { PLA_DOWN_REPEAT, BUTTON_STOP|BUTTON_REPEAT, BUTTON_NONE },
155 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
156 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
157#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) 136#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
158 { PLA_UP, BUTTON_SCROLL_UP, BUTTON_NONE }, 137 { PLA_UP, BUTTON_SCROLL_UP, BUTTON_NONE },
159 { PLA_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE }, 138 { PLA_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE },
@@ -339,24 +318,6 @@ const struct button_mapping pla_main_ctx[] =
339 {PLA_SELECT, BUTTON_SELECT, BUTTON_NONE}, 318 {PLA_SELECT, BUTTON_SELECT, BUTTON_NONE},
340 {PLA_SELECT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, 319 {PLA_SELECT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT},
341 {PLA_SELECT_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE}, 320 {PLA_SELECT_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
342#elif (CONFIG_KEYPAD == RECORDER_PAD)
343 {PLA_CANCEL, BUTTON_ON, BUTTON_NONE},
344 {PLA_EXIT, BUTTON_OFF, BUTTON_NONE},
345 {PLA_SELECT, BUTTON_PLAY, BUTTON_NONE},
346 {PLA_SELECT_REL, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
347 {PLA_SELECT_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
348#elif (CONFIG_KEYPAD == ONDIO_PAD)
349 {PLA_CANCEL, BUTTON_OFF|BUTTON_REL, BUTTON_OFF},
350 {PLA_EXIT, BUTTON_OFF|BUTTON_REPEAT, BUTTON_NONE},
351 {PLA_SELECT, BUTTON_MENU, BUTTON_NONE},
352 {PLA_SELECT_REL, BUTTON_MENU|BUTTON_REL, BUTTON_MENU},
353 {PLA_SELECT_REPEAT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE},
354#elif (CONFIG_KEYPAD == PLAYER_PAD)
355 {PLA_CANCEL, BUTTON_MENU|BUTTON_REL, BUTTON_MENU},
356 {PLA_EXIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE},
357 {PLA_SELECT, BUTTON_ON, BUTTON_NONE},
358 {PLA_SELECT_REL, BUTTON_ON|BUTTON_REL, BUTTON_ON},
359 {PLA_SELECT_REPEAT, BUTTON_ON|BUTTON_REPEAT, BUTTON_NONE},
360#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD) 321#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
361 {PLA_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME}, 322 {PLA_CANCEL, BUTTON_HOME|BUTTON_REL, BUTTON_HOME},
362 {PLA_EXIT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE}, 323 {PLA_EXIT, BUTTON_HOME|BUTTON_REPEAT, BUTTON_NONE},
diff --git a/apps/plugins/lib/xlcd_scroll.c b/apps/plugins/lib/xlcd_scroll.c
index f2fc71ea47..e0fead71be 100644
--- a/apps/plugins/lib/xlcd_scroll.c
+++ b/apps/plugins/lib/xlcd_scroll.c
@@ -396,77 +396,7 @@ void xlcd_scroll_up(int count)
396 { 396 {
397#if LCD_PIXELFORMAT == VERTICAL_PACKING 397#if LCD_PIXELFORMAT == VERTICAL_PACKING
398 398
399#if (CONFIG_CPU == SH7034) && (LCD_DEPTH == 1) 399#if defined(CPU_COLDFIRE) && (LCD_DEPTH == 2)
400 asm (
401 "mov #0,r4 \n" /* x = 0 */
402 "mova .su_shifttbl,r0 \n" /* calculate jump destination for */
403 "mov.b @(r0,%[cnt]),%[cnt] \n" /* shift amount from table */
404 "bra .su_cloop \n" /* skip table */
405 "add r0,%[cnt] \n"
406
407 ".align 2 \n"
408 ".su_shifttbl: \n" /* shift jump offset table */
409 ".byte .su_shift0 - .su_shifttbl \n"
410 ".byte .su_shift1 - .su_shifttbl \n"
411 ".byte .su_shift2 - .su_shifttbl \n"
412 ".byte .su_shift3 - .su_shifttbl \n"
413 ".byte .su_shift4 - .su_shifttbl \n"
414 ".byte .su_shift5 - .su_shifttbl \n"
415 ".byte .su_shift6 - .su_shifttbl \n"
416 ".byte .su_shift7 - .su_shifttbl \n"
417
418 ".su_cloop: \n" /* repeat for every column */
419 "mov %[addr],r2 \n" /* get start address */
420 "mov #0,r3 \n" /* current_row = 0 */
421 "mov #0,r1 \n" /* fill with zero */
422
423 ".su_iloop: \n" /* repeat for all rows */
424 "sub %[wide],r2 \n" /* address -= width */
425 "mov.b @r2,r0 \n" /* get data byte */
426 "shll8 r1 \n" /* old data to 2nd byte */
427 "extu.b r0,r0 \n" /* extend unsigned */
428 "or r1,r0 \n" /* combine old data */
429 "jmp @%[cnt] \n" /* jump into shift "path" */
430 "extu.b r0,r1 \n" /* store data for next round */
431
432 ".su_shift6: \n" /* shift right by 0..7 bits */
433 "shll2 r0 \n"
434 "bra .su_shift0 \n"
435 "shlr8 r0 \n"
436 ".su_shift4: \n"
437 "shlr2 r0 \n"
438 ".su_shift2: \n"
439 "bra .su_shift0 \n"
440 "shlr2 r0 \n"
441 ".su_shift7: \n"
442 "shlr2 r0 \n"
443 ".su_shift5: \n"
444 "shlr2 r0 \n"
445 ".su_shift3: \n"
446 "shlr2 r0 \n"
447 ".su_shift1: \n"
448 "shlr r0 \n"
449 ".su_shift0: \n"
450
451 "mov.b r0,@r2 \n" /* store data */
452 "add #1,r3 \n" /* current_row++ */
453 "cmp/hi r3,%[rows] \n" /* current_row < bheight - shift ? */
454 "bt .su_iloop \n"
455
456 "add #1,%[addr] \n" /* start_address++ */
457 "add #1,r4 \n" /* x++ */
458 "cmp/hi r4,%[wide] \n" /* x < width ? */
459 "bt .su_cloop \n"
460 : /* outputs */
461 : /* inputs */
462 [addr]"r"(rb->lcd_framebuffer + blocklen * LCD_FBWIDTH),
463 [wide]"r"(LCD_FBWIDTH),
464 [rows]"r"(blocklen),
465 [cnt] "r"(bitcount)
466 : /* clobbers */
467 "r0", "r1", "r2", "r3", "r4"
468 );
469#elif defined(CPU_COLDFIRE) && (LCD_DEPTH == 2)
470 asm ( 400 asm (
471 "move.l %[wide],%%d3\n" /* columns = width */ 401 "move.l %[wide],%%d3\n" /* columns = width */
472 402
@@ -590,76 +520,7 @@ void xlcd_scroll_down(int count)
590 { 520 {
591#if LCD_PIXELFORMAT == VERTICAL_PACKING 521#if LCD_PIXELFORMAT == VERTICAL_PACKING
592 522
593#if (CONFIG_CPU == SH7034) && (LCD_DEPTH == 1) 523#if defined(CPU_COLDFIRE) && (LCD_DEPTH == 2)
594 asm (
595 "mov #0,r4 \n" /* x = 0 */
596 "mova .sd_shifttbl,r0 \n" /* calculate jump destination for */
597 "mov.b @(r0,%[cnt]),%[cnt] \n" /* shift amount from table */
598 "bra .sd_cloop \n" /* skip table */
599 "add r0,%[cnt] \n"
600
601 ".align 2 \n"
602 ".sd_shifttbl: \n" /* shift jump offset table */
603 ".byte .sd_shift0 - .sd_shifttbl \n"
604 ".byte .sd_shift1 - .sd_shifttbl \n"
605 ".byte .sd_shift2 - .sd_shifttbl \n"
606 ".byte .sd_shift3 - .sd_shifttbl \n"
607 ".byte .sd_shift4 - .sd_shifttbl \n"
608 ".byte .sd_shift5 - .sd_shifttbl \n"
609 ".byte .sd_shift6 - .sd_shifttbl \n"
610 ".byte .sd_shift7 - .sd_shifttbl \n"
611
612 ".sd_cloop: \n" /* repeat for every column */
613 "mov %[addr],r2 \n" /* get start address */
614 "mov #0,r3 \n" /* current_row = 0 */
615 "mov #0,r1 \n" /* fill with zero */
616
617 ".sd_iloop: \n" /* repeat for all rows */
618 "shlr8 r1 \n" /* shift right to get residue */
619 "mov.b @r2,r0 \n" /* get data byte */
620 "jmp @%[cnt] \n" /* jump into shift "path" */
621 "extu.b r0,r0 \n" /* extend unsigned */
622
623 ".sd_shift6: \n" /* shift left by 0..7 bits */
624 "shll8 r0 \n"
625 "bra .sd_shift0 \n"
626 "shlr2 r0 \n"
627 ".sd_shift4: \n"
628 "shll2 r0 \n"
629 ".sd_shift2: \n"
630 "bra .sd_shift0 \n"
631 "shll2 r0 \n"
632 ".sd_shift7: \n"
633 "shll2 r0 \n"
634 ".sd_shift5: \n"
635 "shll2 r0 \n"
636 ".sd_shift3: \n"
637 "shll2 r0 \n"
638 ".sd_shift1: \n"
639 "shll r0 \n"
640 ".sd_shift0: \n"
641
642 "or r0,r1 \n" /* combine with last residue */
643 "mov.b r1,@r2 \n" /* store data */
644 "add %[wide],r2 \n" /* address += width */
645 "add #1,r3 \n" /* current_row++ */
646 "cmp/hi r3,%[rows] \n" /* current_row < bheight - shift ? */
647 "bt .sd_iloop \n"
648
649 "add #1,%[addr] \n" /* start_address++ */
650 "add #1,r4 \n" /* x++ */
651 "cmp/hi r4,%[wide] \n" /* x < width ? */
652 "bt .sd_cloop \n"
653 : /* outputs */
654 : /* inputs */
655 [addr]"r"(rb->lcd_framebuffer + blockcount * LCD_FBWIDTH),
656 [wide]"r"(LCD_WIDTH),
657 [rows]"r"(blocklen),
658 [cnt] "r"(bitcount)
659 : /* clobbers */
660 "r0", "r1", "r2", "r3", "r4"
661 );
662#elif defined(CPU_COLDFIRE) && (LCD_DEPTH == 2)
663 asm ( 524 asm (
664 "move.l %[wide],%%d3\n" /* columns = width */ 525 "move.l %[wide],%%d3\n" /* columns = width */
665 526
diff --git a/apps/plugins/lrcplayer.c b/apps/plugins/lrcplayer.c
index 4ae9722ae3..eb441eab8d 100644
--- a/apps/plugins/lrcplayer.c
+++ b/apps/plugins/lrcplayer.c
@@ -2667,12 +2667,6 @@ static int handle_button(void)
2667 switch (button) 2667 switch (button)
2668 { 2668 {
2669 case ACTION_WPS_BROWSE: 2669 case ACTION_WPS_BROWSE:
2670#if CONFIG_KEYPAD == ONDIO_PAD
2671 /* ondio doesn't have ACTION_WPS_MENU,
2672 so use ACTION_WPS_BROWSE for menu */
2673 ret = LRC_GOTO_MENU;
2674 break;
2675#endif
2676 case ACTION_WPS_STOP: 2670 case ACTION_WPS_STOP:
2677 save_changes(); 2671 save_changes();
2678 ret = PLUGIN_OK; 2672 ret = PLUGIN_OK;
diff --git a/apps/plugins/lua/Makefile b/apps/plugins/lua/Makefile
index 8568d79c4c..dcf2910c36 100644
--- a/apps/plugins/lua/Makefile
+++ b/apps/plugins/lua/Makefile
@@ -28,13 +28,8 @@ OBJS = $(patsubst %.S, $(OBJDIR)/%.o, $(OBJS2))
28DIRS = . 28DIRS = .
29 29
30ifndef APP_TYPE 30ifndef APP_TYPE
31ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
32 LDS := archos.lds
33 OUTPUT = $(OUTDIR)/lua.ovl
34else ## iRiver/iPod/... targets
35 LDS := ../plugin.lds 31 LDS := ../plugin.lds
36 OUTPUT = $(OUTDIR)/lua.rock 32 OUTPUT = $(OUTDIR)/lua.rock
37endif
38else ## simulators 33else ## simulators
39 OUTPUT = $(OUTDIR)/lua.rock 34 OUTPUT = $(OUTDIR)/lua.rock
40endif 35endif
diff --git a/apps/plugins/lua/lua.make b/apps/plugins/lua/lua.make
index ebdef1e24e..61decb5605 100644
--- a/apps/plugins/lua/lua.make
+++ b/apps/plugins/lua/lua.make
@@ -23,15 +23,7 @@ LUA_INCLUDELIST := $(addprefix $(LUA_BUILDDIR)/,audio.lua blit.lua color.lua dra
23 23
24 24
25ifndef APP_TYPE 25ifndef APP_TYPE
26ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
27 ### lowmem targets
28 ROCKS += $(LUA_BUILDDIR)/lua.ovl
29 LUA_OUTLDS = $(LUA_BUILDDIR)/lua.link
30 LUA_OVLFLAGS = -T$(LUA_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
31else
32 ### all other targets
33 ROCKS += $(LUA_BUILDDIR)/lua.rock 26 ROCKS += $(LUA_BUILDDIR)/lua.rock
34endif
35else 27else
36 ### simulator 28 ### simulator
37 ROCKS += $(LUA_BUILDDIR)/lua.rock 29 ROCKS += $(LUA_BUILDDIR)/lua.rock
diff --git a/apps/plugins/lua/rocklib.c b/apps/plugins/lua/rocklib.c
index a33fdf7170..4fa989da46 100644
--- a/apps/plugins/lua/rocklib.c
+++ b/apps/plugins/lua/rocklib.c
@@ -39,7 +39,7 @@
39 * from Lua in its stack in direct order (the first argument is pushed first). To return values to Lua, 39 * from Lua in its stack in direct order (the first argument is pushed first). To return values to Lua,
40 * a C function just pushes them onto the stack, in direct order (the first result is pushed first), 40 * a C function just pushes them onto the stack, in direct order (the first result is pushed first),
41 * and returns the number of results. Any other value in the stack below the results will be properly 41 * and returns the number of results. Any other value in the stack below the results will be properly
42 * discarded by Lua. Like a Lua function, a C function called by Lua can also return many results. 42 * discarded by Lua. Like a Lua function, a C function called by Lua can also return many results.
43 * 43 *
44 * When porting new functions, don't forget to check rocklib_aux.pl whether it automatically creates 44 * When porting new functions, don't forget to check rocklib_aux.pl whether it automatically creates
45 * wrappers for the function and if so, add the function names to @forbidden_functions. This is to 45 * wrappers for the function and if so, add the function names to @forbidden_functions. This is to
@@ -487,8 +487,7 @@ RB_WRAP(sound)
487 lua_pushstring (L, rb->sound_unit(setting)); 487 lua_pushstring (L, rb->sound_unit(setting));
488 return 1; 488 return 1;
489 break; 489 break;
490#if ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) || \ 490#if ((CONFIG_CODEC == SWCODEC) && defined (HAVE_PITCHCONTROL))
491 (CONFIG_CODEC == SWCODEC)) && defined (HAVE_PITCHCONTROL)
492 case SOUND_SET_PITCH: 491 case SOUND_SET_PITCH:
493 rb->sound_set_pitch(setting); 492 rb->sound_set_pitch(setting);
494 return 1;/*nil*/ 493 return 1;/*nil*/
@@ -496,7 +495,7 @@ RB_WRAP(sound)
496#endif 495#endif
497 case SOUND_VAL2PHYS: 496 case SOUND_VAL2PHYS:
498 value = luaL_checkint(L, 3); 497 value = luaL_checkint(L, 3);
499 result = rb->sound_val2phys(setting, value); 498 result = rb->sound_val2phys(setting, value);
500 break; 499 break;
501 500
502 default: 501 default:
diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c
index 4e875979ab..01659dbfd2 100644
--- a/apps/plugins/minesweeper.c
+++ b/apps/plugins/minesweeper.c
@@ -34,31 +34,8 @@ enum minesweeper_status {
34}; 34};
35 35
36/* variable button definitions */ 36/* variable button definitions */
37#if CONFIG_KEYPAD == RECORDER_PAD 37#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
38# define MINESWP_LEFT BUTTON_LEFT 38 (CONFIG_KEYPAD == IRIVER_H300_PAD)
39# define MINESWP_RIGHT BUTTON_RIGHT
40# define MINESWP_UP BUTTON_UP
41# define MINESWP_DOWN BUTTON_DOWN
42# define MINESWP_QUIT BUTTON_OFF
43# define MINESWP_TOGGLE BUTTON_ON
44# define MINESWP_TOGGLE2 BUTTON_F1
45# define MINESWP_DISCOVER BUTTON_PLAY
46# define MINESWP_DISCOVER2 BUTTON_F2
47# define MINESWP_INFO BUTTON_F3
48
49#elif CONFIG_KEYPAD == ONDIO_PAD
50# define MINESWP_LEFT BUTTON_LEFT
51# define MINESWP_RIGHT BUTTON_RIGHT
52# define MINESWP_UP BUTTON_UP
53# define MINESWP_DOWN BUTTON_DOWN
54# define MINESWP_QUIT BUTTON_OFF
55# define MINESWP_TOGGLE_PRE BUTTON_MENU
56# define MINESWP_TOGGLE (BUTTON_MENU | BUTTON_REL)
57# define MINESWP_DISCOVER (BUTTON_MENU | BUTTON_REPEAT)
58# define MINESWP_INFO (BUTTON_MENU | BUTTON_OFF)
59
60#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
61 (CONFIG_KEYPAD == IRIVER_H300_PAD)
62# define MINESWP_LEFT BUTTON_LEFT 39# define MINESWP_LEFT BUTTON_LEFT
63# define MINESWP_RIGHT BUTTON_RIGHT 40# define MINESWP_RIGHT BUTTON_RIGHT
64# define MINESWP_UP BUTTON_UP 41# define MINESWP_UP BUTTON_UP
diff --git a/apps/plugins/nim.c b/apps/plugins/nim.c
deleted file mode 100644
index 70cf8dcec4..0000000000
--- a/apps/plugins/nim.c
+++ /dev/null
@@ -1,285 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2003 Pierre Delore
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22#include "lib/pluginlib_exit.h"
23
24/* NIM game for the player
25
26Rules of nim game
27-----------------
28There are 21 matches.
29Two players (you and the cpu) alternately pick a certain number of matches and the one,
30who takes the last match, loses.
31
32
33History:
34-------
35V1.0 : 2003-07-22
36 First release of the game
37V1.1 : 2003-07-22
38 I Change the patterns definition in order to have a clean code
39V1.2 : 2003-07-30
40 Patch from JB that change:
41 . the win and lose message
42 . the BUTTON_STOP code
43 . Add a test
44 I suppress the exit variable
45 I suppress or translates the comments which were in French
46 I put min=1 at the of the main loop ( When there are 21 matches you can decide not to
47 take a match. Later you are obliged to take at least one.)
48*/
49
50
51
52/*Pattern for the game*/
53static unsigned char smile[]={0x00, 0x11, 0x04, 0x04, 0x00, 0x11, 0x0E}; /* :-) */
54static unsigned char cry[] ={0x00, 0x11, 0x04, 0x04, 0x00, 0x0E, 0x11}; /* :-( */
55static unsigned char pattern3[]={0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15}; /*3 parts*/
56static unsigned char pattern2[]={0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}; /*2 parts*/
57static unsigned char pattern1[]={0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10}; /*1 part*/
58
59static unsigned long hsmile,hcry,h1,h2; /*Handle for the new pattern*/
60
61static bool end; /*If true game is finished*/
62
63/*Display that the action it's impossible*/
64static void impossible(void)
65{
66 rb->lcd_puts(0,1,"Impossible!");
67 rb->lcd_update();
68 rb->sleep(HZ);
69 return;
70}
71
72/*Display that the CPU lose :) */
73static void lose(void)
74{
75 rb->lcd_define_pattern(hsmile,smile);
76 rb->lcd_puts(0,1,"You Win!!");
77 rb->lcd_putc(8,1,hsmile);
78 rb->lcd_update();
79 end=true;
80 rb->sleep(HZ*2);
81 return;
82}
83
84
85/* Display that the CPU win :( */
86static void win(void)
87{
88 rb->lcd_define_pattern(hcry,cry);
89 rb->lcd_puts(0,1,"You Lose!!");
90 rb->lcd_putc(9,1,hcry);
91 rb->lcd_update();
92 end=true;
93 rb->sleep(HZ*2);
94 return;
95}
96
97
98/*Display the first line*/
99static void display_first_line(int x)
100{
101 int i;
102
103 rb->lcd_putsf(0,0," =%d",x);
104
105 rb->lcd_define_pattern(h1,pattern3);
106 for (i=0;i<x/3;i++)
107 rb->lcd_putc(i,0,h1);
108
109 if (x%3==2)
110 {
111 rb->lcd_define_pattern(h2,pattern2);
112 rb->lcd_putc(i,0,h2);
113 }
114 if (x%3==1)
115 {
116 rb->lcd_define_pattern(h2,pattern1);
117 rb->lcd_putc(i,0,h2);
118 }
119}
120
121/* Call when the program end */
122static void nim_exit(void)
123{
124 /*Restore the old pattern*/
125 rb->lcd_unlock_pattern(h1);
126 rb->lcd_unlock_pattern(h2);
127 rb->lcd_unlock_pattern(hsmile);
128 rb->lcd_unlock_pattern(hcry);
129
130 /*Clear the screen*/
131 rb->lcd_clear_display();
132 rb->lcd_update();
133}
134
135/* this is the plugin entry point */
136enum plugin_status plugin_start(const void* parameter)
137{
138 int y,z,button;
139 int x,v,min;
140 bool ok;
141 bool go;
142 atexit(nim_exit);
143
144 /* if you don't use the parameter, you can do like
145 this to avoid the compiler warning about it */
146 (void)parameter;
147
148 /*Get the pattern handle*/
149 h1=rb->lcd_get_locked_pattern();
150 h2=rb->lcd_get_locked_pattern();
151 hcry=rb->lcd_get_locked_pattern();
152 hsmile=rb->lcd_get_locked_pattern();
153
154
155 rb->splash(HZ, "NIM V1.2");
156 rb->lcd_clear_display();
157
158 /* Main loop */
159 while (1)
160 {
161 /* Init */
162 x=21;
163 v=1;
164 y=1;
165 end=false;
166 min=0;
167
168 /*Empty the event queue*/
169 rb->button_clear_queue();
170
171 /* Game loop */
172 while(end!=true)
173 {
174 do
175 {
176 ok=1;
177 y=1;
178 display_first_line(x);
179
180 rb->lcd_putsf(0,1,"[%d..%d]?=%d",min,v,y);
181 rb->lcd_update();
182
183 go=false;
184 while (!go)
185 {
186 button = rb->button_get(true);
187 switch ( button )
188 {
189 case BUTTON_STOP|BUTTON_REL:
190 go = true;
191 return PLUGIN_OK;
192 break;
193
194 case BUTTON_PLAY|BUTTON_REL:
195 go=true;
196 break;
197
198 case BUTTON_LEFT|BUTTON_REL:
199 go=false;
200 if (y>min)
201 y--;
202 break;
203
204 case BUTTON_RIGHT|BUTTON_REL:
205 go=false;
206 if (y<v)
207 y++;
208 break;
209
210 default:
211 exit_on_usb(button);
212 break;
213 }
214 display_first_line(x);
215 rb->lcd_putsf(0,1,"[%d..%d]?=%d",min,v,y);
216 rb->lcd_update();
217 }
218
219 if ( (y==0) && (x<21))
220 {
221 impossible();
222 ok=false;
223 }
224 else
225 {
226 if (y!=0) /*If y=0 and x=21 jump to CPU code */
227 {
228 if ((y>v) || (y>x))
229 {
230 impossible();
231 ok=false;
232 }
233 if (y-x==0)
234 win();
235 else
236 {
237 v=y*2;
238 x-=y;
239 }
240 }
241 }
242 }
243 while (ok==false);
244
245 display_first_line(x);
246
247 /*CPU*/
248 if (x==1)
249 lose();
250 else
251 if (x==2)
252 win();
253 y=0;
254 if (end==false)
255 {
256 for (z=v;z>=1;z--)
257 {
258 if (x-z==1)
259 y=z;
260 }
261 if (y<=0)
262 {
263 for(z=v;z>=1;z--)
264 {
265 if(x-(z*3)==2)
266 y=z;
267 }
268 if ((y==0) && (x>14))
269 y=v;
270 if (y==0)
271 y=1;
272 }
273 v=y*2;
274 x-=y;
275 rb->lcd_putsf(0,1,"I take=%d",y);
276 rb->lcd_update();
277 rb->sleep(HZ);
278 }
279 if ((x==1)&&(!end))
280 win();
281 min=1;
282 }
283 }
284 return PLUGIN_OK;
285}
diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c
index 97a8094e1f..8e14f26bd5 100644
--- a/apps/plugins/oscilloscope.c
+++ b/apps/plugins/oscilloscope.c
@@ -30,30 +30,7 @@
30#include "lib/osd.h" 30#include "lib/osd.h"
31 31
32/* variable button definitions */ 32/* variable button definitions */
33#if CONFIG_KEYPAD == RECORDER_PAD 33#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
34#define OSCILLOSCOPE_QUIT BUTTON_OFF
35#define OSCILLOSCOPE_DRAWMODE BUTTON_F1
36#define OSCILLOSCOPE_ADVMODE BUTTON_F2
37#define OSCILLOSCOPE_ORIENTATION BUTTON_F3
38#define OSCILLOSCOPE_PAUSE BUTTON_PLAY
39#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
40#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
41#define OSCILLOSCOPE_VOL_UP BUTTON_UP
42#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
43
44#elif CONFIG_KEYPAD == ONDIO_PAD
45#define OSCILLOSCOPE_QUIT BUTTON_OFF
46#define OSCILLOSCOPE_DRAWMODE_PRE BUTTON_MENU
47#define OSCILLOSCOPE_DRAWMODE (BUTTON_MENU | BUTTON_REL)
48#define OSCILLOSCOPE_ADVMODE (BUTTON_MENU | BUTTON_RIGHT)
49#define OSCILLOSCOPE_ORIENTATION (BUTTON_MENU | BUTTON_LEFT)
50#define OSCILLOSCOPE_PAUSE (BUTTON_MENU | BUTTON_OFF)
51#define OSCILLOSCOPE_SPEED_UP BUTTON_RIGHT
52#define OSCILLOSCOPE_SPEED_DOWN BUTTON_LEFT
53#define OSCILLOSCOPE_VOL_UP BUTTON_UP
54#define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN
55
56#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
57#define OSCILLOSCOPE_QUIT BUTTON_OFF 34#define OSCILLOSCOPE_QUIT BUTTON_OFF
58#define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT 35#define OSCILLOSCOPE_DRAWMODE BUTTON_SELECT
59#define OSCILLOSCOPE_ADVMODE BUTTON_MODE 36#define OSCILLOSCOPE_ADVMODE BUTTON_MODE
@@ -934,9 +911,6 @@ static void get_peaks(int *left, int *right)
934#elif defined (SIMULATOR) 911#elif defined (SIMULATOR)
935 *left = rand() % 0x8000; 912 *left = rand() % 0x8000;
936 *right = rand() % 0x8000; 913 *right = rand() % 0x8000;
937#elif (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
938 *left = rb->mas_codec_readreg(0xC);
939 *right = rb->mas_codec_readreg(0xD);
940#else 914#else
941 *left = 0; 915 *left = 0;
942 *right = 0; 916 *right = 0;
diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c
index e000e98d33..c3d38997eb 100644
--- a/apps/plugins/pegbox.c
+++ b/apps/plugins/pegbox.c
@@ -43,41 +43,7 @@
43#define HOLE 6 43#define HOLE 6
44#define PLAYER 7 44#define PLAYER 7
45 45
46#if CONFIG_KEYPAD == RECORDER_PAD 46#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
47#define PEGBOX_SELECT BUTTON_ON
48#define PEGBOX_QUIT BUTTON_OFF
49#define PEGBOX_RESTART BUTTON_F2
50#define PEGBOX_LVL_UP BUTTON_F1
51#define PEGBOX_LVL_DOWN BUTTON_F3
52#define PEGBOX_UP BUTTON_UP
53#define PEGBOX_DOWN BUTTON_DOWN
54#define PEGBOX_RIGHT BUTTON_RIGHT
55#define PEGBOX_LEFT BUTTON_LEFT
56
57#define SELECT_TEXT "ON"
58#define QUIT_TEXT "OFF"
59#define RESTART_TEXT "F2"
60#define LVL_UP_TEXT "F1"
61#define LVL_DOWN_TEXT "F3"
62
63#elif CONFIG_KEYPAD == ONDIO_PAD
64#define PEGBOX_SELECT BUTTON_OFF
65#define PEGBOX_QUIT (BUTTON_MENU | BUTTON_LEFT)
66#define PEGBOX_RESTART (BUTTON_MENU | BUTTON_RIGHT)
67#define PEGBOX_LVL_UP (BUTTON_MENU | BUTTON_UP)
68#define PEGBOX_LVL_DOWN (BUTTON_MENU | BUTTON_DOWN)
69#define PEGBOX_UP BUTTON_UP
70#define PEGBOX_DOWN BUTTON_DOWN
71#define PEGBOX_RIGHT BUTTON_RIGHT
72#define PEGBOX_LEFT BUTTON_LEFT
73
74#define SELECT_TEXT "OFF"
75#define QUIT_TEXT "M+LEFT"
76#define RESTART_TEXT "M+RIGHT"
77#define LVL_UP_TEXT "M+UP"
78#define LVL_DOWN_TEXT "M+DOWN"
79
80#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
81 (CONFIG_KEYPAD == IRIVER_H300_PAD) 47 (CONFIG_KEYPAD == IRIVER_H300_PAD)
82#define PEGBOX_SELECT BUTTON_SELECT 48#define PEGBOX_SELECT BUTTON_SELECT
83#define PEGBOX_QUIT BUTTON_OFF 49#define PEGBOX_QUIT BUTTON_OFF
diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c
index 91174604ea..a32298f861 100644
--- a/apps/plugins/pictureflow/pictureflow.c
+++ b/apps/plugins/pictureflow/pictureflow.c
@@ -90,13 +90,6 @@ const struct button_mapping pf_context_album_scroll[] =
90 {ACTION_NONE, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT}, 90 {ACTION_NONE, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT},
91 {ACTION_NONE, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT}, 91 {ACTION_NONE, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT},
92#endif 92#endif
93#if CONFIG_KEYPAD == ONDIO_PAD
94 {PF_SELECT, BUTTON_UP|BUTTON_REL, BUTTON_UP},
95 {PF_CONTEXT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP},
96 {ACTION_NONE, BUTTON_UP, BUTTON_NONE},
97 {ACTION_NONE, BUTTON_DOWN, BUTTON_NONE},
98 {ACTION_NONE, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE},
99#endif
100 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_PLUGIN|1) 93 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_PLUGIN|1)
101}; 94};
102#endif /* !USE_CORE_PREVNEXT */ 95#endif /* !USE_CORE_PREVNEXT */
@@ -147,8 +140,7 @@ const struct button_mapping pf_context_buttons[] =
147 {PF_QUIT, BUTTON_RC_REC, BUTTON_NONE}, 140 {PF_QUIT, BUTTON_RC_REC, BUTTON_NONE},
148#elif CONFIG_KEYPAD == MEIZU_M6SL_PAD 141#elif CONFIG_KEYPAD == MEIZU_M6SL_PAD
149 {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU}, 142 {PF_QUIT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU},
150#elif CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD || \ 143#elif CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
151 CONFIG_KEYPAD == RECORDER_PAD || CONFIG_KEYPAD == ONDIO_PAD
152 {PF_QUIT, BUTTON_OFF, BUTTON_NONE}, 144 {PF_QUIT, BUTTON_OFF, BUTTON_NONE},
153#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD 145#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
154 {PF_QUIT, BUTTON_REC, BUTTON_NONE}, 146 {PF_QUIT, BUTTON_REC, BUTTON_NONE},
@@ -691,13 +683,7 @@ static inline PFreal fdiv(PFreal num, PFreal den)
691#define fabs(a) (a < 0 ? -a : a) 683#define fabs(a) (a < 0 ? -a : a)
692#define fbound(min,val,max) (fmax((min),fmin((max),(val)))) 684#define fbound(min,val,max) (fmax((min),fmin((max),(val))))
693 685
694#if CONFIG_CPU == SH7034
695/* 16*16->32 bit multiplication is a single instrcution on the SH1 */
696#define MULUQ(a, b) ((uint32_t) (((uint16_t) (a)) * ((uint16_t) (b))))
697#else
698#define MULUQ(a, b) ((a) * (b)) 686#define MULUQ(a, b) ((a) * (b))
699#endif
700
701 687
702#if 0 688#if 0
703#define fmul(a,b) ( ((a)*(b)) >> PFREAL_SHIFT ) 689#define fmul(a,b) ( ((a)*(b)) >> PFREAL_SHIFT )
diff --git a/apps/plugins/pictureflow/pictureflow.make b/apps/plugins/pictureflow/pictureflow.make
index 9c29f7abd9..fb606fb860 100644
--- a/apps/plugins/pictureflow/pictureflow.make
+++ b/apps/plugins/pictureflow/pictureflow.make
@@ -16,15 +16,7 @@ PICTUREFLOW_OBJ := $(call c2obj, $(PICTUREFLOW_SRC))
16OTHER_SRC += $(PICTUREFLOW_SRC) 16OTHER_SRC += $(PICTUREFLOW_SRC)
17 17
18ifndef APP_TYPE 18ifndef APP_TYPE
19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
20 ### lowmem targets
21 ROCKS += $(PICTUREFLOW_OBJDIR)/pictureflow.ovl
22 PICTUREFLOW_OUTLDS = $(PICTUREFLOW_OBJDIR)/picutreflow.link
23 PICTUREFLOW_OVLFLAGS = -T$(PICTUREFLOW_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
24else
25 ### all other targets
26 ROCKS += $(PICTUREFLOW_OBJDIR)/pictureflow.rock 19 ROCKS += $(PICTUREFLOW_OBJDIR)/pictureflow.rock
27endif
28else 20else
29 ### simulator 21 ### simulator
30 ROCKS += $(PICTUREFLOW_OBJDIR)/pictureflow.rock 22 ROCKS += $(PICTUREFLOW_OBJDIR)/pictureflow.rock
diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds
index 7037496be4..25ff4a461b 100644
--- a/apps/plugins/plugin.lds
+++ b/apps/plugins/plugin.lds
@@ -6,8 +6,6 @@
6OUTPUT_FORMAT(elf32-m68k) 6OUTPUT_FORMAT(elf32-m68k)
7#elif defined(CPU_ARM) 7#elif defined(CPU_ARM)
8OUTPUT_FORMAT(elf32-littlearm) 8OUTPUT_FORMAT(elf32-littlearm)
9#elif defined(CPU_SH)
10OUTPUT_FORMAT(elf32-sh)
11#elif defined(CPU_MIPS) 9#elif defined(CPU_MIPS)
12OUTPUT_FORMAT(elf32-littlemips) 10OUTPUT_FORMAT(elf32-littlemips)
13#else 11#else
diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c
index 1fcd018de2..fcc4c5a3b9 100644
--- a/apps/plugins/pong.c
+++ b/apps/plugins/pong.c
@@ -39,23 +39,7 @@
39#define MOVE_STEP LCD_HEIGHT / 32 /* move pad this many steps up/down each move */ 39#define MOVE_STEP LCD_HEIGHT / 32 /* move pad this many steps up/down each move */
40 40
41/* variable button definitions */ 41/* variable button definitions */
42#if CONFIG_KEYPAD == RECORDER_PAD 42#if CONFIG_KEYPAD == IRIVER_H100_PAD
43#define PONG_QUIT BUTTON_OFF
44#define PONG_PAUSE BUTTON_ON
45#define PONG_LEFT_UP BUTTON_F1
46#define PONG_LEFT_DOWN BUTTON_LEFT
47#define PONG_RIGHT_UP BUTTON_F3
48#define PONG_RIGHT_DOWN BUTTON_RIGHT
49
50#elif CONFIG_KEYPAD == ONDIO_PAD
51#define PONG_QUIT BUTTON_OFF
52#define PONG_PAUSE BUTTON_RIGHT
53#define PONG_LEFT_UP BUTTON_LEFT
54#define PONG_LEFT_DOWN BUTTON_MENU
55#define PONG_RIGHT_UP BUTTON_UP
56#define PONG_RIGHT_DOWN BUTTON_DOWN
57
58#elif CONFIG_KEYPAD == IRIVER_H100_PAD
59#define PONG_QUIT BUTTON_OFF 43#define PONG_QUIT BUTTON_OFF
60#define PONG_LEFT_UP BUTTON_UP 44#define PONG_LEFT_UP BUTTON_UP
61#define PONG_LEFT_DOWN BUTTON_DOWN 45#define PONG_LEFT_DOWN BUTTON_DOWN
diff --git a/apps/plugins/reversi/reversi-gui.h b/apps/plugins/reversi/reversi-gui.h
index 4ec6bcb67b..ceeabeebc8 100644
--- a/apps/plugins/reversi/reversi-gui.h
+++ b/apps/plugins/reversi/reversi-gui.h
@@ -27,28 +27,8 @@
27#define GAME_FILE PLUGIN_GAMES_DIR "/reversi.rev" 27#define GAME_FILE PLUGIN_GAMES_DIR "/reversi.rev"
28 28
29/* variable button definitions */ 29/* variable button definitions */
30#if CONFIG_KEYPAD == RECORDER_PAD 30#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
31#define REVERSI_BUTTON_QUIT BUTTON_OFF 31 (CONFIG_KEYPAD == IRIVER_H300_PAD)
32#define REVERSI_BUTTON_UP BUTTON_UP
33#define REVERSI_BUTTON_DOWN BUTTON_DOWN
34#define REVERSI_BUTTON_LEFT BUTTON_LEFT
35#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT
36#define REVERSI_BUTTON_MAKE_MOVE BUTTON_PLAY
37#define REVERSI_BUTTON_MENU BUTTON_F1
38
39#elif CONFIG_KEYPAD == ONDIO_PAD
40#define REVERSI_BUTTON_QUIT BUTTON_OFF
41#define REVERSI_BUTTON_UP BUTTON_UP
42#define REVERSI_BUTTON_DOWN BUTTON_DOWN
43#define REVERSI_BUTTON_LEFT BUTTON_LEFT
44#define REVERSI_BUTTON_RIGHT BUTTON_RIGHT
45#define REVERSI_BUTTON_MAKE_MOVE BUTTON_MENU
46#define REVERSI_BUTTON_MAKE_MOVE_SHORTPRESS
47#define REVERSI_BUTTON_MENU_LONGPRESS
48#define REVERSI_BUTTON_MENU BUTTON_MENU
49
50#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
51 (CONFIG_KEYPAD == IRIVER_H300_PAD)
52#define REVERSI_BUTTON_QUIT BUTTON_OFF 32#define REVERSI_BUTTON_QUIT BUTTON_OFF
53#define REVERSI_BUTTON_UP BUTTON_UP 33#define REVERSI_BUTTON_UP BUTTON_UP
54#define REVERSI_BUTTON_DOWN BUTTON_DOWN 34#define REVERSI_BUTTON_DOWN BUTTON_DOWN
diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c
index b6cf6e5470..1732d61277 100644
--- a/apps/plugins/rockblox.c
+++ b/apps/plugins/rockblox.c
@@ -58,43 +58,6 @@
58 58
59#define ROCKBLOX_RC_OFF BUTTON_RC_STOP 59#define ROCKBLOX_RC_OFF BUTTON_RC_STOP
60 60
61#elif CONFIG_KEYPAD == RECORDER_PAD
62
63#define ROCKBLOX_OFF BUTTON_OFF
64#define ROCKBLOX_ROTATE_CCW BUTTON_UP
65#define ROCKBLOX_ROTATE_CW BUTTON_PLAY
66#define ROCKBLOX_DOWN BUTTON_DOWN
67#define ROCKBLOX_LEFT BUTTON_LEFT
68#define ROCKBLOX_RIGHT BUTTON_RIGHT
69#define ROCKBLOX_DROP BUTTON_ON
70#define ROCKBLOX_RESTART BUTTON_F1
71
72#elif CONFIG_KEYPAD == PLAYER_PAD
73
74#define ROCKBLOX_OFF_PRE BUTTON_STOP
75#define ROCKBLOX_OFF (BUTTON_STOP|BUTTON_REL)
76#define ROCKBLOX_ROTATE_CCW BUTTON_PLAY
77#define ROCKBLOX_ROTATE_CW (BUTTON_ON|BUTTON_PLAY)
78#define ROCKBLOX_DOWN BUTTON_MENU
79#define ROCKBLOX_LEFT BUTTON_LEFT
80#define ROCKBLOX_RIGHT BUTTON_RIGHT
81#define ROCKBLOX_DROP_PRE BUTTON_ON
82#define ROCKBLOX_DROP (BUTTON_ON|BUTTON_REL)
83#define ROCKBLOX_RESTART (BUTTON_STOP|BUTTON_MENU)
84
85#elif CONFIG_KEYPAD == ONDIO_PAD
86
87#define ROCKBLOX_OFF_PRE BUTTON_OFF
88#define ROCKBLOX_OFF (BUTTON_OFF|BUTTON_REL)
89#define ROCKBLOX_ROTATE_CCW BUTTON_UP
90#define ROCKBLOX_ROTATE_CW (BUTTON_MENU|BUTTON_UP)
91#define ROCKBLOX_DOWN BUTTON_DOWN
92#define ROCKBLOX_LEFT BUTTON_LEFT
93#define ROCKBLOX_RIGHT BUTTON_RIGHT
94#define ROCKBLOX_DROP_PRE BUTTON_MENU
95#define ROCKBLOX_DROP (BUTTON_MENU|BUTTON_REL)
96#define ROCKBLOX_RESTART (BUTTON_OFF|BUTTON_MENU)
97
98#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD 61#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
99 62
100#define ROCKBLOX_OFF BUTTON_POWER 63#define ROCKBLOX_OFF BUTTON_POWER
diff --git a/apps/plugins/rockbox_flash.c b/apps/plugins/rockbox_flash.c
deleted file mode 100644
index 4837b03fb5..0000000000
--- a/apps/plugins/rockbox_flash.c
+++ /dev/null
@@ -1,967 +0,0 @@
1/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* Plugin for reprogramming only the second image in Flash ROM.
11* !!! DON'T MESS WITH THIS CODE UNLESS YOU'RE ABSOLUTELY SURE WHAT YOU DO !!!
12*
13* Copyright (C) 2003 Jörg Hohensohn aka [IDC]Dragon
14*
15* This program is free software; you can redistribute it and/or
16* modify it under the terms of the GNU General Public License
17* as published by the Free Software Foundation; either version 2
18* of the License, or (at your option) any later version.
19*
20* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21* KIND, either express or implied.
22*
23****************************************************************************/
24#include "plugin.h"
25
26/* define DUMMY if you only want to "play" with the UI, does no harm */
27/* #define DUMMY */
28
29#define LATEST_BOOTLOADER_VERSION 3 /* update this with the bootloader */
30
31#ifndef UINT8
32#define UINT8 unsigned char
33#endif
34
35#ifndef UINT16
36#define UINT16 unsigned short
37#endif
38
39#ifndef UINT32
40#define UINT32 unsigned long
41#endif
42
43/* hard-coded values */
44static volatile UINT8* FB = (UINT8*)0x02000000; /* Flash base address */
45#define SECTORSIZE 4096 /* size of one flash sector */
46
47#define ROCKBOX_DEST 0x09000000
48#define ROCKBOX_EXEC 0x09000200
49#define BOOT_VERS_ADR 0xFA /* position of bootloader version value in Flash */
50#define FW_VERS_ADR 0xFE /* position of firmware version value in Flash */
51#define UCL_HEADER 26 /* size of the header generated by uclpack */
52
53#if CONFIG_KEYPAD == ONDIO_PAD /* limited keypad */
54#define KEY1 BUTTON_LEFT
55#define KEY2 BUTTON_UP
56#define KEYNAME1 "Left"
57#define KEYNAME2 "Up"
58#else /* recorder keypad */
59#define KEY1 BUTTON_F1
60#define KEY2 BUTTON_F2
61#define KEYNAME1 "F1"
62#define KEYNAME2 "F2"
63#endif
64
65typedef struct
66{
67 UINT32 destination; /* address to copy it to */
68 UINT32 size; /* how many bytes of payload (to the next header) */
69 UINT32 execute; /* entry point */
70 UINT32 flags; /* uncompressed or compressed */
71 /* end of header, now comes the payload */
72} tImageHeader;
73
74/* result of the CheckFirmwareFile() function */
75typedef enum
76{
77 eOK = 0,
78 eFileNotFound, /* errors from here on */
79 eTooBig,
80 eTooSmall,
81 eReadErr,
82 eNotUCL,
83 eWrongAlgorithm,
84 eMultiBlocks,
85 eBadRomLink
86} tCheckResult;
87
88typedef struct
89{
90 UINT8 manufacturer;
91 UINT8 id;
92 int size;
93 char name[32];
94} tFlashInfo;
95
96static UINT8* sector; /* better not place this on the stack... */
97
98/***************** Flash Functions *****************/
99
100
101/* read the manufacturer and device ID */
102static bool ReadID(volatile UINT8* pBase, UINT8* pManufacturerID,
103 UINT8* pDeviceID)
104{
105 UINT8 not_manu, not_id; /* read values before switching to ID mode */
106 UINT8 manu, id; /* read values when in ID mode */
107
108 pBase = (UINT8*)((UINT32)pBase & 0xFFF80000); /* round down to 512k align,
109 to make sure */
110
111 not_manu = pBase[0]; /* read the normal content */
112 not_id = pBase[1]; /* should be 'A' (0x41) and 'R' (0x52) from the
113 "ARCH" marker */
114
115 pBase[0x5555] = 0xAA; /* enter command mode */
116 pBase[0x2AAA] = 0x55;
117 pBase[0x5555] = 0x90; /* ID command */
118 rb->sleep(HZ/50); /* Atmel wants 20ms pause here */
119
120 manu = pBase[0];
121 id = pBase[1];
122
123 pBase[0] = 0xF0; /* reset flash (back to normal read mode) */
124 rb->sleep(HZ/50); /* Atmel wants 20ms pause here */
125
126 /* I assume success if the obtained values are different from
127 the normal flash content. This is not perfectly bulletproof, they
128 could theoretically be the same by chance, causing us to fail. */
129 if (not_manu != manu || not_id != id) /* a value has changed */
130 {
131 *pManufacturerID = manu; /* return the results */
132 *pDeviceID = id;
133 return true; /* success */
134 }
135 return false; /* fail */
136}
137
138/* erase the sector which contains the given address */
139static bool EraseSector(volatile UINT8* pAddr)
140{
141#ifdef DUMMY
142 (void)pAddr; /* prevents warning */
143 return true;
144#else
145 volatile UINT8* pBase =
146 (UINT8*)((UINT32)pAddr & 0xFFF80000); /* round down to 512k align */
147 unsigned timeout = 43000; /* the timeout loop should be no less than
148 25ms */
149
150 pBase[0x5555] = 0xAA; /* enter command mode */
151 pBase[0x2AAA] = 0x55;
152 pBase[0x5555] = 0x80; /* erase command */
153 pBase[0x5555] = 0xAA; /* enter command mode */
154 pBase[0x2AAA] = 0x55;
155 *pAddr = 0x30; /* erase the sector */
156
157 /* I counted 7 instructions for this loop -> min. 0.58 us per round
158 Plus memory waitstates it will be much more, gives margin */
159 while (*pAddr != 0xFF && --timeout); /* poll for erased */
160
161 return (timeout != 0);
162#endif
163}
164
165/* address must be in an erased location */
166static inline bool ProgramByte(volatile UINT8* pAddr, UINT8 data)
167{
168#ifdef DUMMY
169 (void)pAddr; /* prevents warnings */
170 (void)data;
171 return true;
172#else
173 unsigned timeout = 35; /* the timeout loop should be no less than 20us */
174
175 if (~*pAddr & data) /* just a safety feature, not really necessary */
176 return false; /* can't set any bit from 0 to 1 */
177
178 FB[0x5555] = 0xAA; /* enter command mode */
179 FB[0x2AAA] = 0x55;
180 FB[0x5555] = 0xA0; /* byte program command */
181
182 *pAddr = data;
183
184 /* I counted 7 instructions for this loop -> min. 0.58 us per round
185 Plus memory waitstates it will be much more, gives margin */
186 while (*pAddr != data && --timeout); /* poll for programmed */
187
188 return (timeout != 0);
189#endif
190}
191
192/* this returns true if supported and fills the info struct */
193static bool GetFlashInfo(tFlashInfo* pInfo)
194{
195 rb->memset(pInfo, 0, sizeof(tFlashInfo));
196
197 if (!ReadID(FB, &pInfo->manufacturer, &pInfo->id))
198 return false;
199
200 if (pInfo->manufacturer == 0xBF) /* SST */
201 {
202 if (pInfo->id == 0xD6)
203 {
204 pInfo->size = 256* 1024; /* 256k */
205 rb->strcpy(pInfo->name, "SST39VF020");
206 return true;
207 }
208 else if (pInfo->id == 0xD7)
209 {
210 pInfo->size = 512* 1024; /* 512k */
211 rb->strcpy(pInfo->name, "SST39VF040");
212 return true;
213 }
214 else
215 return false;
216 }
217 return false;
218}
219
220
221/*********** Tool Functions ************/
222
223/* read a 32 bit value from memory, big endian */
224static UINT32 Read32(UINT8* pByte)
225{
226 UINT32 value;
227
228 value = (UINT32)pByte[0] << 24;
229 value |= (UINT32)pByte[1] << 16;
230 value |= (UINT32)pByte[2] << 8;
231 value |= (UINT32)pByte[3];
232
233 return value;
234}
235
236/* get the start address of the second image */
237static tImageHeader* GetSecondImage(void)
238{
239 tImageHeader* pImage1;
240 UINT32 pos = 0; /* default: not found */
241 UINT32* pFlash = (UINT32*)FB;
242
243 /* determine the first image position */
244 pos = pFlash[2] + pFlash[3]; /* position + size of the bootloader
245 = after it */
246 pos = (pos + 3) & ~3; /* be sure it's 32 bit aligned */
247 pImage1 = (tImageHeader*)pos;
248
249 if (pImage1->destination != ROCKBOX_DEST ||
250 pImage1->execute != ROCKBOX_EXEC)
251 return 0; /* seems to be no Archos/Rockbox image in here */
252
253 if (pImage1->size != 0)
254 {
255 /* success, we have a second image */
256 pos = (UINT32)pImage1 + sizeof(tImageHeader) + pImage1->size;
257 if (((pos + SECTORSIZE-1) & ~(SECTORSIZE-1)) != pos)
258 { /* not sector-aligned */
259 pos = 0; /* sanity check failed */
260 }
261 }
262
263 return (tImageHeader*)pos;
264}
265
266/* return bootloader version */
267static inline unsigned BootloaderVersion(void)
268{
269 return FB[BOOT_VERS_ADR];
270}
271
272/*********** Image File Functions ************/
273
274/* so far, only compressed images in UCL NRV algorithm 2e supported */
275tCheckResult CheckImageFile(char* filename, int space,
276 tImageHeader* pHeader, UINT8* pos)
277{
278 int i;
279 int fd;
280 int filesize; /* size info */
281
282 int fileread = 0; /* total size as read from the file */
283 int read; /* how many for this sector */
284
285 /* magic file header for compressed files */
286 static const UINT8 magic[8] = { 0x00,0xe9,0x55,0x43,0x4c,0xff,0x01,0x1a };
287 UINT8 ucl_header[UCL_HEADER];
288
289 fd = rb->open(filename, O_RDONLY);
290 if (fd < 0)
291 return eFileNotFound;
292
293 filesize = rb->filesize(fd);
294 if (filesize - (int)sizeof(ucl_header) - 8 > space)
295 {
296 rb->close(fd);
297 return eTooBig;
298 }
299 else if (filesize < 10000) /* give it some reasonable lower limit */
300 {
301 rb->close(fd);
302 return eTooSmall;
303 }
304
305 /* do some sanity checks */
306
307 read = rb->read(fd, ucl_header, sizeof(ucl_header));
308 fileread += read;
309 if (read != sizeof(ucl_header))
310 {
311 rb->close(fd);
312 return eReadErr;
313 }
314
315 /* compare the magic header */
316 for (i=0; i<8; i++)
317 {
318 if (ucl_header[i] != magic[i])
319 {
320 rb->close(fd);
321 return eNotUCL;
322 }
323 }
324
325 pHeader->size = Read32(ucl_header + 22); /* compressed size */
326 if (pHeader->size != filesize - sizeof(ucl_header) - 8)
327 {
328 rb->close(fd);
329 return eMultiBlocks;
330 }
331
332 /* fill in the hardcoded defaults of the header */
333 pHeader->destination = ROCKBOX_DEST;
334 pHeader->execute = ROCKBOX_EXEC;
335
336 if (Read32(ucl_header + 18) > pHeader->size) /* compare with uncompressed
337 size */
338 { /* compressed, normal case */
339 pHeader->flags = 0x00000001; /* flags for UCL compressed */
340
341 /* check for supported algorithm */
342 if (ucl_header[12] != 0x2E)
343 {
344 rb->close(fd);
345 return eWrongAlgorithm;
346 }
347 }
348 else
349 { /* uncompressed, either to be copied or run directly in flash */
350 UINT32 reset_vector; /* image has to start with reset vector */
351
352 pHeader->flags = 0x00000000; /* uncompressed */
353
354 read = rb->read(fd, &reset_vector, sizeof(reset_vector));
355 fileread += read;
356 if (read != sizeof(reset_vector))
357 {
358 rb->close(fd);
359 return eReadErr;
360 }
361 if (reset_vector >= (UINT32)FB
362 && reset_vector < (UINT32)FB+512*1024) /* ROM address? */
363 {
364 /* assume in-place, executing directly in flash */
365 pHeader->destination = (UINT32)(pos + sizeof(tImageHeader));
366
367 /* for new RomBox, this isn't the reset vector,
368 but the link address, for us to check the position */
369 if(pHeader->destination != reset_vector) /* compare link addr. */
370 {
371 rb->close(fd);
372 return eBadRomLink; /* not matching the start address */
373 }
374
375 /* read the now following reset vector */
376 read = rb->read(fd, &reset_vector, sizeof(reset_vector));
377 fileread += read;
378 if (read != sizeof(reset_vector))
379 {
380 rb->close(fd);
381 return eReadErr;
382 }
383 }
384
385 pHeader->execute = reset_vector;
386 }
387
388 /* check if we can read the whole file */
389 do
390 {
391 read = rb->read(fd, sector, SECTORSIZE);
392 fileread += read;
393 } while (read == SECTORSIZE);
394
395 rb->close(fd);
396
397 if (fileread != filesize)
398 return eReadErr;
399
400 return eOK;
401}
402
403
404/* returns the # of failures, 0 on success */
405static unsigned ProgramImageFile(char* filename, UINT8* pos,
406 tImageHeader* pImageHeader,
407 int start, int size)
408{
409 int i;
410 int fd;
411 int read; /* how many for this sector */
412 unsigned failures = 0;
413
414 fd = rb->open(filename, O_RDONLY);
415 if (fd < 0)
416 return false;
417
418 /* no error checking necessary here, we checked for minimum size
419 already */
420 rb->lseek(fd, start, SEEK_SET); /* go to start position */
421
422 *(tImageHeader*)sector = *pImageHeader; /* copy header into sector
423 buffer */
424 read = rb->read(fd, sector + sizeof(tImageHeader),
425 SECTORSIZE - sizeof(tImageHeader)); /* payload behind */
426 size -= read;
427 read += sizeof(tImageHeader); /* to be programmed, but not part of the
428 file */
429
430 do {
431 if (!EraseSector(pos))
432 {
433 /* nothing we can do, let the programming count the errors */
434 }
435
436 for (i=0; i<read; i++)
437 {
438 if (!ProgramByte(pos + i, sector[i]))
439 {
440 failures++;
441 }
442 }
443
444 pos += SECTORSIZE;
445 read = rb->read(fd, sector, (size > SECTORSIZE) ? SECTORSIZE : size);
446 /* payload for next sector */
447 size -= read;
448 } while (read > 0);
449
450 rb->close(fd);
451
452 return failures;
453}
454
455/* returns the # of failures, 0 on success */
456static unsigned VerifyImageFile(char* filename, UINT8* pos,
457 tImageHeader* pImageHeader,
458 int start, int size)
459{
460 int i;
461 int fd;
462 int read; /* how many for this sector */
463 unsigned failures = 0;
464
465 fd = rb->open(filename, O_RDONLY);
466 if (fd < 0)
467 return false;
468
469 /* no error checking necessary here, we checked for minimum size
470 already */
471 rb->lseek(fd, start, SEEK_SET); /* go to start position */
472
473 *(tImageHeader*)sector = *pImageHeader; /* copy header into sector
474 buffer */
475 read = rb->read(fd, sector + sizeof(tImageHeader),
476 SECTORSIZE - sizeof(tImageHeader)); /* payload behind */
477
478 size -= read;
479 read += sizeof(tImageHeader); /* to be programmed, but not part of the
480 file */
481
482 do
483 {
484 for (i=0; i<read; i++)
485 {
486 if (pos[i] != sector[i])
487 {
488 failures++;
489 }
490 }
491
492 pos += SECTORSIZE;
493 read = rb->read(fd, sector, (size > SECTORSIZE) ? SECTORSIZE : size);
494 /* payload for next sector */
495 size -= read;
496 } while (read);
497
498 rb->close(fd);
499
500 return failures;
501}
502
503
504/***************** User Interface Functions *****************/
505
506static int WaitForButton(void)
507{
508 int button;
509
510 do
511 {
512 button = rb->button_get(true);
513 } while (IS_SYSEVENT(button) || (button & BUTTON_REL));
514
515 return button;
516}
517
518#ifdef HAVE_LCD_BITMAP
519/* helper for DoUserDialog() */
520static void ShowFlashInfo(tFlashInfo* pInfo, tImageHeader* pImageHeader)
521{
522 char buf[32];
523
524 if (!pInfo->manufacturer)
525 {
526 rb->lcd_puts_scroll(0, 0, "Flash: M=?? D=??");
527 }
528 else
529 {
530 if (pInfo->size)
531 {
532 rb->snprintf(buf, sizeof(buf), "Flash size: %d KB",
533 pInfo->size / 1024);
534 rb->lcd_puts_scroll(0, 0, buf);
535 }
536 else
537 {
538 rb->lcd_puts_scroll(0, 0, "Unsupported chip");
539 }
540
541 }
542
543 if (pImageHeader)
544 {
545 rb->snprintf(buf, sizeof(buf), "Image at %d KB",
546 ((UINT8*)pImageHeader - FB) / 1024);
547 rb->lcd_puts_scroll(0, 1, buf);
548 }
549 else
550 {
551 rb->lcd_puts_scroll(0, 1, "No image found!");
552 }
553}
554
555
556/* Kind of our main function, defines the application flow. */
557/* recorder version */
558static void DoUserDialog(char* filename)
559{
560 tImageHeader ImageHeader;
561 tFlashInfo FlashInfo;
562 int button;
563 int rc; /* generic return code */
564 UINT32 space, aligned_size, true_size;
565 UINT8* pos;
566 size_t memleft;
567 unsigned bl_version;
568 bool show_greet = false;
569
570 /* this can only work if Rockbox runs in DRAM, not flash ROM */
571 if ((UINT8*)rb >= FB && (UINT8*)rb < FB + 4096*1024) /* 4 MB max */
572 { /* we're running from flash */
573 rb->splash(HZ*3, "Not from ROM");
574 return; /* exit */
575 }
576
577 /* refuse to work if the power may fail meanwhile */
578 if (!rb->battery_level_safe())
579 {
580 rb->splash(HZ*3, "Battery too low!");
581 return; /* exit */
582 }
583
584 /* "allocate" memory */
585 sector = rb->plugin_get_buffer(&memleft);
586 if (memleft < SECTORSIZE) /* need buffer for a flash sector */
587 {
588 rb->splash(HZ*3, "Out of memory");
589 return; /* exit */
590 }
591
592 rb->lcd_setfont(FONT_SYSFIXED);
593
594 pos = (void*)GetSecondImage();
595 rc = GetFlashInfo(&FlashInfo);
596
597 ShowFlashInfo(&FlashInfo, (void*)pos);
598 rb->lcd_update();
599
600 if (FlashInfo.size == 0) /* no valid chip */
601 {
602 rb->splash(HZ*3, "Not flashable");
603 return; /* exit */
604 }
605 else if (pos == 0)
606 {
607 rb->splash(HZ*3, "No image");
608 return; /* exit */
609 }
610
611 bl_version = BootloaderVersion();
612 /* Upgrade currently not recommended for FM and V2
613 recorder due to bugs in V3 BootBox. (FS#12426) */
614#if !defined(ARCHOS_FMRECORDER) && !defined(ARCHOS_RECORDERV2)
615 if (bl_version < LATEST_BOOTLOADER_VERSION)
616 {
617 rb->lcd_putsf(0, 0, "Bootloader V%d", bl_version);
618 rb->lcd_puts(0, 1, "Hint: You're not ");
619 rb->lcd_puts(0, 2, "using the latest ");
620 rb->lcd_puts(0, 3, "bootloader. ");
621 rb->lcd_puts(0, 4, "A full reflash is ");
622 rb->lcd_puts(0, 5, "recommended. ");
623 rb->lcd_puts(0, 6, "Press " KEYNAME1 " to ignore");
624 rb->lcd_update();
625
626 if (WaitForButton() != KEY1)
627 {
628 return;
629 }
630 rb->lcd_clear_display();
631 }
632#endif
633
634 rb->lcd_puts(0, show_greet ? 0 : 3, "Checking...");
635 rb->lcd_update();
636
637 space = FlashInfo.size - (pos-FB + sizeof(ImageHeader));
638 /* size minus start */
639
640 rc = CheckImageFile(filename, space, &ImageHeader, pos);
641 if (rc != eOK)
642 {
643 rb->lcd_clear_display(); /* make room for error message */
644 show_greet = true; /* verbose */
645 }
646
647 rb->lcd_puts(0, show_greet ? 0 : 3, "Checked:");
648 switch (rc) {
649 case eOK:
650 rb->lcd_puts(0, show_greet ? 0 : 4, "File OK.");
651 break;
652 case eNotUCL:
653 rb->lcd_puts(0, 1, "File not UCL ");
654 rb->lcd_puts(0, 2, "compressed.");
655 rb->lcd_puts(0, 3, "Use uclpack --2e");
656 rb->lcd_puts(0, 4, " --10 rockbox.bin");
657 break;
658 case eWrongAlgorithm:
659 rb->lcd_puts(0, 1, "Wrong algorithm");
660 rb->lcd_puts(0, 2, "for compression.");
661 rb->lcd_puts(0, 3, "Use uclpack --2e");
662 rb->lcd_puts(0, 4, " --10 rockbox.bin");
663 break;
664 case eFileNotFound:
665 rb->lcd_puts(0, 1, "File not found:");
666 rb->lcd_puts_scroll(0, 2, filename);
667 break;
668 case eTooBig:
669 rb->lcd_puts(0, 1, "File too big,");
670 rb->lcd_puts(0, 2, "won't fit in chip.");
671 if (bl_version < LATEST_BOOTLOADER_VERSION)
672 {
673 rb->lcd_puts(0, 3, "Upgrade bootloader");
674 }
675 break;
676 case eTooSmall:
677 rb->lcd_puts(0, 1, "File too small.");
678 rb->lcd_puts(0, 2, "Incomplete?");
679 break;
680 case eReadErr:
681 rb->lcd_puts(0, 1, "File read error.");
682 break;
683 case eMultiBlocks:
684 rb->lcd_puts(0, 1, "File invalid.");
685 rb->lcd_puts(0, 2, "Blocksize");
686 rb->lcd_puts(0, 3, " too small?");
687 break;
688 case eBadRomLink:
689 rb->lcd_puts(0, 1, "Bootloader not");
690 rb->lcd_puts(0, 2, "compatible with");
691 rb->lcd_puts(0, 3, "RomBox. Start");
692 rb->lcd_puts(0, 4, "address mismatch.");
693 break;
694 default:
695 rb->lcd_puts(0, 1, "Check failed.");
696 break;
697 }
698
699 if (rc == eOK)
700 { /* was OK */
701 rb->lcd_puts(0, 6, "[" KEYNAME2 "] to program");
702 rb->lcd_puts(0, 7, "other key to exit");
703 }
704 else
705 { /* error occured */
706 rb->lcd_puts(0, 6, "Any key to exit");
707 }
708 rb->lcd_update();
709
710 button = WaitForButton();
711 if (rc != eOK || button != KEY2)
712 {
713 return;
714 }
715
716 true_size = ImageHeader.size;
717 aligned_size = ((sizeof(tImageHeader) + true_size + SECTORSIZE-1) &
718 ~(SECTORSIZE-1)) - sizeof(tImageHeader); /* round up to
719 next flash
720 sector */
721 ImageHeader.size = aligned_size; /* increase image size such that we reach
722 the next sector */
723
724 rb->lcd_clear_display();
725 rb->lcd_puts_scroll(0, 0, "Programming...");
726 rb->lcd_update();
727
728 rc = ProgramImageFile(filename, pos, &ImageHeader, UCL_HEADER, true_size);
729 if (rc)
730 { /* errors */
731 rb->lcd_clear_display();
732 rb->lcd_puts(0, 0, "Error:");
733 rb->lcd_puts(0, 1, "Programming fail!");
734 rb->lcd_putsf(0, 2, "%d errors", rc);
735 rb->lcd_update();
736 button = WaitForButton();
737 }
738
739 rb->lcd_clear_display();
740 rb->lcd_puts_scroll(0, 0, "Verifying...");
741 rb->lcd_update();
742
743 rc = VerifyImageFile(filename, pos, &ImageHeader, UCL_HEADER, true_size);
744
745 rb->lcd_clear_display();
746 if (rc == 0)
747 {
748 rb->lcd_puts(0, 0, "Verify OK.");
749 }
750 else
751 {
752 rb->lcd_puts(0, 0, "Error:");
753 rb->lcd_puts(0, 1, "Verify fail!");
754 rb->lcd_putsf(0, 2, "%d errors", rc);
755 rb->lcd_puts(0, 3, "Use safe image");
756 rb->lcd_puts(0, 4, "if booting hangs:");
757 rb->lcd_puts(0, 5, "F1 during power-on");
758 }
759 rb->lcd_puts(0, 7, "Any key to exit");
760 rb->lcd_update();
761 WaitForButton();
762}
763
764#else /* #ifdef HAVE_LCD_BITMAP */
765
766/* Player version */
767static void DoUserDialog(char* filename)
768{
769 tImageHeader ImageHeader;
770 tFlashInfo FlashInfo;
771 static char buf[MAX_PATH];
772 int button;
773 int rc; /* generic return code */
774 UINT32 space, aligned_size, true_size;
775 UINT8* pos;
776 size_t memleft;
777 unsigned bl_version;
778
779 /* this can only work if Rockbox runs in DRAM, not flash ROM */
780 if ((UINT8*)rb >= FB && (UINT8*)rb < FB + 4096*1024) /* 4 MB max */
781 { /* we're running from flash */
782 rb->splash(HZ*3, "Not from ROM");
783 return; /* exit */
784 }
785
786 /* refuse to work if the power may fail meanwhile */
787 if (!rb->battery_level_safe())
788 {
789 rb->splash(HZ*3, "Batt. too low!");
790 return; /* exit */
791 }
792
793 /* "allocate" memory */
794 sector = rb->plugin_get_buffer(&memleft);
795 if (memleft < SECTORSIZE) /* need buffer for a flash sector */
796 {
797 rb->splash(HZ*3, "Out of memory");
798 return; /* exit */
799 }
800
801 pos = (void*)GetSecondImage();
802 rc = GetFlashInfo(&FlashInfo);
803
804 if (FlashInfo.size == 0) /* no valid chip */
805 {
806 rb->splash(HZ*3, "Not flashable");
807 return; /* exit */
808 }
809 else if (pos == 0)
810 {
811 rb->splash(HZ*3, "No image");
812 return; /* exit */
813 }
814
815 bl_version = BootloaderVersion();
816 if (bl_version < LATEST_BOOTLOADER_VERSION)
817 {
818 rb->lcd_puts_scroll(0, 0, "Hint: You're not using the latest bootloader. A full reflash is recommended, but not required.");
819 rb->lcd_puts_scroll(0, 1, "Press [Menu] to ignore");
820 rb->lcd_update();
821
822 if (WaitForButton() != BUTTON_MENU)
823 {
824 return;
825 }
826 rb->lcd_clear_display();
827 }
828
829 rb->lcd_puts(0, 0, "Checking...");
830 rb->lcd_update();
831
832 space = FlashInfo.size - (pos-FB + sizeof(ImageHeader));
833 /* size minus start */
834
835 rc = CheckImageFile(filename, space, &ImageHeader, pos);
836 rb->lcd_puts(0, 0, "Checked:");
837 switch (rc) {
838 case eOK:
839 rb->lcd_puts(0, 1, "File OK.");
840 rb->sleep(HZ*1);
841 break;
842 case eNotUCL:
843 rb->lcd_puts_scroll(0, 1, "File not UCL compressed.");
844 break;
845 case eWrongAlgorithm:
846 rb->lcd_puts_scroll(0, 1, "Wrong compression algorithm.");
847 break;
848 case eFileNotFound:
849 rb->lcd_puts_scroll(0, 1, "File not found.");
850 break;
851 case eTooBig:
852 if (bl_version < LATEST_BOOTLOADER_VERSION)
853 {
854 rb->lcd_puts_scroll(0, 1, "File too big, upgrade bootloader.");
855 }
856 else
857 {
858 rb->lcd_puts_scroll(0, 1, "File too big.");
859 }
860 break;
861 case eTooSmall:
862 rb->lcd_puts_scroll(0, 1, "File too small. Incomplete?");
863 break;
864 case eReadErr:
865 rb->lcd_puts_scroll(0, 1, "File read error.");
866 break;
867 case eMultiBlocks:
868 rb->lcd_puts_scroll(0, 1, "File invalid. Blocksize too small?");
869 break;
870 case eBadRomLink:
871 rb->lcd_puts_scroll(0, 1, "Bootloader not compatible with RomBox.");
872 break;
873 default:
874 rb->lcd_puts_scroll(0, 1, "Check failed.");
875 break;
876 }
877 rb->lcd_update();
878
879 if (rc == eOK)
880 { /* was OK */
881 rb->lcd_clear_display();
882 rb->lcd_puts_scroll(0, 0, "[ON] to program,");
883 rb->lcd_puts_scroll(0, 1, "other key to exit.");
884 }
885 else
886 { /* error occured */
887 WaitForButton();
888 rb->lcd_clear_display();
889 rb->lcd_puts_scroll(0, 0, "Flash failed.");
890 rb->lcd_puts_scroll(0, 1, "Any key to exit.");
891 }
892 rb->lcd_update();
893
894 button = WaitForButton();
895 if (rc != eOK || button != BUTTON_ON)
896 {
897 return;
898 }
899
900 true_size = ImageHeader.size;
901 aligned_size = ((sizeof(tImageHeader) + true_size + SECTORSIZE-1) &
902 ~(SECTORSIZE-1)) - sizeof(tImageHeader); /* round up to
903 next flash
904 sector */
905 ImageHeader.size = aligned_size; /* increase image size such that we reach
906 the next sector */
907
908 rb->lcd_clear_display();
909 rb->lcd_puts_scroll(0, 0, "Programming...");
910 rb->lcd_update();
911
912 rc = ProgramImageFile(filename, pos, &ImageHeader, UCL_HEADER, true_size);
913 if (rc)
914 { /* errors */
915 rb->lcd_clear_display();
916 rb->snprintf(buf, sizeof(buf), "%d errors", rc);
917 rb->lcd_puts_scroll(0, 0, "Programming failed!");
918 rb->lcd_puts_scroll(0, 1, buf);
919 rb->lcd_update();
920 button = WaitForButton();
921 }
922
923 rb->lcd_clear_display();
924 rb->lcd_puts_scroll(0, 0, "Verifying...");
925 rb->lcd_update();
926
927 rc = VerifyImageFile(filename, pos, &ImageHeader, UCL_HEADER, true_size);
928
929 rb->lcd_clear_display();
930 if (rc == 0)
931 {
932 rb->lcd_puts(0, 0, "Verify OK.");
933 rb->lcd_update();
934 }
935 else
936 {
937 rb->snprintf(buf, sizeof(buf), "Verify fail! %d errors", rc);
938 rb->lcd_puts_scroll(0, 0, buf);
939 rb->lcd_puts_scroll(0, 1, "Use safe image if booting hangs: [-] during power-on");
940 rb->lcd_update();
941 button = WaitForButton();
942 }
943}
944
945#endif /* not HAVE_LCD_BITMAP */
946
947
948
949/***************** Plugin Entry Point *****************/
950
951enum plugin_status plugin_start(const void* parameter)
952{
953 int oldmode;
954
955 if (parameter == NULL)
956 {
957 rb->splash(HZ*3, "Play .ucl file!");
958 return PLUGIN_OK;
959 }
960
961 /* now go ahead and have fun! */
962 oldmode = rb->system_memory_guard(MEMGUARD_NONE); /*disable memory guard */
963 DoUserDialog((char*) parameter);
964 rb->system_memory_guard(oldmode); /* re-enable memory guard */
965
966 return PLUGIN_OK;
967}
diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c
index e8d43f772a..143b8fdfa8 100644
--- a/apps/plugins/rockboy/lcd.c
+++ b/apps/plugins/rockboy/lcd.c
@@ -69,7 +69,7 @@ static void updatepatpix(void) ICODE_ATTR;
69static void updatepatpix(void) 69static void updatepatpix(void)
70{ 70{
71 int i, j; 71 int i, j;
72#if ((CONFIG_CPU != SH7034) && !defined(CPU_COLDFIRE)) 72#if !defined(CPU_COLDFIRE)
73 int k, a, c; 73 int k, a, c;
74#endif 74#endif
75 byte *vram = lcd.vbank[0]; 75 byte *vram = lcd.vbank[0];
@@ -83,76 +83,7 @@ static void updatepatpix(void)
83 patdirty[i] = 0; 83 patdirty[i] = 0;
84 for (j = 0; j < 8; j++) 84 for (j = 0; j < 8; j++)
85 { 85 {
86#if CONFIG_CPU == SH7034 86#if defined(CPU_COLDFIRE)
87 asm volatile (
88 "mov.w @%2,r1 \n"
89 "swap.b r1,r2 \n"
90
91 "mov #0,r0 \n"
92 "shlr r1 \n"
93 "rotcl r0 \n"
94 "shlr r2 \n"
95 "rotcl r0 \n"
96 "mov.b r0,@%0 \n"
97 "mov.b r0,@(7,%1) \n"
98 "mov #0,r0 \n"
99 "shlr r1 \n"
100 "rotcl r0 \n"
101 "shlr r2 \n"
102 "rotcl r0 \n"
103 "mov.b r0,@(1,%0) \n"
104 "mov.b r0,@(6,%1) \n"
105 "mov #0,r0 \n"
106 "shlr r1 \n"
107 "rotcl r0 \n"
108 "shlr r2 \n"
109 "rotcl r0 \n"
110 "mov.b r0,@(2,%0) \n"
111 "mov.b r0,@(5,%1) \n"
112 "mov #0,r0 \n"
113 "shlr r1 \n"
114 "rotcl r0 \n"
115 "shlr r2 \n"
116 "rotcl r0 \n"
117 "mov.b r0,@(3,%0) \n"
118 "mov.b r0,@(4,%1) \n"
119 "mov #0,r0 \n"
120 "shlr r1 \n"
121 "rotcl r0 \n"
122 "shlr r2 \n"
123 "rotcl r0 \n"
124 "mov.b r0,@(4,%0) \n"
125 "mov.b r0,@(3,%1) \n"
126 "mov #0,r0 \n"
127 "shlr r1 \n"
128 "rotcl r0 \n"
129 "shlr r2 \n"
130 "rotcl r0 \n"
131 "mov.b r0,@(5,%0) \n"
132 "mov.b r0,@(2,%1) \n"
133 "mov #0,r0 \n"
134 "shlr r1 \n"
135 "rotcl r0 \n"
136 "shlr r2 \n"
137 "rotcl r0 \n"
138 "mov.b r0,@(6,%0) \n"
139 "mov.b r0,@(1,%1) \n"
140 "mov #0,r0 \n"
141 "shlr r1 \n"
142 "rotcl r0 \n"
143 "shlr r2 \n"
144 "rotcl r0 \n"
145 "mov.b r0,@(7,%0) \n"
146 "mov.b r0,@%1 \n"
147 : /* outputs */
148 : /* inputs */
149 /* %0 */ "r"(patpix[i+1024][j]),
150 /* %1 */ "r"(patpix[i][j]),
151 /* %2 */ "r"(&vram[(i<<4)|(j<<1)])
152 : /* clobbers */
153 "r0", "r1", "r2"
154 );
155#elif defined(CPU_COLDFIRE)
156 asm volatile ( 87 asm volatile (
157 "move.b (%2),%%d2 \n" 88 "move.b (%2),%%d2 \n"
158 "move.b (1,%2),%%d1 \n" 89 "move.b (1,%2),%%d1 \n"
@@ -229,85 +160,7 @@ static void updatepatpix(void)
229 patpix[i+1024][j][7-k]; 160 patpix[i+1024][j][7-k];
230#endif 161#endif
231 } 162 }
232#if CONFIG_CPU == SH7034 163#if defined(CPU_COLDFIRE)
233 asm volatile (
234 "mov.l @%0,r0 \n"
235 "mov.l @(4,%0),r1 \n"
236 "mov.l r0,@(56,%1) \n"
237 "mov.l r1,@(60,%1) \n"
238 "mov.l @(8,%0),r0 \n"
239 "mov.l @(12,%0),r1 \n"
240 "mov.l r0,@(48,%1) \n"
241 "mov.l r1,@(52,%1) \n"
242 "mov.l @(16,%0),r0 \n"
243 "mov.l @(20,%0),r1 \n"
244 "mov.l r0,@(40,%1) \n"
245 "mov.l r1,@(44,%1) \n"
246 "mov.l @(24,%0),r0 \n"
247 "mov.l @(28,%0),r1 \n"
248 "mov.l r0,@(32,%1) \n"
249 "mov.l r1,@(36,%1) \n"
250 "mov.l @(32,%0),r0 \n"
251 "mov.l @(36,%0),r1 \n"
252 "mov.l r0,@(24,%1) \n"
253 "mov.l r1,@(28,%1) \n"
254 "mov.l @(40,%0),r0 \n"
255 "mov.l @(44,%0),r1 \n"
256 "mov.l r0,@(16,%1) \n"
257 "mov.l r1,@(20,%1) \n"
258 "mov.l @(48,%0),r0 \n"
259 "mov.l @(52,%0),r1 \n"
260 "mov.l r0,@(8,%1) \n"
261 "mov.l r1,@(12,%1) \n"
262 "mov.l @(56,%0),r0 \n"
263 "mov.l @(60,%0),r1 \n"
264 "mov.l r0,@%1 \n"
265 "mov.l r1,@(4,%1) \n"
266
267 "add %2,%0 \n"
268 "add %2,%1 \n"
269
270 "mov.l @%0,r0 \n"
271 "mov.l @(4,%0),r1 \n"
272 "mov.l r0,@(56,%1) \n"
273 "mov.l r1,@(60,%1) \n"
274 "mov.l @(8,%0),r0 \n"
275 "mov.l @(12,%0),r1 \n"
276 "mov.l r0,@(48,%1) \n"
277 "mov.l r1,@(52,%1) \n"
278 "mov.l @(16,%0),r0 \n"
279 "mov.l @(20,%0),r1 \n"
280 "mov.l r0,@(40,%1) \n"
281 "mov.l r1,@(44,%1) \n"
282 "mov.l @(24,%0),r0 \n"
283 "mov.l @(28,%0),r1 \n"
284 "mov.l r0,@(32,%1) \n"
285 "mov.l r1,@(36,%1) \n"
286 "mov.l @(32,%0),r0 \n"
287 "mov.l @(36,%0),r1 \n"
288 "mov.l r0,@(24,%1) \n"
289 "mov.l r1,@(28,%1) \n"
290 "mov.l @(40,%0),r0 \n"
291 "mov.l @(44,%0),r1 \n"
292 "mov.l r0,@(16,%1) \n"
293 "mov.l r1,@(20,%1) \n"
294 "mov.l @(48,%0),r0 \n"
295 "mov.l @(52,%0),r1 \n"
296 "mov.l r0,@(8,%1) \n"
297 "mov.l r1,@(12,%1) \n"
298 "mov.l @(56,%0),r0 \n"
299 "mov.l @(60,%0),r1 \n"
300 "mov.l r0,@%1 \n"
301 "mov.l r1,@(4,%1) \n"
302 : /* outputs */
303 : /* inputs */
304 /* %0 */ "r"(patpix[i][0]),
305 /* %1 */ "r"(patpix[i+2048][0]),
306 /* %2 */ "r"(1024*64)
307 : /* clobbers */
308 "r0", "r1"
309 );
310#elif defined(CPU_COLDFIRE)
311 asm volatile ( 164 asm volatile (
312 "movem.l (%0),%%d0-%%d3 \n" 165 "movem.l (%0),%%d0-%%d3 \n"
313 "move.l %%d0,%%d4 \n" 166 "move.l %%d0,%%d4 \n"
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c
index f188dc1e24..57f0c95ea6 100644
--- a/apps/plugins/rockboy/rockboy.c
+++ b/apps/plugins/rockboy/rockboy.c
@@ -110,16 +110,6 @@ static void setoptions (void)
110 options.SELECT = BUTTON_SELECT; 110 options.SELECT = BUTTON_SELECT;
111 options.MENU = BUTTON_OFF; 111 options.MENU = BUTTON_OFF;
112 112
113#elif CONFIG_KEYPAD == RECORDER_PAD
114 options.UP = BUTTON_UP;
115 options.DOWN = BUTTON_DOWN;
116
117 options.A = BUTTON_F1;
118 options.B = BUTTON_F2;
119 options.START = BUTTON_F3;
120 options.SELECT = BUTTON_PLAY;
121 options.MENU = BUTTON_OFF;
122
123#elif CONFIG_KEYPAD == IPOD_4G_PAD 113#elif CONFIG_KEYPAD == IPOD_4G_PAD
124 options.UP = BUTTON_MENU; 114 options.UP = BUTTON_MENU;
125 options.DOWN = BUTTON_PLAY; 115 options.DOWN = BUTTON_PLAY;
diff --git a/apps/plugins/rockboy/sys_rockbox.c b/apps/plugins/rockboy/sys_rockbox.c
index 3a1f3c6760..e27cbbe3e7 100644
--- a/apps/plugins/rockboy/sys_rockbox.c
+++ b/apps/plugins/rockboy/sys_rockbox.c
@@ -91,9 +91,6 @@ void ev_poll(void)
91 if (rb->button_hold()&~holdbutton) 91 if (rb->button_hold()&~holdbutton)
92 fb.mode=(fb.mode+1)%4; 92 fb.mode=(fb.mode+1)%4;
93 holdbutton=rb->button_hold(); 93 holdbutton=rb->button_hold();
94#elif CONFIG_KEYPAD == RECORDER_PAD
95 if (pressed & BUTTON_ON)
96 fb.mode=(fb.mode+1)%4;
97#endif 94#endif
98 95
99#ifdef HAVE_WHEEL_POSITION 96#ifdef HAVE_WHEEL_POSITION
@@ -220,12 +217,10 @@ void ev_poll(void)
220#else 217#else
221 if(pressed & options.MENU) { 218 if(pressed & options.MENU) {
222#endif 219#endif
223#if (CONFIG_KEYPAD != RECORDER_PAD)
224#ifdef HAVE_WHEEL_POSITION 220#ifdef HAVE_WHEEL_POSITION
225 rb->wheel_send_events(true); 221 rb->wheel_send_events(true);
226#endif 222#endif
227 if (do_user_menu() == USER_MENU_QUIT) 223 if (do_user_menu() == USER_MENU_QUIT)
228#endif
229 { 224 {
230 die(""); 225 die("");
231 cleanshut=1; 226 cleanshut=1;
@@ -300,54 +295,6 @@ void vid_update(int scanline)
300 balance += LCD_WIDTH; 295 balance += LCD_WIDTH;
301 if (balance > 0) 296 if (balance > 0)
302 { 297 {
303#if (CONFIG_CPU == SH7034) && !defined(SIMULATOR)
304 asm volatile (
305 "mov.b @%0,r0 \n"
306 "add %1,%0 \n"
307 "tst #0x02, r0 \n" /* ~bit 1 */
308 "rotcr r1 \n"
309 "mov.b @%0,r0 \n"
310 "add %1,%0 \n"
311 "tst #0x02, r0 \n" /* ~bit 1 */
312 "rotcr r1 \n"
313 "mov.b @%0,r0 \n"
314 "add %1,%0 \n"
315 "tst #0x02, r0 \n" /* ~bit 1 */
316 "rotcr r1 \n"
317 "mov.b @%0,r0 \n"
318 "add %1,%0 \n"
319 "tst #0x02, r0 \n" /* ~bit 1 */
320 "rotcr r1 \n"
321 "mov.b @%0,r0 \n"
322 "add %1,%0 \n"
323 "tst #0x02, r0 \n" /* ~bit 1 */
324 "rotcr r1 \n"
325 "mov.b @%0,r0 \n"
326 "add %1,%0 \n"
327 "tst #0x02, r0 \n" /* ~bit 1 */
328 "rotcr r1 \n"
329 "mov.b @%0,r0 \n"
330 "add %1,%0 \n"
331 "tst #0x02, r0 \n" /* ~bit 1 */
332 "rotcr r1 \n"
333 "mov.b @%0,r0 \n"
334 "add %1,%0 \n"
335 "tst #0x02, r0 \n" /* ~bit 1 */
336 "rotcr r1 \n"
337
338 "shlr16 r1 \n"
339 "shlr8 r1 \n"
340 "not r1,r1 \n" /* account for negated bits */
341 "mov.b r1,@%2 \n"
342 : /* outputs */
343 : /* inputs */
344 /* %0 */ "r"(scan.buf[0] + cnt),
345 /* %1 */ "r"(256), /* scan.buf line length */
346 /* %2 */ "r"(frameb++)
347 : /* clobbers */
348 "r0", "r1"
349 );
350#else
351 register unsigned scrbyte = 0; 298 register unsigned scrbyte = 0;
352 if (scan.buf[0][cnt] & 0x02) scrbyte |= 0x01; 299 if (scan.buf[0][cnt] & 0x02) scrbyte |= 0x01;
353 if (scan.buf[1][cnt] & 0x02) scrbyte |= 0x02; 300 if (scan.buf[1][cnt] & 0x02) scrbyte |= 0x02;
@@ -358,7 +305,6 @@ void vid_update(int scanline)
358 if (scan.buf[6][cnt] & 0x02) scrbyte |= 0x40; 305 if (scan.buf[6][cnt] & 0x02) scrbyte |= 0x40;
359 if (scan.buf[7][cnt] & 0x02) scrbyte |= 0x80; 306 if (scan.buf[7][cnt] & 0x02) scrbyte |= 0x80;
360 *(frameb++) = scrbyte; 307 *(frameb++) = scrbyte;
361#endif
362 balance -= 160; 308 balance -= 160;
363 } 309 }
364 cnt ++; 310 cnt ++;
diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c
index ad856b8ab2..1a77eda721 100644
--- a/apps/plugins/sliding_puzzle.c
+++ b/apps/plugins/sliding_puzzle.c
@@ -21,26 +21,7 @@
21#include "plugin.h" 21#include "plugin.h"
22 22
23/* variable button definitions */ 23/* variable button definitions */
24#if CONFIG_KEYPAD == RECORDER_PAD 24#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
25#define PUZZLE_QUIT BUTTON_OFF
26#define PUZZLE_LEFT BUTTON_LEFT
27#define PUZZLE_RIGHT BUTTON_RIGHT
28#define PUZZLE_UP BUTTON_UP
29#define PUZZLE_DOWN BUTTON_DOWN
30#define PUZZLE_SHUFFLE BUTTON_F1
31#define PUZZLE_PICTURE BUTTON_F2
32
33#elif CONFIG_KEYPAD == ONDIO_PAD
34#define PUZZLE_QUIT BUTTON_OFF
35#define PUZZLE_LEFT BUTTON_LEFT
36#define PUZZLE_RIGHT BUTTON_RIGHT
37#define PUZZLE_UP BUTTON_UP
38#define PUZZLE_DOWN BUTTON_DOWN
39#define PUZZLE_SHUFFLE_PICTURE_PRE BUTTON_MENU
40#define PUZZLE_SHUFFLE (BUTTON_MENU | BUTTON_REPEAT)
41#define PUZZLE_PICTURE (BUTTON_MENU | BUTTON_REL)
42
43#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
44 (CONFIG_KEYPAD == IRIVER_H300_PAD) 25 (CONFIG_KEYPAD == IRIVER_H300_PAD)
45#define PUZZLE_QUIT BUTTON_OFF 26#define PUZZLE_QUIT BUTTON_OFF
46#define PUZZLE_LEFT BUTTON_LEFT 27#define PUZZLE_LEFT BUTTON_LEFT
@@ -853,15 +834,7 @@ enum plugin_status plugin_start(
853 /* print instructions */ 834 /* print instructions */
854 rb->lcd_clear_display(); 835 rb->lcd_clear_display();
855 rb->lcd_setfont(FONT_SYSFIXED); 836 rb->lcd_setfont(FONT_SYSFIXED);
856#if CONFIG_KEYPAD == RECORDER_PAD 837#if (CONFIG_KEYPAD == IPOD_4G_PAD) || \
857 rb->lcd_putsxy(3, 18, "[OFF] to stop");
858 rb->lcd_putsxy(3, 28, "[F1] shuffle");
859 rb->lcd_putsxy(3, 38, "[F2] change pic");
860#elif CONFIG_KEYPAD == ONDIO_PAD
861 rb->lcd_putsxy(0, 18, "[OFF] to stop");
862 rb->lcd_putsxy(0, 28, "[MODE..] shuffle");
863 rb->lcd_putsxy(0, 38, "[MODE] change pic");
864#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
865 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 838 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
866 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 839 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
867 rb->lcd_putsxy(0, 18, "[S-MENU] to stop"); 840 rb->lcd_putsxy(0, 18, "[S-MENU] to stop");
diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c
index f60ddfe3de..4471cd12a6 100644
--- a/apps/plugins/snake.c
+++ b/apps/plugins/snake.c
@@ -41,24 +41,8 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left;
41 41
42 42
43/* variable button definitions */ 43/* variable button definitions */
44#if CONFIG_KEYPAD == RECORDER_PAD 44#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
45#define SNAKE_QUIT BUTTON_OFF 45 (CONFIG_KEYPAD == IRIVER_H300_PAD)
46#define SNAKE_LEFT BUTTON_LEFT
47#define SNAKE_RIGHT BUTTON_RIGHT
48#define SNAKE_UP BUTTON_UP
49#define SNAKE_DOWN BUTTON_DOWN
50#define SNAKE_PLAYPAUSE BUTTON_PLAY
51
52#elif CONFIG_KEYPAD == ONDIO_PAD
53#define SNAKE_QUIT BUTTON_OFF
54#define SNAKE_LEFT BUTTON_LEFT
55#define SNAKE_RIGHT BUTTON_RIGHT
56#define SNAKE_UP BUTTON_UP
57#define SNAKE_DOWN BUTTON_DOWN
58#define SNAKE_PLAYPAUSE BUTTON_MENU
59
60#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
61 (CONFIG_KEYPAD == IRIVER_H300_PAD)
62#define SNAKE_QUIT BUTTON_OFF 46#define SNAKE_QUIT BUTTON_OFF
63#define SNAKE_LEFT BUTTON_LEFT 47#define SNAKE_LEFT BUTTON_LEFT
64#define SNAKE_RIGHT BUTTON_RIGHT 48#define SNAKE_RIGHT BUTTON_RIGHT
diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c
index dcb5b72633..bfff0bf870 100644
--- a/apps/plugins/snake2.c
+++ b/apps/plugins/snake2.c
@@ -150,26 +150,8 @@ Head and Tail are stored
150#endif 150#endif
151 151
152/* variable button definitions */ 152/* variable button definitions */
153#if CONFIG_KEYPAD == RECORDER_PAD 153#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
154#define SNAKE2_LEFT BUTTON_LEFT 154 (CONFIG_KEYPAD == IRIVER_H300_PAD)
155#define SNAKE2_RIGHT BUTTON_RIGHT
156#define SNAKE2_UP BUTTON_UP
157#define SNAKE2_DOWN BUTTON_DOWN
158#define SNAKE2_QUIT BUTTON_OFF
159#define SNAKE2_PLAYPAUSE BUTTON_PLAY
160#define SNAKE2_PLAYPAUSE_TEXT "Play"
161
162#elif CONFIG_KEYPAD == ONDIO_PAD
163#define SNAKE2_LEFT BUTTON_LEFT
164#define SNAKE2_RIGHT BUTTON_RIGHT
165#define SNAKE2_UP BUTTON_UP
166#define SNAKE2_DOWN BUTTON_DOWN
167#define SNAKE2_QUIT BUTTON_OFF
168#define SNAKE2_PLAYPAUSE BUTTON_MENU
169#define SNAKE2_PLAYPAUSE_TEXT "Menu"
170
171#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
172 (CONFIG_KEYPAD == IRIVER_H300_PAD)
173#define SNAKE2_LEFT BUTTON_LEFT 155#define SNAKE2_LEFT BUTTON_LEFT
174#define SNAKE2_RIGHT BUTTON_RIGHT 156#define SNAKE2_RIGHT BUTTON_RIGHT
175#define SNAKE2_UP BUTTON_UP 157#define SNAKE2_UP BUTTON_UP
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c
index 62812e0237..3cc1555e83 100644
--- a/apps/plugins/sokoban.c
+++ b/apps/plugins/sokoban.c
@@ -64,11 +64,7 @@
64#endif 64#endif
65 65
66/* size of code+bss */ 66/* size of code+bss */
67#if CONFIG_CPU == SH7034
68#define CODE_SIZE 0x3000 /* 12k */
69#else
70#define CODE_SIZE 0x5000 /* 20k */ 67#define CODE_SIZE 0x5000 /* 20k */
71#endif
72 68
73#define CODE_AND_UNDO_SIZE (CODE_SIZE+0x1000) /* + 4k */ 69#define CODE_AND_UNDO_SIZE (CODE_SIZE+0x1000) /* + 4k */
74 70
@@ -104,39 +100,8 @@
104#define SOKOBAN_MOVE_MIN SOKOBAN_MOVE_DOWN 100#define SOKOBAN_MOVE_MIN SOKOBAN_MOVE_DOWN
105 101
106/* variable button definitions */ 102/* variable button definitions */
107#if (CONFIG_KEYPAD == RECORDER_PAD) 103#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
108#define SOKOBAN_LEFT BUTTON_LEFT 104 (CONFIG_KEYPAD == IRIVER_H300_PAD)
109#define SOKOBAN_RIGHT BUTTON_RIGHT
110#define SOKOBAN_UP BUTTON_UP
111#define SOKOBAN_DOWN BUTTON_DOWN
112#define SOKOBAN_MENU BUTTON_OFF
113#define SOKOBAN_UNDO BUTTON_ON
114#define SOKOBAN_REDO BUTTON_PLAY
115#define SOKOBAN_LEVEL_DOWN BUTTON_F1
116#define SOKOBAN_LEVEL_REPEAT BUTTON_F2
117#define SOKOBAN_LEVEL_UP BUTTON_F3
118#define SOKOBAN_PAUSE BUTTON_PLAY
119#define BUTTON_SAVE BUTTON_ON
120#define BUTTON_SAVE_NAME "ON"
121
122#elif CONFIG_KEYPAD == ONDIO_PAD
123#define SOKOBAN_LEFT BUTTON_LEFT
124#define SOKOBAN_RIGHT BUTTON_RIGHT
125#define SOKOBAN_UP BUTTON_UP
126#define SOKOBAN_DOWN BUTTON_DOWN
127#define SOKOBAN_MENU BUTTON_OFF
128#define SOKOBAN_UNDO_PRE BUTTON_MENU
129#define SOKOBAN_UNDO (BUTTON_MENU | BUTTON_REL)
130#define SOKOBAN_REDO (BUTTON_MENU | BUTTON_DOWN)
131#define SOKOBAN_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
132#define SOKOBAN_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
133#define SOKOBAN_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
134#define SOKOBAN_PAUSE BUTTON_MENU
135#define BUTTON_SAVE BUTTON_MENU
136#define BUTTON_SAVE_NAME "MENU"
137
138#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
139 (CONFIG_KEYPAD == IRIVER_H300_PAD)
140#define SOKOBAN_LEFT BUTTON_LEFT 105#define SOKOBAN_LEFT BUTTON_LEFT
141#define SOKOBAN_RIGHT BUTTON_RIGHT 106#define SOKOBAN_RIGHT BUTTON_RIGHT
142#define SOKOBAN_UP BUTTON_UP 107#define SOKOBAN_UP BUTTON_UP
@@ -1642,22 +1607,8 @@ static int sokoban_menu(void)
1642 rb->screens[i]->clear_display(); 1607 rb->screens[i]->clear_display();
1643 rb->lcd_setfont(SOKOBAN_FONT); 1608 rb->lcd_setfont(SOKOBAN_FONT);
1644 1609
1645#if (CONFIG_KEYPAD == RECORDER_PAD) 1610#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
1646 rb->lcd_putsxy(3, 6, "[OFF] Menu"); 1611 (CONFIG_KEYPAD == IRIVER_H300_PAD)
1647 rb->lcd_putsxy(3, 16, "[ON] Undo");
1648 rb->lcd_putsxy(3, 26, "[PLAY] Redo");
1649 rb->lcd_putsxy(3, 36, "[F1] Down a Level");
1650 rb->lcd_putsxy(3, 46, "[F2] Restart Level");
1651 rb->lcd_putsxy(3, 56, "[F3] Up a Level");
1652#elif CONFIG_KEYPAD == ONDIO_PAD
1653 rb->lcd_putsxy(3, 6, "[OFF] Menu");
1654 rb->lcd_putsxy(3, 16, "[MODE] Undo");
1655 rb->lcd_putsxy(3, 26, "[MODE+DOWN] Redo");
1656 rb->lcd_putsxy(3, 36, "[MODE+LEFT] Previous Level");
1657 rb->lcd_putsxy(3, 46, "[MODE+UP] Restart Level");
1658 rb->lcd_putsxy(3, 56, "[MODE+RIGHT] Up Level");
1659#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
1660 (CONFIG_KEYPAD == IRIVER_H300_PAD)
1661 rb->lcd_putsxy(3, 6, "[STOP] Menu"); 1612 rb->lcd_putsxy(3, 6, "[STOP] Menu");
1662 rb->lcd_putsxy(3, 16, "[REC] Undo"); 1613 rb->lcd_putsxy(3, 16, "[REC] Undo");
1663 rb->lcd_putsxy(3, 26, "[MODE] Redo"); 1614 rb->lcd_putsxy(3, 26, "[MODE] Redo");
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index b830edf857..a7844fba92 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -32,51 +32,8 @@
32 * Key definitions 32 * Key definitions
33 */ 33 */
34 34
35#if CONFIG_KEYPAD == RECORDER_PAD 35#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
36# define SOL_QUIT BUTTON_OFF 36 (CONFIG_KEYPAD == IRIVER_H300_PAD)
37# define SOL_UP BUTTON_UP
38# define SOL_DOWN BUTTON_DOWN
39# define SOL_LEFT BUTTON_LEFT
40# define SOL_RIGHT BUTTON_RIGHT
41# define SOL_MOVE BUTTON_ON
42# define SOL_DRAW BUTTON_F1
43# define SOL_REM2CUR BUTTON_PLAY
44# define SOL_CUR2STACK BUTTON_F2
45# define SOL_REM2STACK BUTTON_F3
46# define HK_MOVE "ON"
47# define HK_DRAW "F1"
48# define HK_REM2CUR "PLAY"
49# define HK_CUR2STACK "F2"
50# define HK_REM2STACK "F3"
51
52#elif CONFIG_KEYPAD == ONDIO_PAD
53# define SOL_QUIT BUTTON_OFF
54# define SOL_UP_PRE BUTTON_UP
55# define SOL_UP (BUTTON_UP | BUTTON_REL)
56# define SOL_DOWN_PRE BUTTON_DOWN
57# define SOL_DOWN (BUTTON_DOWN | BUTTON_REL)
58# define SOL_LEFT_PRE BUTTON_LEFT
59# define SOL_LEFT (BUTTON_LEFT | BUTTON_REL)
60# define SOL_RIGHT_PRE BUTTON_RIGHT
61# define SOL_RIGHT (BUTTON_RIGHT | BUTTON_REL)
62# define SOL_MOVE_PRE BUTTON_MENU
63# define SOL_MOVE (BUTTON_MENU | BUTTON_REL)
64# define SOL_DRAW_PRE BUTTON_MENU
65# define SOL_DRAW (BUTTON_MENU | BUTTON_REPEAT)
66# define SOL_REM2CUR_PRE BUTTON_DOWN
67# define SOL_REM2CUR (BUTTON_DOWN | BUTTON_REPEAT)
68# define SOL_CUR2STACK_PRE BUTTON_UP
69# define SOL_CUR2STACK (BUTTON_UP | BUTTON_REPEAT)
70# define SOL_REM2STACK_PRE BUTTON_RIGHT
71# define SOL_REM2STACK (BUTTON_RIGHT | BUTTON_REPEAT)
72# define HK_MOVE "MODE"
73# define HK_DRAW "MODE.."
74# define HK_REM2CUR "DOWN.."
75# define HK_CUR2STACK "UP.."
76# define HK_REM2STACK "RIGHT.."
77
78#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
79 (CONFIG_KEYPAD == IRIVER_H300_PAD)
80# define SOL_QUIT BUTTON_OFF 37# define SOL_QUIT BUTTON_OFF
81# define SOL_UP BUTTON_UP 38# define SOL_UP BUTTON_UP
82# define SOL_DOWN BUTTON_DOWN 39# define SOL_DOWN BUTTON_DOWN
diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c
index ede67291b0..268c55ad35 100644
--- a/apps/plugins/spacerocks.c
+++ b/apps/plugins/spacerocks.c
@@ -28,26 +28,8 @@
28 28
29 29
30/* variable button definitions */ 30/* variable button definitions */
31#if CONFIG_KEYPAD == RECORDER_PAD 31#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
32#define AST_PAUSE BUTTON_ON 32 (CONFIG_KEYPAD == IRIVER_H300_PAD)
33#define AST_QUIT BUTTON_OFF
34#define AST_THRUST BUTTON_UP
35#define AST_HYPERSPACE BUTTON_DOWN
36#define AST_LEFT BUTTON_LEFT
37#define AST_RIGHT BUTTON_RIGHT
38#define AST_FIRE BUTTON_PLAY
39
40#elif CONFIG_KEYPAD == ONDIO_PAD
41#define AST_PAUSE (BUTTON_MENU | BUTTON_OFF)
42#define AST_QUIT BUTTON_OFF
43#define AST_THRUST BUTTON_UP
44#define AST_HYPERSPACE BUTTON_DOWN
45#define AST_LEFT BUTTON_LEFT
46#define AST_RIGHT BUTTON_RIGHT
47#define AST_FIRE BUTTON_MENU
48
49#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
50 (CONFIG_KEYPAD == IRIVER_H300_PAD)
51#define AST_PAUSE BUTTON_REC 33#define AST_PAUSE BUTTON_REC
52#define AST_QUIT BUTTON_OFF 34#define AST_QUIT BUTTON_OFF
53#define AST_THRUST BUTTON_UP 35#define AST_THRUST BUTTON_UP
diff --git a/apps/plugins/splitedit.c b/apps/plugins/splitedit.c
index 539fc85011..b698e2e18a 100644
--- a/apps/plugins/splitedit.c
+++ b/apps/plugins/splitedit.c
@@ -24,27 +24,7 @@
24 24
25 25
26/* variable button definitions */ 26/* variable button definitions */
27#if CONFIG_KEYPAD == RECORDER_PAD 27#if CONFIG_KEYPAD == IRIVER_H100_PAD
28#define SPLITEDIT_QUIT BUTTON_OFF
29#define SPLITEDIT_PLAY BUTTON_PLAY
30#define SPLITEDIT_SAVE BUTTON_F1
31#define SPLITEDIT_LOOP_MODE BUTTON_F2
32#define SPLITEDIT_SCALE BUTTON_F3
33#define SPLITEDIT_SPEED50 (BUTTON_ON | BUTTON_LEFT)
34#define SPLITEDIT_SPEED100 (BUTTON_ON | BUTTON_PLAY)
35#define SPLITEDIT_SPEED150 (BUTTON_ON | BUTTON_RIGHT)
36#define SPLITEDIT_MENU_RUN BUTTON_PLAY
37
38#elif CONFIG_KEYPAD == ONDIO_PAD
39#define SPLITEDIT_QUIT BUTTON_OFF
40#define SPLITEDIT_PLAY_PRE BUTTON_MENU
41#define SPLITEDIT_PLAY (BUTTON_MENU | BUTTON_REL)
42#define SPLITEDIT_SAVE (BUTTON_MENU | BUTTON_LEFT)
43#define SPLITEDIT_LOOP_MODE (BUTTON_MENU | BUTTON_UP)
44#define SPLITEDIT_SCALE (BUTTON_MENU | BUTTON_RIGHT)
45#define SPLITEDIT_MENU_RUN BUTTON_RIGHT
46
47#elif CONFIG_KEYPAD == IRIVER_H100_PAD
48#define SPLITEDIT_QUIT BUTTON_OFF 28#define SPLITEDIT_QUIT BUTTON_OFF
49#define SPLITEDIT_PLAY BUTTON_ON 29#define SPLITEDIT_PLAY BUTTON_ON
50#define SPLITEDIT_SAVE BUTTON_SELECT 30#define SPLITEDIT_SAVE BUTTON_SELECT
@@ -279,12 +259,6 @@ static void update_icons(void)
279 LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT, 259 LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT,
280 BMPWIDTH, BMPHEIGHT); 260 BMPWIDTH, BMPHEIGHT);
281 261
282#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
283 /* The scale icon */
284 rb->lcd_mono_bitmap(SCALE_BMP[rb->peak_meter_get_use_dbfs() ? 1 : 0],
285 2 *LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT,
286 BMPWIDTH, BMPHEIGHT);
287#else
288 { 262 {
289 static int idx; 263 static int idx;
290 if (idx < 0 || idx > 1) idx = 0; 264 if (idx < 0 || idx > 1) idx = 0;
@@ -293,7 +267,6 @@ static void update_icons(void)
293 2 *LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT, 267 2 *LCD_WIDTH/3 + LCD_WIDTH/3 / 2 - BMPWIDTH/2, LCD_HEIGHT - BMPHEIGHT,
294 BMPWIDTH, BMPHEIGHT); 268 BMPWIDTH, BMPHEIGHT);
295 } 269 }
296#endif
297 270
298 rb->lcd_update_rect(0, LCD_HEIGHT - BMPHEIGHT, LCD_WIDTH, BMPHEIGHT); 271 rb->lcd_update_rect(0, LCD_HEIGHT - BMPHEIGHT, LCD_WIDTH, BMPHEIGHT);
299} 272}
@@ -961,14 +934,7 @@ static unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
961 { 934 {
962 /* read volume info */ 935 /* read volume info */
963 unsigned short volume; 936 unsigned short volume;
964#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
965 volume = rb->mas_codec_readreg(0x0c);
966 volume += rb->mas_codec_readreg(0x0d);
967 volume = volume / 2;
968 volume = rb->peak_meter_scale_value(volume, OSCI_HEIGHT);
969#else
970 volume = OSCI_HEIGHT / 2; 937 volume = OSCI_HEIGHT / 2;
971#endif
972 938
973 /* update osci_buffer */ 939 /* update osci_buffer */
974 if (osci_valid || lastx == x) 940 if (osci_valid || lastx == x)
@@ -1126,25 +1092,6 @@ static unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
1126 lastx = time_to_xpos(mp3->elapsed); 1092 lastx = time_to_xpos(mp3->elapsed);
1127 break; 1093 break;
1128 1094
1129#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
1130#ifdef SPLITEDIT_SPEED100
1131 case SPLITEDIT_SPEED150:
1132 rb->sound_set_pitch(150L*PITCH_SPEED_PRECISION);
1133 splitedit_invalidate_osci();
1134 break;
1135
1136 case SPLITEDIT_SPEED100:
1137 rb->sound_set_pitch(PITCH_SPEED_100);
1138 splitedit_invalidate_osci();
1139 break;
1140
1141 case SPLITEDIT_SPEED50:
1142 rb->sound_set_pitch(50L*PITCH_SPEED_PRECISION);
1143 splitedit_invalidate_osci();
1144 break;
1145#endif
1146#endif
1147
1148 case BUTTON_LEFT: 1095 case BUTTON_LEFT:
1149 case BUTTON_LEFT | BUTTON_REPEAT: 1096 case BUTTON_LEFT | BUTTON_REPEAT:
1150 if (splitedit_get_split_x() > OSCI_X + 2) 1097 if (splitedit_get_split_x() > OSCI_X + 2)
@@ -1185,9 +1132,6 @@ static unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
1185 break; 1132 break;
1186 1133
1187 case SPLITEDIT_SCALE: 1134 case SPLITEDIT_SCALE:
1188#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
1189 rb->peak_meter_set_use_dbfs(!rb->peak_meter_get_use_dbfs());
1190#endif
1191 splitedit_invalidate_osci(); 1135 splitedit_invalidate_osci();
1192 update_icons(); 1136 update_icons();
1193 break; 1137 break;
@@ -1257,12 +1201,6 @@ static unsigned long splitedit_editor(struct mp3entry * mp3_to_split,
1257 } 1201 }
1258 } 1202 }
1259 } 1203 }
1260#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
1261#ifdef SPLITEDIT_SPEED100
1262 rb->sound_set_pitch(1000); /* make sure to reset pitch */
1263#endif
1264#endif
1265
1266 } 1204 }
1267 return retval; 1205 return retval;
1268} 1206}
diff --git a/apps/plugins/star.c b/apps/plugins/star.c
index 5814cc8cab..ea1d5b8bf8 100644
--- a/apps/plugins/star.c
+++ b/apps/plugins/star.c
@@ -57,42 +57,8 @@
57#define STAR_CONTROL_BLOCK 1 57#define STAR_CONTROL_BLOCK 1
58 58
59/* variable button definitions */ 59/* variable button definitions */
60#if CONFIG_KEYPAD == RECORDER_PAD 60#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
61#define STAR_QUIT BUTTON_OFF 61 (CONFIG_KEYPAD == IRIVER_H300_PAD)
62#define STAR_LEFT BUTTON_LEFT
63#define STAR_RIGHT BUTTON_RIGHT
64#define STAR_UP BUTTON_UP
65#define STAR_DOWN BUTTON_DOWN
66#define STAR_TOGGLE_CONTROL BUTTON_ON
67#define STAR_TOGGLE_CONTROL2 BUTTON_PLAY
68#define STAR_LEVEL_UP BUTTON_F3
69#define STAR_LEVEL_DOWN BUTTON_F1
70#define STAR_LEVEL_REPEAT BUTTON_F2
71#define STAR_TOGGLE_CONTROL_NAME "ON"
72#define STAR_QUIT_NAME "OFF"
73#define STAR_LEVEL_UP_NAME "F3"
74#define STAR_LEVEL_DOWN_NAME "F1"
75#define STAR_LEVEL_REPEAT_NAME "F2"
76
77#elif CONFIG_KEYPAD == ONDIO_PAD
78#define STAR_QUIT BUTTON_OFF
79#define STAR_LEFT BUTTON_LEFT
80#define STAR_RIGHT BUTTON_RIGHT
81#define STAR_UP BUTTON_UP
82#define STAR_DOWN BUTTON_DOWN
83#define STAR_TOGGLE_CONTROL_PRE BUTTON_MENU
84#define STAR_TOGGLE_CONTROL (BUTTON_MENU | BUTTON_REL)
85#define STAR_LEVEL_UP (BUTTON_MENU | BUTTON_RIGHT)
86#define STAR_LEVEL_DOWN (BUTTON_MENU | BUTTON_LEFT)
87#define STAR_LEVEL_REPEAT (BUTTON_MENU | BUTTON_UP)
88#define STAR_TOGGLE_CONTROL_NAME "MODE"
89#define STAR_QUIT_NAME "OFF"
90#define STAR_LEVEL_UP_NAME "M >"
91#define STAR_LEVEL_DOWN_NAME "M <"
92#define STAR_LEVEL_REPEAT_NAME "M ^"
93
94#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
95 (CONFIG_KEYPAD == IRIVER_H300_PAD)
96#define STAR_QUIT BUTTON_OFF 62#define STAR_QUIT BUTTON_OFF
97#define STAR_LEFT BUTTON_LEFT 63#define STAR_LEFT BUTTON_LEFT
98#define STAR_RIGHT BUTTON_RIGHT 64#define STAR_RIGHT BUTTON_RIGHT
diff --git a/apps/plugins/starfield.c b/apps/plugins/starfield.c
index 30b01b2645..dff3c4b4d1 100644
--- a/apps/plugins/starfield.c
+++ b/apps/plugins/starfield.c
@@ -220,23 +220,17 @@ static int plugin_main(void)
220 rb->sleep(1); 220 rb->sleep(1);
221 rb->lcd_clear_display(); 221 rb->lcd_clear_display();
222 222
223#if ((CONFIG_CODEC == SWCODEC) || !defined(SIMULATOR) && \ 223#if (CONFIG_CODEC == SWCODEC)
224 ((CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)))
225
226 /* This will make the stars pulse to the music */ 224 /* This will make the stars pulse to the music */
227 if(pulse){ 225 if(pulse){
228 226
229 /* Get the peaks. ( Borrowed from vu_meter ) */ 227 /* Get the peaks. ( Borrowed from vu_meter ) */
230#if (CONFIG_CODEC == SWCODEC)
231 static struct pcm_peaks peaks; 228 static struct pcm_peaks peaks;
232 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK, 229 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
233 &peaks); 230 &peaks);
234 #define left_peak peaks.left 231 #define left_peak peaks.left
235 #define right_peak peaks.right 232 #define right_peak peaks.right
236#else 233
237 int left_peak = rb->mas_codec_readreg(0xC);
238 int right_peak = rb->mas_codec_readreg(0xD);
239#endif
240 /* Devide peak data by 4098 to bring the max 234 /* Devide peak data by 4098 to bring the max
241 value down from ~32k to 8 */ 235 value down from ~32k to 8 */
242 left_peak = left_peak/0x1000; 236 left_peak = left_peak/0x1000;
@@ -261,8 +255,6 @@ static int plugin_main(void)
261 starfield.z_move = avg_peak; 255 starfield.z_move = avg_peak;
262 256
263 } /* if pulse */ 257 } /* if pulse */
264#else
265 (void) avg_peak;
266#endif 258#endif
267 starfield_move_and_draw(&starfield); 259 starfield_move_and_draw(&starfield);
268 260
diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c
index bb778c9d24..c3fa3e15dd 100644
--- a/apps/plugins/stopwatch.c
+++ b/apps/plugins/stopwatch.c
@@ -35,31 +35,7 @@
35#define STOPWATCH_FILE PLUGIN_APPS_DATA_DIR "/stopwatch.dat" 35#define STOPWATCH_FILE PLUGIN_APPS_DATA_DIR "/stopwatch.dat"
36 36
37/* variable button definitions */ 37/* variable button definitions */
38#if CONFIG_KEYPAD == RECORDER_PAD 38#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
39#define STOPWATCH_QUIT BUTTON_OFF
40#define STOPWATCH_START_STOP BUTTON_PLAY
41#define STOPWATCH_RESET_TIMER BUTTON_LEFT
42#define STOPWATCH_LAP_TIMER BUTTON_ON
43#define STOPWATCH_SCROLL_UP BUTTON_UP
44#define STOPWATCH_SCROLL_DOWN BUTTON_DOWN
45
46#elif CONFIG_KEYPAD == ONDIO_PAD
47#define STOPWATCH_QUIT BUTTON_OFF
48#define STOPWATCH_START_STOP BUTTON_RIGHT
49#define STOPWATCH_RESET_TIMER BUTTON_LEFT
50#define STOPWATCH_LAP_TIMER BUTTON_MENU
51#define STOPWATCH_SCROLL_UP BUTTON_UP
52#define STOPWATCH_SCROLL_DOWN BUTTON_DOWN
53
54#elif CONFIG_KEYPAD == PLAYER_PAD
55#define STOPWATCH_QUIT BUTTON_MENU
56#define STOPWATCH_START_STOP BUTTON_PLAY
57#define STOPWATCH_RESET_TIMER BUTTON_STOP
58#define STOPWATCH_LAP_TIMER BUTTON_ON
59#define STOPWATCH_SCROLL_UP BUTTON_RIGHT
60#define STOPWATCH_SCROLL_DOWN BUTTON_LEFT
61
62#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
63 (CONFIG_KEYPAD == IRIVER_H300_PAD) 39 (CONFIG_KEYPAD == IRIVER_H300_PAD)
64#define STOPWATCH_QUIT BUTTON_OFF 40#define STOPWATCH_QUIT BUTTON_OFF
65#define STOPWATCH_START_STOP BUTTON_SELECT 41#define STOPWATCH_START_STOP BUTTON_SELECT
diff --git a/apps/plugins/sudoku/sudoku.h b/apps/plugins/sudoku/sudoku.h
index 47000b8e25..d1eca7fcd4 100644
--- a/apps/plugins/sudoku/sudoku.h
+++ b/apps/plugins/sudoku/sudoku.h
@@ -27,31 +27,8 @@
27#define GAME_FILE PLUGIN_GAMES_DIR "/sudoku.ss" 27#define GAME_FILE PLUGIN_GAMES_DIR "/sudoku.ss"
28 28
29/* variable button definitions */ 29/* variable button definitions */
30#if CONFIG_KEYPAD == RECORDER_PAD 30#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
31#define SUDOKU_BUTTON_QUIT BUTTON_OFF 31 (CONFIG_KEYPAD == IRIVER_H300_PAD)
32#define SUDOKU_BUTTON_UP BUTTON_UP
33#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
34#define SUDOKU_BUTTON_LEFT BUTTON_LEFT
35#define SUDOKU_BUTTON_RIGHT BUTTON_RIGHT
36#define SUDOKU_BUTTON_TOGGLE BUTTON_PLAY
37#define SUDOKU_BUTTON_MENU BUTTON_F1
38#define SUDOKU_BUTTON_POSSIBLE BUTTON_F2
39
40#elif CONFIG_KEYPAD == ONDIO_PAD
41#define SUDOKU_BUTTON_QUIT BUTTON_OFF
42#define SUDOKU_BUTTON_UP BUTTON_UP
43#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
44#define SUDOKU_BUTTON_LEFT BUTTON_LEFT
45#define SUDOKU_BUTTON_RIGHT BUTTON_RIGHT
46#define SUDOKU_BUTTON_ALTTOGGLE (BUTTON_MENU | BUTTON_DOWN)
47#define SUDOKU_BUTTON_TOGGLE_PRE BUTTON_MENU
48#define SUDOKU_BUTTON_TOGGLE (BUTTON_MENU | BUTTON_REL)
49#define SUDOKU_BUTTON_MENU_PRE BUTTON_MENU
50#define SUDOKU_BUTTON_MENU (BUTTON_MENU | BUTTON_REPEAT)
51#define SUDOKU_BUTTON_POSSIBLE (BUTTON_MENU | BUTTON_LEFT)
52
53#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
54 (CONFIG_KEYPAD == IRIVER_H300_PAD)
55#define SUDOKU_BUTTON_QUIT BUTTON_OFF 32#define SUDOKU_BUTTON_QUIT BUTTON_OFF
56#define SUDOKU_BUTTON_UP BUTTON_UP 33#define SUDOKU_BUTTON_UP BUTTON_UP
57#define SUDOKU_BUTTON_DOWN BUTTON_DOWN 34#define SUDOKU_BUTTON_DOWN BUTTON_DOWN
diff --git a/apps/plugins/test_scanrate.c b/apps/plugins/test_scanrate.c
index b558e765c3..52d3c267e6 100644
--- a/apps/plugins/test_scanrate.c
+++ b/apps/plugins/test_scanrate.c
@@ -44,11 +44,7 @@ static const struct button_mapping *plugin_contexts[] = { pla_main_ctx };
44#endif /*HAVE_SCROLLWHEEL*/ 44#endif /*HAVE_SCROLLWHEEL*/
45 45
46/* Default refresh rates in 1/10 Hz */ 46/* Default refresh rates in 1/10 Hz */
47#if defined ARCHOS_RECORDER || defined ARCHOS_FMRECORDER \ 47#if defined IAUDIO_M3
48 || defined ARCHOS_RECORDERV2 || defined ARCHOS_ONDIOFM \
49 || defined ARCHOS_ONDIOSP
50#define DEFAULT_SCAN_RATE 670
51#elif defined IAUDIO_M3
52#define DEFAULT_SCAN_RATE 1500 48#define DEFAULT_SCAN_RATE 1500
53#define HORIZ_SCAN /* LCD controller updates the panel sideways */ 49#define HORIZ_SCAN /* LCD controller updates the panel sideways */
54#define NEED_BOOST 50#define NEED_BOOST
diff --git a/apps/plugins/text_viewer/tv_button.h b/apps/plugins/text_viewer/tv_button.h
index acf7519b69..4f7634e844 100644
--- a/apps/plugins/text_viewer/tv_button.h
+++ b/apps/plugins/text_viewer/tv_button.h
@@ -44,46 +44,8 @@
44 * TV_COLUMN_RIGHT one column right 44 * TV_COLUMN_RIGHT one column right
45 */ 45 */
46 46
47/* Recorder keys */
48#if CONFIG_KEYPAD == RECORDER_PAD
49#define TV_QUIT BUTTON_OFF
50#define TV_SCROLL_UP BUTTON_UP
51#define TV_SCROLL_DOWN BUTTON_DOWN
52#define TV_SCREEN_LEFT BUTTON_LEFT
53#define TV_SCREEN_RIGHT BUTTON_RIGHT
54#define TV_MENU BUTTON_F1
55#define TV_AUTOSCROLL BUTTON_PLAY
56#define TV_LINE_UP (BUTTON_ON | BUTTON_UP)
57#define TV_LINE_DOWN (BUTTON_ON | BUTTON_DOWN)
58#define TV_COLUMN_LEFT (BUTTON_ON | BUTTON_LEFT)
59#define TV_COLUMN_RIGHT (BUTTON_ON | BUTTON_RIGHT)
60#define TV_BOOKMARK BUTTON_F2
61
62/* Ondio keys */
63#elif CONFIG_KEYPAD == ONDIO_PAD
64#define TV_QUIT BUTTON_OFF
65#define TV_SCROLL_UP BUTTON_UP
66#define TV_SCROLL_DOWN BUTTON_DOWN
67#define TV_SCREEN_LEFT BUTTON_LEFT
68#define TV_SCREEN_RIGHT BUTTON_RIGHT
69#define TV_MENU (BUTTON_MENU|BUTTON_REPEAT)
70#define TV_AUTOSCROLL_PRE BUTTON_MENU
71#define TV_AUTOSCROLL (BUTTON_MENU|BUTTON_REL)
72#define TV_BOOKMARK (BUTTON_MENU|BUTTON_OFF)
73
74/* Player keys */
75#elif CONFIG_KEYPAD == PLAYER_PAD
76#define TV_QUIT BUTTON_STOP
77#define TV_SCROLL_UP BUTTON_LEFT
78#define TV_SCROLL_DOWN BUTTON_RIGHT
79#define TV_SCREEN_LEFT (BUTTON_ON|BUTTON_LEFT)
80#define TV_SCREEN_RIGHT (BUTTON_ON|BUTTON_RIGHT)
81#define TV_MENU BUTTON_MENU
82#define TV_AUTOSCROLL BUTTON_PLAY
83#define TV_BOOKMARK BUTTON_ON
84
85/* iRiver H1x0 && H3x0 keys */ 47/* iRiver H1x0 && H3x0 keys */
86#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 48#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
87 (CONFIG_KEYPAD == IRIVER_H300_PAD) 49 (CONFIG_KEYPAD == IRIVER_H300_PAD)
88#define TV_QUIT BUTTON_OFF 50#define TV_QUIT BUTTON_OFF
89#define TV_RC_QUIT BUTTON_RC_STOP 51#define TV_RC_QUIT BUTTON_RC_STOP
diff --git a/apps/plugins/video.c b/apps/plugins/video.c
deleted file mode 100644
index 6a66324a79..0000000000
--- a/apps/plugins/video.c
+++ /dev/null
@@ -1,1030 +0,0 @@
1/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* Plugin for video playback
11* Reads raw image data + audio data from a file
12* !!!!!!!!!! Code Police free zone !!!!!!!!!!
13*
14* Copyright (C) 2003-2004 J�g Hohensohn aka [IDC]Dragon
15*
16* This program is free software; you can redistribute it and/or
17* modify it under the terms of the GNU General Public License
18* as published by the Free Software Foundation; either version 2
19* of the License, or (at your option) any later version.
20*
21* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
22* KIND, either express or implied.
23*
24****************************************************************************/
25
26
27/****************** imports ******************/
28
29#include "plugin.h"
30#include "sh7034.h"
31#include "system.h"
32#include "lib/helper.h"
33
34#ifdef HAVE_LCD_BITMAP /* and definitely not for the Player, haha */
35
36
37
38/* variable button definitions */
39#if CONFIG_KEYPAD == RECORDER_PAD
40#define VIDEO_STOP_SEEK BUTTON_PLAY
41#define VIDEO_RESUME BUTTON_PLAY
42#define VIDEO_DEBUG BUTTON_F1
43#define VIDEO_CONTRAST_DOWN BUTTON_F2
44#define VIDEO_CONTRAST_UP BUTTON_F3
45
46#elif CONFIG_KEYPAD == ONDIO_PAD
47#define VIDEO_STOP_SEEK_PRE BUTTON_MENU
48#define VIDEO_STOP_SEEK (BUTTON_MENU | BUTTON_REL)
49#define VIDEO_RESUME BUTTON_RIGHT
50#define VIDEO_CONTRAST_DOWN (BUTTON_MENU | BUTTON_DOWN)
51#define VIDEO_CONTRAST_UP (BUTTON_MENU | BUTTON_UP)
52
53#endif
54/****************** constants ******************/
55
56#define SCREENSIZE (LCD_WIDTH*LCD_HEIGHT/8) /* in bytes */
57#define FPS 68 /* default fps for headerless (old video-only) file */
58#define MAX_ACC 20 /* maximum FF/FR speedup */
59#define FF_TICKS 3000; /* experimentally found nice */
60
61/* trigger levels, we need about 80 kB/sec */
62#define SPINUP_INIT 5000 /* from what level on to refill, in milliseconds */
63#define SPINUP_SAFETY 700 /* how much on top of the measured spinup time */
64#define CHUNK (1024*32) /* read size */
65
66
67/****************** prototypes ******************/
68static void timer4_isr(void); /* IMIA4 ISR */
69int check_button(void); /* determine next relative frame */
70
71
72/****************** data types ******************/
73
74/* plugins don't introduce headers, so structs are repeated from rvf_format.h */
75
76#define HEADER_MAGIC 0x52564668 /* "RVFh" at file start */
77#define AUDIO_MAGIC 0x41756446 /* "AudF" for each audio block */
78#define FILEVERSION 100 /* 1.00 */
79
80/* format type definitions */
81#define VIDEOFORMAT_NO_VIDEO 0
82#define VIDEOFORMAT_RAW 1
83#define AUDIOFORMAT_NO_AUDIO 0
84#define AUDIOFORMAT_MP3 1
85#define AUDIOFORMAT_MP3_BITSWAPPED 2
86
87/* bit flags */
88#define FLAG_LOOP 0x00000001 /* loop the playback, e.g. for stills */
89
90typedef struct /* contains whatever might be useful to the player */
91{
92 /* general info (16 entries = 64 byte) */
93 unsigned long magic; /* HEADER_MAGIC */
94 unsigned long version; /* file version */
95 unsigned long flags; /* combination of FLAG_xx */
96 unsigned long blocksize; /* how many bytes per block (=video frame) */
97 unsigned long bps_average; /* bits per second of the whole stream */
98 unsigned long bps_peak; /* max. of above (audio may be VBR) */
99 unsigned long resume_pos; /* file position to resume to */
100 unsigned long reserved[9]; /* reserved, should be zero */
101
102 /* video info (16 entries = 64 byte) */
103 unsigned long video_format; /* one of VIDEOFORMAT_xxx */
104 unsigned long video_1st_frame; /* byte position of first video frame */
105 unsigned long video_duration; /* total length of video part, in ms */
106 unsigned long video_payload_size; /* total amount of video data, in bytes */
107 unsigned long video_bitrate; /* derived from resolution and frame time, in bps */
108 unsigned long video_frametime; /* frame interval in 11.0592 MHz clocks */
109 long video_preroll; /* video is how much ahead, in 11.0592 MHz clocks */
110 unsigned long video_width; /* in pixels */
111 unsigned long video_height; /* in pixels */
112 unsigned long video_reserved[7]; /* reserved, should be zero */
113
114 /* audio info (16 entries = 64 byte) */
115 unsigned long audio_format; /* one of AUDIOFORMAT_xxx */
116 unsigned long audio_1st_frame; /* byte position of first video frame */
117 unsigned long audio_duration; /* total length of audio part, in ms */
118 unsigned long audio_payload_size; /* total amount of audio data, in bytes */
119 unsigned long audio_avg_bitrate; /* average audio bitrate, in bits per second */
120 unsigned long audio_peak_bitrate; /* maximum bitrate */
121 unsigned long audio_headersize; /* offset to payload in audio frames */
122 long audio_min_associated; /* minimum offset to video frame, in bytes */
123 long audio_max_associated; /* maximum offset to video frame, in bytes */
124 unsigned long audio_reserved[7]; /* reserved, should be zero */
125
126 /* more to come... ? */
127
128 /* Note: padding up to 'blocksize' with zero following this header */
129} tFileHeader;
130
131typedef struct /* the little header for all audio blocks */
132{
133 unsigned long magic; /* AUDIO_MAGIC indicates an audio block */
134 unsigned char previous_block; /* previous how many blocks backwards */
135 unsigned char next_block; /* next how many blocks forward */
136 short associated_video; /* offset to block with corresponding video */
137 unsigned short frame_start; /* offset to first frame starting in this block */
138 unsigned short frame_end; /* offset to behind last frame ending in this block */
139} tAudioFrameHeader;
140
141
142
143/****************** globals ******************/
144
145static char gPrint[32]; /* a global printf buffer, saves stack */
146
147
148/* playstate */
149static struct
150{
151 enum
152 {
153 paused,
154 playing,
155 } state;
156 bool bAudioUnderrun;
157 bool bVideoUnderrun;
158 bool bHasAudio;
159 bool bHasVideo;
160 int nTimeOSD; /* OSD should stay for this many frames */
161 bool bDirtyOSD; /* OSD needs redraw */
162 bool bRefilling; /* set if refilling buffer */
163 bool bSeeking;
164 int nSeekAcc; /* accelleration value for seek */
165 int nSeekPos; /* current file position for seek */
166 bool bDiskSleep; /* disk is suspended */
167#if FREQ == 12000000 /* Ondio speed kludge */
168 int nFrameTimeAdjusted;
169#endif
170} gPlay;
171
172/* buffer information */
173static struct
174{
175 ssize_t bufsize;
176 int granularity; /* common multiple of block and sector size */
177 unsigned char* pBufStart; /* start of ring buffer */
178 unsigned char* pBufEnd; /* end of ring buffer */
179 int osd_ypos;
180 int osd_height;
181
182 int vidcount; /* how many video blocks are known in a row */
183 unsigned char* pBufFill; /* write pointer for disk, owned by main task */
184 unsigned char* pReadVideo; /* video readout, maintained by timer ISR */
185 unsigned char* pReadAudio; /* audio readout, maintained by demand ISR */
186 bool bEOF; /* flag for end of file */
187 int low_water; /* reload threshold */
188 int high_water; /* end of reload threshold */
189 int spinup_safety; /* safety margin when recalculating low_water */
190 int nReadChunk; /* how much data for normal buffer fill */
191 int nSeekChunk; /* how much data while seeking */
192} gBuf;
193
194/* statistics */
195static struct
196{
197 int minAudioAvail;
198 int minVideoAvail;
199 int nAudioUnderruns;
200 int nVideoUnderruns;
201 long minSpinup;
202 long maxSpinup;
203} gStats;
204
205tFileHeader gFileHdr; /* file header */
206
207/****************** implementation ******************/
208
209/* tool function: return how much playable audio/video is left */
210static int Available(unsigned char* pSnapshot)
211{
212 if (pSnapshot <= gBuf.pBufFill)
213 return gBuf.pBufFill - pSnapshot;
214 else
215 return gBuf.bufsize - (pSnapshot - gBuf.pBufFill);
216}
217
218/* debug function to draw buffer indicators */
219#ifdef VIDEO_DEBUG
220static void DrawBuf(void)
221{
222 int ypos, fill, video, audio;
223
224 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
225 rb->lcd_fillrect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
226 rb->lcd_set_drawmode(DRMODE_SOLID);
227
228 ypos = gBuf.osd_ypos + gBuf.osd_height/2 - 3; /* center vertically */
229
230 rb->lcd_hline(1, LCD_WIDTH-2, ypos + 3);
231 rb->lcd_vline(0, ypos, ypos + 6);
232 rb->lcd_vline(LCD_WIDTH-1, ypos, ypos + 6);
233
234 /* calculate new tick positions */
235 fill = 1 + ((gBuf.pBufFill - gBuf.pBufStart) * (LCD_WIDTH-2)) / gBuf.bufsize;
236 video = 1 + ((gBuf.pReadVideo - gBuf.pBufStart) * (LCD_WIDTH-2)) / gBuf.bufsize;
237 audio = 1 + ((gBuf.pReadAudio - gBuf.pBufStart) * (LCD_WIDTH-2)) / gBuf.bufsize;
238
239 rb->lcd_drawpixel(fill, ypos + 4);
240 rb->lcd_drawpixel(video, ypos + 2);
241 rb->lcd_drawpixel(audio, ypos + 1);
242
243 if (gPlay.state == paused) /* we have to draw ourselves */
244 rb->lcd_update_rect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
245 else
246 gPlay.bDirtyOSD = true; /* redraw it with next timer IRQ */
247}
248#endif
249
250
251/* helper function to draw a position indicator */
252static void DrawPosition(int pos, int total)
253{
254 int w, h;
255 int sec; /* estimated seconds */
256 int ypos;
257
258 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
259 rb->lcd_fillrect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
260 rb->lcd_set_drawmode(DRMODE_SOLID);
261
262 /* print the estimated position */
263 sec = pos / (gFileHdr.bps_average/8);
264 if (sec < 100*60) /* fits into mm:ss format */
265 rb->snprintf(gPrint, sizeof(gPrint), "%02d:%02dm", sec/60, sec%60);
266 else /* a very long clip, hh:mm format */
267 rb->snprintf(gPrint, sizeof(gPrint), "%02d:%02dh", sec/3600, (sec/60)%60);
268
269 rb->lcd_getstringsize(gPrint, &w, &h);
270 w++;
271 ypos = gBuf.osd_ypos + (gBuf.osd_height - h) / 2;
272 rb->lcd_putsxy(0, ypos, gPrint);
273
274 /* draw a slider over the rest of the line */
275 rb->gui_scrollbar_draw(rb->screens[SCREEN_MAIN], w, ypos, LCD_WIDTH-w,
276 h, total, 0, pos, HORIZONTAL);
277
278 if (gPlay.state == paused) /* we have to draw ourselves */
279 rb->lcd_update_rect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
280 else /* let the display time do it */
281 {
282 gPlay.nTimeOSD = FPS;
283 gPlay.bDirtyOSD = true; /* redraw it with next timer IRQ */
284 }
285}
286
287/* Put text on OSD and activate it for 1 second */
288static void osd_show_text(void)
289{
290 int h, ypos;
291
292 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
293 rb->lcd_fillrect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
294 rb->lcd_set_drawmode(DRMODE_SOLID);
295
296 rb->lcd_getstringsize(gPrint, NULL, &h);
297 ypos = gBuf.osd_ypos + (gBuf.osd_height - h) / 2;
298 rb->lcd_putsxy(0, ypos, gPrint);
299
300 if (gPlay.state == paused) /* we have to draw ourselves */
301 rb->lcd_update_rect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
302 else /* let the display time do it */
303 {
304 gPlay.nTimeOSD = FPS; /* display it for 1 sec */
305 gPlay.bDirtyOSD = true; /* let the refresh copy it to LCD */
306 }
307}
308
309/* helper function to change the volume by a certain amount, +/- */
310static void ChangeVolume(int delta)
311{
312 int minvol = rb->sound_min(SOUND_VOLUME);
313 int maxvol = rb->sound_max(SOUND_VOLUME);
314 int vol = rb->global_settings->volume + delta;
315
316 if (vol > maxvol) vol = maxvol;
317 else if (vol < minvol) vol = minvol;
318 if (vol != rb->global_settings->volume)
319 {
320 rb->sound_set(SOUND_VOLUME, vol);
321 rb->global_settings->volume = vol;
322
323 rb->snprintf(gPrint, sizeof(gPrint), "Vol: %d dB", vol);
324 osd_show_text();
325 }
326}
327
328
329/* helper function to change the LCD contrast by a certain amount, +/- */
330static void ChangeContrast(int delta)
331{
332 static int mycontrast = -1; /* the "permanent" value while running */
333 int contrast; /* updated value */
334
335 if (mycontrast == -1)
336 mycontrast = rb->global_settings->contrast;
337
338 contrast = mycontrast + delta;
339 if (contrast > 63) contrast = 63;
340 else if (contrast < 5) contrast = 5;
341 if (contrast != mycontrast)
342 {
343 rb->lcd_set_contrast(contrast);
344 mycontrast = contrast;
345
346 rb->snprintf(gPrint, sizeof(gPrint), "Contrast: %d", contrast);
347 osd_show_text();
348 }
349}
350
351
352/* sync the video to the current audio */
353static void SyncVideo(void)
354{
355 tAudioFrameHeader* pAudioBuf;
356
357 pAudioBuf = (tAudioFrameHeader*)(gBuf.pReadAudio);
358 if (pAudioBuf->magic == AUDIO_MAGIC)
359 {
360 gBuf.vidcount = 0; /* nothing known */
361 /* sync the video position */
362 gBuf.pReadVideo = gBuf.pReadAudio +
363 (long)pAudioBuf->associated_video * (long)gFileHdr.blocksize;
364
365 /* handle possible wrap */
366 if (gBuf.pReadVideo >= gBuf.pBufEnd)
367 gBuf.pReadVideo -= gBuf.bufsize;
368 else if (gBuf.pReadVideo < gBuf.pBufStart)
369 gBuf.pReadVideo += gBuf.bufsize;
370 }
371}
372
373
374/* timer interrupt handler to display a frame */
375static void timer4_isr(void)
376{
377 int available;
378 tAudioFrameHeader* pAudioBuf;
379 int height; /* height to display */
380
381 /* reduce height if we have OSD on */
382 height = gFileHdr.video_height;
383 if (gPlay.nTimeOSD > 0)
384 {
385 gPlay.nTimeOSD--;
386 height = MIN(gBuf.osd_ypos, height);
387 if (gPlay.bDirtyOSD)
388 {
389 rb->lcd_update_rect(0, gBuf.osd_ypos, LCD_WIDTH, gBuf.osd_height);
390 gPlay.bDirtyOSD = false;
391 }
392 }
393
394 rb->lcd_blit_mono(gBuf.pReadVideo, 0, 0,
395 gFileHdr.video_width, height/8, gFileHdr.video_width);
396
397 available = Available(gBuf.pReadVideo);
398
399 /* loop to skip audio frame(s) */
400 while(1)
401 {
402 /* just for the statistics */
403 if (!gBuf.bEOF && available < gStats.minVideoAvail)
404 gStats.minVideoAvail = available;
405
406 if (available <= (int)gFileHdr.blocksize)
407 { /* no data for next frame */
408
409 if (gBuf.bEOF && (gFileHdr.flags & FLAG_LOOP))
410 { /* loop now, assuming the looped clip fits in memory */
411 gBuf.pReadVideo = gBuf.pBufStart + gFileHdr.video_1st_frame;
412 /* FixMe: pReadVideo is incremented below */
413 }
414 else
415 {
416 gPlay.bVideoUnderrun = true;
417 rb->timer_unregister(); /* disable ourselves */
418 return; /* no data available */
419 }
420 }
421 else /* normal advance for next time */
422 {
423 gBuf.pReadVideo += gFileHdr.blocksize;
424 if (gBuf.pReadVideo >= gBuf.pBufEnd)
425 gBuf.pReadVideo -= gBuf.bufsize; /* wraparound */
426 available -= gFileHdr.blocksize;
427 }
428
429 if (!gPlay.bHasAudio)
430 break; /* no need to skip any audio */
431
432 if (gBuf.vidcount)
433 {
434 /* we know the next is a video frame */
435 gBuf.vidcount--;
436 break; /* exit the loop */
437 }
438
439 pAudioBuf = (tAudioFrameHeader*)(gBuf.pReadVideo);
440 if (pAudioBuf->magic == AUDIO_MAGIC)
441 { /* we ran into audio, can happen after seek */
442 gBuf.vidcount = pAudioBuf->next_block;
443 if (gBuf.vidcount)
444 gBuf.vidcount--; /* minus the audio block */
445 }
446 } /* while */
447}
448
449
450/* ISR function to get more mp3 data */
451static void GetMoreMp3(const void** start, size_t* size)
452{
453 int available;
454 int advance;
455
456 tAudioFrameHeader* pAudioBuf = (tAudioFrameHeader*)(gBuf.pReadAudio);
457
458 advance = pAudioBuf->next_block * gFileHdr.blocksize;
459
460 available = Available(gBuf.pReadAudio);
461
462 /* just for the statistics */
463 if (!gBuf.bEOF && available < gStats.minAudioAvail)
464 gStats.minAudioAvail = available;
465
466 if (available < advance + (int)gFileHdr.blocksize || advance == 0)
467 {
468 gPlay.bAudioUnderrun = true;
469 return; /* no data available */
470 }
471
472 gBuf.pReadAudio += advance;
473 if (gBuf.pReadAudio >= gBuf.pBufEnd)
474 gBuf.pReadAudio -= gBuf.bufsize; /* wraparound */
475
476 *start = gBuf.pReadAudio + gFileHdr.audio_headersize;
477 *size = gFileHdr.blocksize - gFileHdr.audio_headersize;
478}
479
480
481static int WaitForButton(void)
482{
483 int button;
484
485 do
486 {
487 button = rb->button_get(true);
488 rb->default_event_handler(button);
489 } while ((button & BUTTON_REL) && button != SYS_USB_CONNECTED);
490
491 return button;
492}
493
494
495static bool WantResume(int fd)
496{
497 int button;
498
499 rb->lcd_puts(0, 0, "Resume to this");
500 rb->lcd_puts(0, 1, "last position?");
501 rb->lcd_puts(0, 2, "PLAY = yes");
502 rb->lcd_puts(0, 3, "Any Other = no");
503 rb->lcd_puts(0, 4, " (plays from start)");
504 DrawPosition(gFileHdr.resume_pos, rb->filesize(fd));
505 rb->lcd_update();
506
507 button = WaitForButton();
508 return (button == VIDEO_RESUME);
509}
510
511
512static int SeekTo(int fd, int nPos)
513{
514 int read_now, got_now;
515
516 if (gPlay.bHasAudio)
517 rb->mp3_play_stop(); /* stop audio ISR */
518 if (gPlay.bHasVideo)
519 rb->timer_unregister(); /* stop the timer */
520
521 rb->lseek(fd, nPos, SEEK_SET);
522
523 gBuf.pBufFill = gBuf.pBufStart; /* all empty */
524 gBuf.pReadVideo = gBuf.pReadAudio = gBuf.pBufStart;
525
526 read_now = gBuf.low_water - 1; /* less than low water, so loading will continue */
527 read_now -= read_now % gBuf.granularity; /* round down to granularity */
528 got_now = rb->read(fd, gBuf.pBufFill, read_now);
529 gBuf.bEOF = (read_now != got_now);
530 gBuf.pBufFill += got_now;
531
532 if (nPos == 0)
533 { /* we seeked to the start */
534 if (gPlay.bHasVideo)
535 gBuf.pReadVideo += gFileHdr.video_1st_frame;
536
537 if (gPlay.bHasAudio)
538 gBuf.pReadAudio += gFileHdr.audio_1st_frame;
539 }
540 else
541 { /* we have to search for the positions */
542 if (gPlay.bHasAudio) /* prepare audio playback, if contained */
543 {
544 /* search for audio frame */
545 while (((tAudioFrameHeader*)(gBuf.pReadAudio))->magic != AUDIO_MAGIC)
546 gBuf.pReadAudio += gFileHdr.blocksize;
547
548 if (gPlay.bHasVideo)
549 SyncVideo(); /* pick the right video for that */
550 }
551 }
552
553 /* synchronous start */
554 gPlay.state = playing;
555 if (gPlay.bHasAudio)
556 {
557 gPlay.bAudioUnderrun = false;
558 rb->mp3_play_data(gBuf.pReadAudio + gFileHdr.audio_headersize,
559 gFileHdr.blocksize - gFileHdr.audio_headersize, GetMoreMp3);
560 rb->mp3_play_pause(true); /* kickoff audio */
561 }
562 if (gPlay.bHasVideo)
563 {
564 gPlay.bVideoUnderrun = false;
565 /* start display interrupt */
566#if FREQ == 12000000 /* Ondio speed kludge */
567 rb->timer_register(1, NULL, gPlay.nFrameTimeAdjusted,
568 timer4_isr IF_COP(, CPU));
569#else
570 rb->timer_register(1, NULL, gFileHdr.video_frametime,
571 timer4_isr IF_COP(, CPU));
572#endif
573 }
574
575 return 0;
576}
577
578/* called from default_event_handler_ex() or at end of playback */
579static void Cleanup(void *fd)
580{
581 rb->close(*(int*)fd); /* close the file */
582
583 if (gPlay.bHasVideo)
584 rb->timer_unregister(); /* stop video ISR, now I can use the display again */
585
586 if (gPlay.bHasAudio)
587 rb->mp3_play_stop(); /* stop audio ISR */
588
589 /* Turn on backlight timeout (revert to settings) */
590 backlight_use_settings();
591
592 /* restore normal contrast */
593 rb->lcd_set_contrast(rb->global_settings->contrast);
594}
595
596/* returns >0 if continue, =0 to stop, <0 to abort (USB) */
597static int PlayTick(int fd)
598{
599 int button;
600 static int lastbutton = 0;
601 int avail_audio = -1, avail_video = -1;
602 int retval = 1;
603 int filepos;
604
605 /* check buffer level */
606
607 if (gPlay.bHasAudio)
608 avail_audio = Available(gBuf.pReadAudio);
609 if (gPlay.bHasVideo)
610 avail_video = Available(gBuf.pReadVideo);
611
612 if ((gPlay.bHasAudio && avail_audio < gBuf.low_water)
613 || (gPlay.bHasVideo && avail_video < gBuf.low_water))
614 {
615 gPlay.bRefilling = true; /* go to refill mode */
616 }
617
618 if ((!gPlay.bHasAudio || gPlay.bAudioUnderrun)
619 && (!gPlay.bHasVideo || gPlay.bVideoUnderrun)
620 && gBuf.bEOF)
621 {
622 if (gFileHdr.resume_pos)
623 { /* we played til the end, clear resume position */
624 gFileHdr.resume_pos = 0;
625 rb->lseek(fd, 0, SEEK_SET); /* save resume position */
626 rb->write(fd, &gFileHdr, sizeof(gFileHdr));
627 }
628 Cleanup(&fd);
629 return 0; /* all expired */
630 }
631
632 if (!gPlay.bRefilling || gBuf.bEOF)
633 { /* nothing to do */
634 button = rb->button_get_w_tmo(HZ/10);
635 }
636 else
637 { /* refill buffer */
638 int read_now, got_now;
639 int buf_free;
640 long spinup; /* measure the spinup time */
641
642 /* how much can we reload, don't fill completely, would appear empty */
643 buf_free = gBuf.bufsize - MAX(avail_audio, avail_video) - gBuf.high_water;
644 if (buf_free < 0)
645 buf_free = 0; /* just for safety */
646 buf_free -= buf_free % gBuf.granularity; /* round down to granularity */
647
648 /* in one piece max. up to buffer end (wrap after that) */
649 read_now = MIN(buf_free, gBuf.pBufEnd - gBuf.pBufFill);
650
651 /* load piecewise, to stay responsive */
652 read_now = MIN(read_now, gBuf.nReadChunk);
653
654 if (read_now == buf_free)
655 gPlay.bRefilling = false; /* last piece requested */
656
657 spinup = *rb->current_tick; /* in case this is interesting below */
658
659 got_now = rb->read(fd, gBuf.pBufFill, read_now);
660 if (got_now != read_now || read_now == 0)
661 {
662 gBuf.bEOF = true;
663 gPlay.bRefilling = false;
664 }
665
666 if (gPlay.bDiskSleep) /* statistics about the spinup time */
667 {
668 spinup = *rb->current_tick - spinup;
669 gPlay.bDiskSleep = false;
670 if (spinup > gStats.maxSpinup)
671 gStats.maxSpinup = spinup;
672 if (spinup < gStats.minSpinup)
673 gStats.minSpinup = spinup;
674
675 /* recalculate the low water mark from real measurements */
676 gBuf.low_water = (gStats.maxSpinup + gBuf.spinup_safety)
677 * gFileHdr.bps_peak / 8 / HZ;
678 }
679
680 if (!gPlay.bRefilling
681#ifdef HAVE_DISK_STORAGE
682 && rb->global_settings->disk_spindown < 20 /* condition for test only */
683#endif
684 )
685 {
686 rb->storage_sleep(); /* no point in leaving the disk run til timeout */
687 gPlay.bDiskSleep = true;
688 }
689
690 gBuf.pBufFill += got_now;
691 if (gBuf.pBufFill >= gBuf.pBufEnd)
692 gBuf.pBufFill = gBuf.pBufStart; /* wrap */
693
694 rb->yield(); /* have mercy with the other threads */
695 button = rb->button_get(false);
696 }
697
698 /* check keypresses */
699
700 if (button != BUTTON_NONE)
701 {
702 filepos = rb->lseek(fd, 0, SEEK_CUR);
703
704 if (gPlay.bHasVideo) /* video position is more accurate */
705 filepos -= Available(gBuf.pReadVideo); /* take video position */
706 else
707 filepos -= Available(gBuf.pReadAudio); /* else audio */
708
709 switch (button) { /* set exit conditions */
710 case BUTTON_OFF:
711 if (gFileHdr.magic == HEADER_MAGIC /* only if file has header */
712 && !(gFileHdr.flags & FLAG_LOOP)) /* not for stills */
713 {
714 gFileHdr.resume_pos = filepos;
715 rb->lseek(fd, 0, SEEK_SET); /* save resume position */
716 rb->write(fd, &gFileHdr, sizeof(gFileHdr));
717 }
718 Cleanup(&fd);
719 retval = 0; /* signal "stopped" to caller */
720 break;
721 case VIDEO_STOP_SEEK:
722#ifdef VIDEO_STOP_SEEK_PRE
723 if (lastbutton != VIDEO_STOP_SEEK_PRE)
724 break;
725#endif
726 if (gPlay.bSeeking)
727 {
728 gPlay.bSeeking = false;
729 gPlay.state = playing;
730 SeekTo(fd, gPlay.nSeekPos);
731 }
732 else if (gPlay.state == playing)
733 {
734 gPlay.state = paused;
735 if (gPlay.bHasAudio)
736 rb->mp3_play_pause(false); /* pause audio */
737 if (gPlay.bHasVideo)
738 rb->timer_unregister(); /* stop the timer */
739 }
740 else if (gPlay.state == paused)
741 {
742 gPlay.state = playing;
743 if (gPlay.bHasAudio)
744 {
745 if (gPlay.bHasVideo)
746 SyncVideo();
747 rb->mp3_play_pause(true); /* play audio */
748 }
749 if (gPlay.bHasVideo)
750 { /* start the video */
751#if FREQ == 12000000 /* Ondio speed kludge */
752 rb->timer_register(1, NULL,
753 gPlay.nFrameTimeAdjusted, timer4_isr);
754#else
755 rb->timer_register(1, NULL,
756 gFileHdr.video_frametime, timer4_isr);
757#endif
758 }
759 }
760 break;
761 case BUTTON_UP:
762 case BUTTON_UP | BUTTON_REPEAT:
763 if (gPlay.bHasAudio)
764 ChangeVolume(1);
765 break;
766 case BUTTON_DOWN:
767 case BUTTON_DOWN | BUTTON_REPEAT:
768 if (gPlay.bHasAudio)
769 ChangeVolume(-1);
770 break;
771 case BUTTON_LEFT:
772 case BUTTON_LEFT | BUTTON_REPEAT:
773 if (!gPlay.bSeeking) /* prepare seek */
774 {
775 gPlay.nSeekPos = filepos;
776 gPlay.bSeeking = true;
777 gPlay.nSeekAcc = 0;
778 }
779 else if (gPlay.nSeekAcc > 0) /* other direction, stop sliding */
780 gPlay.nSeekAcc = 0;
781 else
782 gPlay.nSeekAcc--;
783 break;
784 case BUTTON_RIGHT:
785 case BUTTON_RIGHT | BUTTON_REPEAT:
786 if (!gPlay.bSeeking) /* prepare seek */
787 {
788 gPlay.nSeekPos = filepos;
789 gPlay.bSeeking = true;
790 gPlay.nSeekAcc = 0;
791 }
792 else if (gPlay.nSeekAcc < 0) /* other direction, stop sliding */
793 gPlay.nSeekAcc = 0;
794 else
795 gPlay.nSeekAcc++;
796 break;
797#ifdef VIDEO_DEBUG
798 case VIDEO_DEBUG: /* debug key */
799 case VIDEO_DEBUG | BUTTON_REPEAT:
800 DrawBuf(); /* show buffer status */
801 gPlay.nTimeOSD = FPS/2;
802 gPlay.bDirtyOSD = true;
803 break;
804#endif
805 case VIDEO_CONTRAST_DOWN: /* contrast down */
806 case VIDEO_CONTRAST_DOWN | BUTTON_REPEAT:
807 if (gPlay.bHasVideo)
808 ChangeContrast(-1);
809 break;
810 case VIDEO_CONTRAST_UP: /* contrast up */
811 case VIDEO_CONTRAST_UP | BUTTON_REPEAT:
812 if (gPlay.bHasVideo)
813 ChangeContrast(1);
814 break;
815 default:
816 if (rb->default_event_handler_ex(button, Cleanup, &fd)
817 == SYS_USB_CONNECTED)
818 retval = -1; /* signal "aborted" to caller */
819 break;
820 }
821
822 lastbutton = button;
823 } /* if (button != BUTTON_NONE) */
824
825
826 /* handle seeking */
827
828 if (gPlay.bSeeking) /* seeking? */
829 {
830 if (gPlay.nSeekAcc < -MAX_ACC)
831 gPlay.nSeekAcc = -MAX_ACC;
832 else if (gPlay.nSeekAcc > MAX_ACC)
833 gPlay.nSeekAcc = MAX_ACC;
834
835 gPlay.nSeekPos += gPlay.nSeekAcc * gBuf.nSeekChunk;
836 if (gPlay.nSeekPos < 0)
837 gPlay.nSeekPos = 0;
838 if (gPlay.nSeekPos > rb->filesize(fd) - gBuf.granularity)
839 {
840 gPlay.nSeekPos = rb->filesize(fd);
841 gPlay.nSeekPos -= gPlay.nSeekPos % gBuf.granularity;
842 }
843 DrawPosition(gPlay.nSeekPos, rb->filesize(fd));
844 }
845
846
847 /* check + recover underruns */
848
849 if ((gPlay.bAudioUnderrun || gPlay.bVideoUnderrun) && !gBuf.bEOF)
850 {
851 gBuf.spinup_safety += HZ/2; /* add extra spinup time for the future */
852 filepos = rb->lseek(fd, 0, SEEK_CUR);
853
854 if (gPlay.bHasVideo && gPlay.bVideoUnderrun)
855 {
856 gStats.nVideoUnderruns++;
857 filepos -= Available(gBuf.pReadVideo); /* take video position */
858 SeekTo(fd, filepos);
859 }
860 else if (gPlay.bHasAudio && gPlay.bAudioUnderrun)
861 {
862 gStats.nAudioUnderruns++;
863 filepos -= Available(gBuf.pReadAudio); /* else audio */
864 SeekTo(fd, filepos);
865 }
866 }
867
868 return retval;
869}
870
871
872static int main(char* filename)
873{
874 int file_size;
875 int fd; /* file descriptor handle */
876 int read_now, got_now;
877 int button = 0;
878 int retval;
879
880 /* try to open the file */
881 fd = rb->open(filename, O_RDWR);
882 if (fd < 0)
883 return PLUGIN_ERROR;
884 file_size = rb->filesize(fd);
885
886 /* reset pitch value to ensure synchronous playback */
887 rb->sound_set_pitch(PITCH_SPEED_100);
888
889 /* init statistics */
890 rb->memset(&gStats, 0, sizeof(gStats));
891 gStats.minAudioAvail = gStats.minVideoAvail = INT_MAX;
892 gStats.minSpinup = INT_MAX;
893
894 /* init playback state */
895 rb->memset(&gPlay, 0, sizeof(gPlay));
896
897 /* init buffer */
898 rb->memset(&gBuf, 0, sizeof(gBuf));
899 gBuf.pBufStart = rb->plugin_get_audio_buffer((size_t *)&gBuf.bufsize);
900 /*gBuf.bufsize = 1700*1024; // test, like 2MB version!!!! */
901 gBuf.pBufFill = gBuf.pBufStart; /* all empty */
902
903 /* init OSD */
904 rb->lcd_getstringsize("X", NULL, &retval);
905 gBuf.osd_height = (retval + 7) & ~7;
906 gBuf.osd_ypos = LCD_HEIGHT - gBuf.osd_height;
907
908 /* load file header */
909 read_now = sizeof(gFileHdr);
910 got_now = rb->read(fd, &gFileHdr, read_now);
911 rb->lseek(fd, 0, SEEK_SET); /* rewind to restart sector-aligned */
912 if (got_now != read_now)
913 {
914 rb->close(fd);
915 return (PLUGIN_ERROR);
916 }
917
918 /* check header */
919 if (gFileHdr.magic != HEADER_MAGIC)
920 { /* old file, use default info */
921 rb->memset(&gFileHdr, 0, sizeof(gFileHdr));
922 gFileHdr.blocksize = SCREENSIZE;
923 if (file_size < SCREENSIZE * FPS) /* less than a second */
924 gFileHdr.flags |= FLAG_LOOP;
925 gFileHdr.video_format = VIDEOFORMAT_RAW;
926 gFileHdr.video_width = LCD_WIDTH;
927 gFileHdr.video_height = LCD_HEIGHT;
928 gFileHdr.video_frametime = 11059200 / FPS;
929 gFileHdr.bps_peak = gFileHdr.bps_average = LCD_WIDTH * LCD_HEIGHT * FPS;
930 }
931
932#if FREQ == 12000000 /* Ondio speed kludge, 625 / 576 == 12000000 / 11059200 */
933 gPlay.nFrameTimeAdjusted = (gFileHdr.video_frametime * 625) / 576;
934#endif
935
936 /* continue buffer init: align the end, calc low water, read sizes */
937 gBuf.granularity = gFileHdr.blocksize;
938 while (gBuf.granularity % 512) /* common multiple of sector size */
939 gBuf.granularity *= 2;
940 gBuf.bufsize -= gBuf.bufsize % gBuf.granularity; /* round down */
941 gBuf.pBufEnd = gBuf.pBufStart + gBuf.bufsize;
942 gBuf.low_water = SPINUP_INIT * gFileHdr.bps_peak / 8000;
943 gBuf.spinup_safety = SPINUP_SAFETY * HZ / 1000; /* in time ticks */
944 if (gFileHdr.audio_min_associated < 0)
945 gBuf.high_water = 0 - gFileHdr.audio_min_associated;
946 else
947 gBuf.high_water = 1; /* never fill buffer completely, would appear empty */
948 gBuf.nReadChunk = (CHUNK + gBuf.granularity - 1); /* round up */
949 gBuf.nReadChunk -= gBuf.nReadChunk % gBuf.granularity;/* and align */
950 gBuf.nSeekChunk = rb->filesize(fd) / FF_TICKS;
951 gBuf.nSeekChunk += gBuf.granularity - 1; /* round up */
952 gBuf.nSeekChunk -= gBuf.nSeekChunk % gBuf.granularity; /* and align */
953
954 /* prepare video playback, if contained */
955 if (gFileHdr.video_format == VIDEOFORMAT_RAW)
956 {
957 gPlay.bHasVideo = true;
958 /* Turn off backlight timeout */
959 backlight_ignore_timeout();
960 }
961
962 /* prepare audio playback, if contained */
963 if (gFileHdr.audio_format == AUDIOFORMAT_MP3_BITSWAPPED)
964 {
965 gPlay.bHasAudio = true;
966 }
967
968 /* start playback by seeking to zero or resume position */
969 if (gFileHdr.resume_pos && WantResume(fd)) /* ask the user */
970 SeekTo(fd, gFileHdr.resume_pos);
971 else
972 SeekTo(fd, 0);
973
974 /* all that's left to do is keep the buffer full */
975 do /* the main loop */
976 {
977 retval = PlayTick(fd);
978 } while (retval > 0);
979
980 if (retval < 0) /* aborted? */
981 {
982 return PLUGIN_USB_CONNECTED;
983 }
984
985#ifndef DEBUG /* for release compilations, only display the stats in case of error */
986 if (gStats.nAudioUnderruns || gStats.nVideoUnderruns)
987#endif
988 {
989 /* display statistics */
990 rb->lcd_clear_display();
991 rb->snprintf(gPrint, sizeof(gPrint), "%d Audio Underruns", gStats.nAudioUnderruns);
992 rb->lcd_puts(0, 0, gPrint);
993 rb->snprintf(gPrint, sizeof(gPrint), "%d Video Underruns", gStats.nVideoUnderruns);
994 rb->lcd_puts(0, 1, gPrint);
995 rb->snprintf(gPrint, sizeof(gPrint), "%d MinAudio bytes", gStats.minAudioAvail);
996 rb->lcd_puts(0, 2, gPrint);
997 rb->snprintf(gPrint, sizeof(gPrint), "%d MinVideo bytes", gStats.minVideoAvail);
998 rb->lcd_puts(0, 3, gPrint);
999 rb->snprintf(gPrint, sizeof(gPrint), "MinSpinup %ld.%02ld", gStats.minSpinup/HZ, gStats.minSpinup%HZ);
1000 rb->lcd_puts(0, 4, gPrint);
1001 rb->snprintf(gPrint, sizeof(gPrint), "MaxSpinup %ld.%02ld", gStats.maxSpinup/HZ, gStats.maxSpinup%HZ);
1002 rb->lcd_puts(0, 5, gPrint);
1003 rb->snprintf(gPrint, sizeof(gPrint), "LowWater: %d", gBuf.low_water);
1004 rb->lcd_puts(0, 6, gPrint);
1005 rb->snprintf(gPrint, sizeof(gPrint), "HighWater: %d", gBuf.high_water);
1006 rb->lcd_puts(0, 7, gPrint);
1007
1008 rb->lcd_update();
1009 button = WaitForButton();
1010 }
1011 return (button == SYS_USB_CONNECTED) ? PLUGIN_USB_CONNECTED : PLUGIN_OK;
1012}
1013
1014
1015/***************** Plugin Entry Point *****************/
1016
1017enum plugin_status plugin_start(const void* parameter)
1018{
1019 if (parameter == NULL)
1020 {
1021 rb->splash(HZ*2, "Play .rvf file!");
1022 return PLUGIN_ERROR;
1023 }
1024
1025 /* now go ahead and have fun! */
1026 return main((char*) parameter);
1027}
1028
1029#endif /* #ifdef HAVE_LCD_BITMAP */
1030
diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c
index af6bd6f397..a4d639ede6 100644
--- a/apps/plugins/vu_meter.c
+++ b/apps/plugins/vu_meter.c
@@ -24,32 +24,8 @@
24 24
25 25
26/* variable button definitions */ 26/* variable button definitions */
27#if CONFIG_KEYPAD == RECORDER_PAD 27#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
28#define VUMETER_QUIT BUTTON_OFF 28 (CONFIG_KEYPAD == IRIVER_H300_PAD)
29#define VUMETER_HELP BUTTON_ON
30#define VUMETER_MENU BUTTON_F1
31#define VUMETER_UP BUTTON_UP
32#define VUMETER_DOWN BUTTON_DOWN
33#define LABEL_HELP "ON"
34#define LABEL_QUIT "OFF"
35#define LABEL_MENU "F1"
36#define LABEL_VOLUME "UP/DOWN"
37
38#elif CONFIG_KEYPAD == ONDIO_PAD
39#define VUMETER_QUIT BUTTON_OFF
40#define VUMETER_HELP_PRE BUTTON_MENU
41#define VUMETER_HELP (BUTTON_MENU | BUTTON_REL)
42#define VUMETER_MENU_PRE BUTTON_MENU
43#define VUMETER_MENU (BUTTON_MENU | BUTTON_REPEAT)
44#define VUMETER_UP BUTTON_UP
45#define VUMETER_DOWN BUTTON_DOWN
46#define LABEL_HELP "MODE"
47#define LABEL_QUIT "OFF"
48#define LABEL_MENU "MODE.."
49#define LABEL_VOLUME "UP/DOWN"
50
51#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
52 (CONFIG_KEYPAD == IRIVER_H300_PAD)
53#define VUMETER_QUIT BUTTON_OFF 29#define VUMETER_QUIT BUTTON_OFF
54#define VUMETER_HELP BUTTON_ON 30#define VUMETER_HELP BUTTON_ON
55#define VUMETER_MENU BUTTON_SELECT 31#define VUMETER_MENU BUTTON_SELECT
@@ -804,10 +780,7 @@ static void draw_digital_minimeters(void) {
804 780
805static void analog_meter(void) { 781static void analog_meter(void) {
806 782
807#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 783#if (CONFIG_CODEC == SWCODEC)
808 int left_peak = rb->mas_codec_readreg(0xC);
809 int right_peak = rb->mas_codec_readreg(0xD);
810#elif (CONFIG_CODEC == SWCODEC)
811 static struct pcm_peaks peaks; 784 static struct pcm_peaks peaks;
812 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK, 785 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
813 &peaks); 786 &peaks);
@@ -864,10 +837,7 @@ static void analog_meter(void) {
864} 837}
865 838
866static void digital_meter(void) { 839static void digital_meter(void) {
867#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 840#if (CONFIG_CODEC == SWCODEC)
868 int left_peak = rb->mas_codec_readreg(0xC);
869 int right_peak = rb->mas_codec_readreg(0xD);
870#elif (CONFIG_CODEC == SWCODEC)
871 static struct pcm_peaks peaks; 841 static struct pcm_peaks peaks;
872 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK, 842 rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
873 &peaks); 843 &peaks);
diff --git a/apps/plugins/wavplay.c b/apps/plugins/wavplay.c
deleted file mode 100644
index 073af31280..0000000000
--- a/apps/plugins/wavplay.c
+++ /dev/null
@@ -1,3676 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2006 Jörg Hohensohn
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22
23
24
25/************ Start of MAS pcm codec, raw i2c blocks ************/
26
27// address 04640 count 30 (126 bytes)
28static const unsigned char maspcm_array1[] = {
29 0xe0, 0x00, 0x00, 0x1e, 0x06, 0x40,
30 0x00, 0x08, 0x00, 0x00, // 00080000
31 0x00, 0x00, 0x00, 0x00, // 00000000
32 0x00, 0x00, 0x00, 0x00, // 00000000
33 0x00, 0x08, 0x00, 0x00, // 00080000
34 0x00, 0x00, 0x00, 0x25, // 00000025
35 0x00, 0x00, 0x00, 0x04, // 00000004
36 0x00, 0x00, 0x48, 0x00, // 00004800
37 0x00, 0x08, 0x00, 0x00, // 00080000
38 0x00, 0x00, 0x00, 0x00, // 00000000
39 0x00, 0x00, 0x00, 0x00, // 00000000
40 0x00, 0x00, 0xFF, 0xFF, // 0000FFFF
41 0x00, 0x00, 0x00, 0x00, // 00000000
42 0x00, 0x00, 0x00, 0x00, // 00000000
43 0x00, 0x00, 0x82, 0x00, // 00008200
44 0x00, 0x00, 0x00, 0x0A, // 0000000A
45 0x00, 0x08, 0x00, 0x00, // 00080000
46 0x00, 0x00, 0x00, 0x00, // 00000000
47 0x00, 0x00, 0x00, 0x00, // 00000000
48 0x00, 0x08, 0x00, 0x00, // 00080000
49 0x00, 0x08, 0x00, 0x00, // 00080000
50 0x00, 0x00, 0x00, 0x00, // 00000000
51 0x00, 0x00, 0x00, 0x00, // 00000000
52 0x00, 0x08, 0x00, 0x00, // 00080000
53 0x00, 0x00, 0x03, 0x18, // 00000318
54 0x00, 0x00, 0x03, 0x18, // 00000318
55 0x00, 0x00, 0x03, 0x00, // 00000300
56 0x00, 0x00, 0x03, 0x00, // 00000300
57 0x00, 0x00, 0x03, 0x18, // 00000318
58 0x00, 0x00, 0x00, 0x00, // 00000000
59 0x00, 0x00, 0x03, 0x00, // 00000300
60};
61// address 04674 count 81 (330 bytes)
62static const unsigned char maspcm_array2[] = {
63 0xe0, 0x00, 0x00, 0x51, 0x06, 0x74,
64 0x00, 0x00, 0x60, 0x00, // 00006000
65 0x00, 0x00, 0x00, 0x02, // 00000002
66 0x00, 0x00, 0x00, 0x60, // 00000060
67 0x00, 0x00, 0x00, 0x60, // 00000060
68 0x00, 0x00, 0x03, 0x00, // 00000300
69 0x00, 0x00, 0xC0, 0x00, // 0000C000
70 0x00, 0x00, 0x00, 0x14, // 00000014
71 0x00, 0x00, 0x00, 0x1E, // 0000001E
72 0x00, 0x00, 0x42, 0x11, // 00004211
73 0x00, 0x00, 0x58, 0x33, // 00005833
74 0x00, 0x00, 0x00, 0x02, // 00000002
75 0x00, 0x00, 0x00, 0x40, // 00000040
76 0x00, 0x00, 0x00, 0x40, // 00000040
77 0x00, 0x00, 0x00, 0x00, // 00000000
78 0x00, 0x01, 0x20, 0x01, // 00012001
79 0x00, 0x00, 0x00, 0x14, // 00000014
80 0x00, 0x00, 0x00, 0x29, // 00000029
81 0x00, 0x00, 0x30, 0xC3, // 000030C3
82 0x00, 0x00, 0x60, 0x00, // 00006000
83 0x00, 0x00, 0x00, 0x02, // 00000002
84 0x00, 0x00, 0x00, 0x40, // 00000040
85 0x00, 0x00, 0x00, 0x40, // 00000040
86 0x00, 0x00, 0x02, 0x00, // 00000200
87 0x00, 0x01, 0x20, 0x00, // 00012000
88 0x00, 0x00, 0x00, 0x14, // 00000014
89 0x00, 0x00, 0x00, 0x2D, // 0000002D
90 0x00, 0x00, 0x2C, 0x86, // 00002C86
91 0x00, 0x00, 0x60, 0x00, // 00006000
92 0x00, 0x00, 0x00, 0x01, // 00000001
93 0x00, 0x00, 0x00, 0x30, // 00000030
94 0x00, 0x00, 0x00, 0x30, // 00000030
95 0x00, 0x00, 0x03, 0x00, // 00000300
96 0x00, 0x01, 0x80, 0x00, // 00018000
97 0x00, 0x00, 0x00, 0x14, // 00000014
98 0x00, 0x00, 0x00, 0x3C, // 0000003C
99 0x00, 0x00, 0x21, 0x93, // 00002193
100 0x00, 0x00, 0x58, 0x33, // 00005833
101 0x00, 0x00, 0x00, 0x01, // 00000001
102 0x00, 0x00, 0x00, 0x20, // 00000020
103 0x00, 0x00, 0x00, 0x20, // 00000020
104 0x00, 0x00, 0x00, 0x00, // 00000000
105 0x00, 0x02, 0x40, 0x01, // 00024001
106 0x00, 0x00, 0x00, 0x14, // 00000014
107 0x00, 0x00, 0x00, 0x52, // 00000052
108 0x00, 0x00, 0x18, 0xAD, // 000018AD
109 0x00, 0x00, 0x60, 0x00, // 00006000
110 0x00, 0x00, 0x00, 0x01, // 00000001
111 0x00, 0x00, 0x00, 0x20, // 00000020
112 0x00, 0x00, 0x00, 0x20, // 00000020
113 0x00, 0x00, 0x02, 0x00, // 00000200
114 0x00, 0x02, 0x40, 0x00, // 00024000
115 0x00, 0x00, 0x00, 0x14, // 00000014
116 0x00, 0x00, 0x00, 0x5A, // 0000005A
117 0x00, 0x00, 0x16, 0x81, // 00001681
118 0x00, 0x00, 0x60, 0x00, // 00006000
119 0x00, 0x00, 0x00, 0x00, // 00000000
120 0x00, 0x00, 0x00, 0x18, // 00000018
121 0x00, 0x00, 0x00, 0x18, // 00000018
122 0x00, 0x00, 0x03, 0x00, // 00000300
123 0x00, 0x03, 0x00, 0x00, // 00030000
124 0x00, 0x00, 0x00, 0x14, // 00000014
125 0x00, 0x00, 0x00, 0x78, // 00000078
126 0x00, 0x00, 0x10, 0xED, // 000010ED
127 0x00, 0x00, 0x58, 0x33, // 00005833
128 0x00, 0x00, 0x00, 0x00, // 00000000
129 0x00, 0x00, 0x00, 0x10, // 00000010
130 0x00, 0x00, 0x00, 0x10, // 00000010
131 0x00, 0x00, 0x00, 0x00, // 00000000
132 0x00, 0x04, 0x80, 0x03, // 00048003
133 0x00, 0x00, 0x00, 0x14, // 00000014
134 0x00, 0x00, 0x00, 0xA5, // 000000A5
135 0x00, 0x00, 0x0C, 0x56, // 00000C56
136 0x00, 0x00, 0x60, 0x00, // 00006000
137 0x00, 0x00, 0x00, 0x00, // 00000000
138 0x00, 0x00, 0x00, 0x10, // 00000010
139 0x00, 0x00, 0x00, 0x10, // 00000010
140 0x00, 0x00, 0x02, 0x00, // 00000200
141 0x00, 0x04, 0x80, 0x00, // 00048000
142 0x00, 0x00, 0x00, 0x14, // 00000014
143 0x00, 0x00, 0x00, 0xB4, // 000000B4
144 0x00, 0x00, 0x0B, 0x51, // 00000B51
145};
146// address 04661 count 19 (82 bytes)
147static const unsigned char maspcm_array3[] = {
148 0xe0, 0x00, 0x00, 0x13, 0x06, 0x61,
149 0x00, 0x00, 0x01, 0x25, // 00000125
150 0x00, 0x00, 0x00, 0x05, // 00000005
151 0x00, 0x00, 0x48, 0x00, // 00004800
152 0x00, 0x08, 0x00, 0x00, // 00080000
153 0x00, 0x00, 0x00, 0x00, // 00000000
154 0x00, 0x00, 0x00, 0x00, // 00000000
155 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
156 0x00, 0x00, 0x00, 0x00, // 00000000
157 0x00, 0x00, 0x00, 0x00, // 00000000
158 0x00, 0x00, 0x82, 0x00, // 00008200
159 0x00, 0x00, 0x00, 0x00, // 00000000
160 0x00, 0x08, 0x00, 0x00, // 00080000
161 0x00, 0x00, 0x00, 0x00, // 00000000
162 0x00, 0x00, 0x00, 0x00, // 00000000
163 0x00, 0x08, 0x00, 0x00, // 00080000
164 0x00, 0x08, 0x00, 0x00, // 00080000
165 0x00, 0x00, 0x00, 0x00, // 00000000
166 0x00, 0x00, 0x00, 0x00, // 00000000
167 0x00, 0x08, 0x00, 0x00, // 00080000
168};
169// address 046E4 count 16 (70 bytes)
170static const unsigned char maspcm_array4[] = {
171 0xe0, 0x00, 0x00, 0x10, 0x06, 0xe4,
172 0x00, 0x00, 0x06, 0x74, // 00000674
173 0x00, 0x00, 0x06, 0x7D, // 0000067D
174 0x00, 0x00, 0x06, 0x86, // 00000686
175 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
176 0x00, 0x00, 0x06, 0x8F, // 0000068F
177 0x00, 0x00, 0x06, 0x98, // 00000698
178 0x00, 0x00, 0x06, 0xA1, // 000006A1
179 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
180 0x00, 0x00, 0x06, 0xAA, // 000006AA
181 0x00, 0x00, 0x06, 0xB3, // 000006B3
182 0x00, 0x00, 0x06, 0xBC, // 000006BC
183 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
184 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
185 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
186 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
187 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
188};
189// address 04700 count 18 (78 byte)
190static const unsigned char maspcm_array5[] = {
191 0xe0, 0x00, 0x00, 0x12, 0x07, 0x00,
192 0x00, 0x00, 0x06, 0xBC, // 000006BC
193 0x00, 0x00, 0x00, 0x0A, // 0000000A
194 0x00, 0x00, 0x06, 0x74, // 00000674
195 0x00, 0x00, 0x00, 0x00, // 00000000
196 0x00, 0x00, 0x06, 0x7D, // 0000067D
197 0x00, 0x00, 0x00, 0x01, // 00000001
198 0x00, 0x00, 0x06, 0x86, // 00000686
199 0x00, 0x00, 0x00, 0x02, // 00000002
200 0x00, 0x00, 0x06, 0x8F, // 0000068F
201 0x00, 0x00, 0x00, 0x04, // 00000004
202 0x00, 0x00, 0x06, 0x98, // 00000698
203 0x00, 0x00, 0x00, 0x05, // 00000005
204 0x00, 0x00, 0x06, 0xA1, // 000006A1
205 0x00, 0x00, 0x00, 0x06, // 00000006
206 0x00, 0x00, 0x06, 0xAA, // 000006AA
207 0x00, 0x00, 0x00, 0x08, // 00000008
208 0x00, 0x00, 0x06, 0xB3, // 000006B3
209 0x00, 0x00, 0x00, 0x09, // 00000009
210};
211// address 06600 count 63 (258 bytes)
212static const unsigned char maspcm_array6[] = {
213 0xf0, 0x00, 0x00, 0x3f, 0x06, 0x00,
214 0x00, 0x00, 0x0B, 0xAD, // 00000BAD
215 0x00, 0x00, 0x10, 0x00, // 00001000
216 0x00, 0x00, 0x20, 0x00, // 00002000
217 0x00, 0x00, 0x30, 0x00, // 00003000
218 0x00, 0x00, 0x40, 0x00, // 00004000
219 0x00, 0x00, 0x50, 0x00, // 00005000
220 0x00, 0x00, 0x60, 0x00, // 00006000
221 0x00, 0x00, 0x70, 0x00, // 00007000
222 0x00, 0x00, 0x80, 0x00, // 00008000
223 0x00, 0x00, 0x90, 0x00, // 00009000
224 0x00, 0x00, 0xA0, 0x00, // 0000A000
225 0x00, 0x00, 0xB0, 0x00, // 0000B000
226 0x00, 0x00, 0xC0, 0x00, // 0000C000
227 0x00, 0x00, 0xD0, 0x00, // 0000D000
228 0x00, 0x00, 0xE0, 0x00, // 0000E000
229 0x00, 0x00, 0xF0, 0x00, // 0000F000
230 0x00, 0x01, 0x00, 0x00, // 00010000
231 0x00, 0x01, 0x10, 0x00, // 00011000
232 0x00, 0x01, 0x20, 0x00, // 00012000
233 0x00, 0x01, 0x30, 0x00, // 00013000
234 0x00, 0x01, 0x40, 0x00, // 00014000
235 0x00, 0x01, 0x50, 0x00, // 00015000
236 0x00, 0x01, 0x60, 0x00, // 00016000
237 0x00, 0x01, 0x70, 0x00, // 00017000
238 0x00, 0x01, 0x80, 0x00, // 00018000
239 0x00, 0x01, 0x90, 0x00, // 00019000
240 0x00, 0x01, 0xA0, 0x00, // 0001A000
241 0x00, 0x01, 0xB0, 0x00, // 0001B000
242 0x00, 0x01, 0xC0, 0x00, // 0001C000
243 0x00, 0x01, 0xD0, 0x00, // 0001D000
244 0x00, 0x01, 0xE0, 0x00, // 0001E000
245 0x00, 0x01, 0xF0, 0x00, // 0001F000
246 0x00, 0x02, 0x00, 0x00, // 00020000
247 0x00, 0x02, 0x10, 0x00, // 00021000
248 0x00, 0x02, 0x20, 0x00, // 00022000
249 0x00, 0x02, 0x30, 0x00, // 00023000
250 0x00, 0x02, 0x40, 0x00, // 00024000
251 0x00, 0x00, 0x05, 0xFF, // 000005FF
252 0x00, 0x00, 0x00, 0x00, // 00000000
253 0x00, 0x00, 0x00, 0x00, // 00000000
254 0x00, 0x00, 0x00, 0x00, // 00000000
255 0x00, 0x00, 0x00, 0x90, // 00000090
256 0x00, 0x00, 0x00, 0x90, // 00000090
257 0x00, 0x00, 0x00, 0x90, // 00000090
258 0x00, 0x00, 0x00, 0x20, // 00000020
259 0x00, 0x00, 0x03, 0x00, // 00000300
260 0x00, 0x00, 0x00, 0x20, // 00000020
261 0x00, 0x00, 0x03, 0x00, // 00000300
262 0x00, 0x00, 0x00, 0x20, // 00000020
263 0x00, 0x00, 0x03, 0x00, // 00000300
264 0x00, 0x00, 0x05, 0xFF, // 000005FF
265 0x00, 0x00, 0x00, 0x00, // 00000000
266 0x00, 0x00, 0x00, 0x00, // 00000000
267 0x00, 0x00, 0x00, 0x00, // 00000000
268 0x00, 0x00, 0x00, 0x90, // 00000090
269 0x00, 0x00, 0x00, 0x90, // 00000090
270 0x00, 0x00, 0x00, 0x90, // 00000090
271 0x00, 0x00, 0x00, 0x00, // 00000000
272 0x00, 0x00, 0x00, 0x00, // 00000000
273 0x00, 0x00, 0x00, 0x00, // 00000000
274 0x00, 0x00, 0x00, 0x00, // 00000000
275 0x00, 0x00, 0x00, 0x00, // 00000000
276 0x00, 0x00, 0x00, 0x0C, // 0000000C
277};
278// address 06640 count 12 (54 bytes)
279static const unsigned char maspcm_array7[] = {
280 0xf0, 0x00, 0x00, 0x0c, 0x06, 0x40,
281 0x00, 0x00, 0x00, 0x00, // 00000000
282 0x00, 0x00, 0x00, 0x00, // 00000000
283 0x00, 0x00, 0x00, 0x00, // 00000000
284 0x00, 0x00, 0x00, 0x00, // 00000000
285 0x00, 0x00, 0x00, 0x00, // 00000000
286 0x00, 0x00, 0x00, 0x00, // 00000000
287 0x00, 0x00, 0x00, 0x00, // 00000000
288 0x00, 0x00, 0x00, 0x00, // 00000000
289 0x00, 0x00, 0x00, 0x00, // 00000000
290 0x00, 0x00, 0x00, 0x00, // 00000000
291 0x00, 0x00, 0x00, 0x00, // 00000000
292 0x00, 0x00, 0x00, 0x00, // 00000000
293};
294// address 06660 count 28 (118 bytes)
295static const unsigned char maspcm_array8[] = {
296 0xf0, 0x00, 0x00, 0x1c, 0x06, 0x60,
297 0x00, 0x00, 0x00, 0x00, // 00000000
298 0x00, 0x00, 0x00, 0x00, // 00000000
299 0x00, 0x00, 0x00, 0x00, // 00000000
300 0x00, 0x00, 0x00, 0x00, // 00000000
301 0x00, 0x00, 0x00, 0x00, // 00000000
302 0x00, 0x00, 0x00, 0x00, // 00000000
303 0x00, 0x00, 0x00, 0x00, // 00000000
304 0x00, 0x00, 0x00, 0x00, // 00000000
305 0x00, 0x00, 0x00, 0x00, // 00000000
306 0x00, 0x00, 0x00, 0x00, // 00000000
307 0x00, 0x00, 0x00, 0x00, // 00000000
308 0x00, 0x00, 0x00, 0x00, // 00000000
309 0x00, 0x00, 0x00, 0x00, // 00000000
310 0x00, 0x00, 0x00, 0x00, // 00000000
311 0x00, 0x00, 0x00, 0x00, // 00000000
312 0x00, 0x00, 0x00, 0x00, // 00000000
313 0x00, 0x00, 0x00, 0x00, // 00000000
314 0x00, 0x00, 0x00, 0x00, // 00000000
315 0x00, 0x00, 0x00, 0x00, // 00000000
316 0x00, 0x00, 0x00, 0x00, // 00000000
317 0x00, 0x00, 0x00, 0x00, // 00000000
318 0x00, 0x00, 0x00, 0x00, // 00000000
319 0x00, 0x00, 0x00, 0x00, // 00000000
320 0x00, 0x00, 0x00, 0x00, // 00000000
321 0x00, 0x00, 0x00, 0x00, // 00000000
322 0x00, 0x00, 0x00, 0x00, // 00000000
323 0x00, 0x00, 0x00, 0x00, // 00000000
324 0x00, 0x00, 0x00, 0x00, // 00000000
325};
326// address 04800 count 1668 (6678 bytes)
327static const unsigned char maspcm_array9[] = {
328 0xe0, 0x00, 0x06, 0x84, 0x08, 0x00,
329 0x00, 0x00, 0x00, 0x00, // 00000000
330 0x00, 0x07, 0x47, 0xC0, // 000747C0
331 0x00, 0x07, 0x04, 0x00, // 00070400
332 0x00, 0x00, 0x00, 0x00, // 00000000
333 0x00, 0x00, 0x00, 0x00, // 00000000
334 0x00, 0x00, 0x00, 0x00, // 00000000
335 0x00, 0x06, 0xC0, 0x6B, // 0006C06B
336 0x00, 0x00, 0x00, 0x00, // 00000000
337 0x00, 0x07, 0x44, 0x01, // 00074401
338 0x00, 0x07, 0x06, 0x90, // 00070690
339 0x00, 0x07, 0x4C, 0x07, // 00074C07
340 0x00, 0x07, 0x0F, 0xFF, // 00070FFF
341 0x00, 0x0B, 0x52, 0x40, // 000B5240
342 0x00, 0x06, 0x80, 0x1D, // 0006801D
343 0x00, 0x06, 0x80, 0x1F, // 0006801F
344 0x00, 0x06, 0x80, 0x21, // 00068021
345 0x00, 0x06, 0x80, 0x23, // 00068023
346 0x00, 0x06, 0x84, 0x1D, // 0006841D
347 0x00, 0x06, 0x84, 0x1F, // 0006841F
348 0x00, 0x06, 0x84, 0x21, // 00068421
349 0x00, 0x06, 0x84, 0x23, // 00068423
350 0x00, 0x06, 0x88, 0x17, // 00068817
351 0x00, 0x06, 0x8C, 0x17, // 00068C17
352 0x00, 0x06, 0xD0, 0x6D, // 0006D06D
353 0x00, 0x07, 0x5C, 0x01, // 00075C01
354 0x00, 0x07, 0x1E, 0x57, // 00071E57
355 0x00, 0x07, 0x44, 0x01, // 00074401
356 0x00, 0x07, 0x06, 0x90, // 00070690
357 0x00, 0x07, 0x4C, 0x07, // 00074C07
358 0x00, 0x07, 0x0F, 0xFF, // 00070FFF
359 0x00, 0x0B, 0x52, 0x40, // 000B5240
360 0x00, 0x06, 0x80, 0x1D, // 0006801D
361 0x00, 0x06, 0x80, 0x1F, // 0006801F
362 0x00, 0x06, 0x80, 0x21, // 00068021
363 0x00, 0x06, 0x80, 0x23, // 00068023
364 0x00, 0x06, 0x84, 0x1D, // 0006841D
365 0x00, 0x06, 0x84, 0x1F, // 0006841F
366 0x00, 0x06, 0x84, 0x21, // 00068421
367 0x00, 0x06, 0x84, 0x23, // 00068423
368 0x00, 0x06, 0x88, 0x17, // 00068817
369 0x00, 0x06, 0x8C, 0x17, // 00068C17
370 0x00, 0x06, 0xD0, 0x6D, // 0006D06D
371 0x00, 0x06, 0x98, 0x1E, // 0006981E
372 0x00, 0x04, 0x05, 0x08, // 00040508
373 0x00, 0x04, 0x0D, 0x08, // 00040D08
374 0x00, 0x04, 0x15, 0x08, // 00041508
375 0x00, 0x04, 0x1D, 0x08, // 00041D08
376 0x00, 0x04, 0x25, 0x08, // 00042508
377 0x00, 0x04, 0x2D, 0x08, // 00042D08
378 0x00, 0x04, 0x35, 0x08, // 00043508
379 0x00, 0x07, 0x7C, 0x00, // 00077C00
380 0x00, 0x07, 0x3C, 0x30, // 00073C30
381 0x00, 0x06, 0x80, 0x3B, // 0006803B
382 0x00, 0x06, 0x88, 0x5B, // 0006885B
383 0x00, 0x06, 0x94, 0x3B, // 0006943B
384 0x00, 0x06, 0x9C, 0x43, // 00069C43
385 0x00, 0x06, 0xA0, 0x53, // 0006A053
386 0x00, 0x06, 0xA8, 0x4B, // 0006A84B
387 0x00, 0x06, 0xB4, 0x53, // 0006B453
388 0x00, 0x06, 0xBC, 0x06, // 0006BC06
389 0x00, 0x07, 0x74, 0x01, // 00077401
390 0x00, 0x07, 0x36, 0x63, // 00073663
391 0x00, 0x02, 0x12, 0x57, // 00021257
392 0x00, 0x07, 0x6C, 0x18, // 00076C18
393 0x00, 0x07, 0x2C, 0x00, // 00072C00
394 0x00, 0x07, 0x7C, 0x04, // 00077C04
395 0x00, 0x07, 0x3C, 0x45, // 00073C45
396 0x00, 0x06, 0xB0, 0x20, // 0006B020
397 0x00, 0x04, 0x36, 0x00, // 00043600
398 0x00, 0x02, 0x12, 0x46, // 00021246
399 0x00, 0x07, 0x7C, 0x04, // 00077C04
400 0x00, 0x07, 0x3C, 0x4C, // 00073C4C
401 0x00, 0x00, 0x00, 0x00, // 00000000
402 0x00, 0x00, 0x00, 0x00, // 00000000
403 0x00, 0x00, 0x00, 0x00, // 00000000
404 0x00, 0x00, 0x00, 0x00, // 00000000
405 0x00, 0x0B, 0x52, 0x40, // 000B5240
406 0x00, 0x07, 0x44, 0x01, // 00074401
407 0x00, 0x07, 0x06, 0x66, // 00070666
408 0x00, 0x0B, 0x49, 0x40, // 000B4940
409 0x00, 0x00, 0x00, 0x00, // 00000000
410 0x00, 0x06, 0x94, 0x7F, // 0006947F
411 0x00, 0x06, 0x80, 0x1C, // 0006801C
412 0x00, 0x07, 0x88, 0x04, // 00078804
413 0x00, 0x07, 0x44, 0x01, // 00074401
414 0x00, 0x07, 0x06, 0x61, // 00070661
415 0x00, 0x0B, 0x49, 0x7F, // 000B497F
416 0x00, 0x00, 0x00, 0x00, // 00000000
417 0x00, 0x00, 0x00, 0x00, // 00000000
418 0x00, 0x06, 0x80, 0x1C, // 0006801C
419 0x00, 0x04, 0x14, 0x00, // 00041400
420 0x00, 0x0A, 0xC1, 0xC2, // 000AC1C2
421 0x00, 0x02, 0x9E, 0x08, // 00029E08
422 0x00, 0x02, 0x10, 0x70, // 00021070
423 0x00, 0x0A, 0xD2, 0x7E, // 000AD27E
424 0x00, 0x00, 0x00, 0x00, // 00000000
425 0x00, 0x00, 0x00, 0x00, // 00000000
426 0x00, 0x00, 0x00, 0x00, // 00000000
427 0x00, 0x07, 0x90, 0x04, // 00079004
428 0x00, 0x00, 0x00, 0x00, // 00000000
429 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
430 0x00, 0x07, 0x0C, 0x00, // 00070C00
431 0x00, 0x00, 0x00, 0x00, // 00000000
432 0x00, 0x0A, 0xC2, 0xC1, // 000AC2C1
433 0x00, 0x02, 0x9F, 0x08, // 00029F08
434 0x00, 0x02, 0x10, 0x85, // 00021085
435 0x00, 0x00, 0x00, 0x00, // 00000000
436 0x00, 0x00, 0x00, 0x00, // 00000000
437 0x00, 0x00, 0x00, 0x00, // 00000000
438 0x00, 0x00, 0x00, 0x00, // 00000000
439 0x00, 0x00, 0x00, 0x00, // 00000000
440 0x00, 0x00, 0x00, 0x00, // 00000000
441 0x00, 0x06, 0x00, 0x6D, // 0006006D
442 0x00, 0x00, 0x00, 0x00, // 00000000
443 0x00, 0x08, 0x00, 0x41, // 00080041
444 0x00, 0x00, 0x00, 0x00, // 00000000
445 0x00, 0x00, 0x00, 0x00, // 00000000
446 0x00, 0x00, 0x00, 0x00, // 00000000
447 0x00, 0x06, 0xC0, 0x6D, // 0006C06D
448 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
449 0x00, 0x07, 0x6C, 0x04, // 00076C04
450 0x00, 0x07, 0x2C, 0x7E, // 00072C7E
451 0x00, 0x00, 0x00, 0x00, // 00000000
452 0x00, 0x00, 0x00, 0x00, // 00000000
453 0x00, 0x00, 0x00, 0x00, // 00000000
454 0x00, 0x00, 0x00, 0x00, // 00000000
455 0x00, 0x02, 0x10, 0x54, // 00021054
456 0x00, 0x00, 0x00, 0x00, // 00000000
457 0x00, 0x00, 0x00, 0x00, // 00000000
458 0x00, 0x00, 0x00, 0x00, // 00000000
459 0x00, 0x00, 0x00, 0x00, // 00000000
460 0x00, 0x00, 0x00, 0x00, // 00000000
461 0x00, 0x00, 0x00, 0x00, // 00000000
462 0x00, 0x09, 0x80, 0x74, // 00098074
463 0x00, 0x07, 0x5C, 0x00, // 00075C00
464 0x00, 0x07, 0x1F, 0x00, // 00071F00
465 0x00, 0x08, 0x80, 0x42, // 00088042
466 0x00, 0x02, 0x9F, 0x10, // 00029F10
467 0x00, 0x02, 0x11, 0x51, // 00021151
468 0x00, 0x02, 0x81, 0x28, // 00028128
469 0x00, 0x0A, 0xC2, 0xC3, // 000AC2C3
470 0x00, 0x00, 0x00, 0x00, // 00000000
471 0x00, 0x09, 0x80, 0x78, // 00098078
472 0x00, 0x00, 0x00, 0x00, // 00000000
473 0x00, 0x08, 0x80, 0x42, // 00088042
474 0x00, 0x02, 0x9F, 0x10, // 00029F10
475 0x00, 0x02, 0x11, 0x51, // 00021151
476 0x00, 0x02, 0x81, 0x28, // 00028128
477 0x00, 0x07, 0x4C, 0x00, // 00074C00
478 0x00, 0x07, 0x0F, 0x00, // 00070F00
479 0x00, 0x07, 0x44, 0x01, // 00074401
480 0x00, 0x07, 0x06, 0x66, // 00070666
481 0x00, 0x07, 0x56, 0x00, // 00075600
482 0x00, 0x07, 0x14, 0x03, // 00071403
483 0x00, 0x06, 0x8C, 0x3B, // 00068C3B
484 0x00, 0x00, 0x00, 0x00, // 00000000
485 0x00, 0x06, 0x80, 0x1C, // 0006801C
486 0x00, 0x07, 0x90, 0x04, // 00079004
487 0x00, 0x07, 0x6C, 0x00, // 00076C00
488 0x00, 0x07, 0x2F, 0x00, // 00072F00
489 0x00, 0x07, 0x44, 0x00, // 00074400
490 0x00, 0x07, 0x04, 0x00, // 00070400
491 0x00, 0x0B, 0x49, 0x40, // 000B4940
492 0x00, 0x06, 0xAC, 0x05, // 0006AC05
493 0x00, 0x01, 0x41, 0x00, // 00014100
494 0x00, 0x06, 0x84, 0x1C, // 0006841C
495 0x00, 0x07, 0x8C, 0x0C, // 00078C0C
496 0x00, 0x07, 0x8C, 0x0C, // 00078C0C
497 0x00, 0x07, 0x5C, 0x01, // 00075C01
498 0x00, 0x07, 0x1C, 0x90, // 00071C90
499 0x00, 0x07, 0x54, 0x00, // 00075400
500 0x00, 0x07, 0x17, 0x00, // 00071700
501 0x00, 0x07, 0x64, 0x01, // 00076401
502 0x00, 0x07, 0x25, 0xFF, // 000725FF
503 0x00, 0x07, 0x4C, 0x00, // 00074C00
504 0x00, 0x07, 0x0C, 0x00, // 00070C00
505 0x00, 0x07, 0x6C, 0x00, // 00076C00
506 0x00, 0x07, 0x2C, 0x00, // 00072C00
507 0x00, 0x06, 0x9C, 0x25, // 00069C25
508 0x00, 0x06, 0x98, 0x2D, // 0006982D
509 0x00, 0x06, 0x94, 0x3C, // 0006943C
510 0x00, 0x06, 0xA4, 0x16, // 0006A416
511 0x00, 0x06, 0xA0, 0x16, // 0006A016
512 0x00, 0x06, 0x8C, 0x3B, // 00068C3B
513 0x00, 0x06, 0xAC, 0x24, // 0006AC24
514 0x00, 0x07, 0x4C, 0x01, // 00074C01
515 0x00, 0x07, 0x0F, 0x00, // 00070F00
516 0x00, 0x0B, 0x52, 0x6F, // 000B526F
517 0x00, 0x07, 0x5C, 0x00, // 00075C00
518 0x00, 0x07, 0x1E, 0x90, // 00071E90
519 0x00, 0x00, 0x00, 0x00, // 00000000
520 0x00, 0x06, 0x88, 0x1E, // 0006881E
521 0x00, 0x06, 0x90, 0x15, // 00069015
522 0x00, 0x06, 0x98, 0x1F, // 0006981F
523 0x00, 0x0B, 0x40, 0x40, // 000B4040
524 0x00, 0x00, 0x00, 0x00, // 00000000
525 0x00, 0x00, 0x00, 0x00, // 00000000
526 0x00, 0x00, 0x00, 0x00, // 00000000
527 0x00, 0x06, 0x84, 0x6F, // 0006846F
528 0x00, 0x06, 0x84, 0x70, // 00068470
529 0x00, 0x04, 0x05, 0x10, // 00040510
530 0x00, 0x07, 0x74, 0x01, // 00077401
531 0x00, 0x07, 0x36, 0x63, // 00073663
532 0x00, 0x02, 0x12, 0x57, // 00021257
533 0x00, 0x06, 0x80, 0x1C, // 0006801C
534 0x00, 0x04, 0x2C, 0x08, // 00042C08
535 0x00, 0x07, 0x7C, 0x04, // 00077C04
536 0x00, 0x07, 0x3C, 0xD2, // 00073CD2
537 0x00, 0x06, 0xB0, 0x22, // 0006B022
538 0x00, 0x04, 0x37, 0x08, // 00043708
539 0x00, 0x04, 0x14, 0x20, // 00041420
540 0x00, 0x04, 0x07, 0x00, // 00040700
541 0x00, 0x07, 0x66, 0x00, // 00076600
542 0x00, 0x07, 0x24, 0x00, // 00072400
543 0x00, 0x07, 0x5C, 0x80, // 00075C80
544 0x00, 0x07, 0x1C, 0x00, // 00071C00
545 0x00, 0x07, 0x7C, 0x00, // 00077C00
546 0x00, 0x07, 0x3D, 0x00, // 00073D00
547 0x00, 0x0A, 0xC8, 0xC4, // 000AC8C4
548 0x00, 0x02, 0x9F, 0x08, // 00029F08
549 0x00, 0x08, 0x36, 0xC4, // 000836C4
550 0x00, 0x0A, 0xC8, 0xC3, // 000AC8C3
551 0x00, 0x02, 0x9F, 0x08, // 00029F08
552 0x00, 0x08, 0x12, 0x41, // 00081241
553 0x00, 0x0A, 0xC8, 0xC7, // 000AC8C7
554 0x00, 0x02, 0x9F, 0x08, // 00029F08
555 0x00, 0x0B, 0x52, 0x40, // 000B5240
556 0x00, 0x02, 0x12, 0x46, // 00021246
557 0x00, 0x09, 0x92, 0x51, // 00099251
558 0x00, 0x08, 0x36, 0xC2, // 000836C2
559 0x00, 0x07, 0x7C, 0x04, // 00077C04
560 0x00, 0x07, 0x3C, 0xEA, // 00073CEA
561 0x00, 0x06, 0xAC, 0x6D, // 0006AC6D
562 0x00, 0x06, 0xAC, 0x6C, // 0006AC6C
563 0x00, 0x0B, 0x7F, 0x7F, // 000B7F7F
564 0x00, 0x09, 0xB6, 0x7D, // 0009B67D
565 0x00, 0x0A, 0x3F, 0x53, // 000A3F53
566 0x00, 0x07, 0x64, 0x00, // 00076400
567 0x00, 0x0A, 0xF6, 0x43, // 000AF643
568 0x00, 0x07, 0x24, 0x00, // 00072400
569 0x00, 0x07, 0x54, 0x00, // 00075400
570 0x00, 0x07, 0x14, 0x00, // 00071400
571 0x00, 0x07, 0x5C, 0x00, // 00075C00
572 0x00, 0x07, 0x1F, 0x18, // 00071F18
573 0x00, 0x07, 0x6C, 0x04, // 00076C04
574 0x00, 0x07, 0x2C, 0x00, // 00072C00
575 0x00, 0x04, 0x0C, 0x08, // 00040C08
576 0x00, 0x08, 0xB6, 0x41, // 0008B641
577 0x00, 0x0A, 0x09, 0xC6, // 000A09C6
578 0x00, 0x08, 0x8F, 0xC1, // 00088FC1
579 0x00, 0x00, 0x00, 0x00, // 00000000
580 0x00, 0x0C, 0x09, 0x25, // 000C0925
581 0x00, 0x07, 0x44, 0x00, // 00074400
582 0x00, 0x07, 0x04, 0x00, // 00070400
583 0x00, 0x06, 0x98, 0x53, // 00069853
584 0x00, 0x06, 0x90, 0x2C, // 0006902C
585 0x00, 0x06, 0xA4, 0x24, // 0006A424
586 0x00, 0x06, 0x80, 0x53, // 00068053
587 0x00, 0x06, 0x88, 0x54, // 00068854
588 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
589 0x00, 0x07, 0x0C, 0x00, // 00070C00
590 0x00, 0x06, 0x14, 0x6F, // 0006146F
591 0x00, 0x06, 0x00, 0x52, // 00060052
592 0x00, 0x08, 0x12, 0x41, // 00081241
593 0x00, 0x06, 0x1C, 0x70, // 00061C70
594 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
595 0x00, 0x02, 0x9F, 0x38, // 00029F38
596 0x00, 0x0A, 0x09, 0x74, // 000A0974
597 0x00, 0x00, 0x00, 0x00, // 00000000
598 0x00, 0x0A, 0xC9, 0x43, // 000AC943
599 0x00, 0x00, 0x00, 0x00, // 00000000
600 0x00, 0x08, 0xA1, 0x42, // 0008A142
601 0x00, 0x02, 0x9E, 0x08, // 00029E08
602 0x00, 0x08, 0x1B, 0x41, // 00081B41
603 0x00, 0x00, 0x00, 0x00, // 00000000
604 0x00, 0x00, 0x00, 0x00, // 00000000
605 0x00, 0x06, 0x94, 0x6F, // 0006946F
606 0x00, 0x06, 0x9C, 0x70, // 00069C70
607 0x00, 0x06, 0x00, 0x6D, // 0006006D
608 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
609 0x00, 0x0B, 0x00, 0x41, // 000B0041
610 0x00, 0x07, 0x6C, 0x04, // 00076C04
611 0x00, 0x07, 0x2D, 0x1E, // 00072D1E
612 0x00, 0x00, 0x00, 0x00, // 00000000
613 0x00, 0x06, 0x80, 0x6D, // 0006806D
614 0x00, 0x00, 0x00, 0x00, // 00000000
615 0x00, 0x06, 0x04, 0x24, // 00060424
616 0x00, 0x07, 0x54, 0x01, // 00075401
617 0x00, 0x07, 0x16, 0x61, // 00071661
618 0x00, 0x08, 0x8C, 0x80, // 00088C80
619 0x00, 0x02, 0x89, 0x10, // 00028910
620 0x00, 0x02, 0x11, 0x03, // 00021103
621 0x00, 0x02, 0x81, 0x28, // 00028128
622 0x00, 0x06, 0x90, 0x22, // 00069022
623 0x00, 0x04, 0x07, 0x00, // 00040700
624 0x00, 0x07, 0x54, 0x0C, // 0007540C
625 0x00, 0x07, 0x14, 0x00, // 00071400
626 0x00, 0x0A, 0xD8, 0x7E, // 000AD87E
627 0x00, 0x0A, 0xC8, 0x41, // 000AC841
628 0x00, 0x02, 0x9F, 0x20, // 00029F20
629 0x00, 0x0A, 0xC8, 0xC2, // 000AC8C2
630 0x00, 0x02, 0x9E, 0x10, // 00029E10
631 0x00, 0x02, 0x10, 0x08, // 00021008
632 0x00, 0x02, 0x81, 0x28, // 00028128
633 0x00, 0x07, 0x98, 0x07, // 00079807
634 0x00, 0x06, 0x04, 0x6F, // 0006046F
635 0x00, 0x06, 0x0C, 0x70, // 00060C70
636 0x00, 0x0A, 0x10, 0x7D, // 000A107D
637 0x00, 0x08, 0x90, 0xC2, // 000890C2
638 0x00, 0x08, 0x99, 0xC2, // 000899C2
639 0x00, 0x02, 0x86, 0x10, // 00028610
640 0x00, 0x02, 0x10, 0xC2, // 000210C2
641 0x00, 0x02, 0x81, 0x28, // 00028128
642 0x00, 0x07, 0x4C, 0x01, // 00074C01
643 0x00, 0x07, 0x0E, 0x6B, // 00070E6B
644 0x00, 0x0B, 0x52, 0x50, // 000B5250
645 0x00, 0x00, 0x00, 0x00, // 00000000
646 0x00, 0x00, 0x00, 0x00, // 00000000
647 0x00, 0x06, 0x88, 0x1C, // 0006881C
648 0x00, 0x0A, 0xCC, 0x82, // 000ACC82
649 0x00, 0x04, 0x1D, 0x88, // 00041D88
650 0x00, 0x04, 0x1D, 0x00, // 00041D00
651 0x00, 0x08, 0x09, 0xC3, // 000809C3
652 0x00, 0x00, 0x00, 0x00, // 00000000
653 0x00, 0x00, 0x00, 0x00, // 00000000
654 0x00, 0x00, 0x00, 0x00, // 00000000
655 0x00, 0x07, 0x88, 0x04, // 00078804
656 0x00, 0x07, 0x44, 0x01, // 00074401
657 0x00, 0x07, 0x06, 0x90, // 00070690
658 0x00, 0x07, 0x4C, 0x00, // 00074C00
659 0x00, 0x07, 0x0F, 0x00, // 00070F00
660 0x00, 0x07, 0x54, 0x00, // 00075400
661 0x00, 0x07, 0x17, 0x18, // 00071718
662 0x00, 0x06, 0x80, 0x1F, // 0006801F
663 0x00, 0x06, 0x8C, 0x3B, // 00068C3B
664 0x00, 0x00, 0x00, 0x00, // 00000000
665 0x00, 0x06, 0x90, 0x53, // 00069053
666 0x00, 0x07, 0x4C, 0x01, // 00074C01
667 0x00, 0x07, 0x0E, 0x65, // 00070E65
668 0x00, 0x0B, 0x52, 0x40, // 000B5240
669 0x00, 0x07, 0x64, 0x01, // 00076401
670 0x00, 0x07, 0x26, 0x68, // 00072668
671 0x00, 0x06, 0x88, 0x20, // 00068820
672 0x00, 0x07, 0x90, 0x06, // 00079006
673 0x00, 0x06, 0x94, 0x7F, // 0006947F
674 0x00, 0x06, 0xA0, 0x22, // 0006A022
675 0x00, 0x07, 0x90, 0x07, // 00079007
676 0x00, 0x07, 0x4C, 0x01, // 00074C01
677 0x00, 0x07, 0x0E, 0x6B, // 00070E6B
678 0x00, 0x00, 0x00, 0x00, // 00000000
679 0x00, 0x00, 0x00, 0x00, // 00000000
680 0x00, 0x00, 0x00, 0x00, // 00000000
681 0x00, 0x06, 0x88, 0x20, // 00068820
682 0x00, 0x04, 0x0E, 0x00, // 00040E00
683 0x00, 0x07, 0x5C, 0x00, // 00075C00
684 0x00, 0x07, 0x1C, 0x40, // 00071C40
685 0x00, 0x0B, 0x40, 0x7F, // 000B407F
686 0x00, 0x0A, 0xD1, 0xC3, // 000AD1C3
687 0x00, 0x02, 0x9F, 0x08, // 00029F08
688 0x00, 0x0B, 0x40, 0x40, // 000B4040
689 0x00, 0x00, 0x00, 0x00, // 00000000
690 0x00, 0x00, 0x00, 0x00, // 00000000
691 0x00, 0x00, 0x00, 0x00, // 00000000
692 0x00, 0x06, 0x80, 0x6A, // 0006806A
693 0x00, 0x07, 0x5C, 0x00, // 00075C00
694 0x00, 0x07, 0x1C, 0x20, // 00071C20
695 0x00, 0x0B, 0x40, 0x40, // 000B4040
696 0x00, 0x0A, 0xD1, 0xC3, // 000AD1C3
697 0x00, 0x02, 0x9F, 0x08, // 00029F08
698 0x00, 0x0B, 0x40, 0x7F, // 000B407F
699 0x00, 0x00, 0x00, 0x00, // 00000000
700 0x00, 0x00, 0x00, 0x00, // 00000000
701 0x00, 0x00, 0x00, 0x00, // 00000000
702 0x00, 0x06, 0x80, 0x6C, // 0006806C
703 0x00, 0x07, 0x5C, 0x00, // 00075C00
704 0x00, 0x07, 0x1C, 0x10, // 00071C10
705 0x00, 0x0B, 0x40, 0x40, // 000B4040
706 0x00, 0x0A, 0xD1, 0xC3, // 000AD1C3
707 0x00, 0x02, 0x9F, 0x08, // 00029F08
708 0x00, 0x0B, 0x40, 0x7F, // 000B407F
709 0x00, 0x00, 0x00, 0x00, // 00000000
710 0x00, 0x00, 0x00, 0x00, // 00000000
711 0x00, 0x00, 0x00, 0x00, // 00000000
712 0x00, 0x06, 0x80, 0x76, // 00068076
713 0x00, 0x07, 0x5C, 0x01, // 00075C01
714 0x00, 0x07, 0x1E, 0x67, // 00071E67
715 0x00, 0x07, 0x44, 0x01, // 00074401
716 0x00, 0x07, 0x06, 0xE4, // 000706E4
717 0x00, 0x0A, 0xD1, 0x4F, // 000AD14F
718 0x00, 0x08, 0x10, 0xC2, // 000810C2
719 0x00, 0x00, 0x00, 0x00, // 00000000
720 0x00, 0x06, 0x98, 0x1C, // 0006981C
721 0x00, 0x07, 0x90, 0x04, // 00079004
722 0x00, 0x06, 0x90, 0x1C, // 0006901C
723 0x00, 0x04, 0x14, 0x00, // 00041400
724 0x00, 0x00, 0x00, 0x00, // 00000000
725 0x00, 0x00, 0x00, 0x00, // 00000000
726 0x00, 0x00, 0x00, 0x00, // 00000000
727 0x00, 0x06, 0x90, 0x22, // 00069022
728 0x00, 0x04, 0x2F, 0x08, // 00042F08
729 0x00, 0x07, 0x44, 0x01, // 00074401
730 0x00, 0x07, 0x06, 0x61, // 00070661
731 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
732 0x00, 0x07, 0x0F, 0x00, // 00070F00
733 0x00, 0x07, 0x54, 0x08, // 00075408
734 0x00, 0x07, 0x16, 0x00, // 00071600
735 0x00, 0x06, 0x80, 0x1C, // 0006801C
736 0x00, 0x0A, 0xCC, 0x81, // 000ACC81
737 0x00, 0x08, 0x92, 0xC1, // 000892C1
738 0x00, 0x02, 0x9E, 0x10, // 00029E10
739 0x00, 0x02, 0x11, 0xBD, // 000211BD
740 0x00, 0x02, 0x81, 0x28, // 00028128
741 0x00, 0x07, 0x74, 0x01, // 00077401
742 0x00, 0x02, 0x12, 0x57, // 00021257
743 0x00, 0x07, 0x36, 0x63, // 00073663
744 0x00, 0x00, 0x00, 0x00, // 00000000
745 0x00, 0x07, 0x7C, 0x04, // 00077C04
746 0x00, 0x07, 0x3D, 0xA4, // 00073DA4
747 0x00, 0x06, 0xB0, 0x20, // 0006B020
748 0x00, 0x04, 0x36, 0x08, // 00043608
749 0x00, 0x04, 0x17, 0x08, // 00041708
750 0x00, 0x04, 0x06, 0x00, // 00040600
751 0x00, 0x07, 0x66, 0x00, // 00076600
752 0x00, 0x07, 0x24, 0x00, // 00072400
753 0x00, 0x07, 0x5C, 0x80, // 00075C80
754 0x00, 0x07, 0x1C, 0x00, // 00071C00
755 0x00, 0x07, 0x7C, 0x00, // 00077C00
756 0x00, 0x07, 0x3D, 0x00, // 00073D00
757 0x00, 0x0A, 0xC8, 0xC4, // 000AC8C4
758 0x00, 0x02, 0x9F, 0x08, // 00029F08
759 0x00, 0x08, 0x36, 0xC4, // 000836C4
760 0x00, 0x0A, 0xC8, 0xC3, // 000AC8C3
761 0x00, 0x02, 0x9F, 0x08, // 00029F08
762 0x00, 0x08, 0x12, 0x41, // 00081241
763 0x00, 0x0A, 0xC8, 0xC7, // 000AC8C7
764 0x00, 0x02, 0x9F, 0x08, // 00029F08
765 0x00, 0x0B, 0x52, 0x40, // 000B5240
766 0x00, 0x00, 0x00, 0x00, // 00000000
767 0x00, 0x02, 0x12, 0x46, // 00021246
768 0x00, 0x09, 0x92, 0x51, // 00099251
769 0x00, 0x08, 0x36, 0xC2, // 000836C2
770 0x00, 0x07, 0x7C, 0x04, // 00077C04
771 0x00, 0x07, 0x3D, 0xBF, // 00073DBF
772 0x00, 0x06, 0xAC, 0x6D, // 0006AC6D
773 0x00, 0x06, 0xAC, 0x6C, // 0006AC6C
774 0x00, 0x04, 0x06, 0x08, // 00040608
775 0x00, 0x04, 0x07, 0x08, // 00040708
776 0x00, 0x07, 0x4C, 0x01, // 00074C01
777 0x00, 0x07, 0x0E, 0x62, // 00070E62
778 0x00, 0x07, 0x54, 0x00, // 00075400
779 0x00, 0x07, 0x14, 0x2D, // 0007142D
780 0x00, 0x00, 0x00, 0x00, // 00000000
781 0x00, 0x06, 0x88, 0x1C, // 0006881C
782 0x00, 0x04, 0x0C, 0x00, // 00040C00
783 0x00, 0x0A, 0xD2, 0xC1, // 000AD2C1
784 0x00, 0x00, 0x00, 0x00, // 00000000
785 0x00, 0x00, 0x00, 0x00, // 00000000
786 0x00, 0x00, 0x00, 0x00, // 00000000
787 0x00, 0x06, 0x90, 0x4F, // 0006904F
788 0x00, 0x06, 0x94, 0x77, // 00069477
789 0x00, 0x07, 0x44, 0x01, // 00074401
790 0x00, 0x07, 0x06, 0x39, // 00070639
791 0x00, 0x07, 0x4C, 0x01, // 00074C01
792 0x00, 0x07, 0x0E, 0x61, // 00070E61
793 0x00, 0x07, 0x54, 0x12, // 00075412
794 0x00, 0x07, 0x14, 0x30, // 00071430
795 0x00, 0x06, 0x84, 0x1C, // 0006841C
796 0x00, 0x07, 0x5C, 0x00, // 00075C00
797 0x00, 0x07, 0x1C, 0x00, // 00071C00
798 0x00, 0x06, 0x88, 0x1C, // 0006881C
799 0x00, 0x04, 0x0C, 0x00, // 00040C00
800 0x00, 0x04, 0x27, 0x08, // 00042708
801 0x00, 0x04, 0x37, 0x08, // 00043708
802 0x00, 0x09, 0xAC, 0x7F, // 0009AC7F
803 0x00, 0x0A, 0xC1, 0x50, // 000AC150
804 0x00, 0x02, 0x9E, 0x08, // 00029E08
805 0x00, 0x0A, 0x24, 0x7F, // 000A247F
806 0x00, 0x0A, 0xC9, 0xC2, // 000AC9C2
807 0x00, 0x08, 0x0B, 0xC1, // 00080BC1
808 0x00, 0x00, 0x00, 0x00, // 00000000
809 0x00, 0x07, 0xA4, 0x00, // 0007A400
810 0x00, 0x0B, 0x40, 0x40, // 000B4040
811 0x00, 0x07, 0x8C, 0x00, // 00078C00
812 0x00, 0x07, 0xAC, 0x00, // 0007AC00
813 0x00, 0x04, 0xA8, 0x00, // 0004A800
814 0x00, 0x07, 0xB4, 0x00, // 0007B400
815 0x00, 0x06, 0x84, 0x45, // 00068445
816 0x00, 0x06, 0x84, 0x46, // 00068446
817 0x00, 0x07, 0x54, 0x01, // 00075401
818 0x00, 0x07, 0x16, 0x40, // 00071640
819 0x00, 0x07, 0x64, 0x00, // 00076400
820 0x00, 0x07, 0x26, 0x90, // 00072690
821 0x00, 0x0B, 0x49, 0x75, // 000B4975
822 0x00, 0x06, 0x94, 0x1E, // 0006941E
823 0x00, 0x00, 0x00, 0x00, // 00000000
824 0x00, 0x06, 0xA4, 0x1F, // 0006A41F
825 0x00, 0x06, 0x8C, 0x15, // 00068C15
826 0x00, 0x07, 0x44, 0x01, // 00074401
827 0x00, 0x07, 0x06, 0x6A, // 0007066A
828 0x00, 0x04, 0x0F, 0x08, // 00040F08
829 0x00, 0x04, 0x17, 0x08, // 00041708
830 0x00, 0x04, 0x1F, 0x08, // 00041F08
831 0x00, 0x04, 0x27, 0x08, // 00042708
832 0x00, 0x04, 0x2F, 0x08, // 00042F08
833 0x00, 0x06, 0x80, 0x22, // 00068022
834 0x00, 0x04, 0x07, 0x00, // 00040700
835 0x00, 0x06, 0xA4, 0x65, // 0006A465
836 0x00, 0x00, 0x00, 0x00, // 00000000
837 0x00, 0x00, 0x00, 0x00, // 00000000
838 0x00, 0x07, 0x84, 0x0D, // 0007840D
839 0x00, 0x07, 0x8C, 0x5D, // 00078C5D
840 0x00, 0x06, 0xAC, 0x79, // 0006AC79
841 0x00, 0x07, 0x44, 0x01, // 00074401
842 0x00, 0x07, 0x06, 0x6C, // 0007066C
843 0x00, 0x0B, 0x76, 0x41, // 000B7641
844 0x00, 0x00, 0x00, 0x00, // 00000000
845 0x00, 0x00, 0x00, 0x00, // 00000000
846 0x00, 0x06, 0x80, 0x22, // 00068022
847 0x00, 0x0C, 0x0B, 0x0D, // 000C0B0D
848 0x00, 0x0C, 0x13, 0x0D, // 000C130D
849 0x00, 0x0C, 0x1B, 0x0D, // 000C1B0D
850 0x00, 0x0C, 0x23, 0x0D, // 000C230D
851 0x00, 0x00, 0x00, 0x00, // 00000000
852 0x00, 0x00, 0x00, 0x00, // 00000000
853 0x00, 0x06, 0xB4, 0x6A, // 0006B46A
854 0x00, 0x06, 0x8C, 0x66, // 00068C66
855 0x00, 0x06, 0x94, 0x67, // 00069467
856 0x00, 0x06, 0x9C, 0x68, // 00069C68
857 0x00, 0x06, 0xA4, 0x69, // 0006A469
858 0x00, 0x07, 0x64, 0x01, // 00076401
859 0x00, 0x07, 0x27, 0x12, // 00072712
860 0x00, 0x06, 0x80, 0x22, // 00068022
861 0x00, 0x04, 0x03, 0x00, // 00040300
862 0x00, 0x04, 0x0B, 0x00, // 00040B00
863 0x00, 0x04, 0x13, 0x00, // 00041300
864 0x00, 0x04, 0x1B, 0x00, // 00041B00
865 0x00, 0x06, 0xA0, 0x22, // 0006A022
866 0x00, 0x07, 0x80, 0x0F, // 0007800F
867 0x00, 0x07, 0x88, 0x0F, // 0007880F
868 0x00, 0x07, 0x90, 0x0F, // 0007900F
869 0x00, 0x07, 0x98, 0x07, // 00079807
870 0x00, 0x00, 0x00, 0x00, // 00000000
871 0x00, 0x07, 0x44, 0x01, // 00074401
872 0x00, 0x07, 0x06, 0x61, // 00070661
873 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
874 0x00, 0x07, 0x0C, 0x00, // 00070C00
875 0x00, 0x00, 0x00, 0x00, // 00000000
876 0x00, 0x06, 0x80, 0x1C, // 0006801C
877 0x00, 0x0A, 0xC4, 0x81, // 000AC481
878 0x00, 0x00, 0x00, 0x00, // 00000000
879 0x00, 0x09, 0x80, 0x74, // 00098074
880 0x00, 0x00, 0x00, 0x00, // 00000000
881 0x00, 0x0B, 0x52, 0x40, // 000B5240
882 0x00, 0x07, 0x5C, 0x01, // 00075C01
883 0x00, 0x07, 0x1E, 0x66, // 00071E66
884 0x00, 0x07, 0x64, 0x04, // 00076404
885 0x00, 0x07, 0x24, 0x08, // 00072408
886 0x00, 0x08, 0x88, 0x41, // 00088841
887 0x00, 0x02, 0x9E, 0x08, // 00029E08
888 0x00, 0x02, 0x12, 0x8F, // 0002128F
889 0x00, 0x07, 0x56, 0x00, // 00075600
890 0x00, 0x07, 0x14, 0x01, // 00071401
891 0x00, 0x06, 0xA0, 0x08, // 0006A008
892 0x00, 0x00, 0x00, 0x00, // 00000000
893 0x00, 0x06, 0x98, 0x20, // 00069820
894 0x00, 0x07, 0x90, 0x06, // 00079006
895 0x00, 0x08, 0x98, 0x42, // 00089842
896 0x00, 0x02, 0x9E, 0x08, // 00029E08
897 0x00, 0x02, 0x18, 0x00, // 00021800
898 0x00, 0x07, 0x56, 0x00, // 00075600
899 0x00, 0x07, 0x14, 0x02, // 00071402
900 0x00, 0x00, 0x00, 0x00, // 00000000
901 0x00, 0x00, 0x00, 0x00, // 00000000
902 0x00, 0x00, 0x00, 0x00, // 00000000
903 0x00, 0x07, 0x90, 0x06, // 00079006
904 0x00, 0x02, 0x10, 0x54, // 00021054
905 0x00, 0x00, 0x00, 0x00, // 00000000
906 0x00, 0x00, 0x00, 0x00, // 00000000
907 0x00, 0x00, 0x00, 0x00, // 00000000
908 0x00, 0x00, 0x00, 0x00, // 00000000
909 0x00, 0x00, 0x00, 0x00, // 00000000
910 0x00, 0x00, 0x00, 0x00, // 00000000
911 0x00, 0x0B, 0x64, 0x68, // 000B6468
912 0x00, 0x0A, 0xBE, 0xC4, // 000ABEC4
913 0x00, 0x09, 0xA4, 0x46, // 0009A446
914 0x00, 0x0B, 0x7F, 0xC7, // 000B7FC7
915 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
916 0x00, 0x00, 0x00, 0x00, // 00000000
917 0x00, 0x06, 0xA4, 0x05, // 0006A405
918 0x00, 0x06, 0xBC, 0x0D, // 0006BC0D
919 0x00, 0x01, 0x41, 0x00, // 00014100
920 0x00, 0x06, 0xAC, 0x0F, // 0006AC0F
921 0x00, 0x00, 0x00, 0x00, // 00000000
922 0x00, 0x00, 0x00, 0x00, // 00000000
923 0x00, 0x00, 0xC1, 0x87, // 0000C187
924 0x00, 0x06, 0xB4, 0x0D, // 0006B40D
925 0x00, 0x00, 0x00, 0x00, // 00000000
926 0x00, 0x00, 0x00, 0x00, // 00000000
927 0x00, 0x00, 0x00, 0x00, // 00000000
928 0x00, 0x09, 0xBD, 0x4A, // 0009BD4A
929 0x00, 0x09, 0xB6, 0x7C, // 0009B67C
930 0x00, 0x0A, 0xE4, 0x40, // 000AE440
931 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
932 0x00, 0x07, 0x6F, 0xFF, // 00076FFF
933 0x00, 0x07, 0x2F, 0xFF, // 00072FFF
934 0x00, 0x01, 0x03, 0xA6, // 000103A6
935 0x00, 0x0A, 0x2D, 0x7C, // 000A2D7C
936 0x00, 0x09, 0xA4, 0x41, // 0009A441
937 0x00, 0x09, 0xBF, 0x41, // 0009BF41
938 0x00, 0x08, 0xE4, 0xC5, // 0008E4C5
939 0x00, 0x09, 0x1E, 0xC4, // 00091EC4
940 0x00, 0x02, 0x87, 0x10, // 00028710
941 0x00, 0x0A, 0xE3, 0xC3, // 000AE3C3
942 0x00, 0x08, 0xBF, 0xC5, // 0008BFC5
943 0x00, 0x07, 0x75, 0xD9, // 000775D9
944 0x00, 0x07, 0x36, 0x23, // 00073623
945 0x00, 0x09, 0xA7, 0x40, // 0009A740
946 0x00, 0x07, 0x6D, 0x14, // 00076D14
947 0x00, 0x0C, 0x36, 0x27, // 000C3627
948 0x00, 0x07, 0x2F, 0x2C, // 00072F2C
949 0x00, 0x0B, 0x7D, 0x75, // 000B7D75
950 0x00, 0x08, 0xAD, 0xC4, // 0008ADC4
951 0x00, 0x00, 0xC7, 0x87, // 0000C787
952 0x00, 0x0A, 0x6E, 0xC6, // 000A6EC6
953 0x00, 0x09, 0xA4, 0x44, // 0009A444
954 0x00, 0x08, 0xAD, 0x41, // 0008AD41
955 0x00, 0x09, 0xA4, 0xC5, // 0009A4C5
956 0x00, 0x09, 0xAD, 0x43, // 0009AD43
957 0x00, 0x09, 0xB4, 0x6D, // 0009B46D
958 0x00, 0x09, 0xA4, 0x49, // 0009A449
959 0x00, 0x0A, 0xF6, 0x7F, // 000AF67F
960 0x00, 0x0A, 0x24, 0x77, // 000A2477
961 0x00, 0x02, 0x86, 0x30, // 00028630
962 0x00, 0x08, 0x36, 0x41, // 00083641
963 0x00, 0x08, 0xBE, 0x48, // 0008BE48
964 0x00, 0x02, 0x87, 0x18, // 00028718
965 0x00, 0x09, 0xA4, 0x49, // 0009A449
966 0x00, 0x08, 0xB6, 0x41, // 0008B641
967 0x00, 0x09, 0xA4, 0x77, // 0009A477
968 0x00, 0x0B, 0x7F, 0x74, // 000B7F74
969 0x00, 0x08, 0xB6, 0x44, // 0008B644
970 0x00, 0x02, 0x9E, 0x20, // 00029E20
971 0x00, 0x0B, 0x5B, 0x41, // 000B5B41
972 0x00, 0x08, 0x36, 0x41, // 00083641
973 0x00, 0x09, 0x9B, 0x53, // 00099B53
974 0x00, 0x08, 0x24, 0xC3, // 000824C3
975 0x00, 0x08, 0xB6, 0x41, // 0008B641
976 0x00, 0x00, 0xC7, 0x87, // 0000C787
977 0x00, 0x00, 0xC1, 0x07, // 0000C107
978 0x00, 0x09, 0xB6, 0x4F, // 0009B64F
979 0x00, 0x08, 0x35, 0xC6, // 000835C6
980 0x00, 0x0B, 0x3F, 0xC7, // 000B3FC7
981 0x00, 0x0A, 0xEC, 0xC4, // 000AECC4
982 0x00, 0x00, 0x00, 0x00, // 00000000
983 0x00, 0x00, 0x00, 0x00, // 00000000
984 0x00, 0x07, 0x44, 0x01, // 00074401
985 0x00, 0x07, 0x06, 0x61, // 00070661
986 0x00, 0x07, 0x4C, 0x00, // 00074C00
987 0x00, 0x07, 0x0D, 0x00, // 00070D00
988 0x00, 0x0B, 0x52, 0x40, // 000B5240
989 0x00, 0x06, 0x80, 0x22, // 00068022
990 0x00, 0x04, 0x07, 0x00, // 00040700
991 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
992 0x00, 0x02, 0x9F, 0x08, // 00029F08
993 0x00, 0x0B, 0x52, 0x7F, // 000B527F
994 0x00, 0x07, 0x5C, 0x01, // 00075C01
995 0x00, 0x07, 0x1E, 0x69, // 00071E69
996 0x00, 0x0B, 0x64, 0x7F, // 000B647F
997 0x00, 0x06, 0x90, 0x78, // 00069078
998 0x00, 0x0B, 0x6D, 0x7E, // 000B6D7E
999 0x00, 0x06, 0x98, 0x22, // 00069822
1000 0x00, 0x0A, 0xDF, 0x84, // 000ADF84
1001 0x00, 0x0A, 0xDF, 0x85, // 000ADF85
1002 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
1003 0x00, 0x00, 0x00, 0x00, // 00000000
1004 0x00, 0x06, 0x98, 0x77, // 00069877
1005 0x00, 0x06, 0x98, 0x7A, // 0006987A
1006 0x00, 0x06, 0xB8, 0x68, // 0006B868
1007 0x00, 0x06, 0xB8, 0x69, // 0006B869
1008 0x00, 0x06, 0xB8, 0x6F, // 0006B86F
1009 0x00, 0x06, 0xB8, 0x70, // 0006B870
1010 0x00, 0x06, 0xB8, 0x71, // 0006B871
1011 0x00, 0x06, 0xB8, 0x72, // 0006B872
1012 0x00, 0x06, 0xB8, 0x73, // 0006B873
1013 0x00, 0x06, 0xB8, 0x74, // 0006B874
1014 0x00, 0x06, 0xB8, 0x75, // 0006B875
1015 0x00, 0x00, 0x00, 0x00, // 00000000
1016 0x00, 0x06, 0x28, 0x6A, // 0006286A
1017 0x00, 0x00, 0x00, 0x00, // 00000000
1018 0x00, 0x00, 0x00, 0x00, // 00000000
1019 0x00, 0x00, 0x00, 0x00, // 00000000
1020 0x00, 0x06, 0xA8, 0x61, // 0006A861
1021 0x00, 0x07, 0x65, 0x5D, // 0007655D
1022 0x00, 0x07, 0x24, 0x10, // 00072410
1023 0x00, 0x06, 0x30, 0x6C, // 0006306C
1024 0x00, 0x07, 0x6D, 0x59, // 00076D59
1025 0x00, 0x07, 0x2C, 0x50, // 00072C50
1026 0x00, 0x08, 0xB6, 0x40, // 0008B640
1027 0x00, 0x02, 0x9F, 0x20, // 00029F20
1028 0x00, 0x07, 0x65, 0x05, // 00076505
1029 0x00, 0x07, 0x25, 0x70, // 00072570
1030 0x00, 0x07, 0x6D, 0x15, // 00076D15
1031 0x00, 0x07, 0x2D, 0x60, // 00072D60
1032 0x00, 0x00, 0x00, 0x00, // 00000000
1033 0x00, 0x00, 0x00, 0x00, // 00000000
1034 0x00, 0x06, 0xA0, 0x66, // 0006A066
1035 0x00, 0x06, 0xA8, 0x67, // 0006A867
1036 0x00, 0x07, 0x5C, 0x00, // 00075C00
1037 0x00, 0x07, 0x1C, 0x20, // 00071C20
1038 0x00, 0x07, 0x7C, 0x01, // 00077C01
1039 0x00, 0x07, 0x3D, 0xFF, // 00073DFF
1040 0x00, 0x07, 0x54, 0x00, // 00075400
1041 0x00, 0x07, 0x14, 0x00, // 00071400
1042 0x00, 0x07, 0x4C, 0x01, // 00074C01
1043 0x00, 0x07, 0x0E, 0x00, // 00070E00
1044 0x00, 0x07, 0x74, 0x01, // 00077401
1045 0x00, 0x07, 0x35, 0xFF, // 000735FF
1046 0x00, 0x07, 0x64, 0x00, // 00076400
1047 0x00, 0x07, 0x26, 0x98, // 00072698
1048 0x00, 0x07, 0x6C, 0x01, // 00076C01
1049 0x00, 0x07, 0x2C, 0x90, // 00072C90
1050 0x00, 0x07, 0x44, 0x00, // 00074400
1051 0x00, 0x07, 0x04, 0x90, // 00070490
1052 0x00, 0x07, 0x5C, 0x00, // 00075C00
1053 0x00, 0x07, 0x1C, 0x00, // 00071C00
1054 0x00, 0x06, 0x98, 0x15, // 00069815
1055 0x00, 0x06, 0xB8, 0x16, // 0006B816
1056 0x00, 0x06, 0xB4, 0x14, // 0006B414
1057 0x00, 0x06, 0x88, 0x28, // 00068828
1058 0x00, 0x06, 0x88, 0x22, // 00068822
1059 0x00, 0x06, 0x90, 0x2E, // 0006902E
1060 0x00, 0x06, 0x90, 0x1C, // 0006901C
1061 0x00, 0x06, 0x90, 0x20, // 00069020
1062 0x00, 0x06, 0x9C, 0x1C, // 00069C1C
1063 0x00, 0x06, 0xB4, 0x26, // 0006B426
1064 0x00, 0x06, 0xB4, 0x24, // 0006B424
1065 0x00, 0x06, 0xB4, 0x2E, // 0006B42E
1066 0x00, 0x06, 0xA0, 0x29, // 0006A029
1067 0x00, 0x06, 0xA8, 0x1D, // 0006A81D
1068 0x00, 0x06, 0xA8, 0x21, // 0006A821
1069 0x00, 0x06, 0xA8, 0x2F, // 0006A82F
1070 0x00, 0x06, 0x84, 0x1D, // 0006841D
1071 0x00, 0x08, 0x3F, 0x41, // 00083F41
1072 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1073 0x00, 0x00, 0x00, 0x00, // 00000000
1074 0x00, 0x00, 0x00, 0x00, // 00000000
1075 0x00, 0x01, 0x01, 0x21, // 00010121
1076 0x00, 0x06, 0xB8, 0x6E, // 0006B86E
1077 0x00, 0x07, 0xA8, 0x0F, // 0007A80F
1078 0x00, 0x00, 0x00, 0x00, // 00000000
1079 0x00, 0x06, 0x38, 0x78, // 00063878
1080 0x00, 0x07, 0x44, 0x05, // 00074405
1081 0x00, 0x07, 0x05, 0x89, // 00070589
1082 0x00, 0x07, 0x4C, 0x05, // 00074C05
1083 0x00, 0x07, 0x0D, 0x4B, // 00070D4B
1084 0x00, 0x07, 0x54, 0x05, // 00075405
1085 0x00, 0x07, 0x15, 0x59, // 00071559
1086 0x00, 0x07, 0x5C, 0x05, // 00075C05
1087 0x00, 0x07, 0x1D, 0xBD, // 00071DBD
1088 0x00, 0x08, 0xBF, 0x40, // 0008BF40
1089 0x00, 0x02, 0x9F, 0x40, // 00029F40
1090 0x00, 0x07, 0x44, 0x05, // 00074405
1091 0x00, 0x07, 0x04, 0xC8, // 000704C8
1092 0x00, 0x07, 0x4C, 0x05, // 00074C05
1093 0x00, 0x07, 0x0C, 0xEE, // 00070CEE
1094 0x00, 0x07, 0x54, 0x05, // 00075405
1095 0x00, 0x07, 0x14, 0xF8, // 000714F8
1096 0x00, 0x07, 0x5C, 0x05, // 00075C05
1097 0x00, 0x07, 0x1D, 0x16, // 00071D16
1098 0x00, 0x06, 0x80, 0x09, // 00068009
1099 0x00, 0x06, 0x88, 0x0D, // 0006880D
1100 0x00, 0x06, 0x90, 0x0C, // 0006900C
1101 0x00, 0x06, 0x98, 0x0B, // 0006980B
1102 0x00, 0x07, 0x44, 0x01, // 00074401
1103 0x00, 0x07, 0x06, 0x61, // 00070661
1104 0x00, 0x07, 0x64, 0x00, // 00076400
1105 0x00, 0x07, 0x27, 0x20, // 00072720
1106 0x00, 0x07, 0x4C, 0x00, // 00074C00
1107 0x00, 0x07, 0x0C, 0x00, // 00070C00
1108 0x00, 0x06, 0x80, 0x22, // 00068022
1109 0x00, 0x04, 0x3F, 0x00, // 00043F00
1110 0x00, 0x06, 0x00, 0x78, // 00060078
1111 0x00, 0x0A, 0xFF, 0x44, // 000AFF44
1112 0x00, 0x06, 0xA0, 0x5B, // 0006A05B
1113 0x00, 0x07, 0x64, 0x00, // 00076400
1114 0x00, 0x07, 0x27, 0x00, // 00072700
1115 0x00, 0x07, 0x5C, 0x00, // 00075C00
1116 0x00, 0x07, 0x1C, 0x10, // 00071C10
1117 0x00, 0x08, 0x80, 0x40, // 00088040
1118 0x00, 0x06, 0xA0, 0x5B, // 0006A05B
1119 0x00, 0x02, 0x9E, 0x20, // 00029E20
1120 0x00, 0x07, 0x5C, 0x00, // 00075C00
1121 0x00, 0x07, 0x64, 0x04, // 00076404
1122 0x00, 0x07, 0x24, 0x00, // 00072400
1123 0x00, 0x07, 0x1C, 0x30, // 00071C30
1124 0x00, 0x08, 0x24, 0xC7, // 000824C7
1125 0x00, 0x06, 0x88, 0x4B, // 0006884B
1126 0x00, 0x00, 0x00, 0x00, // 00000000
1127 0x00, 0x06, 0x9C, 0x06, // 00069C06
1128 0x00, 0x06, 0xA0, 0x5B, // 0006A05B
1129 0x00, 0x06, 0xA4, 0x76, // 0006A476
1130 0x00, 0x06, 0x28, 0x77, // 00062877
1131 0x00, 0x07, 0x54, 0x01, // 00075401
1132 0x00, 0x07, 0x16, 0x40, // 00071640
1133 0x00, 0x07, 0x64, 0x00, // 00076400
1134 0x00, 0x07, 0x24, 0x90, // 00072490
1135 0x00, 0x0B, 0x49, 0x7D, // 000B497D
1136 0x00, 0x07, 0x44, 0x01, // 00074401
1137 0x00, 0x07, 0x06, 0x6C, // 0007066C
1138 0x00, 0x06, 0x90, 0x1E, // 0006901E
1139 0x00, 0x06, 0xA0, 0x1F, // 0006A01F
1140 0x00, 0x06, 0x88, 0x14, // 00068814
1141 0x00, 0x06, 0x80, 0x22, // 00068022
1142 0x00, 0x04, 0x0F, 0x08, // 00040F08
1143 0x00, 0x04, 0x17, 0x08, // 00041708
1144 0x00, 0x04, 0x1F, 0x08, // 00041F08
1145 0x00, 0x04, 0x27, 0x08, // 00042708
1146 0x00, 0x08, 0xAD, 0x40, // 0008AD40
1147 0x00, 0x02, 0x9F, 0x20, // 00029F20
1148 0x00, 0x0B, 0x49, 0x40, // 000B4940
1149 0x00, 0x0B, 0x52, 0x40, // 000B5240
1150 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
1151 0x00, 0x0B, 0x64, 0x40, // 000B6440
1152 0x00, 0x07, 0x88, 0x0D, // 0007880D
1153 0x00, 0x07, 0x90, 0x0D, // 0007900D
1154 0x00, 0x07, 0x98, 0x0D, // 0007980D
1155 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1156 0x00, 0x00, 0x00, 0x00, // 00000000
1157 0x00, 0x00, 0xC1, 0x05, // 0000C105
1158 0x00, 0x07, 0x44, 0x04, // 00074404
1159 0x00, 0x07, 0x07, 0x43, // 00070743
1160 0x00, 0x00, 0x00, 0x00, // 00000000
1161 0x00, 0x00, 0x00, 0x00, // 00000000
1162 0x00, 0x00, 0x00, 0x00, // 00000000
1163 0x00, 0x06, 0x80, 0x0F, // 0006800F
1164 0x00, 0x06, 0x38, 0x61, // 00063861
1165 0x00, 0x00, 0x00, 0x00, // 00000000
1166 0x00, 0x08, 0xBF, 0x40, // 0008BF40
1167 0x00, 0x02, 0x9E, 0x10, // 00029E10
1168 0x00, 0x02, 0x13, 0x6E, // 0002136E
1169 0x00, 0x02, 0x81, 0x28, // 00028128
1170 0x00, 0x07, 0x54, 0x00, // 00075400
1171 0x00, 0x07, 0x14, 0x20, // 00071420
1172 0x00, 0x06, 0x18, 0x1C, // 0006181C
1173 0x00, 0x09, 0x12, 0xC0, // 000912C0
1174 0x00, 0x02, 0x86, 0x10, // 00028610
1175 0x00, 0x02, 0x14, 0x14, // 00021414
1176 0x00, 0x02, 0x81, 0x28, // 00028128
1177 0x00, 0x06, 0x10, 0x6E, // 0006106E
1178 0x00, 0x08, 0x9B, 0x44, // 00089B44
1179 0x00, 0x02, 0x86, 0x08, // 00028608
1180 0x00, 0x08, 0x1B, 0xC2, // 00081BC2
1181 0x00, 0x07, 0x45, 0x5D, // 0007455D
1182 0x00, 0x07, 0x04, 0x10, // 00070410
1183 0x00, 0x07, 0x4D, 0x59, // 00074D59
1184 0x00, 0x07, 0x0C, 0x50, // 00070C50
1185 0x00, 0x06, 0x98, 0x1C, // 0006981C
1186 0x00, 0x00, 0xC1, 0x04, // 0000C104
1187 0x00, 0x07, 0x54, 0x04, // 00075404
1188 0x00, 0x07, 0x17, 0x60, // 00071760
1189 0x00, 0x09, 0x80, 0x48, // 00098048
1190 0x00, 0x09, 0x89, 0x78, // 00098978
1191 0x00, 0x08, 0x38, 0xC1, // 000838C1
1192 0x00, 0x06, 0x90, 0x0F, // 0006900F
1193 0x00, 0x08, 0x80, 0x41, // 00088041
1194 0x00, 0x02, 0x9F, 0x10, // 00029F10
1195 0x00, 0x02, 0x14, 0x14, // 00021414
1196 0x00, 0x02, 0x81, 0x28, // 00028128
1197 0x00, 0x07, 0x54, 0x01, // 00075401
1198 0x00, 0x07, 0x16, 0x65, // 00071665
1199 0x00, 0x0B, 0x49, 0x40, // 000B4940
1200 0x00, 0x02, 0x14, 0x14, // 00021414
1201 0x00, 0x00, 0x00, 0x00, // 00000000
1202 0x00, 0x06, 0x90, 0x22, // 00069022
1203 0x00, 0x07, 0x88, 0x03, // 00078803
1204 0x00, 0x00, 0x00, 0x00, // 00000000
1205 0x00, 0x06, 0x88, 0x69, // 00068869
1206 0x00, 0x06, 0x88, 0x61, // 00068861
1207 0x00, 0x06, 0x08, 0x6F, // 0006086F
1208 0x00, 0x0B, 0x52, 0x40, // 000B5240
1209 0x00, 0x08, 0x89, 0x41, // 00088941
1210 0x00, 0x02, 0x9F, 0x10, // 00029F10
1211 0x00, 0x02, 0x13, 0x8B, // 0002138B
1212 0x00, 0x02, 0x81, 0x28, // 00028128
1213 0x00, 0x08, 0x88, 0x42, // 00088842
1214 0x00, 0x02, 0x86, 0x10, // 00028610
1215 0x00, 0x02, 0x14, 0x14, // 00021414
1216 0x00, 0x02, 0x81, 0x28, // 00028128
1217 0x00, 0x00, 0xC1, 0x01, // 0000C101
1218 0x00, 0x07, 0x44, 0x04, // 00074404
1219 0x00, 0x07, 0x07, 0x7F, // 0007077F
1220 0x00, 0x00, 0x00, 0x00, // 00000000
1221 0x00, 0x00, 0x00, 0x00, // 00000000
1222 0x00, 0x06, 0x90, 0x6F, // 0006906F
1223 0x00, 0x06, 0x80, 0x0F, // 0006800F
1224 0x00, 0x06, 0x10, 0x66, // 00061066
1225 0x00, 0x08, 0x90, 0xC2, // 000890C2
1226 0x00, 0x02, 0x9F, 0x10, // 00029F10
1227 0x00, 0x02, 0x16, 0x14, // 00021614
1228 0x00, 0x02, 0x81, 0x28, // 00028128
1229 0x00, 0x06, 0x10, 0x67, // 00061067
1230 0x00, 0x08, 0x91, 0xC2, // 000891C2
1231 0x00, 0x02, 0x9F, 0x10, // 00029F10
1232 0x00, 0x02, 0x16, 0x14, // 00021614
1233 0x00, 0x02, 0x81, 0x28, // 00028128
1234 0x00, 0x02, 0x14, 0x14, // 00021414
1235 0x00, 0x02, 0x81, 0x28, // 00028128
1236 0x00, 0x06, 0x10, 0x76, // 00061076
1237 0x00, 0x06, 0x08, 0x7A, // 0006087A
1238 0x00, 0x0A, 0x00, 0xC2, // 000A00C2
1239 0x00, 0x08, 0x89, 0x40, // 00088940
1240 0x00, 0x02, 0x9F, 0x10, // 00029F10
1241 0x00, 0x02, 0x14, 0x14, // 00021414
1242 0x00, 0x02, 0x81, 0x28, // 00028128
1243 0x00, 0x07, 0x54, 0x00, // 00075400
1244 0x00, 0x07, 0x14, 0x20, // 00071420
1245 0x00, 0x00, 0x00, 0x00, // 00000000
1246 0x00, 0x08, 0x90, 0xC2, // 000890C2
1247 0x00, 0x02, 0x88, 0x10, // 00028810
1248 0x00, 0x02, 0x14, 0x14, // 00021414
1249 0x00, 0x02, 0x81, 0x28, // 00028128
1250 0x00, 0x06, 0x0C, 0x26, // 00060C26
1251 0x00, 0x06, 0x14, 0x1C, // 0006141C
1252 0x00, 0x07, 0x5C, 0x01, // 00075C01
1253 0x00, 0x07, 0x1E, 0x00, // 00071E00
1254 0x00, 0x08, 0x89, 0xC2, // 000889C2
1255 0x00, 0x02, 0x86, 0x08, // 00028608
1256 0x00, 0x08, 0x09, 0xC3, // 000809C3
1257 0x00, 0x06, 0x24, 0x24, // 00062424
1258 0x00, 0x09, 0x22, 0xC4, // 000922C4
1259 0x00, 0x02, 0x86, 0x08, // 00028608
1260 0x00, 0x08, 0x24, 0xC3, // 000824C3
1261 0x00, 0x09, 0x29, 0xC4, // 000929C4
1262 0x00, 0x02, 0x86, 0x08, // 00028608
1263 0x00, 0x08, 0x0C, 0x40, // 00080C40
1264 0x00, 0x06, 0x24, 0x2E, // 0006242E
1265 0x00, 0x09, 0x22, 0xC4, // 000922C4
1266 0x00, 0x02, 0x86, 0x08, // 00028608
1267 0x00, 0x08, 0x24, 0xC3, // 000824C3
1268 0x00, 0x09, 0x29, 0xC4, // 000929C4
1269 0x00, 0x02, 0x86, 0x08, // 00028608
1270 0x00, 0x08, 0x0C, 0x40, // 00080C40
1271 0x00, 0x07, 0x6C, 0x00, // 00076C00
1272 0x00, 0x07, 0x2C, 0x20, // 00072C20
1273 0x00, 0x00, 0x00, 0x00, // 00000000
1274 0x00, 0x08, 0x89, 0xC5, // 000889C5
1275 0x00, 0x02, 0x86, 0x10, // 00028610
1276 0x00, 0x02, 0x14, 0x14, // 00021414
1277 0x00, 0x02, 0x81, 0x28, // 00028128
1278 0x00, 0x00, 0x00, 0x00, // 00000000
1279 0x00, 0x00, 0x00, 0x00, // 00000000
1280 0x00, 0x00, 0x00, 0x00, // 00000000
1281 0x00, 0x0B, 0x6D, 0x70, // 000B6D70
1282 0x00, 0x00, 0x00, 0x00, // 00000000
1283 0x00, 0x00, 0x00, 0x00, // 00000000
1284 0x00, 0x04, 0xB8, 0x0D, // 0004B80D
1285 0x00, 0x06, 0xA8, 0x79, // 0006A879
1286 0x00, 0x09, 0xBF, 0x7C, // 0009BF7C
1287 0x00, 0x00, 0xC1, 0x01, // 0000C101
1288 0x00, 0x07, 0x44, 0x04, // 00074404
1289 0x00, 0x07, 0x07, 0xC5, // 000707C5
1290 0x00, 0x00, 0x00, 0x00, // 00000000
1291 0x00, 0x00, 0x00, 0x00, // 00000000
1292 0x00, 0x00, 0x00, 0x00, // 00000000
1293 0x00, 0x06, 0x80, 0x0F, // 0006800F
1294 0x00, 0x06, 0x18, 0x76, // 00061876
1295 0x00, 0x00, 0x00, 0x00, // 00000000
1296 0x00, 0x08, 0x9B, 0x40, // 00089B40
1297 0x00, 0x02, 0x9F, 0x10, // 00029F10
1298 0x00, 0x08, 0x29, 0x40, // 00082940
1299 0x00, 0x08, 0x08, 0x40, // 00080840
1300 0x00, 0x0C, 0x31, 0x08, // 000C3108
1301 0x00, 0x0E, 0x31, 0x09, // 000E3109
1302 0x00, 0x00, 0x00, 0x00, // 00000000
1303 0x00, 0x06, 0x10, 0x73, // 00061073
1304 0x00, 0x0C, 0x01, 0x08, // 000C0108
1305 0x00, 0x0E, 0x01, 0x09, // 000E0109
1306 0x00, 0x0A, 0xF6, 0x7C, // 000AF67C
1307 0x00, 0x09, 0xA7, 0x7F, // 0009A77F
1308 0x00, 0x02, 0x82, 0x08, // 00028208
1309 0x00, 0x08, 0x36, 0x42, // 00083642
1310 0x00, 0x0A, 0xC0, 0x7C, // 000AC07C
1311 0x00, 0x09, 0xBF, 0x7F, // 0009BF7F
1312 0x00, 0x02, 0x82, 0x08, // 00028208
1313 0x00, 0x08, 0x00, 0x42, // 00080042
1314 0x00, 0x06, 0x20, 0x79, // 00062079
1315 0x00, 0x08, 0x12, 0x42, // 00081242
1316 0x00, 0x08, 0xA4, 0x41, // 0008A441
1317 0x00, 0x07, 0xF4, 0x0C, // 0007F40C
1318 0x00, 0x07, 0xC4, 0x0C, // 0007C40C
1319 0x00, 0x02, 0x9F, 0x50, // 00029F50
1320 0x00, 0x06, 0x90, 0x73, // 00069073
1321 0x00, 0x06, 0xA0, 0x79, // 0006A079
1322 0x00, 0x08, 0x9B, 0x41, // 00089B41
1323 0x00, 0x02, 0x87, 0x20, // 00028720
1324 0x00, 0x08, 0x0D, 0x40, // 00080D40
1325 0x00, 0x08, 0x05, 0x40, // 00080540
1326 0x00, 0x02, 0x13, 0xCB, // 000213CB
1327 0x00, 0x02, 0x81, 0x28, // 00028128
1328 0x00, 0x02, 0x13, 0xBE, // 000213BE
1329 0x00, 0x02, 0x81, 0x28, // 00028128
1330 0x00, 0x06, 0x00, 0x74, // 00060074
1331 0x00, 0x06, 0x0C, 0x1C, // 00060C1C
1332 0x00, 0x07, 0x54, 0x01, // 00075401
1333 0x00, 0x07, 0x14, 0x80, // 00071480
1334 0x00, 0x08, 0x80, 0x40, // 00088040
1335 0x00, 0x02, 0x9E, 0x48, // 00029E48
1336 0x00, 0x08, 0x91, 0xC2, // 000891C2
1337 0x00, 0x02, 0x89, 0x38, // 00028938
1338 0x00, 0x02, 0x15, 0xDB, // 000215DB
1339 0x00, 0x07, 0x44, 0x04, // 00074404
1340 0x00, 0x07, 0x07, 0xF8, // 000707F8
1341 0x00, 0x00, 0x00, 0x00, // 00000000
1342 0x00, 0x00, 0x00, 0x00, // 00000000
1343 0x00, 0x00, 0x00, 0x00, // 00000000
1344 0x00, 0x06, 0x80, 0x0E, // 0006800E
1345 0x00, 0x02, 0x16, 0x52, // 00021652
1346 0x00, 0x07, 0x4C, 0x04, // 00074C04
1347 0x00, 0x07, 0x0F, 0xFF, // 00070FFF
1348 0x00, 0x00, 0x00, 0x00, // 00000000
1349 0x00, 0x00, 0x00, 0x00, // 00000000
1350 0x00, 0x00, 0x00, 0x00, // 00000000
1351 0x00, 0x06, 0x88, 0x0F, // 0006880F
1352 0x00, 0x06, 0x00, 0x69, // 00060069
1353 0x00, 0x07, 0x4C, 0x01, // 00074C01
1354 0x00, 0x07, 0x0E, 0x65, // 00070E65
1355 0x00, 0x08, 0x00, 0x41, // 00080041
1356 0x00, 0x07, 0x54, 0x00, // 00075400
1357 0x00, 0x07, 0x14, 0x20, // 00071420
1358 0x00, 0x06, 0x18, 0x76, // 00061876
1359 0x00, 0x0A, 0x12, 0xC3, // 000A12C3
1360 0x00, 0x06, 0x88, 0x22, // 00068822
1361 0x00, 0x08, 0x92, 0x41, // 00089241
1362 0x00, 0x0A, 0xC0, 0xC2, // 000AC0C2
1363 0x00, 0x04, 0x0F, 0x00, // 00040F00
1364 0x00, 0x02, 0x9F, 0x10, // 00029F10
1365 0x00, 0x02, 0x14, 0x14, // 00021414
1366 0x00, 0x02, 0x81, 0x28, // 00028128
1367 0x00, 0x08, 0x09, 0x41, // 00080941
1368 0x00, 0x06, 0x00, 0x6A, // 0006006A
1369 0x00, 0x00, 0x00, 0x00, // 00000000
1370 0x00, 0x06, 0x80, 0x69, // 00068069
1371 0x00, 0x07, 0x88, 0x07, // 00078807
1372 0x00, 0x06, 0x80, 0x6F, // 0006806F
1373 0x00, 0x00, 0xC1, 0x03, // 0000C103
1374 0x00, 0x07, 0x44, 0x05, // 00074405
1375 0x00, 0x07, 0x04, 0x1B, // 0007041B
1376 0x00, 0x00, 0x00, 0x00, // 00000000
1377 0x00, 0x00, 0x00, 0x00, // 00000000
1378 0x00, 0x00, 0x00, 0x00, // 00000000
1379 0x00, 0x06, 0x80, 0x0F, // 0006800F
1380 0x00, 0x06, 0x04, 0x26, // 00060426
1381 0x00, 0x06, 0x28, 0x7A, // 0006287A
1382 0x00, 0x06, 0x38, 0x7A, // 0006387A
1383 0x00, 0x06, 0x0C, 0x1C, // 00060C1C
1384 0x00, 0x07, 0x54, 0x01, // 00075401
1385 0x00, 0x07, 0x16, 0x00, // 00071600
1386 0x00, 0x06, 0x18, 0x70, // 00061870
1387 0x00, 0x08, 0x80, 0xC1, // 000880C1
1388 0x00, 0x02, 0x86, 0x08, // 00028608
1389 0x00, 0x08, 0x00, 0xC2, // 000800C2
1390 0x00, 0x07, 0x74, 0x00, // 00077400
1391 0x00, 0x07, 0x34, 0x40, // 00073440
1392 0x00, 0x06, 0x08, 0x74, // 00060874
1393 0x00, 0x08, 0xA5, 0x41, // 0008A541
1394 0x00, 0x02, 0x9E, 0x30, // 00029E30
1395 0x00, 0x08, 0x89, 0x40, // 00088940
1396 0x00, 0x02, 0x9F, 0x20, // 00029F20
1397 0x00, 0x08, 0xA0, 0xC6, // 0008A0C6
1398 0x00, 0x02, 0x88, 0x10, // 00028810
1399 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1400 0x00, 0x02, 0x81, 0x80, // 00028180
1401 0x00, 0x08, 0x89, 0x40, // 00088940
1402 0x00, 0x02, 0x9F, 0x70, // 00029F70
1403 0x00, 0x07, 0x64, 0x00, // 00076400
1404 0x00, 0x07, 0x24, 0x21, // 00072421
1405 0x00, 0x08, 0x93, 0xC0, // 000893C0
1406 0x00, 0x06, 0x80, 0x70, // 00068070
1407 0x00, 0x06, 0xA8, 0x7A, // 0006A87A
1408 0x00, 0x08, 0x94, 0xC2, // 000894C2
1409 0x00, 0x02, 0x88, 0x10, // 00028810
1410 0x00, 0x02, 0x16, 0x11, // 00021611
1411 0x00, 0x07, 0x44, 0x05, // 00074405
1412 0x00, 0x07, 0x04, 0x40, // 00070440
1413 0x00, 0x00, 0x00, 0x00, // 00000000
1414 0x00, 0x00, 0x00, 0x00, // 00000000
1415 0x00, 0x00, 0x00, 0x00, // 00000000
1416 0x00, 0x06, 0x80, 0x0F, // 0006800F
1417 0x00, 0x07, 0x44, 0x01, // 00074401
1418 0x00, 0x07, 0x06, 0x61, // 00070661
1419 0x00, 0x07, 0x4C, 0x00, // 00074C00
1420 0x00, 0x07, 0x0C, 0x01, // 00070C01
1421 0x00, 0x00, 0x00, 0x00, // 00000000
1422 0x00, 0x06, 0x80, 0x22, // 00068022
1423 0x00, 0x04, 0x07, 0x00, // 00040700
1424 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
1425 0x00, 0x02, 0x9F, 0x10, // 00029F10
1426 0x00, 0x08, 0x80, 0x41, // 00088041
1427 0x00, 0x02, 0x81, 0x10, // 00028110
1428 0x00, 0x02, 0x14, 0xAC, // 000214AC
1429 0x00, 0x02, 0x81, 0x28, // 00028128
1430 0x00, 0x07, 0x80, 0x07, // 00078007
1431 0x00, 0x07, 0x44, 0x01, // 00074401
1432 0x00, 0x07, 0x06, 0x61, // 00070661
1433 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
1434 0x00, 0x07, 0x0C, 0x00, // 00070C00
1435 0x00, 0x00, 0x00, 0x00, // 00000000
1436 0x00, 0x06, 0x80, 0x22, // 00068022
1437 0x00, 0x0A, 0xC7, 0x81, // 000AC781
1438 0x00, 0x02, 0x9E, 0x10, // 00029E10
1439 0x00, 0x02, 0x14, 0xC1, // 000214C1
1440 0x00, 0x02, 0x81, 0x28, // 00028128
1441 0x00, 0x07, 0x44, 0x01, // 00074401
1442 0x00, 0x07, 0x06, 0x69, // 00070669
1443 0x00, 0x07, 0x4C, 0x00, // 00074C00
1444 0x00, 0x07, 0x0C, 0x01, // 00070C01
1445 0x00, 0x07, 0x44, 0x01, // 00074401
1446 0x00, 0x07, 0x06, 0x6C, // 0007066C
1447 0x00, 0x06, 0x80, 0x22, // 00068022
1448 0x00, 0x06, 0x10, 0x7A, // 0006107A
1449 0x00, 0x06, 0x18, 0x77, // 00061877
1450 0x00, 0x04, 0x25, 0x08, // 00042508
1451 0x00, 0x04, 0x2D, 0x08, // 00042D08
1452 0x00, 0x04, 0x35, 0x08, // 00043508
1453 0x00, 0x04, 0x3D, 0x08, // 00043D08
1454 0x00, 0x0A, 0xCF, 0x81, // 000ACF81
1455 0x00, 0x02, 0x9F, 0x70, // 00029F70
1456 0x00, 0x06, 0x0C, 0x6A, // 00060C6A
1457 0x00, 0x08, 0x9B, 0x40, // 00089B40
1458 0x00, 0x02, 0x9E, 0x50, // 00029E50
1459 0x00, 0x08, 0x92, 0x40, // 00089240
1460 0x00, 0x02, 0x9F, 0x30, // 00029F30
1461 0x00, 0x0B, 0x49, 0x41, // 000B4941
1462 0x00, 0x0B, 0x64, 0x40, // 000B6440
1463 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1464 0x00, 0x0B, 0x76, 0x40, // 000B7640
1465 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
1466 0x00, 0x02, 0x81, 0x08, // 00028108
1467 0x00, 0x06, 0x0C, 0x65, // 00060C65
1468 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
1469 0x00, 0x02, 0x81, 0x70, // 00028170
1470 0x00, 0x06, 0x80, 0x22, // 00068022
1471 0x00, 0x06, 0x0C, 0x6A, // 00060C6A
1472 0x00, 0x08, 0x9B, 0x40, // 00089B40
1473 0x00, 0x02, 0x9F, 0x50, // 00029F50
1474 0x00, 0x08, 0x92, 0x40, // 00089240
1475 0x00, 0x02, 0x9F, 0x30, // 00029F30
1476 0x00, 0x0B, 0x49, 0x41, // 000B4941
1477 0x00, 0x04, 0x27, 0x08, // 00042708
1478 0x00, 0x04, 0x2F, 0x08, // 00042F08
1479 0x00, 0x04, 0x37, 0x08, // 00043708
1480 0x00, 0x04, 0x3F, 0x08, // 00043F08
1481 0x00, 0x02, 0x81, 0x08, // 00028108
1482 0x00, 0x06, 0x0C, 0x65, // 00060C65
1483 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
1484 0x00, 0x06, 0x04, 0x6A, // 0006046A
1485 0x00, 0x06, 0x14, 0x65, // 00061465
1486 0x00, 0x09, 0x00, 0xC2, // 000900C2
1487 0x00, 0x08, 0x11, 0x41, // 00081141
1488 0x00, 0x02, 0x9F, 0x18, // 00029F18
1489 0x00, 0x08, 0x10, 0x41, // 00081041
1490 0x00, 0x02, 0x9F, 0x08, // 00029F08
1491 0x00, 0x08, 0x08, 0x40, // 00080840
1492 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1493 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
1494 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
1495 0x00, 0x06, 0x8C, 0x6A, // 00068C6A
1496 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
1497 0x00, 0x06, 0x98, 0x77, // 00069877
1498 0x00, 0x07, 0x44, 0x01, // 00074401
1499 0x00, 0x07, 0x06, 0x69, // 00070669
1500 0x00, 0x07, 0x4C, 0x00, // 00074C00
1501 0x00, 0x07, 0x0C, 0x02, // 00070C02
1502 0x00, 0x06, 0x10, 0x7A, // 0006107A
1503 0x00, 0x06, 0x80, 0x22, // 00068022
1504 0x00, 0x0A, 0xC3, 0x81, // 000AC381
1505 0x00, 0x02, 0x9F, 0x58, // 00029F58
1506 0x00, 0x08, 0x92, 0x40, // 00089240
1507 0x00, 0x02, 0x9E, 0x40, // 00029E40
1508 0x00, 0x0B, 0x52, 0x7E, // 000B527E
1509 0x00, 0x02, 0x16, 0x2E, // 0002162E
1510 0x00, 0x07, 0x44, 0x05, // 00074405
1511 0x00, 0x07, 0x04, 0xAC, // 000704AC
1512 0x00, 0x06, 0x90, 0x7A, // 0006907A
1513 0x00, 0x00, 0x00, 0x00, // 00000000
1514 0x00, 0x00, 0x00, 0x00, // 00000000
1515 0x00, 0x06, 0x80, 0x0F, // 0006800F
1516 0x00, 0x02, 0x81, 0x18, // 00028118
1517 0x00, 0x08, 0x9A, 0x42, // 00089A42
1518 0x00, 0x02, 0x9E, 0x08, // 00029E08
1519 0x00, 0x0B, 0x52, 0x7F, // 000B527F
1520 0x00, 0x00, 0x00, 0x00, // 00000000
1521 0x00, 0x00, 0x00, 0x00, // 00000000
1522 0x00, 0x00, 0x00, 0x00, // 00000000
1523 0x00, 0x06, 0x90, 0x7A, // 0006907A
1524 0x00, 0x00, 0x00, 0x00, // 00000000
1525 0x00, 0x06, 0x00, 0x6D, // 0006006D
1526 0x00, 0x00, 0x00, 0x00, // 00000000
1527 0x00, 0x08, 0x80, 0x41, // 00088041
1528 0x00, 0x00, 0x00, 0x00, // 00000000
1529 0x00, 0x00, 0x00, 0x00, // 00000000
1530 0x00, 0x00, 0x00, 0x00, // 00000000
1531 0x00, 0x06, 0xC0, 0x6D, // 0006C06D
1532 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
1533 0x00, 0x07, 0x6C, 0x05, // 00076C05
1534 0x00, 0x07, 0x2C, 0xBA, // 00072CBA
1535 0x00, 0x00, 0x00, 0x00, // 00000000
1536 0x00, 0x00, 0x00, 0x00, // 00000000
1537 0x00, 0x00, 0x00, 0x00, // 00000000
1538 0x00, 0x00, 0x00, 0x00, // 00000000
1539 0x00, 0x02, 0x13, 0x3B, // 0002133B
1540 0x00, 0x02, 0x81, 0x28, // 00028128
1541 0x00, 0x00, 0x00, 0x00, // 00000000
1542 0x00, 0x00, 0x00, 0x00, // 00000000
1543 0x00, 0x00, 0x00, 0x00, // 00000000
1544 0x00, 0x00, 0x00, 0x00, // 00000000
1545 0x00, 0x00, 0x00, 0x00, // 00000000
1546 0x00, 0x00, 0xC1, 0x80, // 0000C180
1547 0x00, 0x00, 0x00, 0x00, // 00000000
1548 0x00, 0x00, 0x00, 0x00, // 00000000
1549 0x00, 0x00, 0x00, 0x00, // 00000000
1550 0x00, 0x00, 0x00, 0x00, // 00000000
1551 0x00, 0x00, 0x00, 0x00, // 00000000
1552 0x00, 0x00, 0x00, 0x00, // 00000000
1553 0x00, 0x06, 0x10, 0x68, // 00061068
1554 0x00, 0x04, 0x04, 0x08, // 00040408
1555 0x00, 0x08, 0x92, 0x40, // 00089240
1556 0x00, 0x02, 0x9E, 0x08, // 00029E08
1557 0x00, 0x02, 0x14, 0xDD, // 000214DD
1558 0x00, 0x06, 0x28, 0x6C, // 0006286C
1559 0x00, 0x04, 0x0C, 0x08, // 00040C08
1560 0x00, 0x07, 0x64, 0x3F, // 0007643F
1561 0x00, 0x07, 0x27, 0xFF, // 000727FF
1562 0x00, 0x00, 0x00, 0x00, // 00000000
1563 0x00, 0x09, 0xA4, 0x44, // 0009A444
1564 0x00, 0x04, 0x14, 0x00, // 00041400
1565 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1566 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1567 0x00, 0x0A, 0xD2, 0xC4, // 000AD2C4
1568 0x00, 0x09, 0x80, 0x48, // 00098048
1569 0x00, 0x09, 0xB1, 0x78, // 0009B178
1570 0x00, 0x08, 0x00, 0xC6, // 000800C6
1571 0x00, 0x09, 0x89, 0x48, // 00098948
1572 0x00, 0x09, 0xB2, 0x78, // 0009B278
1573 0x00, 0x08, 0x09, 0xC6, // 000809C6
1574 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1575 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1576 0x00, 0x08, 0xAD, 0x40, // 0008AD40
1577 0x00, 0x02, 0x9F, 0x30, // 00029F30
1578 0x00, 0x09, 0x90, 0x48, // 00099048
1579 0x00, 0x09, 0xB0, 0x78, // 0009B078
1580 0x00, 0x08, 0x02, 0xC6, // 000802C6
1581 0x00, 0x09, 0x91, 0x48, // 00099148
1582 0x00, 0x09, 0xB1, 0x78, // 0009B178
1583 0x00, 0x08, 0x0A, 0xC6, // 00080AC6
1584 0x00, 0x00, 0xC1, 0x07, // 0000C107
1585 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1586 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1587 0x00, 0x00, 0x00, 0x00, // 00000000
1588 0x00, 0x00, 0x00, 0x00, // 00000000
1589 0x00, 0x00, 0x00, 0x00, // 00000000
1590 0x00, 0x00, 0x00, 0x00, // 00000000
1591 0x00, 0x06, 0x18, 0x68, // 00061868
1592 0x00, 0x06, 0x00, 0x1C, // 0006001C
1593 0x00, 0x09, 0x9B, 0x7D, // 00099B7D
1594 0x00, 0x00, 0xC1, 0x07, // 0000C107
1595 0x00, 0x06, 0x08, 0x20, // 00060820
1596 0x00, 0x06, 0x10, 0x6E, // 0006106E
1597 0x00, 0x08, 0x81, 0xC0, // 000881C0
1598 0x00, 0x09, 0x03, 0xC0, // 000903C0
1599 0x00, 0x02, 0x86, 0x08, // 00028608
1600 0x00, 0x08, 0x00, 0xC2, // 000800C2
1601 0x00, 0x0B, 0x40, 0x7F, // 000B407F
1602 0x00, 0x01, 0x0A, 0x20, // 00010A20
1603 0x00, 0x0B, 0x49, 0x7F, // 000B497F
1604 0x00, 0x04, 0x14, 0x00, // 00041400
1605 0x00, 0x0B, 0x76, 0x78, // 000B7678
1606 0x00, 0x09, 0x92, 0x48, // 00099248
1607 0x00, 0x09, 0x89, 0x48, // 00098948
1608 0x00, 0x09, 0x9A, 0x68, // 00099A68
1609 0x00, 0x08, 0x09, 0xC3, // 000809C3
1610 0x00, 0x08, 0x9F, 0xC1, // 00089FC1
1611 0x00, 0x02, 0x9E, 0x08, // 00029E08
1612 0x00, 0x00, 0xC1, 0x87, // 0000C187
1613 0x00, 0x06, 0xB0, 0x68, // 0006B068
1614 0x00, 0x09, 0x92, 0x48, // 00099248
1615 0x00, 0x09, 0x89, 0x48, // 00098948
1616 0x00, 0x09, 0x9A, 0x68, // 00099A68
1617 0x00, 0x08, 0x09, 0xC3, // 000809C3
1618 0x00, 0x0B, 0x76, 0x40, // 000B7640
1619 0x00, 0x04, 0x14, 0x08, // 00041408
1620 0x00, 0x08, 0x9F, 0xC1, // 00089FC1
1621 0x00, 0x02, 0x9E, 0x08, // 00029E08
1622 0x00, 0x00, 0xC1, 0x87, // 0000C187
1623 0x00, 0x06, 0xB0, 0x68, // 0006B068
1624 0x00, 0x00, 0xC1, 0x07, // 0000C107
1625 0x00, 0x0B, 0x40, 0x40, // 000B4040
1626 0x00, 0x00, 0x00, 0x00, // 00000000
1627 0x00, 0x00, 0x00, 0x00, // 00000000
1628 0x00, 0x00, 0x00, 0x00, // 00000000
1629 0x00, 0x00, 0x00, 0x00, // 00000000
1630 0x00, 0x00, 0x00, 0x00, // 00000000
1631 0x00, 0x06, 0x30, 0x71, // 00063071
1632 0x00, 0x07, 0x44, 0x01, // 00074401
1633 0x00, 0x08, 0xB6, 0x40, // 0008B640
1634 0x00, 0x02, 0x9E, 0x08, // 00029E08
1635 0x00, 0x02, 0x15, 0x31, // 00021531
1636 0x00, 0x06, 0x18, 0x7A, // 0006187A
1637 0x00, 0x06, 0x30, 0x72, // 00063072
1638 0x00, 0x07, 0x06, 0x00, // 00070600
1639 0x00, 0x06, 0x08, 0x28, // 00060828
1640 0x00, 0x08, 0x38, 0x41, // 00083841
1641 0x00, 0x08, 0x90, 0xC1, // 000890C1
1642 0x00, 0x02, 0x9F, 0x08, // 00029F08
1643 0x00, 0x00, 0xC1, 0x87, // 0000C187
1644 0x00, 0x07, 0x54, 0x03, // 00075403
1645 0x00, 0x07, 0x17, 0xF0, // 000717F0
1646 0x00, 0x06, 0xB8, 0x22, // 0006B822
1647 0x00, 0x01, 0x04, 0x90, // 00010490
1648 0x00, 0x09, 0x92, 0x48, // 00099248
1649 0x00, 0x0A, 0xE7, 0x8A, // 000AE78A
1650 0x00, 0x0A, 0xEF, 0x8A, // 000AEF8A
1651 0x00, 0x08, 0x36, 0x41, // 00083641
1652 0x00, 0x09, 0xAD, 0x78, // 0009AD78
1653 0x00, 0x08, 0x24, 0xC5, // 000824C5
1654 0x00, 0x00, 0x00, 0x00, // 00000000
1655 0x00, 0x00, 0x00, 0x00, // 00000000
1656 0x00, 0x06, 0xB0, 0x72, // 0006B072
1657 0x00, 0x07, 0xE0, 0x0E, // 0007E00E
1658 0x00, 0x0B, 0x76, 0x40, // 000B7640
1659 0x00, 0x08, 0x9B, 0x40, // 00089B40
1660 0x00, 0x02, 0x9F, 0x08, // 00029F08
1661 0x00, 0x00, 0xC1, 0x87, // 0000C187
1662 0x00, 0x06, 0xB0, 0x71, // 0006B071
1663 0x00, 0x06, 0x08, 0x20, // 00060820
1664 0x00, 0x06, 0x00, 0x1C, // 0006001C
1665 0x00, 0x06, 0x10, 0x6E, // 0006106E
1666 0x00, 0x08, 0x81, 0xC0, // 000881C0
1667 0x00, 0x02, 0x86, 0x08, // 00028608
1668 0x00, 0x08, 0x00, 0xC2, // 000800C2
1669 0x00, 0x07, 0x5C, 0x01, // 00075C01
1670 0x00, 0x07, 0x1D, 0xE8, // 00071DE8
1671 0x00, 0x0B, 0x76, 0x7F, // 000B767F
1672 0x00, 0x08, 0x93, 0xC0, // 000893C0
1673 0x00, 0x02, 0x88, 0x08, // 00028808
1674 0x00, 0x00, 0xC1, 0x87, // 0000C187
1675 0x00, 0x07, 0x44, 0x00, // 00074400
1676 0x00, 0x07, 0x05, 0x38, // 00070538
1677 0x00, 0x00, 0xC1, 0x07, // 0000C107
1678 0x00, 0x00, 0x00, 0x00, // 00000000
1679 0x00, 0x00, 0x00, 0x00, // 00000000
1680 0x00, 0x00, 0x00, 0x00, // 00000000
1681 0x00, 0x06, 0xB0, 0x71, // 0006B071
1682 0x00, 0x06, 0xB8, 0x28, // 0006B828
1683 0x00, 0x06, 0x80, 0x4B, // 0006804B
1684 0x00, 0x06, 0x00, 0x1C, // 0006001C
1685 0x00, 0x06, 0x08, 0x20, // 00060820
1686 0x00, 0x06, 0x10, 0x6E, // 0006106E
1687 0x00, 0x08, 0x81, 0xC0, // 000881C0
1688 0x00, 0x02, 0x86, 0x08, // 00028608
1689 0x00, 0x08, 0x00, 0xC2, // 000800C2
1690 0x00, 0x06, 0x18, 0x68, // 00061868
1691 0x00, 0x00, 0xC1, 0x07, // 0000C107
1692 0x00, 0x0A, 0x10, 0x44, // 000A1044
1693 0x00, 0x0A, 0x20, 0x42, // 000A2042
1694 0x00, 0x08, 0x12, 0xC4, // 000812C4
1695 0x00, 0x09, 0x03, 0xC2, // 000903C2
1696 0x00, 0x00, 0x00, 0x00, // 00000000
1697 0x00, 0x0A, 0x00, 0x7C, // 000A007C
1698 0x00, 0x07, 0x44, 0x00, // 00074400
1699 0x00, 0x07, 0x04, 0x20, // 00070420
1700 0x00, 0x07, 0x54, 0x05, // 00075405
1701 0x00, 0x07, 0x15, 0x7C, // 0007157C
1702 0x00, 0x0B, 0x49, 0x41, // 000B4941
1703 0x00, 0x0B, 0x64, 0x7F, // 000B647F
1704 0x00, 0x0B, 0x5B, 0x78, // 000B5B78
1705 0x00, 0x09, 0xA4, 0x7C, // 0009A47C
1706 0x00, 0x06, 0x90, 0x0A, // 0006900A
1707 0x00, 0x0B, 0x76, 0x40, // 000B7640
1708 0x00, 0x09, 0x94, 0x83, // 00099483
1709 0x00, 0x08, 0x36, 0x41, // 00083641
1710 0x00, 0x09, 0x89, 0x41, // 00098941
1711 0x00, 0x09, 0x92, 0x41, // 00099241
1712 0x00, 0x02, 0x82, 0x08, // 00028208
1713 0x00, 0x08, 0x09, 0xC4, // 000809C4
1714 0x00, 0x01, 0x04, 0x13, // 00010413
1715 0x00, 0x08, 0xAF, 0xC1, // 0008AFC1
1716 0x00, 0x02, 0x9E, 0x08, // 00029E08
1717 0x00, 0x00, 0xC1, 0x82, // 0000C182
1718 0x00, 0x08, 0x36, 0x41, // 00083641
1719 0x00, 0x09, 0x89, 0x41, // 00098941
1720 0x00, 0x09, 0x92, 0x41, // 00099241
1721 0x00, 0x02, 0x82, 0x08, // 00028208
1722 0x00, 0x08, 0x09, 0xC4, // 000809C4
1723 0x00, 0x08, 0xAF, 0xC1, // 0008AFC1
1724 0x00, 0x02, 0x9E, 0x08, // 00029E08
1725 0x00, 0x00, 0xC1, 0x82, // 0000C182
1726 0x00, 0x04, 0x2C, 0x08, // 00042C08
1727 0x00, 0x08, 0x80, 0x41, // 00088041
1728 0x00, 0x02, 0x9F, 0x10, // 00029F10
1729 0x00, 0x02, 0x15, 0x62, // 00021562
1730 0x00, 0x02, 0x81, 0x28, // 00028128
1731 0x00, 0x0B, 0x40, 0x40, // 000B4040
1732 0x00, 0x02, 0x81, 0x08, // 00028108
1733 0x00, 0x0B, 0x40, 0x7F, // 000B407F
1734 0x00, 0x08, 0xAE, 0x54, // 0008AE54
1735 0x00, 0x02, 0x9F, 0x10, // 00029F10
1736 0x00, 0x00, 0xC1, 0x87, // 0000C187
1737 0x00, 0x02, 0x81, 0x28, // 00028128
1738 0x00, 0x0B, 0x76, 0x40, // 000B7640
1739 0x00, 0x00, 0xC1, 0x87, // 0000C187
1740 0x00, 0x00, 0x00, 0x00, // 00000000
1741 0x00, 0x00, 0x00, 0x00, // 00000000
1742 0x00, 0x06, 0xB0, 0x68, // 0006B068
1743 0x00, 0x04, 0x34, 0x08, // 00043408
1744 0x00, 0x00, 0x00, 0x00, // 00000000
1745 0x00, 0x00, 0x00, 0x00, // 00000000
1746 0x00, 0x06, 0x10, 0x68, // 00061068
1747 0x00, 0x00, 0x00, 0x00, // 00000000
1748 0x00, 0x08, 0x82, 0x47, // 00088247
1749 0x00, 0x02, 0x88, 0x08, // 00028808
1750 0x00, 0x02, 0x15, 0x96, // 00021596
1751 0x00, 0x0B, 0x64, 0x41, // 000B6441
1752 0x00, 0x08, 0x9A, 0x54, // 00089A54
1753 0x00, 0x09, 0xA4, 0x78, // 0009A478
1754 0x00, 0x0A, 0xEC, 0x8C, // 000AEC8C
1755 0x00, 0x0A, 0xE4, 0x7F, // 000AE47F
1756 0x00, 0x0A, 0xF4, 0x84, // 000AF484
1757 0x00, 0x0A, 0xF4, 0x8C, // 000AF48C
1758 0x00, 0x0A, 0xCC, 0x84, // 000ACC84
1759 0x00, 0x07, 0x64, 0x3F, // 0007643F
1760 0x00, 0x07, 0x27, 0xFF, // 000727FF
1761 0x00, 0x00, 0x00, 0x00, // 00000000
1762 0x00, 0x09, 0xA4, 0x44, // 0009A444
1763 0x00, 0x09, 0x85, 0xC2, // 000985C2
1764 0x00, 0x09, 0x86, 0xC3, // 000986C3
1765 0x00, 0x08, 0x00, 0xC0, // 000800C0
1766 0x00, 0x08, 0x12, 0x50, // 00081250
1767 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1768 0x00, 0x08, 0x9A, 0x54, // 00089A54
1769 0x00, 0x02, 0x87, 0x18, // 00028718
1770 0x00, 0x08, 0x92, 0x54, // 00089254
1771 0x00, 0x08, 0x2E, 0x40, // 00082E40
1772 0x00, 0x08, 0x31, 0x40, // 00083140
1773 0x00, 0x08, 0x9A, 0x54, // 00089A54
1774 0x00, 0x09, 0x8D, 0xC2, // 00098DC2
1775 0x00, 0x09, 0x8E, 0xC3, // 00098EC3
1776 0x00, 0x08, 0x09, 0xC1, // 000809C1
1777 0x00, 0x08, 0x12, 0x50, // 00081250
1778 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1779 0x00, 0x08, 0x9A, 0x54, // 00089A54
1780 0x00, 0x02, 0x87, 0x08, // 00028708
1781 0x00, 0x08, 0x92, 0x54, // 00089254
1782 0x00, 0x06, 0x28, 0x6C, // 0006286C
1783 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1784 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1785 0x00, 0x06, 0x90, 0x68, // 00069068
1786 0x00, 0x08, 0xAD, 0x40, // 0008AD40
1787 0x00, 0x02, 0x9F, 0x30, // 00029F30
1788 0x00, 0x09, 0x90, 0x48, // 00099048
1789 0x00, 0x09, 0xB0, 0x78, // 0009B078
1790 0x00, 0x08, 0x02, 0xC6, // 000802C6
1791 0x00, 0x09, 0x91, 0x48, // 00099148
1792 0x00, 0x09, 0xB1, 0x78, // 0009B178
1793 0x00, 0x08, 0x0A, 0xC6, // 00080AC6
1794 0x00, 0x00, 0xC1, 0x07, // 0000C107
1795 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1796 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1797 0x00, 0x02, 0x81, 0x18, // 00028118
1798 0x00, 0x07, 0x7C, 0x01, // 00077C01
1799 0x00, 0x07, 0x3C, 0xC0, // 00073CC0
1800 0x00, 0x07, 0x74, 0x01, // 00077401
1801 0x00, 0x07, 0x35, 0x60, // 00073560
1802 0x00, 0x06, 0x20, 0x2E, // 0006202E
1803 0x00, 0x06, 0x18, 0x1C, // 0006181C
1804 0x00, 0x06, 0x10, 0x6E, // 0006106E
1805 0x00, 0x06, 0x00, 0x75, // 00060075
1806 0x00, 0x06, 0x08, 0x7A, // 0006087A
1807 0x00, 0x06, 0xA0, 0x20, // 0006A020
1808 0x00, 0x08, 0x9C, 0xC3, // 00089CC3
1809 0x00, 0x02, 0x86, 0x08, // 00028608
1810 0x00, 0x08, 0x1B, 0xC2, // 00081BC2
1811 0x00, 0x09, 0x16, 0xC3, // 000916C3
1812 0x00, 0x02, 0x89, 0x10, // 00028910
1813 0x00, 0x07, 0x44, 0x00, // 00074400
1814 0x00, 0x07, 0x04, 0x30, // 00070430
1815 0x00, 0x08, 0x89, 0x40, // 00088940
1816 0x00, 0x02, 0x9E, 0x20, // 00029E20
1817 0x00, 0x08, 0x97, 0xC3, // 000897C3
1818 0x00, 0x02, 0x89, 0x10, // 00028910
1819 0x00, 0x07, 0x44, 0x00, // 00074400
1820 0x00, 0x07, 0x04, 0x70, // 00070470
1821 0x00, 0x00, 0xC1, 0x07, // 0000C107
1822 0x00, 0x00, 0x00, 0x00, // 00000000
1823 0x00, 0x00, 0x00, 0x00, // 00000000
1824 0x00, 0x06, 0x98, 0x7F, // 0006987F
1825 0x00, 0x06, 0x84, 0x06, // 00068406
1826 0x00, 0x06, 0x80, 0x75, // 00068075
1827 0x00, 0x00, 0x00, 0x00, // 00000000
1828 0x00, 0x02, 0x15, 0xFC, // 000215FC
1829 0x00, 0x07, 0x4C, 0x05, // 00074C05
1830 0x00, 0x07, 0x0D, 0xE2, // 00070DE2
1831 0x00, 0x00, 0x00, 0x00, // 00000000
1832 0x00, 0x00, 0x00, 0x00, // 00000000
1833 0x00, 0x00, 0x00, 0x00, // 00000000
1834 0x00, 0x06, 0x88, 0x0F, // 0006880F
1835 0x00, 0x07, 0x4C, 0x01, // 00074C01
1836 0x00, 0x07, 0x0E, 0x32, // 00070E32
1837 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
1838 0x00, 0x0B, 0x64, 0x40, // 000B6440
1839 0x00, 0x00, 0x00, 0x00, // 00000000
1840 0x00, 0x06, 0x8C, 0x22, // 00068C22
1841 0x00, 0x06, 0x5C, 0x14, // 00065C14
1842 0x00, 0x06, 0xA8, 0x74, // 0006A874
1843 0x00, 0x06, 0x5C, 0x24, // 00065C24
1844 0x00, 0x06, 0x5C, 0x26, // 00065C26
1845 0x00, 0x06, 0x5C, 0x2E, // 00065C2E
1846 0x00, 0x06, 0x5C, 0x25, // 00065C25
1847 0x00, 0x06, 0x5C, 0x27, // 00065C27
1848 0x00, 0x06, 0x5C, 0x2F, // 00065C2F
1849 0x00, 0x06, 0x5C, 0x44, // 00065C44
1850 0x00, 0x04, 0x80, 0x03, // 00048003
1851 0x00, 0x00, 0x00, 0x00, // 00000000
1852 0x00, 0x00, 0x00, 0x00, // 00000000
1853 0x00, 0x00, 0x00, 0x00, // 00000000
1854 0x00, 0x00, 0xC1, 0x06, // 0000C106
1855 0x00, 0x06, 0x84, 0x74, // 00068474
1856 0x00, 0x06, 0x84, 0x43, // 00068443
1857 0x00, 0x06, 0x5C, 0x3C, // 00065C3C
1858 0x00, 0x06, 0x5C, 0x3B, // 00065C3B
1859 0x00, 0x06, 0x5C, 0x54, // 00065C54
1860 0x00, 0x06, 0x5C, 0x53, // 00065C53
1861 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1862 0x00, 0x07, 0x4C, 0x01, // 00074C01
1863 0x00, 0x07, 0x0E, 0x25, // 00070E25
1864 0x00, 0x00, 0x00, 0x00, // 00000000
1865 0x00, 0x00, 0x00, 0x00, // 00000000
1866 0x00, 0x06, 0xA8, 0x74, // 0006A874
1867 0x00, 0x06, 0x8C, 0x22, // 00068C22
1868 0x00, 0x06, 0x5C, 0x14, // 00065C14
1869 0x00, 0x06, 0x5C, 0x24, // 00065C24
1870 0x00, 0x06, 0x5C, 0x26, // 00065C26
1871 0x00, 0x06, 0x5C, 0x2E, // 00065C2E
1872 0x00, 0x06, 0x5C, 0x25, // 00065C25
1873 0x00, 0x06, 0x5C, 0x27, // 00065C27
1874 0x00, 0x06, 0x5C, 0x2F, // 00065C2F
1875 0x00, 0x00, 0xC1, 0x07, // 0000C107
1876 0x00, 0x06, 0x5C, 0x44, // 00065C44
1877 0x00, 0x06, 0x5C, 0x43, // 00065C43
1878 0x00, 0x06, 0x5C, 0x3C, // 00065C3C
1879 0x00, 0x06, 0x5C, 0x3B, // 00065C3B
1880 0x00, 0x06, 0x5C, 0x54, // 00065C54
1881 0x00, 0x06, 0x5C, 0x53, // 00065C53
1882 0x00, 0x07, 0x5C, 0x00, // 00075C00
1883 0x00, 0x07, 0x1C, 0x02, // 00071C02
1884 0x00, 0x02, 0x81, 0x10, // 00028110
1885 0x00, 0x07, 0x5C, 0x00, // 00075C00
1886 0x00, 0x07, 0x1C, 0x01, // 00071C01
1887 0x00, 0x07, 0x54, 0x01, // 00075401
1888 0x00, 0x07, 0x16, 0x65, // 00071665
1889 0x00, 0x06, 0x00, 0x61, // 00060061
1890 0x00, 0x06, 0x20, 0x7A, // 0006207A
1891 0x00, 0x07, 0x4C, 0x05, // 00074C05
1892 0x00, 0x06, 0x9C, 0x7F, // 00069C7F
1893 0x00, 0x06, 0x90, 0x22, // 00069022
1894 0x00, 0x04, 0x1F, 0x00, // 00041F00
1895 0x00, 0x08, 0xA4, 0x40, // 0008A440
1896 0x00, 0x02, 0x9E, 0x08, // 00029E08
1897 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
1898 0x00, 0x07, 0x0C, 0x14, // 00070C14
1899 0x00, 0x00, 0x00, 0x00, // 00000000
1900 0x00, 0x00, 0x00, 0x00, // 00000000
1901 0x00, 0x07, 0x98, 0x1F, // 0007981F
1902 0x00, 0x04, 0x17, 0x00, // 00041700
1903 0x00, 0x08, 0xA4, 0x40, // 0008A440
1904 0x00, 0x02, 0x9E, 0x10, // 00029E10
1905 0x00, 0x06, 0x00, 0x6A, // 0006006A
1906 0x00, 0x08, 0x12, 0x41, // 00081241
1907 0x00, 0x06, 0x88, 0x0F, // 0006880F
1908 0x00, 0x00, 0x00, 0x00, // 00000000
1909 0x00, 0x06, 0x80, 0x61, // 00068061
1910 0x00, 0x07, 0x90, 0x07, // 00079007
1911 0x00, 0x06, 0x3C, 0x26, // 00063C26
1912 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1913 0x00, 0x08, 0x3F, 0x40, // 00083F40
1914 0x00, 0x0B, 0x40, 0x40, // 000B4040
1915 0x00, 0x06, 0x1C, 0x1C, // 00061C1C
1916 0x00, 0x00, 0x00, 0x00, // 00000000
1917 0x00, 0x06, 0xBC, 0x1C, // 0006BC1C
1918 0x00, 0x04, 0xB0, 0x0D, // 0004B00D
1919 0x00, 0x00, 0x00, 0x00, // 00000000
1920 0x00, 0x09, 0xB6, 0x7C, // 0009B67C
1921 0x00, 0x01, 0x05, 0x10, // 00010510
1922 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
1923 0x00, 0x02, 0x82, 0x08, // 00028208
1924 0x00, 0x08, 0x00, 0x42, // 00080042
1925 0x00, 0x0B, 0x49, 0x40, // 000B4940
1926 0x00, 0x09, 0xB6, 0x7F, // 0009B67F
1927 0x00, 0x02, 0x82, 0x08, // 00028208
1928 0x00, 0x08, 0x09, 0x42, // 00080942
1929 0x00, 0x07, 0x84, 0x0C, // 0007840C
1930 0x00, 0x0B, 0x40, 0x40, // 000B4040
1931 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
1932 0x00, 0x07, 0x8C, 0x0C, // 00078C0C
1933 0x00, 0x07, 0x64, 0x00, // 00076400
1934 0x00, 0x07, 0x24, 0x30, // 00072430
1935 0x00, 0x08, 0x2D, 0x41, // 00082D41
1936 0x00, 0x08, 0xA4, 0xC5, // 0008A4C5
1937 0x00, 0x02, 0x9F, 0x10, // 00029F10
1938 0x00, 0x02, 0x16, 0x35, // 00021635
1939 0x00, 0x02, 0x81, 0x08, // 00028108
1940 0x00, 0x00, 0xC1, 0x87, // 0000C187
1941 0x00, 0x00, 0x00, 0x00, // 00000000
1942 0x00, 0x00, 0x00, 0x00, // 00000000
1943 0x00, 0x00, 0x00, 0x00, // 00000000
1944 0x00, 0x00, 0x00, 0x00, // 00000000
1945 0x00, 0x00, 0x00, 0x00, // 00000000
1946 0x00, 0x06, 0x9C, 0x1C, // 00069C1C
1947 0x00, 0x06, 0x04, 0x6A, // 0006046A
1948 0x00, 0x06, 0x08, 0x77, // 00060877
1949 0x00, 0x07, 0x54, 0x01, // 00075401
1950 0x00, 0x07, 0x17, 0x12, // 00071712
1951 0x00, 0x08, 0x80, 0x40, // 00088040
1952 0x00, 0x02, 0x9E, 0x10, // 00029E10
1953 0x00, 0x02, 0x16, 0x71, // 00021671
1954 0x00, 0x02, 0x81, 0x28, // 00028128
1955 0x00, 0x02, 0x88, 0x08, // 00028808
1956 0x00, 0x00, 0xC1, 0x87, // 0000C187
1957 0x00, 0x08, 0x80, 0x41, // 00088041
1958 0x00, 0x06, 0x24, 0x66, // 00062466
1959 0x00, 0x06, 0x2C, 0x67, // 00062C67
1960 0x00, 0x06, 0x34, 0x68, // 00063468
1961 0x00, 0x06, 0x3C, 0x69, // 00063C69
1962 0x00, 0x08, 0x89, 0x40, // 00088940
1963 0x00, 0x02, 0x9F, 0x20, // 00029F20
1964 0x00, 0x0B, 0x64, 0xC4, // 000B64C4
1965 0x00, 0x0B, 0x6D, 0xC5, // 000B6DC5
1966 0x00, 0x0B, 0x76, 0xC6, // 000B76C6
1967 0x00, 0x0B, 0x7F, 0xC7, // 000B7FC7
1968 0x00, 0x08, 0x25, 0x8C, // 0008258C
1969 0x00, 0x08, 0x2D, 0x8D, // 00082D8D
1970 0x00, 0x08, 0x35, 0x8E, // 0008358E
1971 0x00, 0x00, 0xC1, 0x07, // 0000C107
1972 0x00, 0x08, 0x3D, 0x8F, // 00083D8F
1973 0x00, 0x06, 0x84, 0x6A, // 0006846A
1974 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1975 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
1976 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
1977 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
1978 0x00, 0x08, 0x80, 0x41, // 00088041
1979 0x00, 0x06, 0x90, 0x22, // 00069022
1980 0x00, 0x04, 0x27, 0x08, // 00042708
1981 0x00, 0x04, 0x2F, 0x08, // 00042F08
1982 0x00, 0x04, 0x37, 0x08, // 00043708
1983 0x00, 0x04, 0x3F, 0x08, // 00043F08
1984 0x00, 0x08, 0x89, 0x40, // 00088940
1985 0x00, 0x02, 0x9F, 0x20, // 00029F20
1986 0x00, 0x0B, 0x64, 0x40, // 000B6440
1987 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1988 0x00, 0x0B, 0x76, 0x40, // 000B7640
1989 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
1990 0x00, 0x00, 0xC1, 0x07, // 0000C107
1991 0x00, 0x06, 0x84, 0x6A, // 0006846A
1992 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1993 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
1994 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
1995 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
1996 0x00, 0x00, 0x00, 0x00, // 00000000
1997};
1998// addres 06800 count 1077 (4314 bytes)
1999static const unsigned char maspcm_array10[] = {
2000 0xf0, 0x00, 0x04, 0x35, 0x08, 0x00,
2001 0x00, 0x07, 0x44, 0x01, // 00074401
2002 0x00, 0x07, 0x06, 0x61, // 00070661
2003 0x00, 0x07, 0x4C, 0x00, // 00074C00
2004 0x00, 0x07, 0x0F, 0x00, // 00070F00
2005 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2006 0x00, 0x0B, 0x5B, 0x7E, // 000B5B7E
2007 0x00, 0x06, 0x80, 0x22, // 00068022
2008 0x00, 0x04, 0x07, 0x00, // 00040700
2009 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
2010 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2011 0x00, 0x0A, 0x09, 0x78, // 000A0978
2012 0x00, 0x02, 0x9F, 0x20, // 00029F20
2013 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2014 0x00, 0x08, 0xA1, 0x41, // 0008A141
2015 0x00, 0x02, 0x9F, 0x08, // 00029F08
2016 0x00, 0x0B, 0x52, 0x40, // 000B5240
2017 0x00, 0x00, 0x00, 0x00, // 00000000
2018 0x00, 0x08, 0x92, 0x40, // 00089240
2019 0x00, 0x02, 0x9E, 0x08, // 00029E08
2020 0x00, 0x0B, 0x5B, 0x7E, // 000B5B7E
2021 0x00, 0x07, 0x64, 0x01, // 00076401
2022 0x00, 0x07, 0x26, 0x69, // 00072669
2023 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
2024 0x00, 0x0B, 0x75, 0x7E, // 000B757E
2025 0x00, 0x00, 0x00, 0x00, // 00000000
2026 0x00, 0x06, 0xA0, 0x22, // 0006A022
2027 0x00, 0x0A, 0xF7, 0x86, // 000AF786
2028 0x00, 0x0A, 0xEF, 0x85, // 000AEF85
2029 0x00, 0x0A, 0x36, 0x7F, // 000A367F
2030 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
2031 0x00, 0x0B, 0x64, 0x70, // 000B6470
2032 0x00, 0x06, 0x98, 0x79, // 00069879
2033 0x00, 0x06, 0x90, 0x78, // 00069078
2034 0x00, 0x06, 0xA8, 0x77, // 0006A877
2035 0x00, 0x06, 0xB0, 0x7A, // 0006B07A
2036 0x00, 0x06, 0xBC, 0x64, // 0006BC64
2037 0x00, 0x06, 0xB8, 0x71, // 0006B871
2038 0x00, 0x06, 0xB8, 0x70, // 0006B870
2039 0x00, 0x06, 0xB8, 0x69, // 0006B869
2040 0x00, 0x06, 0xB8, 0x7B, // 0006B87B
2041 0x00, 0x06, 0xB8, 0x7C, // 0006B87C
2042 0x00, 0x06, 0x9C, 0x6B, // 00069C6B
2043 0x00, 0x06, 0xBC, 0x6E, // 0006BC6E
2044 0x00, 0x06, 0xBC, 0x72, // 0006BC72
2045 0x00, 0x06, 0xB8, 0x74, // 0006B874
2046 0x00, 0x06, 0xB8, 0x7D, // 0006B87D
2047 0x00, 0x06, 0xBC, 0x73, // 0006BC73
2048 0x00, 0x06, 0x9C, 0x7D, // 00069C7D
2049 0x00, 0x06, 0xBC, 0x7C, // 0006BC7C
2050 0x00, 0x06, 0xBC, 0x7B, // 0006BC7B
2051 0x00, 0x00, 0x00, 0x00, // 00000000
2052 0x00, 0x06, 0x3C, 0x65, // 00063C65
2053 0x00, 0x00, 0x00, 0x00, // 00000000
2054 0x00, 0x09, 0xBF, 0x41, // 0009BF41
2055 0x00, 0x00, 0x00, 0x00, // 00000000
2056 0x00, 0x00, 0x00, 0x00, // 00000000
2057 0x00, 0x00, 0x00, 0x00, // 00000000
2058 0x00, 0x06, 0xBC, 0x7A, // 0006BC7A
2059 0x00, 0x07, 0x7C, 0x01, // 00077C01
2060 0x00, 0x07, 0x3D, 0xFF, // 00073DFF
2061 0x00, 0x07, 0x54, 0x00, // 00075400
2062 0x00, 0x07, 0x14, 0x00, // 00071400
2063 0x00, 0x07, 0x5C, 0x01, // 00075C01
2064 0x00, 0x07, 0x1C, 0x90, // 00071C90
2065 0x00, 0x07, 0x74, 0x01, // 00077401
2066 0x00, 0x07, 0x34, 0xA0, // 000734A0
2067 0x00, 0x06, 0x08, 0x76, // 00060876
2068 0x00, 0x00, 0x00, 0x00, // 00000000
2069 0x00, 0x08, 0x21, 0x41, // 00082141
2070 0x00, 0x06, 0xB8, 0x16, // 0006B816
2071 0x00, 0x06, 0x90, 0x24, // 00069024
2072 0x00, 0x06, 0x90, 0x2C, // 0006902C
2073 0x00, 0x06, 0x90, 0x1C, // 0006901C
2074 0x00, 0x06, 0x90, 0x20, // 00069020
2075 0x00, 0x06, 0x98, 0x25, // 00069825
2076 0x00, 0x06, 0x98, 0x2D, // 0006982D
2077 0x00, 0x06, 0xB0, 0x1D, // 0006B01D
2078 0x00, 0x06, 0xA0, 0x10, // 0006A010
2079 0x00, 0x06, 0x98, 0x21, // 00069821
2080 0x00, 0x07, 0x7C, 0x00, // 00077C00
2081 0x00, 0x07, 0x3C, 0x24, // 00073C24
2082 0x00, 0x07, 0x54, 0x01, // 00075401
2083 0x00, 0x07, 0x16, 0x00, // 00071600
2084 0x00, 0x07, 0x6C, 0x01, // 00076C01
2085 0x00, 0x07, 0x2C, 0x98, // 00072C98
2086 0x00, 0x06, 0xBC, 0x16, // 0006BC16
2087 0x00, 0x06, 0x94, 0x2A, // 0006942A
2088 0x00, 0x00, 0x00, 0x00, // 00000000
2089 0x00, 0x06, 0xAC, 0x2B, // 0006AC2B
2090 0x00, 0x07, 0x7C, 0x01, // 00077C01
2091 0x00, 0x07, 0x3D, 0xFF, // 00073DFF
2092 0x00, 0x07, 0x54, 0x00, // 00075400
2093 0x00, 0x07, 0x14, 0x00, // 00071400
2094 0x00, 0x07, 0x5C, 0x01, // 00075C01
2095 0x00, 0x07, 0x1E, 0x00, // 00071E00
2096 0x00, 0x07, 0x6C, 0x00, // 00076C00
2097 0x00, 0x07, 0x2C, 0x90, // 00072C90
2098 0x00, 0x06, 0xBC, 0x14, // 0006BC14
2099 0x00, 0x06, 0x94, 0x1C, // 0006941C
2100 0x00, 0x06, 0x9C, 0x26, // 00069C26
2101 0x00, 0x06, 0x9C, 0x2E, // 00069C2E
2102 0x00, 0x06, 0xAC, 0x1D, // 0006AC1D
2103 0x00, 0x06, 0xAC, 0x27, // 0006AC27
2104 0x00, 0x06, 0xAC, 0x2F, // 0006AC2F
2105 0x00, 0x07, 0x4C, 0x00, // 00074C00
2106 0x00, 0x07, 0x0C, 0x04, // 00070C04
2107 0x00, 0x07, 0x54, 0x00, // 00075400
2108 0x00, 0x07, 0x14, 0x10, // 00071410
2109 0x00, 0x00, 0x00, 0x00, // 00000000
2110 0x00, 0x06, 0x88, 0x4B, // 0006884B
2111 0x00, 0x00, 0x00, 0x00, // 00000000
2112 0x00, 0x06, 0x94, 0x06, // 00069406
2113 0x00, 0x00, 0x00, 0x00, // 00000000
2114 0x00, 0x07, 0x5C, 0x01, // 00075C01
2115 0x00, 0x07, 0x1E, 0x62, // 00071E62
2116 0x00, 0x06, 0x10, 0x78, // 00061078
2117 0x00, 0x07, 0x64, 0x00, // 00076400
2118 0x00, 0x07, 0x24, 0x00, // 00072400
2119 0x00, 0x07, 0x5C, 0x00, // 00075C00
2120 0x00, 0x07, 0x1F, 0x18, // 00071F18
2121 0x00, 0x06, 0x98, 0x22, // 00069822
2122 0x00, 0x08, 0x92, 0x41, // 00089241
2123 0x00, 0x02, 0x9E, 0xF0, // 00029EF0
2124 0x00, 0x07, 0x5C, 0x00, // 00075C00
2125 0x00, 0x07, 0x1C, 0x00, // 00071C00
2126 0x00, 0x07, 0x6C, 0x00, // 00076C00
2127 0x00, 0x07, 0x2C, 0x80, // 00072C80
2128 0x00, 0x07, 0x74, 0x00, // 00077400
2129 0x00, 0x07, 0x34, 0x04, // 00073404
2130 0x00, 0x0A, 0xED, 0xC0, // 000AEDC0
2131 0x00, 0x02, 0x9F, 0x08, // 00029F08
2132 0x00, 0x08, 0x1B, 0xC6, // 00081BC6
2133 0x00, 0x07, 0x6C, 0x00, // 00076C00
2134 0x00, 0x07, 0x2C, 0x40, // 00072C40
2135 0x00, 0x07, 0x74, 0x02, // 00077402
2136 0x00, 0x07, 0x34, 0x00, // 00073400
2137 0x00, 0x0A, 0xED, 0xC0, // 000AEDC0
2138 0x00, 0x02, 0x9F, 0x08, // 00029F08
2139 0x00, 0x08, 0x1B, 0xC6, // 00081BC6
2140 0x00, 0x07, 0x6C, 0x00, // 00076C00
2141 0x00, 0x07, 0x2C, 0x04, // 00072C04
2142 0x00, 0x07, 0x74, 0x00, // 00077400
2143 0x00, 0x07, 0x34, 0x20, // 00073420
2144 0x00, 0x04, 0x17, 0x00, // 00041700
2145 0x00, 0x0A, 0xED, 0xC0, // 000AEDC0
2146 0x00, 0x02, 0x9F, 0x08, // 00029F08
2147 0x00, 0x08, 0x1B, 0xC6, // 00081BC6
2148 0x00, 0x0A, 0xD2, 0x41, // 000AD241
2149 0x00, 0x02, 0x9F, 0x10, // 00029F10
2150 0x00, 0x07, 0x5C, 0x00, // 00075C00
2151 0x00, 0x07, 0x1C, 0x00, // 00071C00
2152 0x00, 0x07, 0x64, 0x00, // 00076400
2153 0x00, 0x07, 0x27, 0x18, // 00072718
2154 0x00, 0x00, 0x00, 0x00, // 00000000
2155 0x00, 0x06, 0x98, 0x3B, // 0006983B
2156 0x00, 0x06, 0x9C, 0x75, // 00069C75
2157 0x00, 0x06, 0xA0, 0x53, // 0006A053
2158 0x00, 0x06, 0x28, 0x77, // 00062877
2159 0x00, 0x07, 0x54, 0x01, // 00075401
2160 0x00, 0x07, 0x16, 0x40, // 00071640
2161 0x00, 0x07, 0x64, 0x00, // 00076400
2162 0x00, 0x07, 0x24, 0x90, // 00072490
2163 0x00, 0x0B, 0x49, 0x7D, // 000B497D
2164 0x00, 0x07, 0x44, 0x01, // 00074401
2165 0x00, 0x07, 0x06, 0x6C, // 0007066C
2166 0x00, 0x06, 0x90, 0x1E, // 0006901E
2167 0x00, 0x06, 0xA0, 0x1F, // 0006A01F
2168 0x00, 0x06, 0x88, 0x14, // 00068814
2169 0x00, 0x06, 0x80, 0x22, // 00068022
2170 0x00, 0x04, 0x0F, 0x08, // 00040F08
2171 0x00, 0x04, 0x17, 0x08, // 00041708
2172 0x00, 0x04, 0x1F, 0x08, // 00041F08
2173 0x00, 0x04, 0x27, 0x08, // 00042708
2174 0x00, 0x08, 0xAD, 0x40, // 0008AD40
2175 0x00, 0x02, 0x9F, 0x20, // 00029F20
2176 0x00, 0x0B, 0x49, 0x40, // 000B4940
2177 0x00, 0x0B, 0x52, 0x40, // 000B5240
2178 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2179 0x00, 0x0B, 0x64, 0x40, // 000B6440
2180 0x00, 0x07, 0x88, 0x0D, // 0007880D
2181 0x00, 0x07, 0x90, 0x0D, // 0007900D
2182 0x00, 0x07, 0x98, 0x0D, // 0007980D
2183 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
2184 0x00, 0x07, 0x54, 0x01, // 00075401
2185 0x00, 0x07, 0x16, 0x50, // 00071650
2186 0x00, 0x07, 0x64, 0x00, // 00076400
2187 0x00, 0x07, 0x26, 0x90, // 00072690
2188 0x00, 0x0B, 0x49, 0x7D, // 000B497D
2189 0x00, 0x07, 0x44, 0x01, // 00074401
2190 0x00, 0x07, 0x06, 0x70, // 00070670
2191 0x00, 0x06, 0x94, 0x20, // 00069420
2192 0x00, 0x06, 0xA4, 0x21, // 0006A421
2193 0x00, 0x06, 0x8C, 0x15, // 00068C15
2194 0x00, 0x06, 0x80, 0x22, // 00068022
2195 0x00, 0x0B, 0x52, 0x75, // 000B5275
2196 0x00, 0x04, 0x0F, 0x08, // 00040F08
2197 0x00, 0x04, 0x0F, 0x08, // 00040F08
2198 0x00, 0x04, 0x0F, 0x08, // 00040F08
2199 0x00, 0x04, 0x0F, 0x08, // 00040F08
2200 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2201 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2202 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2203 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2204 0x00, 0x06, 0x94, 0x15, // 00069415
2205 0x00, 0x02, 0x1C, 0x0E, // 00021C0E
2206 0x00, 0x07, 0x4C, 0x06, // 00074C06
2207 0x00, 0x07, 0x0C, 0xD3, // 00070CD3
2208 0x00, 0x00, 0x00, 0x00, // 00000000
2209 0x00, 0x00, 0x00, 0x00, // 00000000
2210 0x00, 0x00, 0x00, 0x00, // 00000000
2211 0x00, 0x06, 0x88, 0x0F, // 0006880F
2212 0x00, 0x07, 0x4C, 0x01, // 00074C01
2213 0x00, 0x07, 0x0E, 0x32, // 00070E32
2214 0x00, 0x07, 0x64, 0x01, // 00076401
2215 0x00, 0x07, 0x26, 0x70, // 00072670
2216 0x00, 0x07, 0x6C, 0x00, // 00076C00
2217 0x00, 0x07, 0x2E, 0x90, // 00072E90
2218 0x00, 0x06, 0x8C, 0x22, // 00068C22
2219 0x00, 0x04, 0x80, 0x4F, // 0004804F
2220 0x00, 0x06, 0x08, 0x78, // 00060878
2221 0x00, 0x06, 0xA4, 0x24, // 0006A424
2222 0x00, 0x06, 0xAC, 0x25, // 0006AC25
2223 0x00, 0x06, 0x5C, 0x3C, // 00065C3C
2224 0x00, 0x06, 0x5C, 0x3B, // 00065C3B
2225 0x00, 0x08, 0x89, 0x40, // 00088940
2226 0x00, 0x02, 0x9F, 0x10, // 00029F10
2227 0x00, 0x02, 0x19, 0x1D, // 0002191D
2228 0x00, 0x02, 0x81, 0x28, // 00028128
2229 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
2230 0x00, 0x07, 0x6C, 0x06, // 00076C06
2231 0x00, 0x07, 0x2C, 0xEB, // 00072CEB
2232 0x00, 0x00, 0x00, 0x00, // 00000000
2233 0x00, 0x00, 0x00, 0x00, // 00000000
2234 0x00, 0x00, 0x00, 0x00, // 00000000
2235 0x00, 0x00, 0x00, 0x00, // 00000000
2236 0x00, 0x07, 0x44, 0x01, // 00074401
2237 0x00, 0x07, 0x06, 0x61, // 00070661
2238 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
2239 0x00, 0x07, 0x0C, 0x00, // 00070C00
2240 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2241 0x00, 0x06, 0x80, 0x22, // 00068022
2242 0x00, 0x0A, 0xC7, 0x82, // 000AC782
2243 0x00, 0x02, 0x9E, 0x20, // 00029E20
2244 0x00, 0x0A, 0xC7, 0x81, // 000AC781
2245 0x00, 0x02, 0x9E, 0x10, // 00029E10
2246 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2247 0x00, 0x02, 0x81, 0x28, // 00028128
2248 0x00, 0x00, 0x00, 0x00, // 00000000
2249 0x00, 0x07, 0x54, 0x04, // 00075404
2250 0x00, 0x07, 0x14, 0x00, // 00071400
2251 0x00, 0x06, 0x30, 0x2C, // 0006302C
2252 0x00, 0x08, 0x92, 0x41, // 00089241
2253 0x00, 0x02, 0x88, 0x10, // 00028810
2254 0x00, 0x02, 0x19, 0x0C, // 0002190C
2255 0x00, 0x02, 0x81, 0x28, // 00028128
2256 0x00, 0x0A, 0xF6, 0x41, // 000AF641
2257 0x00, 0x02, 0x9E, 0x10, // 00029E10
2258 0x00, 0x02, 0x18, 0xFA, // 000218FA
2259 0x00, 0x02, 0x81, 0x28, // 00028128
2260 0x00, 0x06, 0x30, 0x2C, // 0006302C
2261 0x00, 0x08, 0x92, 0x41, // 00089241
2262 0x00, 0x02, 0x88, 0x10, // 00028810
2263 0x00, 0x02, 0x19, 0x0C, // 0002190C
2264 0x00, 0x02, 0x81, 0x28, // 00028128
2265 0x00, 0x0A, 0xF6, 0x41, // 000AF641
2266 0x00, 0x02, 0x9F, 0x10, // 00029F10
2267 0x00, 0x02, 0x19, 0x03, // 00021903
2268 0x00, 0x02, 0x81, 0x28, // 00028128
2269 0x00, 0x06, 0x38, 0x52, // 00063852
2270 0x00, 0x06, 0x30, 0x2C, // 0006302C
2271 0x00, 0x09, 0xBF, 0x7A, // 0009BF7A
2272 0x00, 0x00, 0x00, 0x00, // 00000000
2273 0x00, 0x0A, 0xFF, 0x41, // 000AFF41
2274 0x00, 0x02, 0x9E, 0x08, // 00029E08
2275 0x00, 0x0B, 0x36, 0x41, // 000B3641
2276 0x00, 0x00, 0x00, 0x00, // 00000000
2277 0x00, 0x00, 0x00, 0x00, // 00000000
2278 0x00, 0x00, 0x00, 0x00, // 00000000
2279 0x00, 0x06, 0xB0, 0x2C, // 0006B02C
2280 0x00, 0x00, 0x00, 0x00, // 00000000
2281 0x00, 0x08, 0x92, 0x40, // 00089240
2282 0x00, 0x02, 0x88, 0x10, // 00028810
2283 0x00, 0x02, 0x18, 0xE4, // 000218E4
2284 0x00, 0x02, 0x81, 0x28, // 00028128
2285 0x00, 0x00, 0x00, 0x00, // 00000000
2286 0x00, 0x0B, 0x40, 0x7D, // 000B407D
2287 0x00, 0x00, 0x00, 0x00, // 00000000
2288 0x00, 0x00, 0x00, 0x00, // 00000000
2289 0x00, 0x00, 0x00, 0x00, // 00000000
2290 0x00, 0x06, 0x84, 0x15, // 00068415
2291 0x00, 0x04, 0x35, 0x08, // 00043508
2292 0x00, 0x04, 0xB8, 0x16, // 0004B816
2293 0x00, 0x00, 0x00, 0x00, // 00000000
2294 0x00, 0x0C, 0x06, 0x27, // 000C0627
2295 0x00, 0x04, 0x35, 0x18, // 00043518
2296 0x00, 0x04, 0xB8, 0x1E, // 0004B81E
2297 0x00, 0x00, 0x00, 0x00, // 00000000
2298 0x00, 0x0E, 0x06, 0x27, // 000E0627
2299 0x00, 0x04, 0x35, 0x08, // 00043508
2300 0x00, 0x04, 0xB8, 0x16, // 0004B816
2301 0x00, 0x00, 0x00, 0x00, // 00000000
2302 0x00, 0x0C, 0x0E, 0x27, // 000C0E27
2303 0x00, 0x04, 0x35, 0x08, // 00043508
2304 0x00, 0x04, 0xB8, 0x0E, // 0004B80E
2305 0x00, 0x00, 0x00, 0x00, // 00000000
2306 0x00, 0x0E, 0x0E, 0x27, // 000E0E27
2307 0x00, 0x04, 0x35, 0x08, // 00043508
2308 0x00, 0x04, 0xB8, 0x16, // 0004B816
2309 0x00, 0x00, 0x00, 0x00, // 00000000
2310 0x00, 0x0C, 0x16, 0x27, // 000C1627
2311 0x00, 0x04, 0x35, 0x18, // 00043518
2312 0x00, 0x04, 0xB8, 0x1E, // 0004B81E
2313 0x00, 0x00, 0x00, 0x00, // 00000000
2314 0x00, 0x0E, 0x16, 0x27, // 000E1627
2315 0x00, 0x04, 0x35, 0x08, // 00043508
2316 0x00, 0x04, 0xB8, 0x16, // 0004B816
2317 0x00, 0x00, 0x00, 0x00, // 00000000
2318 0x00, 0x0C, 0x1E, 0x27, // 000C1E27
2319 0x00, 0x04, 0x35, 0x08, // 00043508
2320 0x00, 0x04, 0xB8, 0x0E, // 0004B80E
2321 0x00, 0x00, 0x00, 0x00, // 00000000
2322 0x00, 0x0E, 0x1E, 0x27, // 000E1E27
2323 0x00, 0x07, 0x64, 0x01, // 00076401
2324 0x00, 0x00, 0x00, 0x00, // 00000000
2325 0x00, 0x07, 0x27, 0x12, // 00072712
2326 0x00, 0x07, 0x80, 0x0D, // 0007800D
2327 0x00, 0x07, 0x88, 0x0D, // 0007880D
2328 0x00, 0x07, 0x90, 0x0D, // 0007900D
2329 0x00, 0x07, 0x98, 0x0D, // 0007980D
2330 0x00, 0x06, 0xA0, 0x22, // 0006A022
2331 0x00, 0x07, 0x80, 0x0F, // 0007800F
2332 0x00, 0x07, 0x88, 0x0F, // 0007880F
2333 0x00, 0x07, 0x90, 0x0F, // 0007900F
2334 0x00, 0x07, 0x98, 0x07, // 00079807
2335 0x00, 0x06, 0x2C, 0x79, // 00062C79
2336 0x00, 0x00, 0x00, 0x00, // 00000000
2337 0x00, 0x0C, 0x09, 0x0D, // 000C090D
2338 0x00, 0x0C, 0x11, 0x0D, // 000C110D
2339 0x00, 0x0C, 0x19, 0x0D, // 000C190D
2340 0x00, 0x0C, 0x21, 0x0D, // 000C210D
2341 0x00, 0x00, 0x00, 0x00, // 00000000
2342 0x00, 0x00, 0x00, 0x00, // 00000000
2343 0x00, 0x00, 0x00, 0x00, // 00000000
2344 0x00, 0x06, 0x8C, 0x66, // 00068C66
2345 0x00, 0x06, 0x94, 0x67, // 00069467
2346 0x00, 0x06, 0x9C, 0x68, // 00069C68
2347 0x00, 0x06, 0xA4, 0x69, // 0006A469
2348 0x00, 0x06, 0x00, 0x7A, // 0006007A
2349 0x00, 0x00, 0x00, 0x00, // 00000000
2350 0x00, 0x08, 0x80, 0x40, // 00088040
2351 0x00, 0x02, 0x9F, 0x10, // 00029F10
2352 0x00, 0x02, 0x19, 0xF8, // 000219F8
2353 0x00, 0x02, 0x81, 0x28, // 00028128
2354 0x00, 0x06, 0x00, 0x24, // 00060024
2355 0x00, 0x06, 0x08, 0x78, // 00060878
2356 0x00, 0x06, 0x18, 0x76, // 00061876
2357 0x00, 0x07, 0x54, 0x01, // 00075401
2358 0x00, 0x07, 0x16, 0x00, // 00071600
2359 0x00, 0x08, 0x89, 0x41, // 00088941
2360 0x00, 0x02, 0x9F, 0x08, // 00029F08
2361 0x00, 0x06, 0x00, 0x2C, // 0006002C
2362 0x00, 0x06, 0x08, 0x1C, // 0006081C
2363 0x00, 0x08, 0x80, 0xC1, // 000880C1
2364 0x00, 0x02, 0x86, 0x08, // 00028608
2365 0x00, 0x08, 0x00, 0xC2, // 000800C2
2366 0x00, 0x08, 0x9B, 0x41, // 00089B41
2367 0x00, 0x02, 0x9E, 0x08, // 00029E08
2368 0x00, 0x09, 0x80, 0x7F, // 0009807F
2369 0x00, 0x06, 0x14, 0x7B, // 0006147B
2370 0x00, 0x06, 0x1C, 0x7A, // 00061C7A
2371 0x00, 0x08, 0x92, 0x40, // 00089240
2372 0x00, 0x02, 0x9F, 0x28, // 00029F28
2373 0x00, 0x08, 0x98, 0xC3, // 000898C3
2374 0x00, 0x02, 0x87, 0x10, // 00028710
2375 0x00, 0x0B, 0x52, 0x40, // 000B5240
2376 0x00, 0x02, 0x81, 0x08, // 00028108
2377 0x00, 0x0B, 0x40, 0x40, // 000B4040
2378 0x00, 0x00, 0x00, 0x00, // 00000000
2379 0x00, 0x06, 0x94, 0x7B, // 0006947B
2380 0x00, 0x07, 0x54, 0x00, // 00075400
2381 0x00, 0x07, 0x14, 0x12, // 00071412
2382 0x00, 0x07, 0x5C, 0x01, // 00075C01
2383 0x00, 0x07, 0x1E, 0x00, // 00071E00
2384 0x00, 0x08, 0xA0, 0xC2, // 0008A0C2
2385 0x00, 0x02, 0x88, 0x10, // 00028810
2386 0x00, 0x02, 0x19, 0xF8, // 000219F8
2387 0x00, 0x02, 0x81, 0x28, // 00028128
2388 0x00, 0x06, 0x24, 0x2A, // 0006242A
2389 0x00, 0x08, 0xA3, 0xC4, // 0008A3C4
2390 0x00, 0x02, 0x9F, 0x10, // 00029F10
2391 0x00, 0x02, 0x19, 0xF8, // 000219F8
2392 0x00, 0x02, 0x81, 0x28, // 00028128
2393 0x00, 0x07, 0x5C, 0x01, // 00075C01
2394 0x00, 0x07, 0x1E, 0x01, // 00071E01
2395 0x00, 0x07, 0x44, 0x00, // 00074400
2396 0x00, 0x07, 0x04, 0x09, // 00070409
2397 0x00, 0x06, 0x08, 0x69, // 00060869
2398 0x00, 0x06, 0x9C, 0x22, // 00069C22
2399 0x00, 0x06, 0x10, 0x6A, // 0006106A
2400 0x00, 0x08, 0x89, 0x40, // 00088940
2401 0x00, 0x02, 0x9F, 0x10, // 00029F10
2402 0x00, 0x02, 0x19, 0xA4, // 000219A4
2403 0x00, 0x02, 0x81, 0x28, // 00028128
2404 0x00, 0x08, 0x92, 0x41, // 00089241
2405 0x00, 0x02, 0x9F, 0x10, // 00029F10
2406 0x00, 0x02, 0x19, 0xA4, // 000219A4
2407 0x00, 0x02, 0x81, 0x28, // 00028128
2408 0x00, 0x08, 0x80, 0x41, // 00088041
2409 0x00, 0x07, 0x55, 0x5C, // 0007555C
2410 0x00, 0x07, 0x14, 0x00, // 00071400
2411 0x00, 0x07, 0x5D, 0x04, // 00075D04
2412 0x00, 0x07, 0x1C, 0x00, // 00071C00
2413 0x00, 0x07, 0x65, 0x58, // 00076558
2414 0x00, 0x07, 0x24, 0x00, // 00072400
2415 0x00, 0x07, 0x6D, 0x14, // 00076D14
2416 0x00, 0x07, 0x2C, 0x00, // 00072C00
2417 0x00, 0x07, 0x94, 0x0F, // 0007940F
2418 0x00, 0x07, 0x9C, 0x0F, // 00079C0F
2419 0x00, 0x07, 0xA4, 0x0F, // 0007A40F
2420 0x00, 0x07, 0xAC, 0x0F, // 0007AC0F
2421 0x00, 0x06, 0x38, 0x3A, // 0006383A
2422 0x00, 0x0B, 0x76, 0x7D, // 000B767D
2423 0x00, 0x06, 0x10, 0x6C, // 0006106C
2424 0x00, 0x0A, 0xFF, 0x5F, // 000AFF5F
2425 0x00, 0x06, 0x84, 0x05, // 00068405
2426 0x00, 0x02, 0x9F, 0x18, // 00029F18
2427 0x00, 0x09, 0x3F, 0x54, // 00093F54
2428 0x00, 0x02, 0x86, 0x08, // 00028608
2429 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2430 0x00, 0x00, 0x00, 0x00, // 00000000
2431 0x00, 0x06, 0xB4, 0x15, // 0006B415
2432 0x00, 0x07, 0x77, 0xFC, // 000777FC
2433 0x00, 0x07, 0x34, 0x00, // 00073400
2434 0x00, 0x06, 0x00, 0x78, // 00060078
2435 0x00, 0x00, 0x00, 0x00, // 00000000
2436 0x00, 0x08, 0x80, 0x41, // 00088041
2437 0x00, 0x02, 0x9F, 0x08, // 00029F08
2438 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2439 0x00, 0x01, 0x4E, 0x80, // 00014E80
2440 0x00, 0x00, 0x00, 0x00, // 00000000
2441 0x00, 0x09, 0x80, 0x87, // 00098087
2442 0x00, 0x09, 0x88, 0x87, // 00098887
2443 0x00, 0x0C, 0x20, 0x12, // 000C2012
2444 0x00, 0x0E, 0x21, 0x12, // 000E2112
2445 0x00, 0x00, 0x00, 0x00, // 00000000
2446 0x00, 0x00, 0x00, 0x00, // 00000000
2447 0x00, 0x00, 0x00, 0x00, // 00000000
2448 0x00, 0x0C, 0x28, 0x12, // 000C2812
2449 0x00, 0x0E, 0x29, 0x12, // 000E2912
2450 0x00, 0x00, 0x00, 0x00, // 00000000
2451 0x00, 0x00, 0x00, 0x00, // 00000000
2452 0x00, 0x00, 0x00, 0x00, // 00000000
2453 0x00, 0x09, 0x84, 0x48, // 00098448
2454 0x00, 0x09, 0x8D, 0x48, // 00098D48
2455 0x00, 0x08, 0x92, 0x40, // 00089240
2456 0x00, 0x02, 0x9F, 0x20, // 00029F20
2457 0x00, 0x09, 0xA4, 0x48, // 0009A448
2458 0x00, 0x08, 0x04, 0x40, // 00080440
2459 0x00, 0x09, 0xAD, 0x48, // 0009AD48
2460 0x00, 0x08, 0x0D, 0x40, // 00080D40
2461 0x00, 0x0A, 0xE4, 0xC6, // 000AE4C6
2462 0x00, 0x0A, 0xC0, 0xC6, // 000AC0C6
2463 0x00, 0x0A, 0xED, 0xC6, // 000AEDC6
2464 0x00, 0x0A, 0xC9, 0xC6, // 000AC9C6
2465 0x00, 0x00, 0x00, 0x00, // 00000000
2466 0x00, 0x07, 0xE4, 0x0F, // 0007E40F
2467 0x00, 0x07, 0xC4, 0x0F, // 0007C40F
2468 0x00, 0x07, 0xEC, 0x0F, // 0007EC0F
2469 0x00, 0x07, 0xCC, 0x0F, // 0007CC0F
2470 0x00, 0x06, 0x00, 0x69, // 00060069
2471 0x00, 0x07, 0x4C, 0x01, // 00074C01
2472 0x00, 0x07, 0x0E, 0x65, // 00070E65
2473 0x00, 0x08, 0x00, 0x41, // 00080041
2474 0x00, 0x06, 0x1C, 0x64, // 00061C64
2475 0x00, 0x07, 0x54, 0x00, // 00075400
2476 0x00, 0x07, 0x14, 0x39, // 00071439
2477 0x00, 0x06, 0x88, 0x22, // 00068822
2478 0x00, 0x04, 0x0F, 0x00, // 00040F00
2479 0x00, 0x08, 0x90, 0xC2, // 000890C2
2480 0x00, 0x02, 0x9E, 0x28, // 00029E28
2481 0x00, 0x08, 0x9B, 0x40, // 00089B40
2482 0x00, 0x02, 0x9F, 0x08, // 00029F08
2483 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2484 0x00, 0x0B, 0x40, 0x40, // 000B4040
2485 0x00, 0x08, 0x09, 0x41, // 00080941
2486 0x00, 0x00, 0x00, 0x00, // 00000000
2487 0x00, 0x00, 0x00, 0x00, // 00000000
2488 0x00, 0x06, 0x80, 0x69, // 00068069
2489 0x00, 0x07, 0x88, 0x07, // 00078807
2490 0x00, 0x07, 0x4C, 0x01, // 00074C01
2491 0x00, 0x0B, 0x76, 0x75, // 000B7675
2492 0x00, 0x07, 0x0E, 0x01, // 00070E01
2493 0x00, 0x07, 0x44, 0x00, // 00074400
2494 0x00, 0x07, 0x04, 0x04, // 00070404
2495 0x00, 0x00, 0x00, 0x00, // 00000000
2496 0x00, 0x00, 0x00, 0x00, // 00000000
2497 0x00, 0x0B, 0x52, 0x40, // 000B5240
2498 0x00, 0x06, 0x80, 0x4B, // 0006804B
2499 0x00, 0x07, 0x44, 0x00, // 00074400
2500 0x00, 0x07, 0x05, 0x3D, // 0007053D
2501 0x00, 0x06, 0xB4, 0x15, // 0006B415
2502 0x00, 0x06, 0x8C, 0x2A, // 00068C2A
2503 0x00, 0x06, 0x94, 0x72, // 00069472
2504 0x00, 0x06, 0x80, 0x4B, // 0006804B
2505 0x00, 0x06, 0x00, 0x24, // 00060024
2506 0x00, 0x06, 0x08, 0x78, // 00060878
2507 0x00, 0x06, 0x18, 0x76, // 00061876
2508 0x00, 0x07, 0x54, 0x01, // 00075401
2509 0x00, 0x07, 0x16, 0x00, // 00071600
2510 0x00, 0x08, 0x89, 0x41, // 00088941
2511 0x00, 0x02, 0x9F, 0x08, // 00029F08
2512 0x00, 0x06, 0x00, 0x2C, // 0006002C
2513 0x00, 0x06, 0x08, 0x20, // 00060820
2514 0x00, 0x08, 0x80, 0xC1, // 000880C1
2515 0x00, 0x02, 0x86, 0x08, // 00028608
2516 0x00, 0x08, 0x00, 0xC2, // 000800C2
2517 0x00, 0x06, 0x0C, 0x26, // 00060C26
2518 0x00, 0x06, 0x14, 0x1C, // 0006141C
2519 0x00, 0x07, 0x5C, 0x01, // 00075C01
2520 0x00, 0x07, 0x1E, 0x00, // 00071E00
2521 0x00, 0x08, 0x89, 0xC2, // 000889C2
2522 0x00, 0x02, 0x86, 0x08, // 00028608
2523 0x00, 0x08, 0x09, 0xC3, // 000809C3
2524 0x00, 0x06, 0x24, 0x24, // 00062424
2525 0x00, 0x09, 0x22, 0xC4, // 000922C4
2526 0x00, 0x02, 0x86, 0x08, // 00028608
2527 0x00, 0x08, 0x24, 0xC3, // 000824C3
2528 0x00, 0x09, 0x29, 0xC4, // 000929C4
2529 0x00, 0x02, 0x86, 0x08, // 00028608
2530 0x00, 0x08, 0x0C, 0x40, // 00080C40
2531 0x00, 0x06, 0x24, 0x2E, // 0006242E
2532 0x00, 0x09, 0x22, 0xC4, // 000922C4
2533 0x00, 0x02, 0x86, 0x08, // 00028608
2534 0x00, 0x08, 0x24, 0xC3, // 000824C3
2535 0x00, 0x09, 0x29, 0xC4, // 000929C4
2536 0x00, 0x02, 0x86, 0x08, // 00028608
2537 0x00, 0x08, 0x0C, 0x40, // 00080C40
2538 0x00, 0x07, 0x54, 0x00, // 00075400
2539 0x00, 0x07, 0x14, 0x20, // 00071420
2540 0x00, 0x00, 0x00, 0x00, // 00000000
2541 0x00, 0x08, 0x80, 0xC2, // 000880C2
2542 0x00, 0x02, 0x86, 0x10, // 00028610
2543 0x00, 0x02, 0x1A, 0x86, // 00021A86
2544 0x00, 0x02, 0x81, 0x28, // 00028128
2545 0x00, 0x08, 0x89, 0xC2, // 000889C2
2546 0x00, 0x02, 0x86, 0x10, // 00028610
2547 0x00, 0x02, 0x1A, 0x86, // 00021A86
2548 0x00, 0x02, 0x81, 0x28, // 00028128
2549 0x00, 0x06, 0x28, 0x3A, // 0006283A
2550 0x00, 0x00, 0x00, 0x00, // 00000000
2551 0x00, 0x0A, 0xED, 0x5F, // 000AED5F
2552 0x00, 0x02, 0x9F, 0x18, // 00029F18
2553 0x00, 0x09, 0x2D, 0x54, // 00092D54
2554 0x00, 0x02, 0x86, 0x08, // 00028608
2555 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2556 0x00, 0x04, 0xB8, 0x0D, // 0004B80D
2557 0x00, 0x00, 0x00, 0x00, // 00000000
2558 0x00, 0x09, 0xBF, 0x7C, // 0009BF7C
2559 0x00, 0x06, 0x00, 0x78, // 00060078
2560 0x00, 0x00, 0x00, 0x00, // 00000000
2561 0x00, 0x08, 0x80, 0x41, // 00088041
2562 0x00, 0x02, 0x9F, 0x08, // 00029F08
2563 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2564 0x00, 0x01, 0x0D, 0x10, // 00010D10
2565 0x00, 0x06, 0x20, 0x76, // 00062076
2566 0x00, 0x09, 0x86, 0x8D, // 0009868D
2567 0x00, 0x09, 0x8E, 0x8D, // 00098E8D
2568 0x00, 0x08, 0xA4, 0x40, // 0008A440
2569 0x00, 0x02, 0x9F, 0x08, // 00029F08
2570 0x00, 0x08, 0x08, 0x40, // 00080840
2571 0x00, 0x0C, 0x31, 0x08, // 000C3108
2572 0x00, 0x0E, 0x31, 0x09, // 000E3109
2573 0x00, 0x00, 0x00, 0x00, // 00000000
2574 0x00, 0x00, 0x00, 0x00, // 00000000
2575 0x00, 0x0C, 0x01, 0x08, // 000C0108
2576 0x00, 0x0E, 0x01, 0x09, // 000E0109
2577 0x00, 0x00, 0x00, 0x00, // 00000000
2578 0x00, 0x00, 0x00, 0x00, // 00000000
2579 0x00, 0x00, 0x00, 0x00, // 00000000
2580 0x00, 0x0A, 0xF6, 0x7C, // 000AF67C
2581 0x00, 0x09, 0x9F, 0x7F, // 00099F7F
2582 0x00, 0x02, 0x82, 0x08, // 00028208
2583 0x00, 0x08, 0x36, 0x42, // 00083642
2584 0x00, 0x0A, 0xC0, 0x7C, // 000AC07C
2585 0x00, 0x09, 0xBF, 0x7F, // 0009BF7F
2586 0x00, 0x02, 0x82, 0x08, // 00028208
2587 0x00, 0x08, 0x00, 0x42, // 00080042
2588 0x00, 0x00, 0x00, 0x00, // 00000000
2589 0x00, 0x07, 0xF4, 0x0C, // 0007F40C
2590 0x00, 0x00, 0x00, 0x00, // 00000000
2591 0x00, 0x07, 0xC4, 0x0C, // 0007C40C
2592 0x00, 0x02, 0x16, 0x52, // 00021652
2593 0x00, 0x07, 0x4C, 0x06, // 00074C06
2594 0x00, 0x07, 0x0E, 0x56, // 00070E56
2595 0x00, 0x00, 0x00, 0x00, // 00000000
2596 0x00, 0x00, 0x00, 0x00, // 00000000
2597 0x00, 0x00, 0x00, 0x00, // 00000000
2598 0x00, 0x06, 0x88, 0x0F, // 0006880F
2599 0x00, 0x06, 0x00, 0x7B, // 0006007B
2600 0x00, 0x06, 0x10, 0x74, // 00061074
2601 0x00, 0x08, 0x00, 0x41, // 00080041
2602 0x00, 0x07, 0x5C, 0x00, // 00075C00
2603 0x00, 0x07, 0x1C, 0x30, // 00071C30
2604 0x00, 0x08, 0x92, 0x40, // 00089240
2605 0x00, 0x02, 0x9E, 0x18, // 00029E18
2606 0x00, 0x08, 0x88, 0xC3, // 000888C3
2607 0x00, 0x02, 0x9E, 0x08, // 00029E08
2608 0x00, 0x02, 0x15, 0xDB, // 000215DB
2609 0x00, 0x07, 0x4C, 0x06, // 00074C06
2610 0x00, 0x07, 0x0E, 0x66, // 00070E66
2611 0x00, 0x06, 0x80, 0x7B, // 0006807B
2612 0x00, 0x00, 0x00, 0x00, // 00000000
2613 0x00, 0x00, 0x00, 0x00, // 00000000
2614 0x00, 0x06, 0x88, 0x0E, // 0006880E
2615 0x00, 0x06, 0x00, 0x78, // 00060078
2616 0x00, 0x06, 0x08, 0x24, // 00060824
2617 0x00, 0x08, 0x80, 0x41, // 00088041
2618 0x00, 0x02, 0x9F, 0x08, // 00029F08
2619 0x00, 0x06, 0x08, 0x2C, // 0006082C
2620 0x00, 0x06, 0x34, 0x26, // 00063426
2621 0x00, 0x00, 0x00, 0x00, // 00000000
2622 0x00, 0x08, 0x86, 0xC1, // 000886C1
2623 0x00, 0x07, 0x5C, 0x00, // 00075C00
2624 0x00, 0x07, 0x1F, 0x00, // 00071F00
2625 0x00, 0x07, 0x54, 0x01, // 00075401
2626 0x00, 0x07, 0x16, 0x00, // 00071600
2627 0x00, 0x08, 0xA8, 0xC3, // 0008A8C3
2628 0x00, 0x02, 0x87, 0x08, // 00028708
2629 0x00, 0x08, 0x80, 0xC2, // 000880C2
2630 0x00, 0x06, 0x20, 0x74, // 00062074
2631 0x00, 0x08, 0x28, 0xC3, // 000828C3
2632 0x00, 0x02, 0x86, 0x08, // 00028608
2633 0x00, 0x08, 0x00, 0xC2, // 000800C2
2634 0x00, 0x06, 0x18, 0x79, // 00061879
2635 0x00, 0x06, 0x14, 0x6E, // 0006146E
2636 0x00, 0x08, 0xA4, 0x41, // 0008A441
2637 0x00, 0x02, 0x9E, 0x20, // 00029E20
2638 0x00, 0x08, 0xBB, 0x42, // 0008BB42
2639 0x00, 0x02, 0x9E, 0x10, // 00029E10
2640 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
2641 0x00, 0x08, 0x10, 0x40, // 00081040
2642 0x00, 0x00, 0x00, 0x00, // 00000000
2643 0x00, 0x00, 0x00, 0x00, // 00000000
2644 0x00, 0x06, 0x98, 0x79, // 00069879
2645 0x00, 0x06, 0x94, 0x6E, // 0006946E
2646 0x00, 0x00, 0x00, 0x00, // 00000000
2647 0x00, 0x06, 0x00, 0x78, // 00060078
2648 0x00, 0x06, 0x08, 0x24, // 00060824
2649 0x00, 0x08, 0x80, 0x41, // 00088041
2650 0x00, 0x02, 0x9F, 0x08, // 00029F08
2651 0x00, 0x06, 0x08, 0x2C, // 0006082C
2652 0x00, 0x06, 0x00, 0x1C, // 0006001C
2653 0x00, 0x07, 0x54, 0x01, // 00075401
2654 0x00, 0x07, 0x16, 0x00, // 00071600
2655 0x00, 0x06, 0x18, 0x71, // 00061871
2656 0x00, 0x00, 0x00, 0x00, // 00000000
2657 0x00, 0x06, 0x24, 0x6B, // 0006246B
2658 0x00, 0x08, 0xA9, 0xC0, // 0008A9C0
2659 0x00, 0x02, 0x86, 0x08, // 00028608
2660 0x00, 0x08, 0x2D, 0xC2, // 00082DC2
2661 0x00, 0x08, 0xB4, 0x41, // 0008B441
2662 0x00, 0x02, 0x9F, 0x10, // 00029F10
2663 0x00, 0x02, 0x1A, 0xA5, // 00021AA5
2664 0x00, 0x02, 0x81, 0x28, // 00028128
2665 0x00, 0x08, 0xB5, 0x42, // 0008B542
2666 0x00, 0x02, 0x86, 0x10, // 00028610
2667 0x00, 0x02, 0x1A, 0xA5, // 00021AA5
2668 0x00, 0x02, 0x81, 0x28, // 00028128
2669 0x00, 0x06, 0x34, 0x26, // 00063426
2670 0x00, 0x0A, 0xD1, 0x41, // 000AD141
2671 0x00, 0x0A, 0xF6, 0x7E, // 000AF67E
2672 0x00, 0x08, 0x12, 0xC6, // 000812C6
2673 0x00, 0x0B, 0x64, 0x40, // 000B6440
2674 0x00, 0x0A, 0xC2, 0x7E, // 000AC27E
2675 0x00, 0x00, 0x00, 0x00, // 00000000
2676 0x00, 0x00, 0x00, 0x00, // 00000000
2677 0x00, 0x06, 0xA4, 0x6B, // 0006A46B
2678 0x00, 0x07, 0x64, 0x00, // 00076400
2679 0x00, 0x07, 0x24, 0x25, // 00072425
2680 0x00, 0x08, 0x93, 0xC5, // 000893C5
2681 0x00, 0x06, 0xA8, 0x71, // 0006A871
2682 0x00, 0x08, 0x9C, 0xC2, // 00089CC2
2683 0x00, 0x02, 0x88, 0x10, // 00028810
2684 0x00, 0x02, 0x1B, 0x86, // 00021B86
2685 0x00, 0x02, 0x81, 0x28, // 00028128
2686 0x00, 0x06, 0x00, 0x78, // 00060078
2687 0x00, 0x06, 0x18, 0x52, // 00061852
2688 0x00, 0x07, 0x54, 0x08, // 00075408
2689 0x00, 0x07, 0x14, 0x00, // 00071400
2690 0x00, 0x07, 0x7C, 0x06, // 00077C06
2691 0x00, 0x07, 0x3E, 0xFD, // 00073EFD
2692 0x00, 0x08, 0x80, 0x41, // 00088041
2693 0x00, 0x02, 0x9F, 0x20, // 00029F20
2694 0x00, 0x0A, 0xC3, 0xC2, // 000AC3C2
2695 0x00, 0x02, 0x9E, 0x10, // 00029E10
2696 0x00, 0x02, 0x1B, 0xA7, // 00021BA7
2697 0x00, 0x02, 0x81, 0x28, // 00028128
2698 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
2699 0x00, 0x06, 0x34, 0x26, // 00063426
2700 0x00, 0x06, 0x3C, 0x1C, // 00063C1C
2701 0x00, 0x07, 0x54, 0x01, // 00075401
2702 0x00, 0x07, 0x16, 0x00, // 00071600
2703 0x00, 0x06, 0x18, 0x70, // 00061870
2704 0x00, 0x08, 0x86, 0xC7, // 000886C7
2705 0x00, 0x02, 0x86, 0x08, // 00028608
2706 0x00, 0x08, 0x00, 0xC2, // 000800C2
2707 0x00, 0x07, 0x64, 0x00, // 00076400
2708 0x00, 0x07, 0x24, 0x25, // 00072425
2709 0x00, 0x06, 0x28, 0x79, // 00062879
2710 0x00, 0x08, 0x93, 0xC0, // 000893C0
2711 0x00, 0x06, 0x80, 0x70, // 00068070
2712 0x00, 0x08, 0x94, 0xC2, // 000894C2
2713 0x00, 0x02, 0x88, 0x38, // 00028838
2714 0x00, 0x08, 0xBD, 0x41, // 0008BD41
2715 0x00, 0x02, 0x9E, 0x08, // 00029E08
2716 0x00, 0x09, 0xAD, 0x41, // 0009AD41
2717 0x00, 0x07, 0x7C, 0x06, // 00077C06
2718 0x00, 0x07, 0x3E, 0xFD, // 00073EFD
2719 0x00, 0x02, 0x1B, 0xB0, // 00021BB0
2720 0x00, 0x02, 0x81, 0x28, // 00028128
2721 0x00, 0x06, 0xA8, 0x79, // 0006A879
2722 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
2723 0x00, 0x06, 0x14, 0x26, // 00061426
2724 0x00, 0x06, 0x20, 0x7D, // 0006207D
2725 0x00, 0x06, 0x28, 0x7C, // 0006287C
2726 0x00, 0x08, 0x32, 0x60, // 00083260
2727 0x00, 0x02, 0x86, 0x18, // 00028618
2728 0x00, 0x08, 0x2D, 0xC4, // 00082DC4
2729 0x00, 0x0B, 0x64, 0x40, // 000B6440
2730 0x00, 0x02, 0x81, 0x08, // 00028108
2731 0x00, 0x0B, 0x64, 0x7F, // 000B647F
2732 0x00, 0x00, 0x00, 0x00, // 00000000
2733 0x00, 0x00, 0x00, 0x00, // 00000000
2734 0x00, 0x06, 0xA8, 0x7C, // 0006A87C
2735 0x00, 0x06, 0xA0, 0x7D, // 0006A07D
2736 0x00, 0x07, 0x7C, 0x00, // 00077C00
2737 0x00, 0x07, 0x3C, 0x01, // 00073C01
2738 0x00, 0x06, 0x00, 0x7C, // 0006007C
2739 0x00, 0x06, 0x30, 0x79, // 00063079
2740 0x00, 0x08, 0xBF, 0xC0, // 0008BFC0
2741 0x00, 0x02, 0x88, 0xC0, // 000288C0
2742 0x00, 0x08, 0xB6, 0x41, // 0008B641
2743 0x00, 0x02, 0x9E, 0xB0, // 00029EB0
2744 0x00, 0x0B, 0x40, 0x40, // 000B4040
2745 0x00, 0x08, 0xBA, 0xC1, // 0008BAC1
2746 0x00, 0x06, 0x34, 0x6E, // 0006346E
2747 0x00, 0x08, 0xBF, 0xC6, // 0008BFC6
2748 0x00, 0x07, 0x5C, 0x00, // 00075C00
2749 0x00, 0x07, 0x1F, 0x00, // 00071F00
2750 0x00, 0x07, 0x54, 0x01, // 00075401
2751 0x00, 0x07, 0x16, 0x00, // 00071600
2752 0x00, 0x08, 0xAF, 0xC3, // 0008AFC3
2753 0x00, 0x02, 0x87, 0x08, // 00028708
2754 0x00, 0x08, 0xBF, 0xC2, // 0008BFC2
2755 0x00, 0x08, 0x2F, 0xC3, // 00082FC3
2756 0x00, 0x02, 0x86, 0x08, // 00028608
2757 0x00, 0x08, 0x3F, 0xC2, // 00083FC2
2758 0x00, 0x00, 0x00, 0x00, // 00000000
2759 0x00, 0x02, 0x1C, 0x15, // 00021C15
2760 0x00, 0x07, 0x4C, 0x06, // 00074C06
2761 0x00, 0x07, 0x0E, 0xFD, // 00070EFD
2762 0x00, 0x00, 0x00, 0x00, // 00000000
2763 0x00, 0x00, 0x00, 0x00, // 00000000
2764 0x00, 0x06, 0x80, 0x7C, // 0006807C
2765 0x00, 0x06, 0x88, 0x0F, // 0006880F
2766 0x00, 0x00, 0x00, 0x00, // 00000000
2767 0x00, 0x06, 0x04, 0x64, // 00060464
2768 0x00, 0x06, 0x0C, 0x72, // 00060C72
2769 0x00, 0x06, 0x10, 0x74, // 00061074
2770 0x00, 0x08, 0x80, 0x40, // 00088040
2771 0x00, 0x02, 0x9F, 0x40, // 00029F40
2772 0x00, 0x08, 0x89, 0x40, // 00088940
2773 0x00, 0x02, 0x9F, 0x10, // 00029F10
2774 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2775 0x00, 0x02, 0x81, 0x28, // 00028128
2776 0x00, 0x08, 0x92, 0x40, // 00089240
2777 0x00, 0x02, 0x9E, 0x10, // 00029E10
2778 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2779 0x00, 0x02, 0x81, 0x28, // 00028128
2780 0x00, 0x07, 0x44, 0x01, // 00074401
2781 0x00, 0x07, 0x06, 0x61, // 00070661
2782 0x00, 0x07, 0x4C, 0x00, // 00074C00
2783 0x00, 0x07, 0x0C, 0x01, // 00070C01
2784 0x00, 0x00, 0x00, 0x00, // 00000000
2785 0x00, 0x06, 0x80, 0x22, // 00068022
2786 0x00, 0x04, 0x07, 0x00, // 00040700
2787 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
2788 0x00, 0x02, 0x9F, 0x10, // 00029F10
2789 0x00, 0x08, 0x80, 0x41, // 00088041
2790 0x00, 0x02, 0x81, 0x10, // 00028110
2791 0x00, 0x02, 0x1B, 0x68, // 00021B68
2792 0x00, 0x02, 0x81, 0x28, // 00028128
2793 0x00, 0x07, 0x80, 0x07, // 00078007
2794 0x00, 0x07, 0x44, 0x01, // 00074401
2795 0x00, 0x07, 0x06, 0x61, // 00070661
2796 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
2797 0x00, 0x07, 0x0C, 0x00, // 00070C00
2798 0x00, 0x06, 0x14, 0x64, // 00061464
2799 0x00, 0x06, 0x80, 0x22, // 00068022
2800 0x00, 0x0A, 0xC7, 0x81, // 000AC781
2801 0x00, 0x02, 0x9E, 0x08, // 00029E08
2802 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2803 0x00, 0x00, 0x00, 0x00, // 00000000
2804 0x00, 0x00, 0x00, 0x00, // 00000000
2805 0x00, 0x00, 0x00, 0x00, // 00000000
2806 0x00, 0x06, 0x94, 0x64, // 00069464
2807 0x00, 0x07, 0x44, 0x01, // 00074401
2808 0x00, 0x07, 0x06, 0x69, // 00070669
2809 0x00, 0x07, 0x4C, 0x00, // 00074C00
2810 0x00, 0x07, 0x0C, 0x02, // 00070C02
2811 0x00, 0x06, 0x10, 0x7A, // 0006107A
2812 0x00, 0x06, 0x20, 0x1C, // 0006201C
2813 0x00, 0x06, 0x80, 0x22, // 00068022
2814 0x00, 0x0A, 0xC3, 0x81, // 000AC381
2815 0x00, 0x02, 0x9F, 0x10, // 00029F10
2816 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2817 0x00, 0x02, 0x81, 0x48, // 00028148
2818 0x00, 0x08, 0x9A, 0x41, // 00089A41
2819 0x00, 0x02, 0x9E, 0x38, // 00029E38
2820 0x00, 0x06, 0x00, 0x78, // 00060078
2821 0x00, 0x06, 0x08, 0x24, // 00060824
2822 0x00, 0x08, 0x80, 0x41, // 00088041
2823 0x00, 0x02, 0x9F, 0x08, // 00029F08
2824 0x00, 0x06, 0x08, 0x2C, // 0006082C
2825 0x00, 0x0B, 0x52, 0x40, // 000B5240
2826 0x00, 0x0A, 0xE1, 0x7E, // 000AE17E
2827 0x00, 0x00, 0x00, 0x00, // 00000000
2828 0x00, 0x00, 0x00, 0x00, // 00000000
2829 0x00, 0x06, 0x90, 0x7A, // 0006907A
2830 0x00, 0x06, 0xA0, 0x1C, // 0006A01C
2831 0x00, 0x07, 0x44, 0x01, // 00074401
2832 0x00, 0x07, 0x06, 0x69, // 00070669
2833 0x00, 0x07, 0x4C, 0x00, // 00074C00
2834 0x00, 0x07, 0x0C, 0x01, // 00070C01
2835 0x00, 0x07, 0x44, 0x01, // 00074401
2836 0x00, 0x07, 0x06, 0x6C, // 0007066C
2837 0x00, 0x06, 0x80, 0x22, // 00068022
2838 0x00, 0x0A, 0xCF, 0x81, // 000ACF81
2839 0x00, 0x06, 0x18, 0x77, // 00061877
2840 0x00, 0x06, 0x80, 0x22, // 00068022
2841 0x00, 0x0B, 0x09, 0xC3, // 000B09C3
2842 0x00, 0x02, 0x9E, 0x10, // 00029E10
2843 0x00, 0x02, 0x1B, 0x68, // 00021B68
2844 0x00, 0x02, 0x81, 0x28, // 00028128
2845 0x00, 0x06, 0x24, 0x6B, // 0006246B
2846 0x00, 0x0B, 0x1B, 0x41, // 000B1B41
2847 0x00, 0x06, 0x14, 0x65, // 00061465
2848 0x00, 0x06, 0x04, 0x6A, // 0006046A
2849 0x00, 0x08, 0x28, 0x41, // 00082841
2850 0x00, 0x02, 0x9F, 0x08, // 00029F08
2851 0x00, 0x08, 0x82, 0xC0, // 000882C0
2852 0x00, 0x08, 0xA4, 0x40, // 0008A440
2853 0x00, 0x02, 0x9E, 0x10, // 00029E10
2854 0x00, 0x02, 0x1B, 0x66, // 00021B66
2855 0x00, 0x02, 0x81, 0x28, // 00028128
2856 0x00, 0x0B, 0x40, 0x41, // 000B4041
2857 0x00, 0x0B, 0x64, 0x40, // 000B6440
2858 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2859 0x00, 0x0B, 0x76, 0x40, // 000B7640
2860 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2861 0x00, 0x08, 0x9B, 0x40, // 00089B40
2862 0x00, 0x02, 0x9E, 0x28, // 00029E28
2863 0x00, 0x04, 0x27, 0x08, // 00042708
2864 0x00, 0x04, 0x2F, 0x08, // 00042F08
2865 0x00, 0x04, 0x37, 0x08, // 00043708
2866 0x00, 0x04, 0x3F, 0x08, // 00043F08
2867 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
2868 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
2869 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
2870 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
2871 0x00, 0x06, 0x98, 0x77, // 00069877
2872 0x00, 0x06, 0x84, 0x6A, // 0006846A
2873 0x00, 0x00, 0x00, 0x00, // 00000000
2874 0x00, 0x06, 0x00, 0x6D, // 0006006D
2875 0x00, 0x00, 0x00, 0x00, // 00000000
2876 0x00, 0x08, 0x80, 0x41, // 00088041
2877 0x00, 0x00, 0x00, 0x00, // 00000000
2878 0x00, 0x00, 0x00, 0x00, // 00000000
2879 0x00, 0x00, 0x00, 0x00, // 00000000
2880 0x00, 0x06, 0xC0, 0x6D, // 0006C06D
2881 0x00, 0x00, 0x00, 0x00, // 00000000
2882 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
2883 0x00, 0x07, 0x6C, 0x06, // 00076C06
2884 0x00, 0x07, 0x2F, 0x78, // 00072F78
2885 0x00, 0x00, 0x00, 0x00, // 00000000
2886 0x00, 0x00, 0x00, 0x00, // 00000000
2887 0x00, 0x00, 0x00, 0x00, // 00000000
2888 0x00, 0x00, 0x00, 0x00, // 00000000
2889 0x00, 0x02, 0x19, 0x5B, // 0002195B
2890 0x00, 0x02, 0x81, 0x28, // 00028128
2891 0x00, 0x00, 0x00, 0x00, // 00000000
2892 0x00, 0x00, 0x00, 0x00, // 00000000
2893 0x00, 0x00, 0x00, 0x00, // 00000000
2894 0x00, 0x00, 0x00, 0x00, // 00000000
2895 0x00, 0x00, 0x00, 0x00, // 00000000
2896 0x00, 0x00, 0xC1, 0x80, // 0000C180
2897 0x00, 0x00, 0x00, 0x00, // 00000000
2898 0x00, 0x00, 0x00, 0x00, // 00000000
2899 0x00, 0x00, 0x00, 0x00, // 00000000
2900 0x00, 0x00, 0x00, 0x00, // 00000000
2901 0x00, 0x00, 0x00, 0x00, // 00000000
2902 0x00, 0x00, 0x00, 0x00, // 00000000
2903 0x00, 0x06, 0x00, 0x1C, // 0006001C
2904 0x00, 0x07, 0x6C, 0x01, // 00076C01
2905 0x00, 0x07, 0x2E, 0x00, // 00072E00
2906 0x00, 0x07, 0x7C, 0x01, // 00077C01
2907 0x00, 0x07, 0x3E, 0x68, // 00073E68
2908 0x00, 0x0A, 0xF1, 0x7E, // 000AF17E
2909 0x00, 0x09, 0x00, 0xC6, // 000900C6
2910 0x00, 0x02, 0x88, 0x08, // 00028808
2911 0x00, 0x08, 0x00, 0xC5, // 000800C5
2912 0x00, 0x06, 0x2C, 0x64, // 00062C64
2913 0x00, 0x0A, 0x00, 0x7F, // 000A007F
2914 0x00, 0x06, 0x20, 0x7A, // 0006207A
2915 0x00, 0x06, 0xB8, 0x22, // 0006B822
2916 0x00, 0x04, 0x3F, 0x00, // 00043F00
2917 0x00, 0x08, 0xA4, 0x40, // 0008A440
2918 0x00, 0x02, 0x9E, 0x08, // 00029E08
2919 0x00, 0x08, 0x3F, 0xC0, // 00083FC0
2920 0x00, 0x08, 0xAD, 0x40, // 0008AD40
2921 0x00, 0x02, 0x9F, 0x10, // 00029F10
2922 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2923 0x00, 0x02, 0x81, 0x28, // 00028128
2924 0x00, 0x06, 0x2C, 0x7F, // 00062C7F
2925 0x00, 0x08, 0xA4, 0x40, // 0008A440
2926 0x00, 0x02, 0x9E, 0x08, // 00029E08
2927 0x00, 0x0B, 0x6D, 0x6F, // 000B6D6F
2928 0x00, 0x0B, 0x40, 0x7F, // 000B407F
2929 0x00, 0x02, 0x1A, 0xAD, // 00021AAD
2930 0x00, 0x06, 0xB0, 0x1C, // 0006B01C
2931 0x00, 0x0A, 0xFF, 0x7E, // 000AFF7E
2932 0x00, 0x00, 0x00, 0x00, // 00000000
2933 0x00, 0x06, 0x84, 0x72, // 00068472
2934 0x00, 0x06, 0xAC, 0x7F, // 0006AC7F
2935 0x00, 0x07, 0xB8, 0x07, // 0007B807
2936 0x00, 0x06, 0x10, 0x2C, // 0006102C
2937 0x00, 0x0B, 0x64, 0x6D, // 000B646D
2938 0x00, 0x0A, 0xD2, 0x7E, // 000AD27E
2939 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
2940 0x00, 0x00, 0x00, 0x00, // 00000000
2941 0x00, 0x02, 0x81, 0x20, // 00028120
2942 0x00, 0x06, 0x90, 0x1C, // 0006901C
2943 0x00, 0x06, 0x90, 0x20, // 00069020
2944 0x00, 0x06, 0x9C, 0x7B, // 00069C7B
2945 0x00, 0x0B, 0x64, 0x6E, // 000B646E
2946 0x00, 0x06, 0x34, 0x6D, // 0006346D
2947 0x00, 0x00, 0x00, 0x00, // 00000000
2948 0x00, 0x00, 0x00, 0x00, // 00000000
2949 0x00, 0x06, 0xA4, 0x7F, // 0006A47F
2950 0x00, 0x06, 0xB4, 0x0F, // 0006B40F
2951 0x00, 0x06, 0xB4, 0x6C, // 0006B46C
2952 0x00, 0x0B, 0x76, 0x7F, // 000B767F
2953 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2954 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2955 0x00, 0x08, 0x3F, 0x40, // 00083F40
2956 0x00, 0x0B, 0x40, 0x40, // 000B4040
2957 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2958 0x00, 0x06, 0xB4, 0x6B, // 0006B46B
2959 0x00, 0x04, 0xB0, 0x0D, // 0004B00D
2960 0x00, 0x00, 0x00, 0x00, // 00000000
2961 0x00, 0x09, 0xB6, 0x7C, // 0009B67C
2962 0x00, 0x01, 0x05, 0x10, // 00010510
2963 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
2964 0x00, 0x02, 0x82, 0x08, // 00028208
2965 0x00, 0x08, 0x00, 0x42, // 00080042
2966 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2967 0x00, 0x09, 0xB6, 0x7F, // 0009B67F
2968 0x00, 0x02, 0x82, 0x08, // 00028208
2969 0x00, 0x08, 0x3F, 0x42, // 00083F42
2970 0x00, 0x07, 0x84, 0x0C, // 0007840C
2971 0x00, 0x0B, 0x40, 0x40, // 000B4040
2972 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
2973 0x00, 0x07, 0xBC, 0x0C, // 0007BC0C
2974 0x00, 0x07, 0x64, 0x00, // 00076400
2975 0x00, 0x07, 0x24, 0x30, // 00072430
2976 0x00, 0x08, 0x2D, 0x41, // 00082D41
2977 0x00, 0x08, 0xA4, 0xC5, // 0008A4C5
2978 0x00, 0x02, 0x9F, 0x10, // 00029F10
2979 0x00, 0x02, 0x1B, 0xBE, // 00021BBE
2980 0x00, 0x02, 0x81, 0x28, // 00028128
2981 0x00, 0x07, 0x7C, 0x00, // 00077C00
2982 0x00, 0x07, 0x3F, 0x18, // 00073F18
2983 0x00, 0x06, 0x00, 0x78, // 00060078
2984 0x00, 0x06, 0x10, 0x24, // 00061024
2985 0x00, 0x08, 0x80, 0x41, // 00088041
2986 0x00, 0x00, 0x00, 0x00, // 00000000
2987 0x00, 0x02, 0x9F, 0x18, // 00029F18
2988 0x00, 0x07, 0x7C, 0x00, // 00077C00
2989 0x00, 0x07, 0x3C, 0x00, // 00073C00
2990 0x00, 0x06, 0x10, 0x2C, // 0006102C
2991 0x00, 0x00, 0x00, 0x00, // 00000000
2992 0x00, 0x0A, 0xD2, 0x7E, // 000AD27E
2993 0x00, 0x00, 0x00, 0x00, // 00000000
2994 0x00, 0x00, 0x00, 0x00, // 00000000
2995 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
2996 0x00, 0x06, 0x04, 0x64, // 00060464
2997 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2998 0x00, 0x08, 0x80, 0x41, // 00088041
2999 0x00, 0x00, 0xDE, 0x87, // 0000DE87
3000 0x00, 0x06, 0x90, 0x1C, // 0006901C
3001 0x00, 0x06, 0x90, 0x20, // 00069020
3002 0x00, 0x06, 0x9C, 0x62, // 00069C62
3003 0x00, 0x06, 0x9C, 0x6E, // 00069C6E
3004 0x00, 0x06, 0x9C, 0x63, // 00069C63
3005 0x00, 0x06, 0xAC, 0x7D, // 0006AC7D
3006 0x00, 0x00, 0x00, 0x00, // 00000000
3007 0x00, 0x06, 0x04, 0x73, // 00060473
3008 0x00, 0x07, 0x5C, 0x01, // 00075C01
3009 0x00, 0x07, 0x1E, 0x00, // 00071E00
3010 0x00, 0x08, 0x80, 0x41, // 00088041
3011 0x00, 0x02, 0x9E, 0x10, // 00029E10
3012 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
3013 0x00, 0x02, 0x81, 0x28, // 00028128
3014 0x00, 0x0B, 0x40, 0x7F, // 000B407F
3015 0x00, 0x08, 0x12, 0x42, // 00081242
3016 0x00, 0x09, 0x1B, 0xC2, // 00091BC2
3017 0x00, 0x02, 0x87, 0x08, // 00028708
3018 0x00, 0x08, 0x92, 0xC3, // 000892C3
3019 0x00, 0x06, 0x84, 0x73, // 00068473
3020 0x00, 0x07, 0x64, 0x00, // 00076400
3021 0x00, 0x07, 0x27, 0x00, // 00072700
3022 0x00, 0x07, 0x7C, 0x00, // 00077C00
3023 0x00, 0x07, 0x3C, 0x00, // 00073C00
3024 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
3025 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
3026 0x00, 0x06, 0xA4, 0x05, // 0006A405
3027 0x00, 0x01, 0x41, 0x80, // 00014180
3028 0x00, 0x06, 0xB8, 0x22, // 0006B822
3029 0x00, 0x07, 0x98, 0x0F, // 0007980F
3030 0x00, 0x00, 0x00, 0x00, // 00000000
3031 0x00, 0x07, 0x98, 0x0F, // 0007980F
3032 0x00, 0x00, 0xC1, 0x87, // 0000C187
3033 0x00, 0x06, 0x90, 0x1C, // 0006901C
3034 0x00, 0x06, 0x9C, 0x62, // 00069C62
3035 0x00, 0x00, 0x00, 0x00, // 00000000
3036 0x00, 0x06, 0x9C, 0x63, // 00069C63
3037 0x00, 0x06, 0x9C, 0x6E, // 00069C6E
3038 0x00, 0x06, 0xAC, 0x7D, // 0006AC7D
3039 0x00, 0x00, 0xC1, 0x07, // 0000C107
3040 0x00, 0x0B, 0x40, 0x40, // 000B4040
3041 0x00, 0x00, 0x00, 0x00, // 00000000
3042 0x00, 0x00, 0x00, 0x00, // 00000000
3043 0x00, 0x00, 0x00, 0x00, // 00000000
3044 0x00, 0x06, 0x84, 0x62, // 00068462
3045 0x00, 0x06, 0x84, 0x63, // 00068463
3046 0x00, 0x06, 0x04, 0x62, // 00060462
3047 0x00, 0x06, 0x1C, 0x63, // 00061C63
3048 0x00, 0x0A, 0x0F, 0x41, // 000A0F41
3049 0x00, 0x08, 0x97, 0xC0, // 000897C0
3050 0x00, 0x08, 0x1B, 0xC2, // 00081BC2
3051 0x00, 0x0A, 0x12, 0x47, // 000A1247
3052 0x00, 0x07, 0x65, 0x00, // 00076500
3053 0x00, 0x07, 0x24, 0x00, // 00072400
3054 0x00, 0x07, 0x6D, 0x00, // 00076D00
3055 0x00, 0x07, 0x2C, 0x00, // 00072C00
3056 0x00, 0x07, 0x75, 0x00, // 00077500
3057 0x00, 0x07, 0x34, 0x00, // 00073400
3058 0x00, 0x0C, 0x12, 0x25, // 000C1225
3059 0x00, 0x0E, 0x11, 0x24, // 000E1124
3060 0x00, 0x0E, 0x13, 0x26, // 000E1326
3061 0x00, 0x00, 0x00, 0x00, // 00000000
3062 0x00, 0x00, 0x00, 0x00, // 00000000
3063 0x00, 0x06, 0x04, 0x6C, // 0006046C
3064 0x00, 0x00, 0xC1, 0x07, // 0000C107
3065 0x00, 0x09, 0x12, 0xC0, // 000912C0
3066 0x00, 0x06, 0xBC, 0x62, // 0006BC62
3067 0x00, 0x06, 0x9C, 0x63, // 00069C63
3068 0x00, 0x00, 0x00, 0x00, // 00000000
3069 0x00, 0x06, 0x94, 0x6C, // 0006946C
3070 0x00, 0x06, 0x94, 0x0F, // 0006940F
3071 0x00, 0x03, 0x33, 0x33, // 00033333
3072 0x00, 0x00, 0x00, 0x00, // 00000000
3073 0x00, 0x00, 0x00, 0x00, // 00000000
3074 0x00, 0x00, 0x00, 0x00, // 00000000
3075 0x00, 0x00, 0x00, 0x00, // 00000000
3076 0x00, 0x00, 0x00, 0x00, // 00000000
3077 0x00, 0x00, 0x00, 0x00, // 00000000
3078};
3079
3080struct i2c_block {
3081 const unsigned char *data;
3082 unsigned len;
3083};
3084
3085static struct i2c_block maspcm[] = {
3086 { maspcm_array1, sizeof(maspcm_array1) },
3087 { maspcm_array2, sizeof(maspcm_array2) },
3088 { maspcm_array3, sizeof(maspcm_array3) },
3089 { maspcm_array4, sizeof(maspcm_array4) },
3090 { maspcm_array5, sizeof(maspcm_array5) },
3091 { maspcm_array6, sizeof(maspcm_array6) },
3092 { maspcm_array7, sizeof(maspcm_array7) },
3093 { maspcm_array8, sizeof(maspcm_array8) },
3094 { maspcm_array9, sizeof(maspcm_array9) },
3095 { maspcm_array10, sizeof(maspcm_array10) },
3096};
3097
3098/************ End of MAS pcm codec ************/
3099
3100#define WAVPLAY_QUIT BUTTON_OFF
3101
3102#define PCM_MAIN_IO_CONTROL 0x0661
3103#define PCM_IF_STATUS_CONTROL 0x0662
3104#define PCM_OFREQ_CONTROL 0x0663
3105#define PCM_OUTPUT_CLOCK_CONF 0x0664
3106#define PCM_FRAME_COUNTER 0x0665
3107#define PCM_APP_RUNNING 0x0666
3108#define PCM_SAMPLE_RATE_STATUS 0x0667
3109#define PCM_BUFFER_ERROR_COUNTER 0x0668
3110#define PCM_SOFT_MUTE 0x0669
3111#define PCM_SPDIF_CHANNEL_STATUS 0x066a
3112#define PCM_SAMPLE_RATE 0x066b
3113#define PCM_VOL_OUT_LL 0x066c
3114#define PCM_VOL_OUT_RL 0x066d
3115#define PCM_VOL_OUT_LR 0x066e
3116#define PCM_VOL_OUT_RR 0x066f
3117#define PCM_VOL_IN_LL 0x0670
3118#define PCM_VOL_IN_RL 0x0671
3119#define PCM_VOL_IN_LR 0x0672
3120#define PCM_VOL_IN_RR 0x0673
3121
3122#define IRQ3 (*((volatile unsigned long*)0x0900010C))
3123#define IRQ6 (*((volatile unsigned long*)0x09000118))
3124#define DEI3 (*((volatile unsigned long*)0x09000138))
3125
3126#define PLAY_OK 0
3127#define PLAY_ERROR -1
3128#define PLAY_GOT_USB 1
3129
3130#define LOW_WATER_CHUNKSIZE (256*1024)
3131
3132/* declarations */
3133
3134void start_demand_isr(void) __attribute__((interrupt_handler));
3135void stop_demand_isr(void) __attribute__((interrupt_handler));
3136void dma_end_isr(void) __attribute__((interrupt_handler));
3137
3138/* variables */
3139
3140static unsigned char *aud_buf;
3141static ssize_t aud_size;
3142static unsigned char *plug_buf;
3143
3144static void (*pcm_callback)(unsigned char**, int*) = NULL;
3145static bool playing = false;
3146static bool filling;
3147static int last_dma_chunksize;
3148static int aud_read = 0;
3149static int aud_write = 0;
3150static int low_water = (256*1024);
3151
3152/** i2c, MAS configuration **/
3153
3154void i2c_random_write(int addr, int cmd, const unsigned char* data, int size)
3155{
3156 plug_buf[0] = cmd;
3157 rb->memcpy(plug_buf+1, data, size);
3158
3159 rb->i2c_begin();
3160 rb->i2c_write(addr, plug_buf, size+1);
3161 rb->i2c_end();
3162}
3163
3164void mas_freeze(void)
3165{
3166 static const unsigned char freeze[] = { 0x00, 0x00 };
3167
3168 /* Freeze DSP */
3169 i2c_random_write(MAS_ADR, MAS_DATA_WRITE, freeze, sizeof(freeze));
3170 /* mas_run(0); in core implementation */
3171
3172 /* stop all internal transfers */
3173 rb->mas_writereg(0x3b, 0x00318); /* stopdma 1 */
3174 rb->mas_writereg(0x43, 0x00300); /* stopdma 2 */
3175 rb->mas_writereg(0x4b, 0); /* stopdma 3 */
3176 rb->mas_writereg(0x53, 0x00318); /* stopdma 4 */
3177 rb->mas_writereg(0x6b, 0); /* stopdma 5 */
3178 rb->mas_writereg(0xbb, 0x00318); /* stopdma 6 */
3179 rb->mas_writereg(0xc3, 0x00300); /* stopdma 7 */
3180 rb->mas_writereg(0x06, 0); /* stopdma 8 */
3181}
3182
3183void mas_download_pcm(void)
3184{
3185 static const unsigned char runi2s[] = { 0x10, 0x00 };
3186 unsigned i;
3187
3188 mas_freeze();
3189
3190 // Download program to MAS memory
3191 for ( i = 0; i < (sizeof(maspcm)/sizeof(struct i2c_block)); i++ )
3192 i2c_random_write(MAS_ADR, MAS_DATA_WRITE, maspcm[i].data, maspcm[i].len);
3193
3194 rb->mas_writereg(0x6b, 0xc0000); /* Reconfigure data to program memory */
3195
3196 /* Start execution at D0:1000 */
3197 i2c_random_write(MAS_ADR, MAS_DATA_WRITE, runi2s, sizeof(runi2s));
3198 /* mas_run(0x1000); in core implementation */
3199}
3200
3201void mas_restore(void)
3202{
3203 static const unsigned char resetdsp[] = { 0x88, 0x00 };
3204 static const unsigned char initdsp[] = { 0x8c, 0x00 };
3205 unsigned long val;
3206
3207 i2c_random_write(MAS_ADR, MAS_CONTROL, resetdsp, sizeof(resetdsp));
3208 /* mas_direct_config_write(MAS_CONTROL, 0x8d00); in core implementation */
3209 rb->sleep(1);
3210 i2c_random_write(MAS_ADR, MAS_CONTROL, initdsp, sizeof(initdsp));
3211 /* mas_direct_config_write(MAS_CONTROL, 0x8c00); in core implementation */
3212
3213 /* Stop the current application */
3214 val = 0;
3215 rb->mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
3216 do
3217 rb->mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
3218 while(val);
3219
3220#ifdef HAVE_SPDIF_OUT
3221 val = 0x0009; /* Disable SDO and SDI, low impedance S/PDIF outputs */
3222#else
3223 val = 0x002d; /* Disable SDO and SDI, disable S/PDIF output */
3224#endif
3225 rb->mas_writemem(MAS_BANK_D0, MAS_D0_INTERFACE_CONTROL, &val, 1);
3226
3227 val = 0x0025; /* Set Demand mode and validate all settings */
3228 rb->mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val, 1);
3229
3230 val = 0x000c; /* Start the Layer2/3 decoder applications */
3231 rb->mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
3232 do
3233 rb->mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
3234 while((val & 0x000c) != 0x000c);
3235}
3236
3237void pcm_channel_config(int channel_config, int stereo_width)
3238{
3239 /* default values: stereo */
3240 unsigned long val_ll = 0x80001;
3241 unsigned long val_lr = 0;
3242 unsigned long val_rl = 0;
3243 unsigned long val_rr = 0x80001;
3244
3245 switch(channel_config)
3246 {
3247 /* Note: cases are in different order that in firmware/sound.c
3248 * to work around a gcc bug (jumptable creation)! */
3249
3250 /* case SOUND_CHAN_STEREO unnecessary */
3251
3252 case SOUND_CHAN_MONO:
3253 val_ll = 0xc0001;
3254 val_lr = 0xc0001;
3255 val_rl = 0xc0001;
3256 val_rr = 0xc0001;
3257 break;
3258
3259 case SOUND_CHAN_MONO_LEFT:
3260 val_ll = 0x80001;
3261 val_lr = 0x80001;
3262 val_rl = 0;
3263 val_rr = 0;
3264 break;
3265
3266 case SOUND_CHAN_MONO_RIGHT:
3267 val_ll = 0;
3268 val_lr = 0;
3269 val_rl = 0x80001;
3270 val_rr = 0x80001;
3271 break;
3272
3273 case SOUND_CHAN_KARAOKE:
3274 val_ll = 0xc0001;
3275 val_lr = 0x3ffff;
3276 val_rl = 0x3ffff;
3277 val_rr = 0xc0001;
3278 break;
3279
3280 case SOUND_CHAN_CUSTOM:
3281 {
3282 /* fixed point variables (matching MAS internal format)
3283 integer part: upper 13 bits (inlcuding sign)
3284 fractional part: lower 19 bits */
3285 long fp_width, fp_straight, fp_cross;
3286
3287 fp_width = (stereo_width * 0x7ffff) / 100;
3288 if (stereo_width <= 100)
3289 {
3290 fp_straight = - (0x7ffff + fp_width) / 2;
3291 fp_cross = fp_straight + fp_width;
3292 }
3293 else
3294 {
3295 /* straight = - (1 + width) / (2 * width) */
3296 fp_straight = - (((0x7ffff + fp_width) / (fp_width >> 9)) << 9);
3297 fp_cross = 0x7ffff + fp_straight;
3298 }
3299 val_ll = val_rr = fp_straight & 0xfffff;
3300 val_lr = val_rl = fp_cross & 0xfffff;
3301 }
3302 break;
3303
3304 }
3305
3306 rb->mas_writemem(MAS_BANK_D0, PCM_VOL_OUT_LL, &val_ll, 1); /* LL */
3307 rb->mas_writemem(MAS_BANK_D0, PCM_VOL_OUT_LR, &val_lr, 1); /* LR */
3308 rb->mas_writemem(MAS_BANK_D0, PCM_VOL_OUT_RL, &val_rl, 1); /* RL */
3309 rb->mas_writemem(MAS_BANK_D0, PCM_VOL_OUT_RR, &val_rr, 1); /* RR */
3310}
3311
3312/** Basic playback system **/
3313
3314void start_demand_isr(void)
3315{
3316 ICR |= 0x0010; /* IRQ3 edge sensitive */
3317 or_b(0x80, &SCR0);
3318}
3319
3320void stop_demand_isr(void)
3321{
3322 and_b(~0x80, &SCR0);
3323}
3324
3325void dma_end_isr(void)
3326{
3327 unsigned char* start;
3328 int size = 0;
3329
3330 if (pcm_callback)
3331 pcm_callback(&start, &size);
3332
3333 if (size > 0)
3334 {
3335 DTCR3 = size;
3336 SAR3 = (unsigned int) start;
3337 }
3338 else
3339 {
3340 CHCR3 &= ~0x0001; /* Disable the DMA interrupt */
3341 playing = false;
3342 }
3343 CHCR3 &= ~0x0002; /* Clear DMA interrupt */
3344}
3345
3346void demand_irq_enable(bool on)
3347{
3348 int oldlevel = disable_irq_save();
3349
3350 if(on)
3351 {
3352 IPRA = (IPRA & 0xfff0) | 0x000b;
3353 ICR &= ~0x0010; /* IRQ3 level sensitive */
3354 }
3355 else
3356 {
3357 IPRA &= 0xfff0;
3358 }
3359
3360 restore_irq(oldlevel);
3361}
3362
3363static inline int available(void)
3364{
3365 int space = aud_write - aud_read;
3366 if (space < 0)
3367 space += aud_size;
3368
3369 return space;
3370}
3371
3372void pcm_get_more(unsigned char** start, int* size)
3373{
3374 int advance;
3375
3376 aud_read += last_dma_chunksize;
3377 if (aud_read >= aud_size)
3378 aud_read = 0;
3379
3380 advance = MIN(available(), aud_size - aud_read);
3381 advance = MIN(0x4000, advance);
3382
3383 *start = aud_buf + aud_read;
3384 *size = advance;
3385
3386 last_dma_chunksize = advance;
3387}
3388
3389void pcm_start(void)
3390{
3391 int advance;
3392
3393 advance = MIN(available(), aud_size - aud_read);
3394 advance = MIN(0x4000, advance);
3395
3396 if (!advance)
3397 return;
3398
3399 pcm_callback = pcm_get_more;
3400
3401 /* init DMA */
3402 DAR3 = 0x5FFFEC3;
3403 CHCR3 &= ~0x0002; /* Clear interrupt */
3404 CHCR3 = 0x1504; /* Single address destination, TXI0, IE=1 */
3405 DMAOR = 0x0001; /* Enable DMA */
3406
3407 SAR3 = (unsigned int)(aud_buf + aud_read);
3408 DTCR3 = advance;
3409 last_dma_chunksize = advance;
3410
3411 playing = true;
3412 demand_irq_enable(true);
3413 CHCR3 |= 0x0001; /* Enable DMA IRQ */
3414}
3415
3416void hijack_interrupts(bool on)
3417{
3418 static bool taken = false;
3419 static unsigned long orig_DEI3, orig_IRQ3, orig_IRQ6;
3420
3421 if (on && !taken)
3422 {
3423 orig_IRQ3 = IRQ3;
3424 IRQ3 = (unsigned long)start_demand_isr;
3425 orig_IRQ6 = IRQ6;
3426 IRQ6 = (unsigned long)stop_demand_isr;
3427 orig_DEI3 = DEI3;
3428 DEI3 = (unsigned long)dma_end_isr;
3429 }
3430 else if (!on && taken)
3431 {
3432 IRQ3 = orig_IRQ3;
3433 IRQ6 = orig_IRQ6;
3434 DEI3 = orig_DEI3;
3435 }
3436 taken = on;
3437}
3438
3439void cleanup(void *fd)
3440{
3441 demand_irq_enable(false);
3442 hijack_interrupts(false);
3443
3444 mas_restore();
3445 rb->sound_set(SOUND_CHANNELS, rb->global_settings->channel_config);
3446 rb->sound_set(SOUND_STEREO_WIDTH, rb->global_settings->stereo_width);
3447
3448 /* reconfigure SCI */
3449 while (!(SSR0 & SCI_TEND)); /* wait for end of transfer */
3450 BRR0 = 2; /* ~1 MBit/s */
3451
3452 rb->close(*(int*)fd);
3453}
3454
3455int play_file(char* filename)
3456{
3457 int button;
3458 int fd;
3459 int wanted, got;
3460 unsigned format, channels, samplerate, samplebits, bytes, time;
3461 unsigned rate = 0;
3462 unsigned long mas;
3463
3464 fd = rb->open(filename, O_RDONLY);
3465 if (fd < 0)
3466 {
3467 rb->splash(2*HZ, "Couldn't open WAV file");
3468 return PLAY_ERROR;
3469 }
3470
3471 /* Process WAV header */
3472 wanted = 44;
3473 got = rb->read(fd, aud_buf, wanted); /* wav header */
3474 if (got < 0)
3475 {
3476 rb->splash(2*HZ, "Read error");
3477 rb->close(fd);
3478 return PLAY_ERROR;
3479 }
3480 else if (got < wanted)
3481 {
3482 rb->splash(2*HZ, "File too short");
3483 rb->close(fd);
3484 return PLAY_ERROR;
3485 }
3486
3487 if (rb->memcmp(aud_buf, "RIFF", 4)
3488 || rb->memcmp(aud_buf + 8, "WAVE", 4)
3489 || rb->memcmp(aud_buf + 12, "fmt ", 4)
3490 || rb->memcmp(aud_buf + 36, "data", 4))
3491 {
3492 rb->splash(2*HZ, "No canonical WAV file");
3493 rb->close(fd);
3494 return PLAY_ERROR;
3495 }
3496
3497 format = letoh16(*(uint16_t *)(aud_buf + 20));
3498 if (format != 1)
3499 {
3500 rb->splashf(2*HZ, "Unsupported format: %d", format);
3501 rb->close(fd);
3502 return PLAY_ERROR;
3503 }
3504
3505 channels = letoh16(*(uint16_t *)(aud_buf + 22));
3506 if (channels > 2)
3507 {
3508 rb->splashf(2*HZ, "Too many channels: %d", channels);
3509 rb->close(fd);
3510 return PLAY_ERROR;
3511 }
3512
3513 samplebits = letoh16(*(uint16_t *)(aud_buf + 34));
3514 if (samplebits != 16)
3515 {
3516 rb->splashf(2*HZ, "Unsupported sample depth: %dbit", samplebits);
3517 rb->close(fd);
3518 return PLAY_ERROR;
3519 }
3520
3521 samplerate = letoh32(*(uint32_t *)(aud_buf + 24));
3522 switch (samplerate)
3523 {
3524 case 8000: rate = 0; break;
3525 case 11025: rate = 1; break;
3526 case 12000: rate = 2; break;
3527 case 16000: rate = 4; break;
3528 case 22050: rate = 5; break;
3529 case 24000: rate = 6; break;
3530 case 32000: rate = 8; break;
3531 case 44100: rate = 9; break;
3532 case 48000: rate = 10; break;
3533 default:
3534 rb->splashf(2*HZ, "Unsupported samplerate: %dHz", samplerate);
3535 rb->close(fd);
3536 return PLAY_ERROR;
3537 }
3538 bytes = letoh32(*(uint32_t *)(aud_buf + 40));
3539 time = bytes / (samplerate * 2 * channels);
3540
3541 rb->lcd_puts(0, 0, "Playing WAV file");
3542 rb->lcd_putsf(0, 1, "%dHz %s", samplerate,
3543 (channels == 1) ? "mono" : "stereo");
3544 rb->lcd_putsf(0, 2, "Length: %d:%02d", time / 60, time % 60);
3545 rb->lcd_update();
3546
3547 rb->sound_set_pitch(PITCH_SPEED_100); /* reset pitch */
3548 mas_download_pcm(); /* Download PCM codec */
3549
3550 /* Configure PCM codec */
3551 pcm_channel_config(rb->global_settings->channel_config,
3552 rb->global_settings->stereo_width);
3553#ifdef HAVE_SPDIF_OUT
3554 mas = 0x0009; /* Disable SDO and SDI, low impedance S/PDIF outputs */
3555#else
3556 mas = 0x002d; /* Disable SDO and SDI, disable S/PDIF output */
3557#endif
3558 rb->mas_writemem(MAS_BANK_D0, PCM_IF_STATUS_CONTROL, &mas, 1);
3559
3560 mas = 0x0060 /* no framing, little endian */
3561 | ((channels == 1) ? 0x10 : 0) /* mono or stereo */
3562 | rate; /* bitrate */
3563 rb->mas_writemem(MAS_BANK_D0, PCM_SAMPLE_RATE, &mas, 1);
3564
3565 mas = 0x1025; /* playback, SIBC clock invert, validate */
3566 rb->mas_writemem(MAS_BANK_D0, PCM_MAIN_IO_CONTROL, &mas, 1);
3567
3568 /* configure SCI */
3569 while (!(SSR0 & SCI_TEND)); /* wait for end of transfer */
3570 BRR0 = 0; /* maximum speed, ~3 MBit/s */
3571
3572#if !(CONFIG_STORAGE & STORAGE_MMC)
3573 low_water = 5 /* seconds */
3574 * 2 /* bytes per sample */
3575 * channels
3576 * samplerate;
3577#endif
3578
3579 hijack_interrupts(true);
3580 filling = true;
3581
3582 /* Playback loop */
3583 while (filling || playing)
3584 {
3585 if (filling)
3586 {
3587 int free_space = aud_read - aud_write;
3588
3589 if (free_space <= 0)
3590 free_space += aud_size;
3591 free_space -= 2;
3592
3593 if (free_space <= 0)
3594 {
3595 filling = false;
3596 rb->storage_sleep();
3597 }
3598 else
3599 {
3600 wanted = MIN(free_space, aud_size - aud_write);
3601#if (CONFIG_STORAGE & STORAGE_MMC)
3602 wanted = MIN(wanted, 256*1024);
3603#elif MEMORYSIZE == 8
3604 wanted = MIN(wanted, 1024*1024);
3605#endif
3606 if (available() < low_water)
3607 wanted = MIN(wanted, LOW_WATER_CHUNKSIZE);
3608
3609 got = rb->read(fd, aud_buf + aud_write, wanted);
3610
3611 if (got > 0)
3612 {
3613 rb->bitswap(aud_buf + aud_write, got);
3614
3615 aud_write += got;
3616 if (aud_write >= aud_size)
3617 aud_write = 0;
3618 }
3619 else /* end of file */
3620 {
3621 filling = false;
3622 }
3623
3624 if (((available() >= low_water) || !filling) && !playing)
3625 pcm_start();
3626 }
3627 button = rb->button_get(false);
3628 }
3629 else
3630 {
3631 button = rb->button_get_w_tmo(HZ/2);
3632 if ((available() < low_water) && (got > 0))
3633 filling = true;
3634 }
3635 if (button == WAVPLAY_QUIT)
3636 break;
3637 else if (rb->default_event_handler_ex(button, cleanup, &fd) == SYS_USB_CONNECTED)
3638 return PLAY_GOT_USB;
3639
3640
3641 }
3642 cleanup(&fd);
3643 return PLAY_OK;
3644}
3645
3646/* plugin entry point */
3647enum plugin_status plugin_start(const void* parameter)
3648{
3649 size_t buf_size;
3650
3651 if (!parameter)
3652 {
3653 rb->splash(HZ, "Play WAV file!");
3654 return PLUGIN_OK;
3655 }
3656
3657 plug_buf = rb->plugin_get_buffer(&buf_size);
3658 if (buf_size < 6700) /* needed for i2c transfer */
3659 {
3660 rb->splash(HZ, "Out of memory.");
3661 return PLUGIN_ERROR;
3662 }
3663
3664 aud_buf = rb->plugin_get_audio_buffer(&buf_size);
3665 aud_size = buf_size;
3666
3667 switch (play_file((char*)parameter))
3668 {
3669 case PLAY_OK:
3670 return PLUGIN_OK;
3671 case PLAY_GOT_USB:
3672 return PLUGIN_USB_CONNECTED;
3673 default:
3674 return PLUGIN_ERROR;
3675 }
3676}
diff --git a/apps/plugins/wavrecord.c b/apps/plugins/wavrecord.c
deleted file mode 100644
index 23751be041..0000000000
--- a/apps/plugins/wavrecord.c
+++ /dev/null
@@ -1,3811 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 Jens Arnold
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "plugin.h"
22#include "lib/configfile.h"
23
24
25
26/************ Start of MAS pcm codec, raw i2c blocks ************/
27
28// address 04640 count 30 (126 bytes)
29static const unsigned char maspcm_array1[] = {
30 0xe0, 0x00, 0x00, 0x1e, 0x06, 0x40,
31 0x00, 0x08, 0x00, 0x00, // 00080000
32 0x00, 0x00, 0x00, 0x00, // 00000000
33 0x00, 0x00, 0x00, 0x00, // 00000000
34 0x00, 0x08, 0x00, 0x00, // 00080000
35 0x00, 0x00, 0x00, 0x25, // 00000025
36 0x00, 0x00, 0x00, 0x04, // 00000004
37 0x00, 0x00, 0x48, 0x00, // 00004800
38 0x00, 0x08, 0x00, 0x00, // 00080000
39 0x00, 0x00, 0x00, 0x00, // 00000000
40 0x00, 0x00, 0x00, 0x00, // 00000000
41 0x00, 0x00, 0xFF, 0xFF, // 0000FFFF
42 0x00, 0x00, 0x00, 0x00, // 00000000
43 0x00, 0x00, 0x00, 0x00, // 00000000
44 0x00, 0x00, 0x82, 0x00, // 00008200
45 0x00, 0x00, 0x00, 0x0A, // 0000000A
46 0x00, 0x08, 0x00, 0x00, // 00080000
47 0x00, 0x00, 0x00, 0x00, // 00000000
48 0x00, 0x00, 0x00, 0x00, // 00000000
49 0x00, 0x08, 0x00, 0x00, // 00080000
50 0x00, 0x08, 0x00, 0x00, // 00080000
51 0x00, 0x00, 0x00, 0x00, // 00000000
52 0x00, 0x00, 0x00, 0x00, // 00000000
53 0x00, 0x08, 0x00, 0x00, // 00080000
54 0x00, 0x00, 0x03, 0x18, // 00000318
55 0x00, 0x00, 0x03, 0x18, // 00000318
56 0x00, 0x00, 0x03, 0x00, // 00000300
57 0x00, 0x00, 0x03, 0x00, // 00000300
58 0x00, 0x00, 0x03, 0x18, // 00000318
59 0x00, 0x00, 0x00, 0x00, // 00000000
60 0x00, 0x00, 0x03, 0x00, // 00000300
61};
62// address 04674 count 81 (330 bytes)
63static const unsigned char maspcm_array2[] = {
64 0xe0, 0x00, 0x00, 0x51, 0x06, 0x74,
65 0x00, 0x00, 0x60, 0x00, // 00006000
66 0x00, 0x00, 0x00, 0x02, // 00000002
67 0x00, 0x00, 0x00, 0x60, // 00000060
68 0x00, 0x00, 0x00, 0x60, // 00000060
69 0x00, 0x00, 0x03, 0x00, // 00000300
70 0x00, 0x00, 0xC0, 0x00, // 0000C000
71 0x00, 0x00, 0x00, 0x14, // 00000014
72 0x00, 0x00, 0x00, 0x1E, // 0000001E
73 0x00, 0x00, 0x42, 0x11, // 00004211
74 0x00, 0x00, 0x58, 0x33, // 00005833
75 0x00, 0x00, 0x00, 0x02, // 00000002
76 0x00, 0x00, 0x00, 0x40, // 00000040
77 0x00, 0x00, 0x00, 0x40, // 00000040
78 0x00, 0x00, 0x00, 0x00, // 00000000
79 0x00, 0x01, 0x20, 0x01, // 00012001
80 0x00, 0x00, 0x00, 0x14, // 00000014
81 0x00, 0x00, 0x00, 0x29, // 00000029
82 0x00, 0x00, 0x30, 0xC3, // 000030C3
83 0x00, 0x00, 0x60, 0x00, // 00006000
84 0x00, 0x00, 0x00, 0x02, // 00000002
85 0x00, 0x00, 0x00, 0x40, // 00000040
86 0x00, 0x00, 0x00, 0x40, // 00000040
87 0x00, 0x00, 0x02, 0x00, // 00000200
88 0x00, 0x01, 0x20, 0x00, // 00012000
89 0x00, 0x00, 0x00, 0x14, // 00000014
90 0x00, 0x00, 0x00, 0x2D, // 0000002D
91 0x00, 0x00, 0x2C, 0x86, // 00002C86
92 0x00, 0x00, 0x60, 0x00, // 00006000
93 0x00, 0x00, 0x00, 0x01, // 00000001
94 0x00, 0x00, 0x00, 0x30, // 00000030
95 0x00, 0x00, 0x00, 0x30, // 00000030
96 0x00, 0x00, 0x03, 0x00, // 00000300
97 0x00, 0x01, 0x80, 0x00, // 00018000
98 0x00, 0x00, 0x00, 0x14, // 00000014
99 0x00, 0x00, 0x00, 0x3C, // 0000003C
100 0x00, 0x00, 0x21, 0x93, // 00002193
101 0x00, 0x00, 0x58, 0x33, // 00005833
102 0x00, 0x00, 0x00, 0x01, // 00000001
103 0x00, 0x00, 0x00, 0x20, // 00000020
104 0x00, 0x00, 0x00, 0x20, // 00000020
105 0x00, 0x00, 0x00, 0x00, // 00000000
106 0x00, 0x02, 0x40, 0x01, // 00024001
107 0x00, 0x00, 0x00, 0x14, // 00000014
108 0x00, 0x00, 0x00, 0x52, // 00000052
109 0x00, 0x00, 0x18, 0xAD, // 000018AD
110 0x00, 0x00, 0x60, 0x00, // 00006000
111 0x00, 0x00, 0x00, 0x01, // 00000001
112 0x00, 0x00, 0x00, 0x20, // 00000020
113 0x00, 0x00, 0x00, 0x20, // 00000020
114 0x00, 0x00, 0x02, 0x00, // 00000200
115 0x00, 0x02, 0x40, 0x00, // 00024000
116 0x00, 0x00, 0x00, 0x14, // 00000014
117 0x00, 0x00, 0x00, 0x5A, // 0000005A
118 0x00, 0x00, 0x16, 0x81, // 00001681
119 0x00, 0x00, 0x60, 0x00, // 00006000
120 0x00, 0x00, 0x00, 0x00, // 00000000
121 0x00, 0x00, 0x00, 0x18, // 00000018
122 0x00, 0x00, 0x00, 0x18, // 00000018
123 0x00, 0x00, 0x03, 0x00, // 00000300
124 0x00, 0x03, 0x00, 0x00, // 00030000
125 0x00, 0x00, 0x00, 0x14, // 00000014
126 0x00, 0x00, 0x00, 0x78, // 00000078
127 0x00, 0x00, 0x10, 0xED, // 000010ED
128 0x00, 0x00, 0x58, 0x33, // 00005833
129 0x00, 0x00, 0x00, 0x00, // 00000000
130 0x00, 0x00, 0x00, 0x10, // 00000010
131 0x00, 0x00, 0x00, 0x10, // 00000010
132 0x00, 0x00, 0x00, 0x00, // 00000000
133 0x00, 0x04, 0x80, 0x03, // 00048003
134 0x00, 0x00, 0x00, 0x14, // 00000014
135 0x00, 0x00, 0x00, 0xA5, // 000000A5
136 0x00, 0x00, 0x0C, 0x56, // 00000C56
137 0x00, 0x00, 0x60, 0x00, // 00006000
138 0x00, 0x00, 0x00, 0x00, // 00000000
139 0x00, 0x00, 0x00, 0x10, // 00000010
140 0x00, 0x00, 0x00, 0x10, // 00000010
141 0x00, 0x00, 0x02, 0x00, // 00000200
142 0x00, 0x04, 0x80, 0x00, // 00048000
143 0x00, 0x00, 0x00, 0x14, // 00000014
144 0x00, 0x00, 0x00, 0xB4, // 000000B4
145 0x00, 0x00, 0x0B, 0x51, // 00000B51
146};
147// address 04661 count 19 (82 bytes)
148static const unsigned char maspcm_array3[] = {
149 0xe0, 0x00, 0x00, 0x13, 0x06, 0x61,
150 0x00, 0x00, 0x01, 0x25, // 00000125
151 0x00, 0x00, 0x00, 0x05, // 00000005
152 0x00, 0x00, 0x48, 0x00, // 00004800
153 0x00, 0x08, 0x00, 0x00, // 00080000
154 0x00, 0x00, 0x00, 0x00, // 00000000
155 0x00, 0x00, 0x00, 0x00, // 00000000
156 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
157 0x00, 0x00, 0x00, 0x00, // 00000000
158 0x00, 0x00, 0x00, 0x00, // 00000000
159 0x00, 0x00, 0x82, 0x00, // 00008200
160 0x00, 0x00, 0x00, 0x00, // 00000000
161 0x00, 0x08, 0x00, 0x00, // 00080000
162 0x00, 0x00, 0x00, 0x00, // 00000000
163 0x00, 0x00, 0x00, 0x00, // 00000000
164 0x00, 0x08, 0x00, 0x00, // 00080000
165 0x00, 0x08, 0x00, 0x00, // 00080000
166 0x00, 0x00, 0x00, 0x00, // 00000000
167 0x00, 0x00, 0x00, 0x00, // 00000000
168 0x00, 0x08, 0x00, 0x00, // 00080000
169};
170// address 046E4 count 16 (70 bytes)
171static const unsigned char maspcm_array4[] = {
172 0xe0, 0x00, 0x00, 0x10, 0x06, 0xe4,
173 0x00, 0x00, 0x06, 0x74, // 00000674
174 0x00, 0x00, 0x06, 0x7D, // 0000067D
175 0x00, 0x00, 0x06, 0x86, // 00000686
176 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
177 0x00, 0x00, 0x06, 0x8F, // 0000068F
178 0x00, 0x00, 0x06, 0x98, // 00000698
179 0x00, 0x00, 0x06, 0xA1, // 000006A1
180 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
181 0x00, 0x00, 0x06, 0xAA, // 000006AA
182 0x00, 0x00, 0x06, 0xB3, // 000006B3
183 0x00, 0x00, 0x06, 0xBC, // 000006BC
184 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
185 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
186 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
187 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
188 0x00, 0x0F, 0xFF, 0xFF, // 000FFFFF
189};
190// address 04700 count 18 (78 byte)
191static const unsigned char maspcm_array5[] = {
192 0xe0, 0x00, 0x00, 0x12, 0x07, 0x00,
193 0x00, 0x00, 0x06, 0xBC, // 000006BC
194 0x00, 0x00, 0x00, 0x0A, // 0000000A
195 0x00, 0x00, 0x06, 0x74, // 00000674
196 0x00, 0x00, 0x00, 0x00, // 00000000
197 0x00, 0x00, 0x06, 0x7D, // 0000067D
198 0x00, 0x00, 0x00, 0x01, // 00000001
199 0x00, 0x00, 0x06, 0x86, // 00000686
200 0x00, 0x00, 0x00, 0x02, // 00000002
201 0x00, 0x00, 0x06, 0x8F, // 0000068F
202 0x00, 0x00, 0x00, 0x04, // 00000004
203 0x00, 0x00, 0x06, 0x98, // 00000698
204 0x00, 0x00, 0x00, 0x05, // 00000005
205 0x00, 0x00, 0x06, 0xA1, // 000006A1
206 0x00, 0x00, 0x00, 0x06, // 00000006
207 0x00, 0x00, 0x06, 0xAA, // 000006AA
208 0x00, 0x00, 0x00, 0x08, // 00000008
209 0x00, 0x00, 0x06, 0xB3, // 000006B3
210 0x00, 0x00, 0x00, 0x09, // 00000009
211};
212// address 06600 count 63 (258 bytes)
213static const unsigned char maspcm_array6[] = {
214 0xf0, 0x00, 0x00, 0x3f, 0x06, 0x00,
215 0x00, 0x00, 0x0B, 0xAD, // 00000BAD
216 0x00, 0x00, 0x10, 0x00, // 00001000
217 0x00, 0x00, 0x20, 0x00, // 00002000
218 0x00, 0x00, 0x30, 0x00, // 00003000
219 0x00, 0x00, 0x40, 0x00, // 00004000
220 0x00, 0x00, 0x50, 0x00, // 00005000
221 0x00, 0x00, 0x60, 0x00, // 00006000
222 0x00, 0x00, 0x70, 0x00, // 00007000
223 0x00, 0x00, 0x80, 0x00, // 00008000
224 0x00, 0x00, 0x90, 0x00, // 00009000
225 0x00, 0x00, 0xA0, 0x00, // 0000A000
226 0x00, 0x00, 0xB0, 0x00, // 0000B000
227 0x00, 0x00, 0xC0, 0x00, // 0000C000
228 0x00, 0x00, 0xD0, 0x00, // 0000D000
229 0x00, 0x00, 0xE0, 0x00, // 0000E000
230 0x00, 0x00, 0xF0, 0x00, // 0000F000
231 0x00, 0x01, 0x00, 0x00, // 00010000
232 0x00, 0x01, 0x10, 0x00, // 00011000
233 0x00, 0x01, 0x20, 0x00, // 00012000
234 0x00, 0x01, 0x30, 0x00, // 00013000
235 0x00, 0x01, 0x40, 0x00, // 00014000
236 0x00, 0x01, 0x50, 0x00, // 00015000
237 0x00, 0x01, 0x60, 0x00, // 00016000
238 0x00, 0x01, 0x70, 0x00, // 00017000
239 0x00, 0x01, 0x80, 0x00, // 00018000
240 0x00, 0x01, 0x90, 0x00, // 00019000
241 0x00, 0x01, 0xA0, 0x00, // 0001A000
242 0x00, 0x01, 0xB0, 0x00, // 0001B000
243 0x00, 0x01, 0xC0, 0x00, // 0001C000
244 0x00, 0x01, 0xD0, 0x00, // 0001D000
245 0x00, 0x01, 0xE0, 0x00, // 0001E000
246 0x00, 0x01, 0xF0, 0x00, // 0001F000
247 0x00, 0x02, 0x00, 0x00, // 00020000
248 0x00, 0x02, 0x10, 0x00, // 00021000
249 0x00, 0x02, 0x20, 0x00, // 00022000
250 0x00, 0x02, 0x30, 0x00, // 00023000
251 0x00, 0x02, 0x40, 0x00, // 00024000
252 0x00, 0x00, 0x05, 0xFF, // 000005FF
253 0x00, 0x00, 0x00, 0x00, // 00000000
254 0x00, 0x00, 0x00, 0x00, // 00000000
255 0x00, 0x00, 0x00, 0x00, // 00000000
256 0x00, 0x00, 0x00, 0x90, // 00000090
257 0x00, 0x00, 0x00, 0x90, // 00000090
258 0x00, 0x00, 0x00, 0x90, // 00000090
259 0x00, 0x00, 0x00, 0x20, // 00000020
260 0x00, 0x00, 0x03, 0x00, // 00000300
261 0x00, 0x00, 0x00, 0x20, // 00000020
262 0x00, 0x00, 0x03, 0x00, // 00000300
263 0x00, 0x00, 0x00, 0x20, // 00000020
264 0x00, 0x00, 0x03, 0x00, // 00000300
265 0x00, 0x00, 0x05, 0xFF, // 000005FF
266 0x00, 0x00, 0x00, 0x00, // 00000000
267 0x00, 0x00, 0x00, 0x00, // 00000000
268 0x00, 0x00, 0x00, 0x00, // 00000000
269 0x00, 0x00, 0x00, 0x90, // 00000090
270 0x00, 0x00, 0x00, 0x90, // 00000090
271 0x00, 0x00, 0x00, 0x90, // 00000090
272 0x00, 0x00, 0x00, 0x00, // 00000000
273 0x00, 0x00, 0x00, 0x00, // 00000000
274 0x00, 0x00, 0x00, 0x00, // 00000000
275 0x00, 0x00, 0x00, 0x00, // 00000000
276 0x00, 0x00, 0x00, 0x00, // 00000000
277 0x00, 0x00, 0x00, 0x0C, // 0000000C
278};
279// address 06640 count 12 (54 bytes)
280static const unsigned char maspcm_array7[] = {
281 0xf0, 0x00, 0x00, 0x0c, 0x06, 0x40,
282 0x00, 0x00, 0x00, 0x00, // 00000000
283 0x00, 0x00, 0x00, 0x00, // 00000000
284 0x00, 0x00, 0x00, 0x00, // 00000000
285 0x00, 0x00, 0x00, 0x00, // 00000000
286 0x00, 0x00, 0x00, 0x00, // 00000000
287 0x00, 0x00, 0x00, 0x00, // 00000000
288 0x00, 0x00, 0x00, 0x00, // 00000000
289 0x00, 0x00, 0x00, 0x00, // 00000000
290 0x00, 0x00, 0x00, 0x00, // 00000000
291 0x00, 0x00, 0x00, 0x00, // 00000000
292 0x00, 0x00, 0x00, 0x00, // 00000000
293 0x00, 0x00, 0x00, 0x00, // 00000000
294};
295// address 06660 count 28 (118 bytes)
296static const unsigned char maspcm_array8[] = {
297 0xf0, 0x00, 0x00, 0x1c, 0x06, 0x60,
298 0x00, 0x00, 0x00, 0x00, // 00000000
299 0x00, 0x00, 0x00, 0x00, // 00000000
300 0x00, 0x00, 0x00, 0x00, // 00000000
301 0x00, 0x00, 0x00, 0x00, // 00000000
302 0x00, 0x00, 0x00, 0x00, // 00000000
303 0x00, 0x00, 0x00, 0x00, // 00000000
304 0x00, 0x00, 0x00, 0x00, // 00000000
305 0x00, 0x00, 0x00, 0x00, // 00000000
306 0x00, 0x00, 0x00, 0x00, // 00000000
307 0x00, 0x00, 0x00, 0x00, // 00000000
308 0x00, 0x00, 0x00, 0x00, // 00000000
309 0x00, 0x00, 0x00, 0x00, // 00000000
310 0x00, 0x00, 0x00, 0x00, // 00000000
311 0x00, 0x00, 0x00, 0x00, // 00000000
312 0x00, 0x00, 0x00, 0x00, // 00000000
313 0x00, 0x00, 0x00, 0x00, // 00000000
314 0x00, 0x00, 0x00, 0x00, // 00000000
315 0x00, 0x00, 0x00, 0x00, // 00000000
316 0x00, 0x00, 0x00, 0x00, // 00000000
317 0x00, 0x00, 0x00, 0x00, // 00000000
318 0x00, 0x00, 0x00, 0x00, // 00000000
319 0x00, 0x00, 0x00, 0x00, // 00000000
320 0x00, 0x00, 0x00, 0x00, // 00000000
321 0x00, 0x00, 0x00, 0x00, // 00000000
322 0x00, 0x00, 0x00, 0x00, // 00000000
323 0x00, 0x00, 0x00, 0x00, // 00000000
324 0x00, 0x00, 0x00, 0x00, // 00000000
325 0x00, 0x00, 0x00, 0x00, // 00000000
326};
327// address 04800 count 1668 (6678 bytes)
328static const unsigned char maspcm_array9[] = {
329 0xe0, 0x00, 0x06, 0x84, 0x08, 0x00,
330 0x00, 0x00, 0x00, 0x00, // 00000000
331 0x00, 0x07, 0x47, 0xC0, // 000747C0
332 0x00, 0x07, 0x04, 0x00, // 00070400
333 0x00, 0x00, 0x00, 0x00, // 00000000
334 0x00, 0x00, 0x00, 0x00, // 00000000
335 0x00, 0x00, 0x00, 0x00, // 00000000
336 0x00, 0x06, 0xC0, 0x6B, // 0006C06B
337 0x00, 0x00, 0x00, 0x00, // 00000000
338 0x00, 0x07, 0x44, 0x01, // 00074401
339 0x00, 0x07, 0x06, 0x90, // 00070690
340 0x00, 0x07, 0x4C, 0x07, // 00074C07
341 0x00, 0x07, 0x0F, 0xFF, // 00070FFF
342 0x00, 0x0B, 0x52, 0x40, // 000B5240
343 0x00, 0x06, 0x80, 0x1D, // 0006801D
344 0x00, 0x06, 0x80, 0x1F, // 0006801F
345 0x00, 0x06, 0x80, 0x21, // 00068021
346 0x00, 0x06, 0x80, 0x23, // 00068023
347 0x00, 0x06, 0x84, 0x1D, // 0006841D
348 0x00, 0x06, 0x84, 0x1F, // 0006841F
349 0x00, 0x06, 0x84, 0x21, // 00068421
350 0x00, 0x06, 0x84, 0x23, // 00068423
351 0x00, 0x06, 0x88, 0x17, // 00068817
352 0x00, 0x06, 0x8C, 0x17, // 00068C17
353 0x00, 0x06, 0xD0, 0x6D, // 0006D06D
354 0x00, 0x07, 0x5C, 0x01, // 00075C01
355 0x00, 0x07, 0x1E, 0x57, // 00071E57
356 0x00, 0x07, 0x44, 0x01, // 00074401
357 0x00, 0x07, 0x06, 0x90, // 00070690
358 0x00, 0x07, 0x4C, 0x07, // 00074C07
359 0x00, 0x07, 0x0F, 0xFF, // 00070FFF
360 0x00, 0x0B, 0x52, 0x40, // 000B5240
361 0x00, 0x06, 0x80, 0x1D, // 0006801D
362 0x00, 0x06, 0x80, 0x1F, // 0006801F
363 0x00, 0x06, 0x80, 0x21, // 00068021
364 0x00, 0x06, 0x80, 0x23, // 00068023
365 0x00, 0x06, 0x84, 0x1D, // 0006841D
366 0x00, 0x06, 0x84, 0x1F, // 0006841F
367 0x00, 0x06, 0x84, 0x21, // 00068421
368 0x00, 0x06, 0x84, 0x23, // 00068423
369 0x00, 0x06, 0x88, 0x17, // 00068817
370 0x00, 0x06, 0x8C, 0x17, // 00068C17
371 0x00, 0x06, 0xD0, 0x6D, // 0006D06D
372 0x00, 0x06, 0x98, 0x1E, // 0006981E
373 0x00, 0x04, 0x05, 0x08, // 00040508
374 0x00, 0x04, 0x0D, 0x08, // 00040D08
375 0x00, 0x04, 0x15, 0x08, // 00041508
376 0x00, 0x04, 0x1D, 0x08, // 00041D08
377 0x00, 0x04, 0x25, 0x08, // 00042508
378 0x00, 0x04, 0x2D, 0x08, // 00042D08
379 0x00, 0x04, 0x35, 0x08, // 00043508
380 0x00, 0x07, 0x7C, 0x00, // 00077C00
381 0x00, 0x07, 0x3C, 0x30, // 00073C30
382 0x00, 0x06, 0x80, 0x3B, // 0006803B
383 0x00, 0x06, 0x88, 0x5B, // 0006885B
384 0x00, 0x06, 0x94, 0x3B, // 0006943B
385 0x00, 0x06, 0x9C, 0x43, // 00069C43
386 0x00, 0x06, 0xA0, 0x53, // 0006A053
387 0x00, 0x06, 0xA8, 0x4B, // 0006A84B
388 0x00, 0x06, 0xB4, 0x53, // 0006B453
389 0x00, 0x06, 0xBC, 0x06, // 0006BC06
390 0x00, 0x07, 0x74, 0x01, // 00077401
391 0x00, 0x07, 0x36, 0x63, // 00073663
392 0x00, 0x02, 0x12, 0x57, // 00021257
393 0x00, 0x07, 0x6C, 0x18, // 00076C18
394 0x00, 0x07, 0x2C, 0x00, // 00072C00
395 0x00, 0x07, 0x7C, 0x04, // 00077C04
396 0x00, 0x07, 0x3C, 0x45, // 00073C45
397 0x00, 0x06, 0xB0, 0x20, // 0006B020
398 0x00, 0x04, 0x36, 0x00, // 00043600
399 0x00, 0x02, 0x12, 0x46, // 00021246
400 0x00, 0x07, 0x7C, 0x04, // 00077C04
401 0x00, 0x07, 0x3C, 0x4C, // 00073C4C
402 0x00, 0x00, 0x00, 0x00, // 00000000
403 0x00, 0x00, 0x00, 0x00, // 00000000
404 0x00, 0x00, 0x00, 0x00, // 00000000
405 0x00, 0x00, 0x00, 0x00, // 00000000
406 0x00, 0x0B, 0x52, 0x40, // 000B5240
407 0x00, 0x07, 0x44, 0x01, // 00074401
408 0x00, 0x07, 0x06, 0x66, // 00070666
409 0x00, 0x0B, 0x49, 0x40, // 000B4940
410 0x00, 0x00, 0x00, 0x00, // 00000000
411 0x00, 0x06, 0x94, 0x7F, // 0006947F
412 0x00, 0x06, 0x80, 0x1C, // 0006801C
413 0x00, 0x07, 0x88, 0x04, // 00078804
414 0x00, 0x07, 0x44, 0x01, // 00074401
415 0x00, 0x07, 0x06, 0x61, // 00070661
416 0x00, 0x0B, 0x49, 0x7F, // 000B497F
417 0x00, 0x00, 0x00, 0x00, // 00000000
418 0x00, 0x00, 0x00, 0x00, // 00000000
419 0x00, 0x06, 0x80, 0x1C, // 0006801C
420 0x00, 0x04, 0x14, 0x00, // 00041400
421 0x00, 0x0A, 0xC1, 0xC2, // 000AC1C2
422 0x00, 0x02, 0x9E, 0x08, // 00029E08
423 0x00, 0x02, 0x10, 0x70, // 00021070
424 0x00, 0x0A, 0xD2, 0x7E, // 000AD27E
425 0x00, 0x00, 0x00, 0x00, // 00000000
426 0x00, 0x00, 0x00, 0x00, // 00000000
427 0x00, 0x00, 0x00, 0x00, // 00000000
428 0x00, 0x07, 0x90, 0x04, // 00079004
429 0x00, 0x00, 0x00, 0x00, // 00000000
430 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
431 0x00, 0x07, 0x0C, 0x00, // 00070C00
432 0x00, 0x00, 0x00, 0x00, // 00000000
433 0x00, 0x0A, 0xC2, 0xC1, // 000AC2C1
434 0x00, 0x02, 0x9F, 0x08, // 00029F08
435 0x00, 0x02, 0x10, 0x85, // 00021085
436 0x00, 0x00, 0x00, 0x00, // 00000000
437 0x00, 0x00, 0x00, 0x00, // 00000000
438 0x00, 0x00, 0x00, 0x00, // 00000000
439 0x00, 0x00, 0x00, 0x00, // 00000000
440 0x00, 0x00, 0x00, 0x00, // 00000000
441 0x00, 0x00, 0x00, 0x00, // 00000000
442 0x00, 0x06, 0x00, 0x6D, // 0006006D
443 0x00, 0x00, 0x00, 0x00, // 00000000
444 0x00, 0x08, 0x00, 0x41, // 00080041
445 0x00, 0x00, 0x00, 0x00, // 00000000
446 0x00, 0x00, 0x00, 0x00, // 00000000
447 0x00, 0x00, 0x00, 0x00, // 00000000
448 0x00, 0x06, 0xC0, 0x6D, // 0006C06D
449 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
450 0x00, 0x07, 0x6C, 0x04, // 00076C04
451 0x00, 0x07, 0x2C, 0x7E, // 00072C7E
452 0x00, 0x00, 0x00, 0x00, // 00000000
453 0x00, 0x00, 0x00, 0x00, // 00000000
454 0x00, 0x00, 0x00, 0x00, // 00000000
455 0x00, 0x00, 0x00, 0x00, // 00000000
456 0x00, 0x02, 0x10, 0x54, // 00021054
457 0x00, 0x00, 0x00, 0x00, // 00000000
458 0x00, 0x00, 0x00, 0x00, // 00000000
459 0x00, 0x00, 0x00, 0x00, // 00000000
460 0x00, 0x00, 0x00, 0x00, // 00000000
461 0x00, 0x00, 0x00, 0x00, // 00000000
462 0x00, 0x00, 0x00, 0x00, // 00000000
463 0x00, 0x09, 0x80, 0x74, // 00098074
464 0x00, 0x07, 0x5C, 0x00, // 00075C00
465 0x00, 0x07, 0x1F, 0x00, // 00071F00
466 0x00, 0x08, 0x80, 0x42, // 00088042
467 0x00, 0x02, 0x9F, 0x10, // 00029F10
468 0x00, 0x02, 0x11, 0x51, // 00021151
469 0x00, 0x02, 0x81, 0x28, // 00028128
470 0x00, 0x0A, 0xC2, 0xC3, // 000AC2C3
471 0x00, 0x00, 0x00, 0x00, // 00000000
472 0x00, 0x09, 0x80, 0x78, // 00098078
473 0x00, 0x00, 0x00, 0x00, // 00000000
474 0x00, 0x08, 0x80, 0x42, // 00088042
475 0x00, 0x02, 0x9F, 0x10, // 00029F10
476 0x00, 0x02, 0x11, 0x51, // 00021151
477 0x00, 0x02, 0x81, 0x28, // 00028128
478 0x00, 0x07, 0x4C, 0x00, // 00074C00
479 0x00, 0x07, 0x0F, 0x00, // 00070F00
480 0x00, 0x07, 0x44, 0x01, // 00074401
481 0x00, 0x07, 0x06, 0x66, // 00070666
482 0x00, 0x07, 0x56, 0x00, // 00075600
483 0x00, 0x07, 0x14, 0x03, // 00071403
484 0x00, 0x06, 0x8C, 0x3B, // 00068C3B
485 0x00, 0x00, 0x00, 0x00, // 00000000
486 0x00, 0x06, 0x80, 0x1C, // 0006801C
487 0x00, 0x07, 0x90, 0x04, // 00079004
488 0x00, 0x07, 0x6C, 0x00, // 00076C00
489 0x00, 0x07, 0x2F, 0x00, // 00072F00
490 0x00, 0x07, 0x44, 0x00, // 00074400
491 0x00, 0x07, 0x04, 0x00, // 00070400
492 0x00, 0x0B, 0x49, 0x40, // 000B4940
493 0x00, 0x06, 0xAC, 0x05, // 0006AC05
494 0x00, 0x01, 0x41, 0x00, // 00014100
495 0x00, 0x06, 0x84, 0x1C, // 0006841C
496 0x00, 0x07, 0x8C, 0x0C, // 00078C0C
497 0x00, 0x07, 0x8C, 0x0C, // 00078C0C
498 0x00, 0x07, 0x5C, 0x01, // 00075C01
499 0x00, 0x07, 0x1C, 0x90, // 00071C90
500 0x00, 0x07, 0x54, 0x00, // 00075400
501 0x00, 0x07, 0x17, 0x00, // 00071700
502 0x00, 0x07, 0x64, 0x01, // 00076401
503 0x00, 0x07, 0x25, 0xFF, // 000725FF
504 0x00, 0x07, 0x4C, 0x00, // 00074C00
505 0x00, 0x07, 0x0C, 0x00, // 00070C00
506 0x00, 0x07, 0x6C, 0x00, // 00076C00
507 0x00, 0x07, 0x2C, 0x00, // 00072C00
508 0x00, 0x06, 0x9C, 0x25, // 00069C25
509 0x00, 0x06, 0x98, 0x2D, // 0006982D
510 0x00, 0x06, 0x94, 0x3C, // 0006943C
511 0x00, 0x06, 0xA4, 0x16, // 0006A416
512 0x00, 0x06, 0xA0, 0x16, // 0006A016
513 0x00, 0x06, 0x8C, 0x3B, // 00068C3B
514 0x00, 0x06, 0xAC, 0x24, // 0006AC24
515 0x00, 0x07, 0x4C, 0x01, // 00074C01
516 0x00, 0x07, 0x0F, 0x00, // 00070F00
517 0x00, 0x0B, 0x52, 0x6F, // 000B526F
518 0x00, 0x07, 0x5C, 0x00, // 00075C00
519 0x00, 0x07, 0x1E, 0x90, // 00071E90
520 0x00, 0x00, 0x00, 0x00, // 00000000
521 0x00, 0x06, 0x88, 0x1E, // 0006881E
522 0x00, 0x06, 0x90, 0x15, // 00069015
523 0x00, 0x06, 0x98, 0x1F, // 0006981F
524 0x00, 0x0B, 0x40, 0x40, // 000B4040
525 0x00, 0x00, 0x00, 0x00, // 00000000
526 0x00, 0x00, 0x00, 0x00, // 00000000
527 0x00, 0x00, 0x00, 0x00, // 00000000
528 0x00, 0x06, 0x84, 0x6F, // 0006846F
529 0x00, 0x06, 0x84, 0x70, // 00068470
530 0x00, 0x04, 0x05, 0x10, // 00040510
531 0x00, 0x07, 0x74, 0x01, // 00077401
532 0x00, 0x07, 0x36, 0x63, // 00073663
533 0x00, 0x02, 0x12, 0x57, // 00021257
534 0x00, 0x06, 0x80, 0x1C, // 0006801C
535 0x00, 0x04, 0x2C, 0x08, // 00042C08
536 0x00, 0x07, 0x7C, 0x04, // 00077C04
537 0x00, 0x07, 0x3C, 0xD2, // 00073CD2
538 0x00, 0x06, 0xB0, 0x22, // 0006B022
539 0x00, 0x04, 0x37, 0x08, // 00043708
540 0x00, 0x04, 0x14, 0x20, // 00041420
541 0x00, 0x04, 0x07, 0x00, // 00040700
542 0x00, 0x07, 0x66, 0x00, // 00076600
543 0x00, 0x07, 0x24, 0x00, // 00072400
544 0x00, 0x07, 0x5C, 0x80, // 00075C80
545 0x00, 0x07, 0x1C, 0x00, // 00071C00
546 0x00, 0x07, 0x7C, 0x00, // 00077C00
547 0x00, 0x07, 0x3D, 0x00, // 00073D00
548 0x00, 0x0A, 0xC8, 0xC4, // 000AC8C4
549 0x00, 0x02, 0x9F, 0x08, // 00029F08
550 0x00, 0x08, 0x36, 0xC4, // 000836C4
551 0x00, 0x0A, 0xC8, 0xC3, // 000AC8C3
552 0x00, 0x02, 0x9F, 0x08, // 00029F08
553 0x00, 0x08, 0x12, 0x41, // 00081241
554 0x00, 0x0A, 0xC8, 0xC7, // 000AC8C7
555 0x00, 0x02, 0x9F, 0x08, // 00029F08
556 0x00, 0x0B, 0x52, 0x40, // 000B5240
557 0x00, 0x02, 0x12, 0x46, // 00021246
558 0x00, 0x09, 0x92, 0x51, // 00099251
559 0x00, 0x08, 0x36, 0xC2, // 000836C2
560 0x00, 0x07, 0x7C, 0x04, // 00077C04
561 0x00, 0x07, 0x3C, 0xEA, // 00073CEA
562 0x00, 0x06, 0xAC, 0x6D, // 0006AC6D
563 0x00, 0x06, 0xAC, 0x6C, // 0006AC6C
564 0x00, 0x0B, 0x7F, 0x7F, // 000B7F7F
565 0x00, 0x09, 0xB6, 0x7D, // 0009B67D
566 0x00, 0x0A, 0x3F, 0x53, // 000A3F53
567 0x00, 0x07, 0x64, 0x00, // 00076400
568 0x00, 0x0A, 0xF6, 0x43, // 000AF643
569 0x00, 0x07, 0x24, 0x00, // 00072400
570 0x00, 0x07, 0x54, 0x00, // 00075400
571 0x00, 0x07, 0x14, 0x00, // 00071400
572 0x00, 0x07, 0x5C, 0x00, // 00075C00
573 0x00, 0x07, 0x1F, 0x18, // 00071F18
574 0x00, 0x07, 0x6C, 0x04, // 00076C04
575 0x00, 0x07, 0x2C, 0x00, // 00072C00
576 0x00, 0x04, 0x0C, 0x08, // 00040C08
577 0x00, 0x08, 0xB6, 0x41, // 0008B641
578 0x00, 0x0A, 0x09, 0xC6, // 000A09C6
579 0x00, 0x08, 0x8F, 0xC1, // 00088FC1
580 0x00, 0x00, 0x00, 0x00, // 00000000
581 0x00, 0x0C, 0x09, 0x25, // 000C0925
582 0x00, 0x07, 0x44, 0x00, // 00074400
583 0x00, 0x07, 0x04, 0x00, // 00070400
584 0x00, 0x06, 0x98, 0x53, // 00069853
585 0x00, 0x06, 0x90, 0x2C, // 0006902C
586 0x00, 0x06, 0xA4, 0x24, // 0006A424
587 0x00, 0x06, 0x80, 0x53, // 00068053
588 0x00, 0x06, 0x88, 0x54, // 00068854
589 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
590 0x00, 0x07, 0x0C, 0x00, // 00070C00
591 0x00, 0x06, 0x14, 0x6F, // 0006146F
592 0x00, 0x06, 0x00, 0x52, // 00060052
593 0x00, 0x08, 0x12, 0x41, // 00081241
594 0x00, 0x06, 0x1C, 0x70, // 00061C70
595 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
596 0x00, 0x02, 0x9F, 0x38, // 00029F38
597 0x00, 0x0A, 0x09, 0x74, // 000A0974
598 0x00, 0x00, 0x00, 0x00, // 00000000
599 0x00, 0x0A, 0xC9, 0x43, // 000AC943
600 0x00, 0x00, 0x00, 0x00, // 00000000
601 0x00, 0x08, 0xA1, 0x42, // 0008A142
602 0x00, 0x02, 0x9E, 0x08, // 00029E08
603 0x00, 0x08, 0x1B, 0x41, // 00081B41
604 0x00, 0x00, 0x00, 0x00, // 00000000
605 0x00, 0x00, 0x00, 0x00, // 00000000
606 0x00, 0x06, 0x94, 0x6F, // 0006946F
607 0x00, 0x06, 0x9C, 0x70, // 00069C70
608 0x00, 0x06, 0x00, 0x6D, // 0006006D
609 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
610 0x00, 0x0B, 0x00, 0x41, // 000B0041
611 0x00, 0x07, 0x6C, 0x04, // 00076C04
612 0x00, 0x07, 0x2D, 0x1E, // 00072D1E
613 0x00, 0x00, 0x00, 0x00, // 00000000
614 0x00, 0x06, 0x80, 0x6D, // 0006806D
615 0x00, 0x00, 0x00, 0x00, // 00000000
616 0x00, 0x06, 0x04, 0x24, // 00060424
617 0x00, 0x07, 0x54, 0x01, // 00075401
618 0x00, 0x07, 0x16, 0x61, // 00071661
619 0x00, 0x08, 0x8C, 0x80, // 00088C80
620 0x00, 0x02, 0x89, 0x10, // 00028910
621 0x00, 0x02, 0x11, 0x03, // 00021103
622 0x00, 0x02, 0x81, 0x28, // 00028128
623 0x00, 0x06, 0x90, 0x22, // 00069022
624 0x00, 0x04, 0x07, 0x00, // 00040700
625 0x00, 0x07, 0x54, 0x0C, // 0007540C
626 0x00, 0x07, 0x14, 0x00, // 00071400
627 0x00, 0x0A, 0xD8, 0x7E, // 000AD87E
628 0x00, 0x0A, 0xC8, 0x41, // 000AC841
629 0x00, 0x02, 0x9F, 0x20, // 00029F20
630 0x00, 0x0A, 0xC8, 0xC2, // 000AC8C2
631 0x00, 0x02, 0x9E, 0x10, // 00029E10
632 0x00, 0x02, 0x10, 0x08, // 00021008
633 0x00, 0x02, 0x81, 0x28, // 00028128
634 0x00, 0x07, 0x98, 0x07, // 00079807
635 0x00, 0x06, 0x04, 0x6F, // 0006046F
636 0x00, 0x06, 0x0C, 0x70, // 00060C70
637 0x00, 0x0A, 0x10, 0x7D, // 000A107D
638 0x00, 0x08, 0x90, 0xC2, // 000890C2
639 0x00, 0x08, 0x99, 0xC2, // 000899C2
640 0x00, 0x02, 0x86, 0x10, // 00028610
641 0x00, 0x02, 0x10, 0xC2, // 000210C2
642 0x00, 0x02, 0x81, 0x28, // 00028128
643 0x00, 0x07, 0x4C, 0x01, // 00074C01
644 0x00, 0x07, 0x0E, 0x6B, // 00070E6B
645 0x00, 0x0B, 0x52, 0x50, // 000B5250
646 0x00, 0x00, 0x00, 0x00, // 00000000
647 0x00, 0x00, 0x00, 0x00, // 00000000
648 0x00, 0x06, 0x88, 0x1C, // 0006881C
649 0x00, 0x0A, 0xCC, 0x82, // 000ACC82
650 0x00, 0x04, 0x1D, 0x88, // 00041D88
651 0x00, 0x04, 0x1D, 0x00, // 00041D00
652 0x00, 0x08, 0x09, 0xC3, // 000809C3
653 0x00, 0x00, 0x00, 0x00, // 00000000
654 0x00, 0x00, 0x00, 0x00, // 00000000
655 0x00, 0x00, 0x00, 0x00, // 00000000
656 0x00, 0x07, 0x88, 0x04, // 00078804
657 0x00, 0x07, 0x44, 0x01, // 00074401
658 0x00, 0x07, 0x06, 0x90, // 00070690
659 0x00, 0x07, 0x4C, 0x00, // 00074C00
660 0x00, 0x07, 0x0F, 0x00, // 00070F00
661 0x00, 0x07, 0x54, 0x00, // 00075400
662 0x00, 0x07, 0x17, 0x18, // 00071718
663 0x00, 0x06, 0x80, 0x1F, // 0006801F
664 0x00, 0x06, 0x8C, 0x3B, // 00068C3B
665 0x00, 0x00, 0x00, 0x00, // 00000000
666 0x00, 0x06, 0x90, 0x53, // 00069053
667 0x00, 0x07, 0x4C, 0x01, // 00074C01
668 0x00, 0x07, 0x0E, 0x65, // 00070E65
669 0x00, 0x0B, 0x52, 0x40, // 000B5240
670 0x00, 0x07, 0x64, 0x01, // 00076401
671 0x00, 0x07, 0x26, 0x68, // 00072668
672 0x00, 0x06, 0x88, 0x20, // 00068820
673 0x00, 0x07, 0x90, 0x06, // 00079006
674 0x00, 0x06, 0x94, 0x7F, // 0006947F
675 0x00, 0x06, 0xA0, 0x22, // 0006A022
676 0x00, 0x07, 0x90, 0x07, // 00079007
677 0x00, 0x07, 0x4C, 0x01, // 00074C01
678 0x00, 0x07, 0x0E, 0x6B, // 00070E6B
679 0x00, 0x00, 0x00, 0x00, // 00000000
680 0x00, 0x00, 0x00, 0x00, // 00000000
681 0x00, 0x00, 0x00, 0x00, // 00000000
682 0x00, 0x06, 0x88, 0x20, // 00068820
683 0x00, 0x04, 0x0E, 0x00, // 00040E00
684 0x00, 0x07, 0x5C, 0x00, // 00075C00
685 0x00, 0x07, 0x1C, 0x40, // 00071C40
686 0x00, 0x0B, 0x40, 0x7F, // 000B407F
687 0x00, 0x0A, 0xD1, 0xC3, // 000AD1C3
688 0x00, 0x02, 0x9F, 0x08, // 00029F08
689 0x00, 0x0B, 0x40, 0x40, // 000B4040
690 0x00, 0x00, 0x00, 0x00, // 00000000
691 0x00, 0x00, 0x00, 0x00, // 00000000
692 0x00, 0x00, 0x00, 0x00, // 00000000
693 0x00, 0x06, 0x80, 0x6A, // 0006806A
694 0x00, 0x07, 0x5C, 0x00, // 00075C00
695 0x00, 0x07, 0x1C, 0x20, // 00071C20
696 0x00, 0x0B, 0x40, 0x40, // 000B4040
697 0x00, 0x0A, 0xD1, 0xC3, // 000AD1C3
698 0x00, 0x02, 0x9F, 0x08, // 00029F08
699 0x00, 0x0B, 0x40, 0x7F, // 000B407F
700 0x00, 0x00, 0x00, 0x00, // 00000000
701 0x00, 0x00, 0x00, 0x00, // 00000000
702 0x00, 0x00, 0x00, 0x00, // 00000000
703 0x00, 0x06, 0x80, 0x6C, // 0006806C
704 0x00, 0x07, 0x5C, 0x00, // 00075C00
705 0x00, 0x07, 0x1C, 0x10, // 00071C10
706 0x00, 0x0B, 0x40, 0x40, // 000B4040
707 0x00, 0x0A, 0xD1, 0xC3, // 000AD1C3
708 0x00, 0x02, 0x9F, 0x08, // 00029F08
709 0x00, 0x0B, 0x40, 0x7F, // 000B407F
710 0x00, 0x00, 0x00, 0x00, // 00000000
711 0x00, 0x00, 0x00, 0x00, // 00000000
712 0x00, 0x00, 0x00, 0x00, // 00000000
713 0x00, 0x06, 0x80, 0x76, // 00068076
714 0x00, 0x07, 0x5C, 0x01, // 00075C01
715 0x00, 0x07, 0x1E, 0x67, // 00071E67
716 0x00, 0x07, 0x44, 0x01, // 00074401
717 0x00, 0x07, 0x06, 0xE4, // 000706E4
718 0x00, 0x0A, 0xD1, 0x4F, // 000AD14F
719 0x00, 0x08, 0x10, 0xC2, // 000810C2
720 0x00, 0x00, 0x00, 0x00, // 00000000
721 0x00, 0x06, 0x98, 0x1C, // 0006981C
722 0x00, 0x07, 0x90, 0x04, // 00079004
723 0x00, 0x06, 0x90, 0x1C, // 0006901C
724 0x00, 0x04, 0x14, 0x00, // 00041400
725 0x00, 0x00, 0x00, 0x00, // 00000000
726 0x00, 0x00, 0x00, 0x00, // 00000000
727 0x00, 0x00, 0x00, 0x00, // 00000000
728 0x00, 0x06, 0x90, 0x22, // 00069022
729 0x00, 0x04, 0x2F, 0x08, // 00042F08
730 0x00, 0x07, 0x44, 0x01, // 00074401
731 0x00, 0x07, 0x06, 0x61, // 00070661
732 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
733 0x00, 0x07, 0x0F, 0x00, // 00070F00
734 0x00, 0x07, 0x54, 0x08, // 00075408
735 0x00, 0x07, 0x16, 0x00, // 00071600
736 0x00, 0x06, 0x80, 0x1C, // 0006801C
737 0x00, 0x0A, 0xCC, 0x81, // 000ACC81
738 0x00, 0x08, 0x92, 0xC1, // 000892C1
739 0x00, 0x02, 0x9E, 0x10, // 00029E10
740 0x00, 0x02, 0x11, 0xBD, // 000211BD
741 0x00, 0x02, 0x81, 0x28, // 00028128
742 0x00, 0x07, 0x74, 0x01, // 00077401
743 0x00, 0x02, 0x12, 0x57, // 00021257
744 0x00, 0x07, 0x36, 0x63, // 00073663
745 0x00, 0x00, 0x00, 0x00, // 00000000
746 0x00, 0x07, 0x7C, 0x04, // 00077C04
747 0x00, 0x07, 0x3D, 0xA4, // 00073DA4
748 0x00, 0x06, 0xB0, 0x20, // 0006B020
749 0x00, 0x04, 0x36, 0x08, // 00043608
750 0x00, 0x04, 0x17, 0x08, // 00041708
751 0x00, 0x04, 0x06, 0x00, // 00040600
752 0x00, 0x07, 0x66, 0x00, // 00076600
753 0x00, 0x07, 0x24, 0x00, // 00072400
754 0x00, 0x07, 0x5C, 0x80, // 00075C80
755 0x00, 0x07, 0x1C, 0x00, // 00071C00
756 0x00, 0x07, 0x7C, 0x00, // 00077C00
757 0x00, 0x07, 0x3D, 0x00, // 00073D00
758 0x00, 0x0A, 0xC8, 0xC4, // 000AC8C4
759 0x00, 0x02, 0x9F, 0x08, // 00029F08
760 0x00, 0x08, 0x36, 0xC4, // 000836C4
761 0x00, 0x0A, 0xC8, 0xC3, // 000AC8C3
762 0x00, 0x02, 0x9F, 0x08, // 00029F08
763 0x00, 0x08, 0x12, 0x41, // 00081241
764 0x00, 0x0A, 0xC8, 0xC7, // 000AC8C7
765 0x00, 0x02, 0x9F, 0x08, // 00029F08
766 0x00, 0x0B, 0x52, 0x40, // 000B5240
767 0x00, 0x00, 0x00, 0x00, // 00000000
768 0x00, 0x02, 0x12, 0x46, // 00021246
769 0x00, 0x09, 0x92, 0x51, // 00099251
770 0x00, 0x08, 0x36, 0xC2, // 000836C2
771 0x00, 0x07, 0x7C, 0x04, // 00077C04
772 0x00, 0x07, 0x3D, 0xBF, // 00073DBF
773 0x00, 0x06, 0xAC, 0x6D, // 0006AC6D
774 0x00, 0x06, 0xAC, 0x6C, // 0006AC6C
775 0x00, 0x04, 0x06, 0x08, // 00040608
776 0x00, 0x04, 0x07, 0x08, // 00040708
777 0x00, 0x07, 0x4C, 0x01, // 00074C01
778 0x00, 0x07, 0x0E, 0x62, // 00070E62
779 0x00, 0x07, 0x54, 0x00, // 00075400
780 0x00, 0x07, 0x14, 0x2D, // 0007142D
781 0x00, 0x00, 0x00, 0x00, // 00000000
782 0x00, 0x06, 0x88, 0x1C, // 0006881C
783 0x00, 0x04, 0x0C, 0x00, // 00040C00
784 0x00, 0x0A, 0xD2, 0xC1, // 000AD2C1
785 0x00, 0x00, 0x00, 0x00, // 00000000
786 0x00, 0x00, 0x00, 0x00, // 00000000
787 0x00, 0x00, 0x00, 0x00, // 00000000
788 0x00, 0x06, 0x90, 0x4F, // 0006904F
789 0x00, 0x06, 0x94, 0x77, // 00069477
790 0x00, 0x07, 0x44, 0x01, // 00074401
791 0x00, 0x07, 0x06, 0x39, // 00070639
792 0x00, 0x07, 0x4C, 0x01, // 00074C01
793 0x00, 0x07, 0x0E, 0x61, // 00070E61
794 0x00, 0x07, 0x54, 0x12, // 00075412
795 0x00, 0x07, 0x14, 0x30, // 00071430
796 0x00, 0x06, 0x84, 0x1C, // 0006841C
797 0x00, 0x07, 0x5C, 0x00, // 00075C00
798 0x00, 0x07, 0x1C, 0x00, // 00071C00
799 0x00, 0x06, 0x88, 0x1C, // 0006881C
800 0x00, 0x04, 0x0C, 0x00, // 00040C00
801 0x00, 0x04, 0x27, 0x08, // 00042708
802 0x00, 0x04, 0x37, 0x08, // 00043708
803 0x00, 0x09, 0xAC, 0x7F, // 0009AC7F
804 0x00, 0x0A, 0xC1, 0x50, // 000AC150
805 0x00, 0x02, 0x9E, 0x08, // 00029E08
806 0x00, 0x0A, 0x24, 0x7F, // 000A247F
807 0x00, 0x0A, 0xC9, 0xC2, // 000AC9C2
808 0x00, 0x08, 0x0B, 0xC1, // 00080BC1
809 0x00, 0x00, 0x00, 0x00, // 00000000
810 0x00, 0x07, 0xA4, 0x00, // 0007A400
811 0x00, 0x0B, 0x40, 0x40, // 000B4040
812 0x00, 0x07, 0x8C, 0x00, // 00078C00
813 0x00, 0x07, 0xAC, 0x00, // 0007AC00
814 0x00, 0x04, 0xA8, 0x00, // 0004A800
815 0x00, 0x07, 0xB4, 0x00, // 0007B400
816 0x00, 0x06, 0x84, 0x45, // 00068445
817 0x00, 0x06, 0x84, 0x46, // 00068446
818 0x00, 0x07, 0x54, 0x01, // 00075401
819 0x00, 0x07, 0x16, 0x40, // 00071640
820 0x00, 0x07, 0x64, 0x00, // 00076400
821 0x00, 0x07, 0x26, 0x90, // 00072690
822 0x00, 0x0B, 0x49, 0x75, // 000B4975
823 0x00, 0x06, 0x94, 0x1E, // 0006941E
824 0x00, 0x00, 0x00, 0x00, // 00000000
825 0x00, 0x06, 0xA4, 0x1F, // 0006A41F
826 0x00, 0x06, 0x8C, 0x15, // 00068C15
827 0x00, 0x07, 0x44, 0x01, // 00074401
828 0x00, 0x07, 0x06, 0x6A, // 0007066A
829 0x00, 0x04, 0x0F, 0x08, // 00040F08
830 0x00, 0x04, 0x17, 0x08, // 00041708
831 0x00, 0x04, 0x1F, 0x08, // 00041F08
832 0x00, 0x04, 0x27, 0x08, // 00042708
833 0x00, 0x04, 0x2F, 0x08, // 00042F08
834 0x00, 0x06, 0x80, 0x22, // 00068022
835 0x00, 0x04, 0x07, 0x00, // 00040700
836 0x00, 0x06, 0xA4, 0x65, // 0006A465
837 0x00, 0x00, 0x00, 0x00, // 00000000
838 0x00, 0x00, 0x00, 0x00, // 00000000
839 0x00, 0x07, 0x84, 0x0D, // 0007840D
840 0x00, 0x07, 0x8C, 0x5D, // 00078C5D
841 0x00, 0x06, 0xAC, 0x79, // 0006AC79
842 0x00, 0x07, 0x44, 0x01, // 00074401
843 0x00, 0x07, 0x06, 0x6C, // 0007066C
844 0x00, 0x0B, 0x76, 0x41, // 000B7641
845 0x00, 0x00, 0x00, 0x00, // 00000000
846 0x00, 0x00, 0x00, 0x00, // 00000000
847 0x00, 0x06, 0x80, 0x22, // 00068022
848 0x00, 0x0C, 0x0B, 0x0D, // 000C0B0D
849 0x00, 0x0C, 0x13, 0x0D, // 000C130D
850 0x00, 0x0C, 0x1B, 0x0D, // 000C1B0D
851 0x00, 0x0C, 0x23, 0x0D, // 000C230D
852 0x00, 0x00, 0x00, 0x00, // 00000000
853 0x00, 0x00, 0x00, 0x00, // 00000000
854 0x00, 0x06, 0xB4, 0x6A, // 0006B46A
855 0x00, 0x06, 0x8C, 0x66, // 00068C66
856 0x00, 0x06, 0x94, 0x67, // 00069467
857 0x00, 0x06, 0x9C, 0x68, // 00069C68
858 0x00, 0x06, 0xA4, 0x69, // 0006A469
859 0x00, 0x07, 0x64, 0x01, // 00076401
860 0x00, 0x07, 0x27, 0x12, // 00072712
861 0x00, 0x06, 0x80, 0x22, // 00068022
862 0x00, 0x04, 0x03, 0x00, // 00040300
863 0x00, 0x04, 0x0B, 0x00, // 00040B00
864 0x00, 0x04, 0x13, 0x00, // 00041300
865 0x00, 0x04, 0x1B, 0x00, // 00041B00
866 0x00, 0x06, 0xA0, 0x22, // 0006A022
867 0x00, 0x07, 0x80, 0x0F, // 0007800F
868 0x00, 0x07, 0x88, 0x0F, // 0007880F
869 0x00, 0x07, 0x90, 0x0F, // 0007900F
870 0x00, 0x07, 0x98, 0x07, // 00079807
871 0x00, 0x00, 0x00, 0x00, // 00000000
872 0x00, 0x07, 0x44, 0x01, // 00074401
873 0x00, 0x07, 0x06, 0x61, // 00070661
874 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
875 0x00, 0x07, 0x0C, 0x00, // 00070C00
876 0x00, 0x00, 0x00, 0x00, // 00000000
877 0x00, 0x06, 0x80, 0x1C, // 0006801C
878 0x00, 0x0A, 0xC4, 0x81, // 000AC481
879 0x00, 0x00, 0x00, 0x00, // 00000000
880 0x00, 0x09, 0x80, 0x74, // 00098074
881 0x00, 0x00, 0x00, 0x00, // 00000000
882 0x00, 0x0B, 0x52, 0x40, // 000B5240
883 0x00, 0x07, 0x5C, 0x01, // 00075C01
884 0x00, 0x07, 0x1E, 0x66, // 00071E66
885 0x00, 0x07, 0x64, 0x04, // 00076404
886 0x00, 0x07, 0x24, 0x08, // 00072408
887 0x00, 0x08, 0x88, 0x41, // 00088841
888 0x00, 0x02, 0x9E, 0x08, // 00029E08
889 0x00, 0x02, 0x12, 0x8F, // 0002128F
890 0x00, 0x07, 0x56, 0x00, // 00075600
891 0x00, 0x07, 0x14, 0x01, // 00071401
892 0x00, 0x06, 0xA0, 0x08, // 0006A008
893 0x00, 0x00, 0x00, 0x00, // 00000000
894 0x00, 0x06, 0x98, 0x20, // 00069820
895 0x00, 0x07, 0x90, 0x06, // 00079006
896 0x00, 0x08, 0x98, 0x42, // 00089842
897 0x00, 0x02, 0x9E, 0x08, // 00029E08
898 0x00, 0x02, 0x18, 0x00, // 00021800
899 0x00, 0x07, 0x56, 0x00, // 00075600
900 0x00, 0x07, 0x14, 0x02, // 00071402
901 0x00, 0x00, 0x00, 0x00, // 00000000
902 0x00, 0x00, 0x00, 0x00, // 00000000
903 0x00, 0x00, 0x00, 0x00, // 00000000
904 0x00, 0x07, 0x90, 0x06, // 00079006
905 0x00, 0x02, 0x10, 0x54, // 00021054
906 0x00, 0x00, 0x00, 0x00, // 00000000
907 0x00, 0x00, 0x00, 0x00, // 00000000
908 0x00, 0x00, 0x00, 0x00, // 00000000
909 0x00, 0x00, 0x00, 0x00, // 00000000
910 0x00, 0x00, 0x00, 0x00, // 00000000
911 0x00, 0x00, 0x00, 0x00, // 00000000
912 0x00, 0x0B, 0x64, 0x68, // 000B6468
913 0x00, 0x0A, 0xBE, 0xC4, // 000ABEC4
914 0x00, 0x09, 0xA4, 0x46, // 0009A446
915 0x00, 0x0B, 0x7F, 0xC7, // 000B7FC7
916 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
917 0x00, 0x00, 0x00, 0x00, // 00000000
918 0x00, 0x06, 0xA4, 0x05, // 0006A405
919 0x00, 0x06, 0xBC, 0x0D, // 0006BC0D
920 0x00, 0x01, 0x41, 0x00, // 00014100
921 0x00, 0x06, 0xAC, 0x0F, // 0006AC0F
922 0x00, 0x00, 0x00, 0x00, // 00000000
923 0x00, 0x00, 0x00, 0x00, // 00000000
924 0x00, 0x00, 0xC1, 0x87, // 0000C187
925 0x00, 0x06, 0xB4, 0x0D, // 0006B40D
926 0x00, 0x00, 0x00, 0x00, // 00000000
927 0x00, 0x00, 0x00, 0x00, // 00000000
928 0x00, 0x00, 0x00, 0x00, // 00000000
929 0x00, 0x09, 0xBD, 0x4A, // 0009BD4A
930 0x00, 0x09, 0xB6, 0x7C, // 0009B67C
931 0x00, 0x0A, 0xE4, 0x40, // 000AE440
932 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
933 0x00, 0x07, 0x6F, 0xFF, // 00076FFF
934 0x00, 0x07, 0x2F, 0xFF, // 00072FFF
935 0x00, 0x01, 0x03, 0xA6, // 000103A6
936 0x00, 0x0A, 0x2D, 0x7C, // 000A2D7C
937 0x00, 0x09, 0xA4, 0x41, // 0009A441
938 0x00, 0x09, 0xBF, 0x41, // 0009BF41
939 0x00, 0x08, 0xE4, 0xC5, // 0008E4C5
940 0x00, 0x09, 0x1E, 0xC4, // 00091EC4
941 0x00, 0x02, 0x87, 0x10, // 00028710
942 0x00, 0x0A, 0xE3, 0xC3, // 000AE3C3
943 0x00, 0x08, 0xBF, 0xC5, // 0008BFC5
944 0x00, 0x07, 0x75, 0xD9, // 000775D9
945 0x00, 0x07, 0x36, 0x23, // 00073623
946 0x00, 0x09, 0xA7, 0x40, // 0009A740
947 0x00, 0x07, 0x6D, 0x14, // 00076D14
948 0x00, 0x0C, 0x36, 0x27, // 000C3627
949 0x00, 0x07, 0x2F, 0x2C, // 00072F2C
950 0x00, 0x0B, 0x7D, 0x75, // 000B7D75
951 0x00, 0x08, 0xAD, 0xC4, // 0008ADC4
952 0x00, 0x00, 0xC7, 0x87, // 0000C787
953 0x00, 0x0A, 0x6E, 0xC6, // 000A6EC6
954 0x00, 0x09, 0xA4, 0x44, // 0009A444
955 0x00, 0x08, 0xAD, 0x41, // 0008AD41
956 0x00, 0x09, 0xA4, 0xC5, // 0009A4C5
957 0x00, 0x09, 0xAD, 0x43, // 0009AD43
958 0x00, 0x09, 0xB4, 0x6D, // 0009B46D
959 0x00, 0x09, 0xA4, 0x49, // 0009A449
960 0x00, 0x0A, 0xF6, 0x7F, // 000AF67F
961 0x00, 0x0A, 0x24, 0x77, // 000A2477
962 0x00, 0x02, 0x86, 0x30, // 00028630
963 0x00, 0x08, 0x36, 0x41, // 00083641
964 0x00, 0x08, 0xBE, 0x48, // 0008BE48
965 0x00, 0x02, 0x87, 0x18, // 00028718
966 0x00, 0x09, 0xA4, 0x49, // 0009A449
967 0x00, 0x08, 0xB6, 0x41, // 0008B641
968 0x00, 0x09, 0xA4, 0x77, // 0009A477
969 0x00, 0x0B, 0x7F, 0x74, // 000B7F74
970 0x00, 0x08, 0xB6, 0x44, // 0008B644
971 0x00, 0x02, 0x9E, 0x20, // 00029E20
972 0x00, 0x0B, 0x5B, 0x41, // 000B5B41
973 0x00, 0x08, 0x36, 0x41, // 00083641
974 0x00, 0x09, 0x9B, 0x53, // 00099B53
975 0x00, 0x08, 0x24, 0xC3, // 000824C3
976 0x00, 0x08, 0xB6, 0x41, // 0008B641
977 0x00, 0x00, 0xC7, 0x87, // 0000C787
978 0x00, 0x00, 0xC1, 0x07, // 0000C107
979 0x00, 0x09, 0xB6, 0x4F, // 0009B64F
980 0x00, 0x08, 0x35, 0xC6, // 000835C6
981 0x00, 0x0B, 0x3F, 0xC7, // 000B3FC7
982 0x00, 0x0A, 0xEC, 0xC4, // 000AECC4
983 0x00, 0x00, 0x00, 0x00, // 00000000
984 0x00, 0x00, 0x00, 0x00, // 00000000
985 0x00, 0x07, 0x44, 0x01, // 00074401
986 0x00, 0x07, 0x06, 0x61, // 00070661
987 0x00, 0x07, 0x4C, 0x00, // 00074C00
988 0x00, 0x07, 0x0D, 0x00, // 00070D00
989 0x00, 0x0B, 0x52, 0x40, // 000B5240
990 0x00, 0x06, 0x80, 0x22, // 00068022
991 0x00, 0x04, 0x07, 0x00, // 00040700
992 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
993 0x00, 0x02, 0x9F, 0x08, // 00029F08
994 0x00, 0x0B, 0x52, 0x7F, // 000B527F
995 0x00, 0x07, 0x5C, 0x01, // 00075C01
996 0x00, 0x07, 0x1E, 0x69, // 00071E69
997 0x00, 0x0B, 0x64, 0x7F, // 000B647F
998 0x00, 0x06, 0x90, 0x78, // 00069078
999 0x00, 0x0B, 0x6D, 0x7E, // 000B6D7E
1000 0x00, 0x06, 0x98, 0x22, // 00069822
1001 0x00, 0x0A, 0xDF, 0x84, // 000ADF84
1002 0x00, 0x0A, 0xDF, 0x85, // 000ADF85
1003 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
1004 0x00, 0x00, 0x00, 0x00, // 00000000
1005 0x00, 0x06, 0x98, 0x77, // 00069877
1006 0x00, 0x06, 0x98, 0x7A, // 0006987A
1007 0x00, 0x06, 0xB8, 0x68, // 0006B868
1008 0x00, 0x06, 0xB8, 0x69, // 0006B869
1009 0x00, 0x06, 0xB8, 0x6F, // 0006B86F
1010 0x00, 0x06, 0xB8, 0x70, // 0006B870
1011 0x00, 0x06, 0xB8, 0x71, // 0006B871
1012 0x00, 0x06, 0xB8, 0x72, // 0006B872
1013 0x00, 0x06, 0xB8, 0x73, // 0006B873
1014 0x00, 0x06, 0xB8, 0x74, // 0006B874
1015 0x00, 0x06, 0xB8, 0x75, // 0006B875
1016 0x00, 0x00, 0x00, 0x00, // 00000000
1017 0x00, 0x06, 0x28, 0x6A, // 0006286A
1018 0x00, 0x00, 0x00, 0x00, // 00000000
1019 0x00, 0x00, 0x00, 0x00, // 00000000
1020 0x00, 0x00, 0x00, 0x00, // 00000000
1021 0x00, 0x06, 0xA8, 0x61, // 0006A861
1022 0x00, 0x07, 0x65, 0x5D, // 0007655D
1023 0x00, 0x07, 0x24, 0x10, // 00072410
1024 0x00, 0x06, 0x30, 0x6C, // 0006306C
1025 0x00, 0x07, 0x6D, 0x59, // 00076D59
1026 0x00, 0x07, 0x2C, 0x50, // 00072C50
1027 0x00, 0x08, 0xB6, 0x40, // 0008B640
1028 0x00, 0x02, 0x9F, 0x20, // 00029F20
1029 0x00, 0x07, 0x65, 0x05, // 00076505
1030 0x00, 0x07, 0x25, 0x70, // 00072570
1031 0x00, 0x07, 0x6D, 0x15, // 00076D15
1032 0x00, 0x07, 0x2D, 0x60, // 00072D60
1033 0x00, 0x00, 0x00, 0x00, // 00000000
1034 0x00, 0x00, 0x00, 0x00, // 00000000
1035 0x00, 0x06, 0xA0, 0x66, // 0006A066
1036 0x00, 0x06, 0xA8, 0x67, // 0006A867
1037 0x00, 0x07, 0x5C, 0x00, // 00075C00
1038 0x00, 0x07, 0x1C, 0x20, // 00071C20
1039 0x00, 0x07, 0x7C, 0x01, // 00077C01
1040 0x00, 0x07, 0x3D, 0xFF, // 00073DFF
1041 0x00, 0x07, 0x54, 0x00, // 00075400
1042 0x00, 0x07, 0x14, 0x00, // 00071400
1043 0x00, 0x07, 0x4C, 0x01, // 00074C01
1044 0x00, 0x07, 0x0E, 0x00, // 00070E00
1045 0x00, 0x07, 0x74, 0x01, // 00077401
1046 0x00, 0x07, 0x35, 0xFF, // 000735FF
1047 0x00, 0x07, 0x64, 0x00, // 00076400
1048 0x00, 0x07, 0x26, 0x98, // 00072698
1049 0x00, 0x07, 0x6C, 0x01, // 00076C01
1050 0x00, 0x07, 0x2C, 0x90, // 00072C90
1051 0x00, 0x07, 0x44, 0x00, // 00074400
1052 0x00, 0x07, 0x04, 0x90, // 00070490
1053 0x00, 0x07, 0x5C, 0x00, // 00075C00
1054 0x00, 0x07, 0x1C, 0x00, // 00071C00
1055 0x00, 0x06, 0x98, 0x15, // 00069815
1056 0x00, 0x06, 0xB8, 0x16, // 0006B816
1057 0x00, 0x06, 0xB4, 0x14, // 0006B414
1058 0x00, 0x06, 0x88, 0x28, // 00068828
1059 0x00, 0x06, 0x88, 0x22, // 00068822
1060 0x00, 0x06, 0x90, 0x2E, // 0006902E
1061 0x00, 0x06, 0x90, 0x1C, // 0006901C
1062 0x00, 0x06, 0x90, 0x20, // 00069020
1063 0x00, 0x06, 0x9C, 0x1C, // 00069C1C
1064 0x00, 0x06, 0xB4, 0x26, // 0006B426
1065 0x00, 0x06, 0xB4, 0x24, // 0006B424
1066 0x00, 0x06, 0xB4, 0x2E, // 0006B42E
1067 0x00, 0x06, 0xA0, 0x29, // 0006A029
1068 0x00, 0x06, 0xA8, 0x1D, // 0006A81D
1069 0x00, 0x06, 0xA8, 0x21, // 0006A821
1070 0x00, 0x06, 0xA8, 0x2F, // 0006A82F
1071 0x00, 0x06, 0x84, 0x1D, // 0006841D
1072 0x00, 0x08, 0x3F, 0x41, // 00083F41
1073 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1074 0x00, 0x00, 0x00, 0x00, // 00000000
1075 0x00, 0x00, 0x00, 0x00, // 00000000
1076 0x00, 0x01, 0x01, 0x21, // 00010121
1077 0x00, 0x06, 0xB8, 0x6E, // 0006B86E
1078 0x00, 0x07, 0xA8, 0x0F, // 0007A80F
1079 0x00, 0x00, 0x00, 0x00, // 00000000
1080 0x00, 0x06, 0x38, 0x78, // 00063878
1081 0x00, 0x07, 0x44, 0x05, // 00074405
1082 0x00, 0x07, 0x05, 0x89, // 00070589
1083 0x00, 0x07, 0x4C, 0x05, // 00074C05
1084 0x00, 0x07, 0x0D, 0x4B, // 00070D4B
1085 0x00, 0x07, 0x54, 0x05, // 00075405
1086 0x00, 0x07, 0x15, 0x59, // 00071559
1087 0x00, 0x07, 0x5C, 0x05, // 00075C05
1088 0x00, 0x07, 0x1D, 0xBD, // 00071DBD
1089 0x00, 0x08, 0xBF, 0x40, // 0008BF40
1090 0x00, 0x02, 0x9F, 0x40, // 00029F40
1091 0x00, 0x07, 0x44, 0x05, // 00074405
1092 0x00, 0x07, 0x04, 0xC8, // 000704C8
1093 0x00, 0x07, 0x4C, 0x05, // 00074C05
1094 0x00, 0x07, 0x0C, 0xEE, // 00070CEE
1095 0x00, 0x07, 0x54, 0x05, // 00075405
1096 0x00, 0x07, 0x14, 0xF8, // 000714F8
1097 0x00, 0x07, 0x5C, 0x05, // 00075C05
1098 0x00, 0x07, 0x1D, 0x16, // 00071D16
1099 0x00, 0x06, 0x80, 0x09, // 00068009
1100 0x00, 0x06, 0x88, 0x0D, // 0006880D
1101 0x00, 0x06, 0x90, 0x0C, // 0006900C
1102 0x00, 0x06, 0x98, 0x0B, // 0006980B
1103 0x00, 0x07, 0x44, 0x01, // 00074401
1104 0x00, 0x07, 0x06, 0x61, // 00070661
1105 0x00, 0x07, 0x64, 0x00, // 00076400
1106 0x00, 0x07, 0x27, 0x20, // 00072720
1107 0x00, 0x07, 0x4C, 0x00, // 00074C00
1108 0x00, 0x07, 0x0C, 0x00, // 00070C00
1109 0x00, 0x06, 0x80, 0x22, // 00068022
1110 0x00, 0x04, 0x3F, 0x00, // 00043F00
1111 0x00, 0x06, 0x00, 0x78, // 00060078
1112 0x00, 0x0A, 0xFF, 0x44, // 000AFF44
1113 0x00, 0x06, 0xA0, 0x5B, // 0006A05B
1114 0x00, 0x07, 0x64, 0x00, // 00076400
1115 0x00, 0x07, 0x27, 0x00, // 00072700
1116 0x00, 0x07, 0x5C, 0x00, // 00075C00
1117 0x00, 0x07, 0x1C, 0x10, // 00071C10
1118 0x00, 0x08, 0x80, 0x40, // 00088040
1119 0x00, 0x06, 0xA0, 0x5B, // 0006A05B
1120 0x00, 0x02, 0x9E, 0x20, // 00029E20
1121 0x00, 0x07, 0x5C, 0x00, // 00075C00
1122 0x00, 0x07, 0x64, 0x04, // 00076404
1123 0x00, 0x07, 0x24, 0x00, // 00072400
1124 0x00, 0x07, 0x1C, 0x30, // 00071C30
1125 0x00, 0x08, 0x24, 0xC7, // 000824C7
1126 0x00, 0x06, 0x88, 0x4B, // 0006884B
1127 0x00, 0x00, 0x00, 0x00, // 00000000
1128 0x00, 0x06, 0x9C, 0x06, // 00069C06
1129 0x00, 0x06, 0xA0, 0x5B, // 0006A05B
1130 0x00, 0x06, 0xA4, 0x76, // 0006A476
1131 0x00, 0x06, 0x28, 0x77, // 00062877
1132 0x00, 0x07, 0x54, 0x01, // 00075401
1133 0x00, 0x07, 0x16, 0x40, // 00071640
1134 0x00, 0x07, 0x64, 0x00, // 00076400
1135 0x00, 0x07, 0x24, 0x90, // 00072490
1136 0x00, 0x0B, 0x49, 0x7D, // 000B497D
1137 0x00, 0x07, 0x44, 0x01, // 00074401
1138 0x00, 0x07, 0x06, 0x6C, // 0007066C
1139 0x00, 0x06, 0x90, 0x1E, // 0006901E
1140 0x00, 0x06, 0xA0, 0x1F, // 0006A01F
1141 0x00, 0x06, 0x88, 0x14, // 00068814
1142 0x00, 0x06, 0x80, 0x22, // 00068022
1143 0x00, 0x04, 0x0F, 0x08, // 00040F08
1144 0x00, 0x04, 0x17, 0x08, // 00041708
1145 0x00, 0x04, 0x1F, 0x08, // 00041F08
1146 0x00, 0x04, 0x27, 0x08, // 00042708
1147 0x00, 0x08, 0xAD, 0x40, // 0008AD40
1148 0x00, 0x02, 0x9F, 0x20, // 00029F20
1149 0x00, 0x0B, 0x49, 0x40, // 000B4940
1150 0x00, 0x0B, 0x52, 0x40, // 000B5240
1151 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
1152 0x00, 0x0B, 0x64, 0x40, // 000B6440
1153 0x00, 0x07, 0x88, 0x0D, // 0007880D
1154 0x00, 0x07, 0x90, 0x0D, // 0007900D
1155 0x00, 0x07, 0x98, 0x0D, // 0007980D
1156 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1157 0x00, 0x00, 0x00, 0x00, // 00000000
1158 0x00, 0x00, 0xC1, 0x05, // 0000C105
1159 0x00, 0x07, 0x44, 0x04, // 00074404
1160 0x00, 0x07, 0x07, 0x43, // 00070743
1161 0x00, 0x00, 0x00, 0x00, // 00000000
1162 0x00, 0x00, 0x00, 0x00, // 00000000
1163 0x00, 0x00, 0x00, 0x00, // 00000000
1164 0x00, 0x06, 0x80, 0x0F, // 0006800F
1165 0x00, 0x06, 0x38, 0x61, // 00063861
1166 0x00, 0x00, 0x00, 0x00, // 00000000
1167 0x00, 0x08, 0xBF, 0x40, // 0008BF40
1168 0x00, 0x02, 0x9E, 0x10, // 00029E10
1169 0x00, 0x02, 0x13, 0x6E, // 0002136E
1170 0x00, 0x02, 0x81, 0x28, // 00028128
1171 0x00, 0x07, 0x54, 0x00, // 00075400
1172 0x00, 0x07, 0x14, 0x20, // 00071420
1173 0x00, 0x06, 0x18, 0x1C, // 0006181C
1174 0x00, 0x09, 0x12, 0xC0, // 000912C0
1175 0x00, 0x02, 0x86, 0x10, // 00028610
1176 0x00, 0x02, 0x14, 0x14, // 00021414
1177 0x00, 0x02, 0x81, 0x28, // 00028128
1178 0x00, 0x06, 0x10, 0x6E, // 0006106E
1179 0x00, 0x08, 0x9B, 0x44, // 00089B44
1180 0x00, 0x02, 0x86, 0x08, // 00028608
1181 0x00, 0x08, 0x1B, 0xC2, // 00081BC2
1182 0x00, 0x07, 0x45, 0x5D, // 0007455D
1183 0x00, 0x07, 0x04, 0x10, // 00070410
1184 0x00, 0x07, 0x4D, 0x59, // 00074D59
1185 0x00, 0x07, 0x0C, 0x50, // 00070C50
1186 0x00, 0x06, 0x98, 0x1C, // 0006981C
1187 0x00, 0x00, 0xC1, 0x04, // 0000C104
1188 0x00, 0x07, 0x54, 0x04, // 00075404
1189 0x00, 0x07, 0x17, 0x60, // 00071760
1190 0x00, 0x09, 0x80, 0x48, // 00098048
1191 0x00, 0x09, 0x89, 0x78, // 00098978
1192 0x00, 0x08, 0x38, 0xC1, // 000838C1
1193 0x00, 0x06, 0x90, 0x0F, // 0006900F
1194 0x00, 0x08, 0x80, 0x41, // 00088041
1195 0x00, 0x02, 0x9F, 0x10, // 00029F10
1196 0x00, 0x02, 0x14, 0x14, // 00021414
1197 0x00, 0x02, 0x81, 0x28, // 00028128
1198 0x00, 0x07, 0x54, 0x01, // 00075401
1199 0x00, 0x07, 0x16, 0x65, // 00071665
1200 0x00, 0x0B, 0x49, 0x40, // 000B4940
1201 0x00, 0x02, 0x14, 0x14, // 00021414
1202 0x00, 0x00, 0x00, 0x00, // 00000000
1203 0x00, 0x06, 0x90, 0x22, // 00069022
1204 0x00, 0x07, 0x88, 0x03, // 00078803
1205 0x00, 0x00, 0x00, 0x00, // 00000000
1206 0x00, 0x06, 0x88, 0x69, // 00068869
1207 0x00, 0x06, 0x88, 0x61, // 00068861
1208 0x00, 0x06, 0x08, 0x6F, // 0006086F
1209 0x00, 0x0B, 0x52, 0x40, // 000B5240
1210 0x00, 0x08, 0x89, 0x41, // 00088941
1211 0x00, 0x02, 0x9F, 0x10, // 00029F10
1212 0x00, 0x02, 0x13, 0x8B, // 0002138B
1213 0x00, 0x02, 0x81, 0x28, // 00028128
1214 0x00, 0x08, 0x88, 0x42, // 00088842
1215 0x00, 0x02, 0x86, 0x10, // 00028610
1216 0x00, 0x02, 0x14, 0x14, // 00021414
1217 0x00, 0x02, 0x81, 0x28, // 00028128
1218 0x00, 0x00, 0xC1, 0x01, // 0000C101
1219 0x00, 0x07, 0x44, 0x04, // 00074404
1220 0x00, 0x07, 0x07, 0x7F, // 0007077F
1221 0x00, 0x00, 0x00, 0x00, // 00000000
1222 0x00, 0x00, 0x00, 0x00, // 00000000
1223 0x00, 0x06, 0x90, 0x6F, // 0006906F
1224 0x00, 0x06, 0x80, 0x0F, // 0006800F
1225 0x00, 0x06, 0x10, 0x66, // 00061066
1226 0x00, 0x08, 0x90, 0xC2, // 000890C2
1227 0x00, 0x02, 0x9F, 0x10, // 00029F10
1228 0x00, 0x02, 0x16, 0x14, // 00021614
1229 0x00, 0x02, 0x81, 0x28, // 00028128
1230 0x00, 0x06, 0x10, 0x67, // 00061067
1231 0x00, 0x08, 0x91, 0xC2, // 000891C2
1232 0x00, 0x02, 0x9F, 0x10, // 00029F10
1233 0x00, 0x02, 0x16, 0x14, // 00021614
1234 0x00, 0x02, 0x81, 0x28, // 00028128
1235 0x00, 0x02, 0x14, 0x14, // 00021414
1236 0x00, 0x02, 0x81, 0x28, // 00028128
1237 0x00, 0x06, 0x10, 0x76, // 00061076
1238 0x00, 0x06, 0x08, 0x7A, // 0006087A
1239 0x00, 0x0A, 0x00, 0xC2, // 000A00C2
1240 0x00, 0x08, 0x89, 0x40, // 00088940
1241 0x00, 0x02, 0x9F, 0x10, // 00029F10
1242 0x00, 0x02, 0x14, 0x14, // 00021414
1243 0x00, 0x02, 0x81, 0x28, // 00028128
1244 0x00, 0x07, 0x54, 0x00, // 00075400
1245 0x00, 0x07, 0x14, 0x20, // 00071420
1246 0x00, 0x00, 0x00, 0x00, // 00000000
1247 0x00, 0x08, 0x90, 0xC2, // 000890C2
1248 0x00, 0x02, 0x88, 0x10, // 00028810
1249 0x00, 0x02, 0x14, 0x14, // 00021414
1250 0x00, 0x02, 0x81, 0x28, // 00028128
1251 0x00, 0x06, 0x0C, 0x26, // 00060C26
1252 0x00, 0x06, 0x14, 0x1C, // 0006141C
1253 0x00, 0x07, 0x5C, 0x01, // 00075C01
1254 0x00, 0x07, 0x1E, 0x00, // 00071E00
1255 0x00, 0x08, 0x89, 0xC2, // 000889C2
1256 0x00, 0x02, 0x86, 0x08, // 00028608
1257 0x00, 0x08, 0x09, 0xC3, // 000809C3
1258 0x00, 0x06, 0x24, 0x24, // 00062424
1259 0x00, 0x09, 0x22, 0xC4, // 000922C4
1260 0x00, 0x02, 0x86, 0x08, // 00028608
1261 0x00, 0x08, 0x24, 0xC3, // 000824C3
1262 0x00, 0x09, 0x29, 0xC4, // 000929C4
1263 0x00, 0x02, 0x86, 0x08, // 00028608
1264 0x00, 0x08, 0x0C, 0x40, // 00080C40
1265 0x00, 0x06, 0x24, 0x2E, // 0006242E
1266 0x00, 0x09, 0x22, 0xC4, // 000922C4
1267 0x00, 0x02, 0x86, 0x08, // 00028608
1268 0x00, 0x08, 0x24, 0xC3, // 000824C3
1269 0x00, 0x09, 0x29, 0xC4, // 000929C4
1270 0x00, 0x02, 0x86, 0x08, // 00028608
1271 0x00, 0x08, 0x0C, 0x40, // 00080C40
1272 0x00, 0x07, 0x6C, 0x00, // 00076C00
1273 0x00, 0x07, 0x2C, 0x20, // 00072C20
1274 0x00, 0x00, 0x00, 0x00, // 00000000
1275 0x00, 0x08, 0x89, 0xC5, // 000889C5
1276 0x00, 0x02, 0x86, 0x10, // 00028610
1277 0x00, 0x02, 0x14, 0x14, // 00021414
1278 0x00, 0x02, 0x81, 0x28, // 00028128
1279 0x00, 0x00, 0x00, 0x00, // 00000000
1280 0x00, 0x00, 0x00, 0x00, // 00000000
1281 0x00, 0x00, 0x00, 0x00, // 00000000
1282 0x00, 0x0B, 0x6D, 0x70, // 000B6D70
1283 0x00, 0x00, 0x00, 0x00, // 00000000
1284 0x00, 0x00, 0x00, 0x00, // 00000000
1285 0x00, 0x04, 0xB8, 0x0D, // 0004B80D
1286 0x00, 0x06, 0xA8, 0x79, // 0006A879
1287 0x00, 0x09, 0xBF, 0x7C, // 0009BF7C
1288 0x00, 0x00, 0xC1, 0x01, // 0000C101
1289 0x00, 0x07, 0x44, 0x04, // 00074404
1290 0x00, 0x07, 0x07, 0xC5, // 000707C5
1291 0x00, 0x00, 0x00, 0x00, // 00000000
1292 0x00, 0x00, 0x00, 0x00, // 00000000
1293 0x00, 0x00, 0x00, 0x00, // 00000000
1294 0x00, 0x06, 0x80, 0x0F, // 0006800F
1295 0x00, 0x06, 0x18, 0x76, // 00061876
1296 0x00, 0x00, 0x00, 0x00, // 00000000
1297 0x00, 0x08, 0x9B, 0x40, // 00089B40
1298 0x00, 0x02, 0x9F, 0x10, // 00029F10
1299 0x00, 0x08, 0x29, 0x40, // 00082940
1300 0x00, 0x08, 0x08, 0x40, // 00080840
1301 0x00, 0x0C, 0x31, 0x08, // 000C3108
1302 0x00, 0x0E, 0x31, 0x09, // 000E3109
1303 0x00, 0x00, 0x00, 0x00, // 00000000
1304 0x00, 0x06, 0x10, 0x73, // 00061073
1305 0x00, 0x0C, 0x01, 0x08, // 000C0108
1306 0x00, 0x0E, 0x01, 0x09, // 000E0109
1307 0x00, 0x0A, 0xF6, 0x7C, // 000AF67C
1308 0x00, 0x09, 0xA7, 0x7F, // 0009A77F
1309 0x00, 0x02, 0x82, 0x08, // 00028208
1310 0x00, 0x08, 0x36, 0x42, // 00083642
1311 0x00, 0x0A, 0xC0, 0x7C, // 000AC07C
1312 0x00, 0x09, 0xBF, 0x7F, // 0009BF7F
1313 0x00, 0x02, 0x82, 0x08, // 00028208
1314 0x00, 0x08, 0x00, 0x42, // 00080042
1315 0x00, 0x06, 0x20, 0x79, // 00062079
1316 0x00, 0x08, 0x12, 0x42, // 00081242
1317 0x00, 0x08, 0xA4, 0x41, // 0008A441
1318 0x00, 0x07, 0xF4, 0x0C, // 0007F40C
1319 0x00, 0x07, 0xC4, 0x0C, // 0007C40C
1320 0x00, 0x02, 0x9F, 0x50, // 00029F50
1321 0x00, 0x06, 0x90, 0x73, // 00069073
1322 0x00, 0x06, 0xA0, 0x79, // 0006A079
1323 0x00, 0x08, 0x9B, 0x41, // 00089B41
1324 0x00, 0x02, 0x87, 0x20, // 00028720
1325 0x00, 0x08, 0x0D, 0x40, // 00080D40
1326 0x00, 0x08, 0x05, 0x40, // 00080540
1327 0x00, 0x02, 0x13, 0xCB, // 000213CB
1328 0x00, 0x02, 0x81, 0x28, // 00028128
1329 0x00, 0x02, 0x13, 0xBE, // 000213BE
1330 0x00, 0x02, 0x81, 0x28, // 00028128
1331 0x00, 0x06, 0x00, 0x74, // 00060074
1332 0x00, 0x06, 0x0C, 0x1C, // 00060C1C
1333 0x00, 0x07, 0x54, 0x01, // 00075401
1334 0x00, 0x07, 0x14, 0x80, // 00071480
1335 0x00, 0x08, 0x80, 0x40, // 00088040
1336 0x00, 0x02, 0x9E, 0x48, // 00029E48
1337 0x00, 0x08, 0x91, 0xC2, // 000891C2
1338 0x00, 0x02, 0x89, 0x38, // 00028938
1339 0x00, 0x02, 0x15, 0xDB, // 000215DB
1340 0x00, 0x07, 0x44, 0x04, // 00074404
1341 0x00, 0x07, 0x07, 0xF8, // 000707F8
1342 0x00, 0x00, 0x00, 0x00, // 00000000
1343 0x00, 0x00, 0x00, 0x00, // 00000000
1344 0x00, 0x00, 0x00, 0x00, // 00000000
1345 0x00, 0x06, 0x80, 0x0E, // 0006800E
1346 0x00, 0x02, 0x16, 0x52, // 00021652
1347 0x00, 0x07, 0x4C, 0x04, // 00074C04
1348 0x00, 0x07, 0x0F, 0xFF, // 00070FFF
1349 0x00, 0x00, 0x00, 0x00, // 00000000
1350 0x00, 0x00, 0x00, 0x00, // 00000000
1351 0x00, 0x00, 0x00, 0x00, // 00000000
1352 0x00, 0x06, 0x88, 0x0F, // 0006880F
1353 0x00, 0x06, 0x00, 0x69, // 00060069
1354 0x00, 0x07, 0x4C, 0x01, // 00074C01
1355 0x00, 0x07, 0x0E, 0x65, // 00070E65
1356 0x00, 0x08, 0x00, 0x41, // 00080041
1357 0x00, 0x07, 0x54, 0x00, // 00075400
1358 0x00, 0x07, 0x14, 0x20, // 00071420
1359 0x00, 0x06, 0x18, 0x76, // 00061876
1360 0x00, 0x0A, 0x12, 0xC3, // 000A12C3
1361 0x00, 0x06, 0x88, 0x22, // 00068822
1362 0x00, 0x08, 0x92, 0x41, // 00089241
1363 0x00, 0x0A, 0xC0, 0xC2, // 000AC0C2
1364 0x00, 0x04, 0x0F, 0x00, // 00040F00
1365 0x00, 0x02, 0x9F, 0x10, // 00029F10
1366 0x00, 0x02, 0x14, 0x14, // 00021414
1367 0x00, 0x02, 0x81, 0x28, // 00028128
1368 0x00, 0x08, 0x09, 0x41, // 00080941
1369 0x00, 0x06, 0x00, 0x6A, // 0006006A
1370 0x00, 0x00, 0x00, 0x00, // 00000000
1371 0x00, 0x06, 0x80, 0x69, // 00068069
1372 0x00, 0x07, 0x88, 0x07, // 00078807
1373 0x00, 0x06, 0x80, 0x6F, // 0006806F
1374 0x00, 0x00, 0xC1, 0x03, // 0000C103
1375 0x00, 0x07, 0x44, 0x05, // 00074405
1376 0x00, 0x07, 0x04, 0x1B, // 0007041B
1377 0x00, 0x00, 0x00, 0x00, // 00000000
1378 0x00, 0x00, 0x00, 0x00, // 00000000
1379 0x00, 0x00, 0x00, 0x00, // 00000000
1380 0x00, 0x06, 0x80, 0x0F, // 0006800F
1381 0x00, 0x06, 0x04, 0x26, // 00060426
1382 0x00, 0x06, 0x28, 0x7A, // 0006287A
1383 0x00, 0x06, 0x38, 0x7A, // 0006387A
1384 0x00, 0x06, 0x0C, 0x1C, // 00060C1C
1385 0x00, 0x07, 0x54, 0x01, // 00075401
1386 0x00, 0x07, 0x16, 0x00, // 00071600
1387 0x00, 0x06, 0x18, 0x70, // 00061870
1388 0x00, 0x08, 0x80, 0xC1, // 000880C1
1389 0x00, 0x02, 0x86, 0x08, // 00028608
1390 0x00, 0x08, 0x00, 0xC2, // 000800C2
1391 0x00, 0x07, 0x74, 0x00, // 00077400
1392 0x00, 0x07, 0x34, 0x40, // 00073440
1393 0x00, 0x06, 0x08, 0x74, // 00060874
1394 0x00, 0x08, 0xA5, 0x41, // 0008A541
1395 0x00, 0x02, 0x9E, 0x30, // 00029E30
1396 0x00, 0x08, 0x89, 0x40, // 00088940
1397 0x00, 0x02, 0x9F, 0x20, // 00029F20
1398 0x00, 0x08, 0xA0, 0xC6, // 0008A0C6
1399 0x00, 0x02, 0x88, 0x10, // 00028810
1400 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1401 0x00, 0x02, 0x81, 0x80, // 00028180
1402 0x00, 0x08, 0x89, 0x40, // 00088940
1403 0x00, 0x02, 0x9F, 0x70, // 00029F70
1404 0x00, 0x07, 0x64, 0x00, // 00076400
1405 0x00, 0x07, 0x24, 0x21, // 00072421
1406 0x00, 0x08, 0x93, 0xC0, // 000893C0
1407 0x00, 0x06, 0x80, 0x70, // 00068070
1408 0x00, 0x06, 0xA8, 0x7A, // 0006A87A
1409 0x00, 0x08, 0x94, 0xC2, // 000894C2
1410 0x00, 0x02, 0x88, 0x10, // 00028810
1411 0x00, 0x02, 0x16, 0x11, // 00021611
1412 0x00, 0x07, 0x44, 0x05, // 00074405
1413 0x00, 0x07, 0x04, 0x40, // 00070440
1414 0x00, 0x00, 0x00, 0x00, // 00000000
1415 0x00, 0x00, 0x00, 0x00, // 00000000
1416 0x00, 0x00, 0x00, 0x00, // 00000000
1417 0x00, 0x06, 0x80, 0x0F, // 0006800F
1418 0x00, 0x07, 0x44, 0x01, // 00074401
1419 0x00, 0x07, 0x06, 0x61, // 00070661
1420 0x00, 0x07, 0x4C, 0x00, // 00074C00
1421 0x00, 0x07, 0x0C, 0x01, // 00070C01
1422 0x00, 0x00, 0x00, 0x00, // 00000000
1423 0x00, 0x06, 0x80, 0x22, // 00068022
1424 0x00, 0x04, 0x07, 0x00, // 00040700
1425 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
1426 0x00, 0x02, 0x9F, 0x10, // 00029F10
1427 0x00, 0x08, 0x80, 0x41, // 00088041
1428 0x00, 0x02, 0x81, 0x10, // 00028110
1429 0x00, 0x02, 0x14, 0xAC, // 000214AC
1430 0x00, 0x02, 0x81, 0x28, // 00028128
1431 0x00, 0x07, 0x80, 0x07, // 00078007
1432 0x00, 0x07, 0x44, 0x01, // 00074401
1433 0x00, 0x07, 0x06, 0x61, // 00070661
1434 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
1435 0x00, 0x07, 0x0C, 0x00, // 00070C00
1436 0x00, 0x00, 0x00, 0x00, // 00000000
1437 0x00, 0x06, 0x80, 0x22, // 00068022
1438 0x00, 0x0A, 0xC7, 0x81, // 000AC781
1439 0x00, 0x02, 0x9E, 0x10, // 00029E10
1440 0x00, 0x02, 0x14, 0xC1, // 000214C1
1441 0x00, 0x02, 0x81, 0x28, // 00028128
1442 0x00, 0x07, 0x44, 0x01, // 00074401
1443 0x00, 0x07, 0x06, 0x69, // 00070669
1444 0x00, 0x07, 0x4C, 0x00, // 00074C00
1445 0x00, 0x07, 0x0C, 0x01, // 00070C01
1446 0x00, 0x07, 0x44, 0x01, // 00074401
1447 0x00, 0x07, 0x06, 0x6C, // 0007066C
1448 0x00, 0x06, 0x80, 0x22, // 00068022
1449 0x00, 0x06, 0x10, 0x7A, // 0006107A
1450 0x00, 0x06, 0x18, 0x77, // 00061877
1451 0x00, 0x04, 0x25, 0x08, // 00042508
1452 0x00, 0x04, 0x2D, 0x08, // 00042D08
1453 0x00, 0x04, 0x35, 0x08, // 00043508
1454 0x00, 0x04, 0x3D, 0x08, // 00043D08
1455 0x00, 0x0A, 0xCF, 0x81, // 000ACF81
1456 0x00, 0x02, 0x9F, 0x70, // 00029F70
1457 0x00, 0x06, 0x0C, 0x6A, // 00060C6A
1458 0x00, 0x08, 0x9B, 0x40, // 00089B40
1459 0x00, 0x02, 0x9E, 0x50, // 00029E50
1460 0x00, 0x08, 0x92, 0x40, // 00089240
1461 0x00, 0x02, 0x9F, 0x30, // 00029F30
1462 0x00, 0x0B, 0x49, 0x41, // 000B4941
1463 0x00, 0x0B, 0x64, 0x40, // 000B6440
1464 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1465 0x00, 0x0B, 0x76, 0x40, // 000B7640
1466 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
1467 0x00, 0x02, 0x81, 0x08, // 00028108
1468 0x00, 0x06, 0x0C, 0x65, // 00060C65
1469 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
1470 0x00, 0x02, 0x81, 0x70, // 00028170
1471 0x00, 0x06, 0x80, 0x22, // 00068022
1472 0x00, 0x06, 0x0C, 0x6A, // 00060C6A
1473 0x00, 0x08, 0x9B, 0x40, // 00089B40
1474 0x00, 0x02, 0x9F, 0x50, // 00029F50
1475 0x00, 0x08, 0x92, 0x40, // 00089240
1476 0x00, 0x02, 0x9F, 0x30, // 00029F30
1477 0x00, 0x0B, 0x49, 0x41, // 000B4941
1478 0x00, 0x04, 0x27, 0x08, // 00042708
1479 0x00, 0x04, 0x2F, 0x08, // 00042F08
1480 0x00, 0x04, 0x37, 0x08, // 00043708
1481 0x00, 0x04, 0x3F, 0x08, // 00043F08
1482 0x00, 0x02, 0x81, 0x08, // 00028108
1483 0x00, 0x06, 0x0C, 0x65, // 00060C65
1484 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
1485 0x00, 0x06, 0x04, 0x6A, // 0006046A
1486 0x00, 0x06, 0x14, 0x65, // 00061465
1487 0x00, 0x09, 0x00, 0xC2, // 000900C2
1488 0x00, 0x08, 0x11, 0x41, // 00081141
1489 0x00, 0x02, 0x9F, 0x18, // 00029F18
1490 0x00, 0x08, 0x10, 0x41, // 00081041
1491 0x00, 0x02, 0x9F, 0x08, // 00029F08
1492 0x00, 0x08, 0x08, 0x40, // 00080840
1493 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1494 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
1495 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
1496 0x00, 0x06, 0x8C, 0x6A, // 00068C6A
1497 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
1498 0x00, 0x06, 0x98, 0x77, // 00069877
1499 0x00, 0x07, 0x44, 0x01, // 00074401
1500 0x00, 0x07, 0x06, 0x69, // 00070669
1501 0x00, 0x07, 0x4C, 0x00, // 00074C00
1502 0x00, 0x07, 0x0C, 0x02, // 00070C02
1503 0x00, 0x06, 0x10, 0x7A, // 0006107A
1504 0x00, 0x06, 0x80, 0x22, // 00068022
1505 0x00, 0x0A, 0xC3, 0x81, // 000AC381
1506 0x00, 0x02, 0x9F, 0x58, // 00029F58
1507 0x00, 0x08, 0x92, 0x40, // 00089240
1508 0x00, 0x02, 0x9E, 0x40, // 00029E40
1509 0x00, 0x0B, 0x52, 0x7E, // 000B527E
1510 0x00, 0x02, 0x16, 0x2E, // 0002162E
1511 0x00, 0x07, 0x44, 0x05, // 00074405
1512 0x00, 0x07, 0x04, 0xAC, // 000704AC
1513 0x00, 0x06, 0x90, 0x7A, // 0006907A
1514 0x00, 0x00, 0x00, 0x00, // 00000000
1515 0x00, 0x00, 0x00, 0x00, // 00000000
1516 0x00, 0x06, 0x80, 0x0F, // 0006800F
1517 0x00, 0x02, 0x81, 0x18, // 00028118
1518 0x00, 0x08, 0x9A, 0x42, // 00089A42
1519 0x00, 0x02, 0x9E, 0x08, // 00029E08
1520 0x00, 0x0B, 0x52, 0x7F, // 000B527F
1521 0x00, 0x00, 0x00, 0x00, // 00000000
1522 0x00, 0x00, 0x00, 0x00, // 00000000
1523 0x00, 0x00, 0x00, 0x00, // 00000000
1524 0x00, 0x06, 0x90, 0x7A, // 0006907A
1525 0x00, 0x00, 0x00, 0x00, // 00000000
1526 0x00, 0x06, 0x00, 0x6D, // 0006006D
1527 0x00, 0x00, 0x00, 0x00, // 00000000
1528 0x00, 0x08, 0x80, 0x41, // 00088041
1529 0x00, 0x00, 0x00, 0x00, // 00000000
1530 0x00, 0x00, 0x00, 0x00, // 00000000
1531 0x00, 0x00, 0x00, 0x00, // 00000000
1532 0x00, 0x06, 0xC0, 0x6D, // 0006C06D
1533 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
1534 0x00, 0x07, 0x6C, 0x05, // 00076C05
1535 0x00, 0x07, 0x2C, 0xBA, // 00072CBA
1536 0x00, 0x00, 0x00, 0x00, // 00000000
1537 0x00, 0x00, 0x00, 0x00, // 00000000
1538 0x00, 0x00, 0x00, 0x00, // 00000000
1539 0x00, 0x00, 0x00, 0x00, // 00000000
1540 0x00, 0x02, 0x13, 0x3B, // 0002133B
1541 0x00, 0x02, 0x81, 0x28, // 00028128
1542 0x00, 0x00, 0x00, 0x00, // 00000000
1543 0x00, 0x00, 0x00, 0x00, // 00000000
1544 0x00, 0x00, 0x00, 0x00, // 00000000
1545 0x00, 0x00, 0x00, 0x00, // 00000000
1546 0x00, 0x00, 0x00, 0x00, // 00000000
1547 0x00, 0x00, 0xC1, 0x80, // 0000C180
1548 0x00, 0x00, 0x00, 0x00, // 00000000
1549 0x00, 0x00, 0x00, 0x00, // 00000000
1550 0x00, 0x00, 0x00, 0x00, // 00000000
1551 0x00, 0x00, 0x00, 0x00, // 00000000
1552 0x00, 0x00, 0x00, 0x00, // 00000000
1553 0x00, 0x00, 0x00, 0x00, // 00000000
1554 0x00, 0x06, 0x10, 0x68, // 00061068
1555 0x00, 0x04, 0x04, 0x08, // 00040408
1556 0x00, 0x08, 0x92, 0x40, // 00089240
1557 0x00, 0x02, 0x9E, 0x08, // 00029E08
1558 0x00, 0x02, 0x14, 0xDD, // 000214DD
1559 0x00, 0x06, 0x28, 0x6C, // 0006286C
1560 0x00, 0x04, 0x0C, 0x08, // 00040C08
1561 0x00, 0x07, 0x64, 0x3F, // 0007643F
1562 0x00, 0x07, 0x27, 0xFF, // 000727FF
1563 0x00, 0x00, 0x00, 0x00, // 00000000
1564 0x00, 0x09, 0xA4, 0x44, // 0009A444
1565 0x00, 0x04, 0x14, 0x00, // 00041400
1566 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1567 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1568 0x00, 0x0A, 0xD2, 0xC4, // 000AD2C4
1569 0x00, 0x09, 0x80, 0x48, // 00098048
1570 0x00, 0x09, 0xB1, 0x78, // 0009B178
1571 0x00, 0x08, 0x00, 0xC6, // 000800C6
1572 0x00, 0x09, 0x89, 0x48, // 00098948
1573 0x00, 0x09, 0xB2, 0x78, // 0009B278
1574 0x00, 0x08, 0x09, 0xC6, // 000809C6
1575 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1576 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1577 0x00, 0x08, 0xAD, 0x40, // 0008AD40
1578 0x00, 0x02, 0x9F, 0x30, // 00029F30
1579 0x00, 0x09, 0x90, 0x48, // 00099048
1580 0x00, 0x09, 0xB0, 0x78, // 0009B078
1581 0x00, 0x08, 0x02, 0xC6, // 000802C6
1582 0x00, 0x09, 0x91, 0x48, // 00099148
1583 0x00, 0x09, 0xB1, 0x78, // 0009B178
1584 0x00, 0x08, 0x0A, 0xC6, // 00080AC6
1585 0x00, 0x00, 0xC1, 0x07, // 0000C107
1586 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1587 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1588 0x00, 0x00, 0x00, 0x00, // 00000000
1589 0x00, 0x00, 0x00, 0x00, // 00000000
1590 0x00, 0x00, 0x00, 0x00, // 00000000
1591 0x00, 0x00, 0x00, 0x00, // 00000000
1592 0x00, 0x06, 0x18, 0x68, // 00061868
1593 0x00, 0x06, 0x00, 0x1C, // 0006001C
1594 0x00, 0x09, 0x9B, 0x7D, // 00099B7D
1595 0x00, 0x00, 0xC1, 0x07, // 0000C107
1596 0x00, 0x06, 0x08, 0x20, // 00060820
1597 0x00, 0x06, 0x10, 0x6E, // 0006106E
1598 0x00, 0x08, 0x81, 0xC0, // 000881C0
1599 0x00, 0x09, 0x03, 0xC0, // 000903C0
1600 0x00, 0x02, 0x86, 0x08, // 00028608
1601 0x00, 0x08, 0x00, 0xC2, // 000800C2
1602 0x00, 0x0B, 0x40, 0x7F, // 000B407F
1603 0x00, 0x01, 0x0A, 0x20, // 00010A20
1604 0x00, 0x0B, 0x49, 0x7F, // 000B497F
1605 0x00, 0x04, 0x14, 0x00, // 00041400
1606 0x00, 0x0B, 0x76, 0x78, // 000B7678
1607 0x00, 0x09, 0x92, 0x48, // 00099248
1608 0x00, 0x09, 0x89, 0x48, // 00098948
1609 0x00, 0x09, 0x9A, 0x68, // 00099A68
1610 0x00, 0x08, 0x09, 0xC3, // 000809C3
1611 0x00, 0x08, 0x9F, 0xC1, // 00089FC1
1612 0x00, 0x02, 0x9E, 0x08, // 00029E08
1613 0x00, 0x00, 0xC1, 0x87, // 0000C187
1614 0x00, 0x06, 0xB0, 0x68, // 0006B068
1615 0x00, 0x09, 0x92, 0x48, // 00099248
1616 0x00, 0x09, 0x89, 0x48, // 00098948
1617 0x00, 0x09, 0x9A, 0x68, // 00099A68
1618 0x00, 0x08, 0x09, 0xC3, // 000809C3
1619 0x00, 0x0B, 0x76, 0x40, // 000B7640
1620 0x00, 0x04, 0x14, 0x08, // 00041408
1621 0x00, 0x08, 0x9F, 0xC1, // 00089FC1
1622 0x00, 0x02, 0x9E, 0x08, // 00029E08
1623 0x00, 0x00, 0xC1, 0x87, // 0000C187
1624 0x00, 0x06, 0xB0, 0x68, // 0006B068
1625 0x00, 0x00, 0xC1, 0x07, // 0000C107
1626 0x00, 0x0B, 0x40, 0x40, // 000B4040
1627 0x00, 0x00, 0x00, 0x00, // 00000000
1628 0x00, 0x00, 0x00, 0x00, // 00000000
1629 0x00, 0x00, 0x00, 0x00, // 00000000
1630 0x00, 0x00, 0x00, 0x00, // 00000000
1631 0x00, 0x00, 0x00, 0x00, // 00000000
1632 0x00, 0x06, 0x30, 0x71, // 00063071
1633 0x00, 0x07, 0x44, 0x01, // 00074401
1634 0x00, 0x08, 0xB6, 0x40, // 0008B640
1635 0x00, 0x02, 0x9E, 0x08, // 00029E08
1636 0x00, 0x02, 0x15, 0x31, // 00021531
1637 0x00, 0x06, 0x18, 0x7A, // 0006187A
1638 0x00, 0x06, 0x30, 0x72, // 00063072
1639 0x00, 0x07, 0x06, 0x00, // 00070600
1640 0x00, 0x06, 0x08, 0x28, // 00060828
1641 0x00, 0x08, 0x38, 0x41, // 00083841
1642 0x00, 0x08, 0x90, 0xC1, // 000890C1
1643 0x00, 0x02, 0x9F, 0x08, // 00029F08
1644 0x00, 0x00, 0xC1, 0x87, // 0000C187
1645 0x00, 0x07, 0x54, 0x03, // 00075403
1646 0x00, 0x07, 0x17, 0xF0, // 000717F0
1647 0x00, 0x06, 0xB8, 0x22, // 0006B822
1648 0x00, 0x01, 0x04, 0x90, // 00010490
1649 0x00, 0x09, 0x92, 0x48, // 00099248
1650 0x00, 0x0A, 0xE7, 0x8A, // 000AE78A
1651 0x00, 0x0A, 0xEF, 0x8A, // 000AEF8A
1652 0x00, 0x08, 0x36, 0x41, // 00083641
1653 0x00, 0x09, 0xAD, 0x78, // 0009AD78
1654 0x00, 0x08, 0x24, 0xC5, // 000824C5
1655 0x00, 0x00, 0x00, 0x00, // 00000000
1656 0x00, 0x00, 0x00, 0x00, // 00000000
1657 0x00, 0x06, 0xB0, 0x72, // 0006B072
1658 0x00, 0x07, 0xE0, 0x0E, // 0007E00E
1659 0x00, 0x0B, 0x76, 0x40, // 000B7640
1660 0x00, 0x08, 0x9B, 0x40, // 00089B40
1661 0x00, 0x02, 0x9F, 0x08, // 00029F08
1662 0x00, 0x00, 0xC1, 0x87, // 0000C187
1663 0x00, 0x06, 0xB0, 0x71, // 0006B071
1664 0x00, 0x06, 0x08, 0x20, // 00060820
1665 0x00, 0x06, 0x00, 0x1C, // 0006001C
1666 0x00, 0x06, 0x10, 0x6E, // 0006106E
1667 0x00, 0x08, 0x81, 0xC0, // 000881C0
1668 0x00, 0x02, 0x86, 0x08, // 00028608
1669 0x00, 0x08, 0x00, 0xC2, // 000800C2
1670 0x00, 0x07, 0x5C, 0x01, // 00075C01
1671 0x00, 0x07, 0x1D, 0xE8, // 00071DE8
1672 0x00, 0x0B, 0x76, 0x7F, // 000B767F
1673 0x00, 0x08, 0x93, 0xC0, // 000893C0
1674 0x00, 0x02, 0x88, 0x08, // 00028808
1675 0x00, 0x00, 0xC1, 0x87, // 0000C187
1676 0x00, 0x07, 0x44, 0x00, // 00074400
1677 0x00, 0x07, 0x05, 0x38, // 00070538
1678 0x00, 0x00, 0xC1, 0x07, // 0000C107
1679 0x00, 0x00, 0x00, 0x00, // 00000000
1680 0x00, 0x00, 0x00, 0x00, // 00000000
1681 0x00, 0x00, 0x00, 0x00, // 00000000
1682 0x00, 0x06, 0xB0, 0x71, // 0006B071
1683 0x00, 0x06, 0xB8, 0x28, // 0006B828
1684 0x00, 0x06, 0x80, 0x4B, // 0006804B
1685 0x00, 0x06, 0x00, 0x1C, // 0006001C
1686 0x00, 0x06, 0x08, 0x20, // 00060820
1687 0x00, 0x06, 0x10, 0x6E, // 0006106E
1688 0x00, 0x08, 0x81, 0xC0, // 000881C0
1689 0x00, 0x02, 0x86, 0x08, // 00028608
1690 0x00, 0x08, 0x00, 0xC2, // 000800C2
1691 0x00, 0x06, 0x18, 0x68, // 00061868
1692 0x00, 0x00, 0xC1, 0x07, // 0000C107
1693 0x00, 0x0A, 0x10, 0x44, // 000A1044
1694 0x00, 0x0A, 0x20, 0x42, // 000A2042
1695 0x00, 0x08, 0x12, 0xC4, // 000812C4
1696 0x00, 0x09, 0x03, 0xC2, // 000903C2
1697 0x00, 0x00, 0x00, 0x00, // 00000000
1698 0x00, 0x0A, 0x00, 0x7C, // 000A007C
1699 0x00, 0x07, 0x44, 0x00, // 00074400
1700 0x00, 0x07, 0x04, 0x20, // 00070420
1701 0x00, 0x07, 0x54, 0x05, // 00075405
1702 0x00, 0x07, 0x15, 0x7C, // 0007157C
1703 0x00, 0x0B, 0x49, 0x41, // 000B4941
1704 0x00, 0x0B, 0x64, 0x7F, // 000B647F
1705 0x00, 0x0B, 0x5B, 0x78, // 000B5B78
1706 0x00, 0x09, 0xA4, 0x7C, // 0009A47C
1707 0x00, 0x06, 0x90, 0x0A, // 0006900A
1708 0x00, 0x0B, 0x76, 0x40, // 000B7640
1709 0x00, 0x09, 0x94, 0x83, // 00099483
1710 0x00, 0x08, 0x36, 0x41, // 00083641
1711 0x00, 0x09, 0x89, 0x41, // 00098941
1712 0x00, 0x09, 0x92, 0x41, // 00099241
1713 0x00, 0x02, 0x82, 0x08, // 00028208
1714 0x00, 0x08, 0x09, 0xC4, // 000809C4
1715 0x00, 0x01, 0x04, 0x13, // 00010413
1716 0x00, 0x08, 0xAF, 0xC1, // 0008AFC1
1717 0x00, 0x02, 0x9E, 0x08, // 00029E08
1718 0x00, 0x00, 0xC1, 0x82, // 0000C182
1719 0x00, 0x08, 0x36, 0x41, // 00083641
1720 0x00, 0x09, 0x89, 0x41, // 00098941
1721 0x00, 0x09, 0x92, 0x41, // 00099241
1722 0x00, 0x02, 0x82, 0x08, // 00028208
1723 0x00, 0x08, 0x09, 0xC4, // 000809C4
1724 0x00, 0x08, 0xAF, 0xC1, // 0008AFC1
1725 0x00, 0x02, 0x9E, 0x08, // 00029E08
1726 0x00, 0x00, 0xC1, 0x82, // 0000C182
1727 0x00, 0x04, 0x2C, 0x08, // 00042C08
1728 0x00, 0x08, 0x80, 0x41, // 00088041
1729 0x00, 0x02, 0x9F, 0x10, // 00029F10
1730 0x00, 0x02, 0x15, 0x62, // 00021562
1731 0x00, 0x02, 0x81, 0x28, // 00028128
1732 0x00, 0x0B, 0x40, 0x40, // 000B4040
1733 0x00, 0x02, 0x81, 0x08, // 00028108
1734 0x00, 0x0B, 0x40, 0x7F, // 000B407F
1735 0x00, 0x08, 0xAE, 0x54, // 0008AE54
1736 0x00, 0x02, 0x9F, 0x10, // 00029F10
1737 0x00, 0x00, 0xC1, 0x87, // 0000C187
1738 0x00, 0x02, 0x81, 0x28, // 00028128
1739 0x00, 0x0B, 0x76, 0x40, // 000B7640
1740 0x00, 0x00, 0xC1, 0x87, // 0000C187
1741 0x00, 0x00, 0x00, 0x00, // 00000000
1742 0x00, 0x00, 0x00, 0x00, // 00000000
1743 0x00, 0x06, 0xB0, 0x68, // 0006B068
1744 0x00, 0x04, 0x34, 0x08, // 00043408
1745 0x00, 0x00, 0x00, 0x00, // 00000000
1746 0x00, 0x00, 0x00, 0x00, // 00000000
1747 0x00, 0x06, 0x10, 0x68, // 00061068
1748 0x00, 0x00, 0x00, 0x00, // 00000000
1749 0x00, 0x08, 0x82, 0x47, // 00088247
1750 0x00, 0x02, 0x88, 0x08, // 00028808
1751 0x00, 0x02, 0x15, 0x96, // 00021596
1752 0x00, 0x0B, 0x64, 0x41, // 000B6441
1753 0x00, 0x08, 0x9A, 0x54, // 00089A54
1754 0x00, 0x09, 0xA4, 0x78, // 0009A478
1755 0x00, 0x0A, 0xEC, 0x8C, // 000AEC8C
1756 0x00, 0x0A, 0xE4, 0x7F, // 000AE47F
1757 0x00, 0x0A, 0xF4, 0x84, // 000AF484
1758 0x00, 0x0A, 0xF4, 0x8C, // 000AF48C
1759 0x00, 0x0A, 0xCC, 0x84, // 000ACC84
1760 0x00, 0x07, 0x64, 0x3F, // 0007643F
1761 0x00, 0x07, 0x27, 0xFF, // 000727FF
1762 0x00, 0x00, 0x00, 0x00, // 00000000
1763 0x00, 0x09, 0xA4, 0x44, // 0009A444
1764 0x00, 0x09, 0x85, 0xC2, // 000985C2
1765 0x00, 0x09, 0x86, 0xC3, // 000986C3
1766 0x00, 0x08, 0x00, 0xC0, // 000800C0
1767 0x00, 0x08, 0x12, 0x50, // 00081250
1768 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1769 0x00, 0x08, 0x9A, 0x54, // 00089A54
1770 0x00, 0x02, 0x87, 0x18, // 00028718
1771 0x00, 0x08, 0x92, 0x54, // 00089254
1772 0x00, 0x08, 0x2E, 0x40, // 00082E40
1773 0x00, 0x08, 0x31, 0x40, // 00083140
1774 0x00, 0x08, 0x9A, 0x54, // 00089A54
1775 0x00, 0x09, 0x8D, 0xC2, // 00098DC2
1776 0x00, 0x09, 0x8E, 0xC3, // 00098EC3
1777 0x00, 0x08, 0x09, 0xC1, // 000809C1
1778 0x00, 0x08, 0x12, 0x50, // 00081250
1779 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1780 0x00, 0x08, 0x9A, 0x54, // 00089A54
1781 0x00, 0x02, 0x87, 0x08, // 00028708
1782 0x00, 0x08, 0x92, 0x54, // 00089254
1783 0x00, 0x06, 0x28, 0x6C, // 0006286C
1784 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1785 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1786 0x00, 0x06, 0x90, 0x68, // 00069068
1787 0x00, 0x08, 0xAD, 0x40, // 0008AD40
1788 0x00, 0x02, 0x9F, 0x30, // 00029F30
1789 0x00, 0x09, 0x90, 0x48, // 00099048
1790 0x00, 0x09, 0xB0, 0x78, // 0009B078
1791 0x00, 0x08, 0x02, 0xC6, // 000802C6
1792 0x00, 0x09, 0x91, 0x48, // 00099148
1793 0x00, 0x09, 0xB1, 0x78, // 0009B178
1794 0x00, 0x08, 0x0A, 0xC6, // 00080AC6
1795 0x00, 0x00, 0xC1, 0x07, // 0000C107
1796 0x00, 0x0A, 0xC0, 0xC4, // 000AC0C4
1797 0x00, 0x0A, 0xC9, 0xC4, // 000AC9C4
1798 0x00, 0x02, 0x81, 0x18, // 00028118
1799 0x00, 0x07, 0x7C, 0x01, // 00077C01
1800 0x00, 0x07, 0x3C, 0xC0, // 00073CC0
1801 0x00, 0x07, 0x74, 0x01, // 00077401
1802 0x00, 0x07, 0x35, 0x60, // 00073560
1803 0x00, 0x06, 0x20, 0x2E, // 0006202E
1804 0x00, 0x06, 0x18, 0x1C, // 0006181C
1805 0x00, 0x06, 0x10, 0x6E, // 0006106E
1806 0x00, 0x06, 0x00, 0x75, // 00060075
1807 0x00, 0x06, 0x08, 0x7A, // 0006087A
1808 0x00, 0x06, 0xA0, 0x20, // 0006A020
1809 0x00, 0x08, 0x9C, 0xC3, // 00089CC3
1810 0x00, 0x02, 0x86, 0x08, // 00028608
1811 0x00, 0x08, 0x1B, 0xC2, // 00081BC2
1812 0x00, 0x09, 0x16, 0xC3, // 000916C3
1813 0x00, 0x02, 0x89, 0x10, // 00028910
1814 0x00, 0x07, 0x44, 0x00, // 00074400
1815 0x00, 0x07, 0x04, 0x30, // 00070430
1816 0x00, 0x08, 0x89, 0x40, // 00088940
1817 0x00, 0x02, 0x9E, 0x20, // 00029E20
1818 0x00, 0x08, 0x97, 0xC3, // 000897C3
1819 0x00, 0x02, 0x89, 0x10, // 00028910
1820 0x00, 0x07, 0x44, 0x00, // 00074400
1821 0x00, 0x07, 0x04, 0x70, // 00070470
1822 0x00, 0x00, 0xC1, 0x07, // 0000C107
1823 0x00, 0x00, 0x00, 0x00, // 00000000
1824 0x00, 0x00, 0x00, 0x00, // 00000000
1825 0x00, 0x06, 0x98, 0x7F, // 0006987F
1826 0x00, 0x06, 0x84, 0x06, // 00068406
1827 0x00, 0x06, 0x80, 0x75, // 00068075
1828 0x00, 0x00, 0x00, 0x00, // 00000000
1829 0x00, 0x02, 0x15, 0xFC, // 000215FC
1830 0x00, 0x07, 0x4C, 0x05, // 00074C05
1831 0x00, 0x07, 0x0D, 0xE2, // 00070DE2
1832 0x00, 0x00, 0x00, 0x00, // 00000000
1833 0x00, 0x00, 0x00, 0x00, // 00000000
1834 0x00, 0x00, 0x00, 0x00, // 00000000
1835 0x00, 0x06, 0x88, 0x0F, // 0006880F
1836 0x00, 0x07, 0x4C, 0x01, // 00074C01
1837 0x00, 0x07, 0x0E, 0x32, // 00070E32
1838 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
1839 0x00, 0x0B, 0x64, 0x40, // 000B6440
1840 0x00, 0x00, 0x00, 0x00, // 00000000
1841 0x00, 0x06, 0x8C, 0x22, // 00068C22
1842 0x00, 0x06, 0x5C, 0x14, // 00065C14
1843 0x00, 0x06, 0xA8, 0x74, // 0006A874
1844 0x00, 0x06, 0x5C, 0x24, // 00065C24
1845 0x00, 0x06, 0x5C, 0x26, // 00065C26
1846 0x00, 0x06, 0x5C, 0x2E, // 00065C2E
1847 0x00, 0x06, 0x5C, 0x25, // 00065C25
1848 0x00, 0x06, 0x5C, 0x27, // 00065C27
1849 0x00, 0x06, 0x5C, 0x2F, // 00065C2F
1850 0x00, 0x06, 0x5C, 0x44, // 00065C44
1851 0x00, 0x04, 0x80, 0x03, // 00048003
1852 0x00, 0x00, 0x00, 0x00, // 00000000
1853 0x00, 0x00, 0x00, 0x00, // 00000000
1854 0x00, 0x00, 0x00, 0x00, // 00000000
1855 0x00, 0x00, 0xC1, 0x06, // 0000C106
1856 0x00, 0x06, 0x84, 0x74, // 00068474
1857 0x00, 0x06, 0x84, 0x43, // 00068443
1858 0x00, 0x06, 0x5C, 0x3C, // 00065C3C
1859 0x00, 0x06, 0x5C, 0x3B, // 00065C3B
1860 0x00, 0x06, 0x5C, 0x54, // 00065C54
1861 0x00, 0x06, 0x5C, 0x53, // 00065C53
1862 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1863 0x00, 0x07, 0x4C, 0x01, // 00074C01
1864 0x00, 0x07, 0x0E, 0x25, // 00070E25
1865 0x00, 0x00, 0x00, 0x00, // 00000000
1866 0x00, 0x00, 0x00, 0x00, // 00000000
1867 0x00, 0x06, 0xA8, 0x74, // 0006A874
1868 0x00, 0x06, 0x8C, 0x22, // 00068C22
1869 0x00, 0x06, 0x5C, 0x14, // 00065C14
1870 0x00, 0x06, 0x5C, 0x24, // 00065C24
1871 0x00, 0x06, 0x5C, 0x26, // 00065C26
1872 0x00, 0x06, 0x5C, 0x2E, // 00065C2E
1873 0x00, 0x06, 0x5C, 0x25, // 00065C25
1874 0x00, 0x06, 0x5C, 0x27, // 00065C27
1875 0x00, 0x06, 0x5C, 0x2F, // 00065C2F
1876 0x00, 0x00, 0xC1, 0x07, // 0000C107
1877 0x00, 0x06, 0x5C, 0x44, // 00065C44
1878 0x00, 0x06, 0x5C, 0x43, // 00065C43
1879 0x00, 0x06, 0x5C, 0x3C, // 00065C3C
1880 0x00, 0x06, 0x5C, 0x3B, // 00065C3B
1881 0x00, 0x06, 0x5C, 0x54, // 00065C54
1882 0x00, 0x06, 0x5C, 0x53, // 00065C53
1883 0x00, 0x07, 0x5C, 0x00, // 00075C00
1884 0x00, 0x07, 0x1C, 0x02, // 00071C02
1885 0x00, 0x02, 0x81, 0x10, // 00028110
1886 0x00, 0x07, 0x5C, 0x00, // 00075C00
1887 0x00, 0x07, 0x1C, 0x01, // 00071C01
1888 0x00, 0x07, 0x54, 0x01, // 00075401
1889 0x00, 0x07, 0x16, 0x65, // 00071665
1890 0x00, 0x06, 0x00, 0x61, // 00060061
1891 0x00, 0x06, 0x20, 0x7A, // 0006207A
1892 0x00, 0x07, 0x4C, 0x05, // 00074C05
1893 0x00, 0x06, 0x9C, 0x7F, // 00069C7F
1894 0x00, 0x06, 0x90, 0x22, // 00069022
1895 0x00, 0x04, 0x1F, 0x00, // 00041F00
1896 0x00, 0x08, 0xA4, 0x40, // 0008A440
1897 0x00, 0x02, 0x9E, 0x08, // 00029E08
1898 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
1899 0x00, 0x07, 0x0C, 0x14, // 00070C14
1900 0x00, 0x00, 0x00, 0x00, // 00000000
1901 0x00, 0x00, 0x00, 0x00, // 00000000
1902 0x00, 0x07, 0x98, 0x1F, // 0007981F
1903 0x00, 0x04, 0x17, 0x00, // 00041700
1904 0x00, 0x08, 0xA4, 0x40, // 0008A440
1905 0x00, 0x02, 0x9E, 0x10, // 00029E10
1906 0x00, 0x06, 0x00, 0x6A, // 0006006A
1907 0x00, 0x08, 0x12, 0x41, // 00081241
1908 0x00, 0x06, 0x88, 0x0F, // 0006880F
1909 0x00, 0x00, 0x00, 0x00, // 00000000
1910 0x00, 0x06, 0x80, 0x61, // 00068061
1911 0x00, 0x07, 0x90, 0x07, // 00079007
1912 0x00, 0x06, 0x3C, 0x26, // 00063C26
1913 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1914 0x00, 0x08, 0x3F, 0x40, // 00083F40
1915 0x00, 0x0B, 0x40, 0x40, // 000B4040
1916 0x00, 0x06, 0x1C, 0x1C, // 00061C1C
1917 0x00, 0x00, 0x00, 0x00, // 00000000
1918 0x00, 0x06, 0xBC, 0x1C, // 0006BC1C
1919 0x00, 0x04, 0xB0, 0x0D, // 0004B00D
1920 0x00, 0x00, 0x00, 0x00, // 00000000
1921 0x00, 0x09, 0xB6, 0x7C, // 0009B67C
1922 0x00, 0x01, 0x05, 0x10, // 00010510
1923 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
1924 0x00, 0x02, 0x82, 0x08, // 00028208
1925 0x00, 0x08, 0x00, 0x42, // 00080042
1926 0x00, 0x0B, 0x49, 0x40, // 000B4940
1927 0x00, 0x09, 0xB6, 0x7F, // 0009B67F
1928 0x00, 0x02, 0x82, 0x08, // 00028208
1929 0x00, 0x08, 0x09, 0x42, // 00080942
1930 0x00, 0x07, 0x84, 0x0C, // 0007840C
1931 0x00, 0x0B, 0x40, 0x40, // 000B4040
1932 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
1933 0x00, 0x07, 0x8C, 0x0C, // 00078C0C
1934 0x00, 0x07, 0x64, 0x00, // 00076400
1935 0x00, 0x07, 0x24, 0x30, // 00072430
1936 0x00, 0x08, 0x2D, 0x41, // 00082D41
1937 0x00, 0x08, 0xA4, 0xC5, // 0008A4C5
1938 0x00, 0x02, 0x9F, 0x10, // 00029F10
1939 0x00, 0x02, 0x16, 0x35, // 00021635
1940 0x00, 0x02, 0x81, 0x08, // 00028108
1941 0x00, 0x00, 0xC1, 0x87, // 0000C187
1942 0x00, 0x00, 0x00, 0x00, // 00000000
1943 0x00, 0x00, 0x00, 0x00, // 00000000
1944 0x00, 0x00, 0x00, 0x00, // 00000000
1945 0x00, 0x00, 0x00, 0x00, // 00000000
1946 0x00, 0x00, 0x00, 0x00, // 00000000
1947 0x00, 0x06, 0x9C, 0x1C, // 00069C1C
1948 0x00, 0x06, 0x04, 0x6A, // 0006046A
1949 0x00, 0x06, 0x08, 0x77, // 00060877
1950 0x00, 0x07, 0x54, 0x01, // 00075401
1951 0x00, 0x07, 0x17, 0x12, // 00071712
1952 0x00, 0x08, 0x80, 0x40, // 00088040
1953 0x00, 0x02, 0x9E, 0x10, // 00029E10
1954 0x00, 0x02, 0x16, 0x71, // 00021671
1955 0x00, 0x02, 0x81, 0x28, // 00028128
1956 0x00, 0x02, 0x88, 0x08, // 00028808
1957 0x00, 0x00, 0xC1, 0x87, // 0000C187
1958 0x00, 0x08, 0x80, 0x41, // 00088041
1959 0x00, 0x06, 0x24, 0x66, // 00062466
1960 0x00, 0x06, 0x2C, 0x67, // 00062C67
1961 0x00, 0x06, 0x34, 0x68, // 00063468
1962 0x00, 0x06, 0x3C, 0x69, // 00063C69
1963 0x00, 0x08, 0x89, 0x40, // 00088940
1964 0x00, 0x02, 0x9F, 0x20, // 00029F20
1965 0x00, 0x0B, 0x64, 0xC4, // 000B64C4
1966 0x00, 0x0B, 0x6D, 0xC5, // 000B6DC5
1967 0x00, 0x0B, 0x76, 0xC6, // 000B76C6
1968 0x00, 0x0B, 0x7F, 0xC7, // 000B7FC7
1969 0x00, 0x08, 0x25, 0x8C, // 0008258C
1970 0x00, 0x08, 0x2D, 0x8D, // 00082D8D
1971 0x00, 0x08, 0x35, 0x8E, // 0008358E
1972 0x00, 0x00, 0xC1, 0x07, // 0000C107
1973 0x00, 0x08, 0x3D, 0x8F, // 00083D8F
1974 0x00, 0x06, 0x84, 0x6A, // 0006846A
1975 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1976 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
1977 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
1978 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
1979 0x00, 0x08, 0x80, 0x41, // 00088041
1980 0x00, 0x06, 0x90, 0x22, // 00069022
1981 0x00, 0x04, 0x27, 0x08, // 00042708
1982 0x00, 0x04, 0x2F, 0x08, // 00042F08
1983 0x00, 0x04, 0x37, 0x08, // 00043708
1984 0x00, 0x04, 0x3F, 0x08, // 00043F08
1985 0x00, 0x08, 0x89, 0x40, // 00088940
1986 0x00, 0x02, 0x9F, 0x20, // 00029F20
1987 0x00, 0x0B, 0x64, 0x40, // 000B6440
1988 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
1989 0x00, 0x0B, 0x76, 0x40, // 000B7640
1990 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
1991 0x00, 0x00, 0xC1, 0x07, // 0000C107
1992 0x00, 0x06, 0x84, 0x6A, // 0006846A
1993 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
1994 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
1995 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
1996 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
1997 0x00, 0x00, 0x00, 0x00, // 00000000
1998};
1999// addres 06800 count 1077 (4314 bytes)
2000static const unsigned char maspcm_array10[] = {
2001 0xf0, 0x00, 0x04, 0x35, 0x08, 0x00,
2002 0x00, 0x07, 0x44, 0x01, // 00074401
2003 0x00, 0x07, 0x06, 0x61, // 00070661
2004 0x00, 0x07, 0x4C, 0x00, // 00074C00
2005 0x00, 0x07, 0x0F, 0x00, // 00070F00
2006 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2007 0x00, 0x0B, 0x5B, 0x7E, // 000B5B7E
2008 0x00, 0x06, 0x80, 0x22, // 00068022
2009 0x00, 0x04, 0x07, 0x00, // 00040700
2010 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
2011 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2012 0x00, 0x0A, 0x09, 0x78, // 000A0978
2013 0x00, 0x02, 0x9F, 0x20, // 00029F20
2014 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2015 0x00, 0x08, 0xA1, 0x41, // 0008A141
2016 0x00, 0x02, 0x9F, 0x08, // 00029F08
2017 0x00, 0x0B, 0x52, 0x40, // 000B5240
2018 0x00, 0x00, 0x00, 0x00, // 00000000
2019 0x00, 0x08, 0x92, 0x40, // 00089240
2020 0x00, 0x02, 0x9E, 0x08, // 00029E08
2021 0x00, 0x0B, 0x5B, 0x7E, // 000B5B7E
2022 0x00, 0x07, 0x64, 0x01, // 00076401
2023 0x00, 0x07, 0x26, 0x69, // 00072669
2024 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
2025 0x00, 0x0B, 0x75, 0x7E, // 000B757E
2026 0x00, 0x00, 0x00, 0x00, // 00000000
2027 0x00, 0x06, 0xA0, 0x22, // 0006A022
2028 0x00, 0x0A, 0xF7, 0x86, // 000AF786
2029 0x00, 0x0A, 0xEF, 0x85, // 000AEF85
2030 0x00, 0x0A, 0x36, 0x7F, // 000A367F
2031 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
2032 0x00, 0x0B, 0x64, 0x70, // 000B6470
2033 0x00, 0x06, 0x98, 0x79, // 00069879
2034 0x00, 0x06, 0x90, 0x78, // 00069078
2035 0x00, 0x06, 0xA8, 0x77, // 0006A877
2036 0x00, 0x06, 0xB0, 0x7A, // 0006B07A
2037 0x00, 0x06, 0xBC, 0x64, // 0006BC64
2038 0x00, 0x06, 0xB8, 0x71, // 0006B871
2039 0x00, 0x06, 0xB8, 0x70, // 0006B870
2040 0x00, 0x06, 0xB8, 0x69, // 0006B869
2041 0x00, 0x06, 0xB8, 0x7B, // 0006B87B
2042 0x00, 0x06, 0xB8, 0x7C, // 0006B87C
2043 0x00, 0x06, 0x9C, 0x6B, // 00069C6B
2044 0x00, 0x06, 0xBC, 0x6E, // 0006BC6E
2045 0x00, 0x06, 0xBC, 0x72, // 0006BC72
2046 0x00, 0x06, 0xB8, 0x74, // 0006B874
2047 0x00, 0x06, 0xB8, 0x7D, // 0006B87D
2048 0x00, 0x06, 0xBC, 0x73, // 0006BC73
2049 0x00, 0x06, 0x9C, 0x7D, // 00069C7D
2050 0x00, 0x06, 0xBC, 0x7C, // 0006BC7C
2051 0x00, 0x06, 0xBC, 0x7B, // 0006BC7B
2052 0x00, 0x00, 0x00, 0x00, // 00000000
2053 0x00, 0x06, 0x3C, 0x65, // 00063C65
2054 0x00, 0x00, 0x00, 0x00, // 00000000
2055 0x00, 0x09, 0xBF, 0x41, // 0009BF41
2056 0x00, 0x00, 0x00, 0x00, // 00000000
2057 0x00, 0x00, 0x00, 0x00, // 00000000
2058 0x00, 0x00, 0x00, 0x00, // 00000000
2059 0x00, 0x06, 0xBC, 0x7A, // 0006BC7A
2060 0x00, 0x07, 0x7C, 0x01, // 00077C01
2061 0x00, 0x07, 0x3D, 0xFF, // 00073DFF
2062 0x00, 0x07, 0x54, 0x00, // 00075400
2063 0x00, 0x07, 0x14, 0x00, // 00071400
2064 0x00, 0x07, 0x5C, 0x01, // 00075C01
2065 0x00, 0x07, 0x1C, 0x90, // 00071C90
2066 0x00, 0x07, 0x74, 0x01, // 00077401
2067 0x00, 0x07, 0x34, 0xA0, // 000734A0
2068 0x00, 0x06, 0x08, 0x76, // 00060876
2069 0x00, 0x00, 0x00, 0x00, // 00000000
2070 0x00, 0x08, 0x21, 0x41, // 00082141
2071 0x00, 0x06, 0xB8, 0x16, // 0006B816
2072 0x00, 0x06, 0x90, 0x24, // 00069024
2073 0x00, 0x06, 0x90, 0x2C, // 0006902C
2074 0x00, 0x06, 0x90, 0x1C, // 0006901C
2075 0x00, 0x06, 0x90, 0x20, // 00069020
2076 0x00, 0x06, 0x98, 0x25, // 00069825
2077 0x00, 0x06, 0x98, 0x2D, // 0006982D
2078 0x00, 0x06, 0xB0, 0x1D, // 0006B01D
2079 0x00, 0x06, 0xA0, 0x10, // 0006A010
2080 0x00, 0x06, 0x98, 0x21, // 00069821
2081 0x00, 0x07, 0x7C, 0x00, // 00077C00
2082 0x00, 0x07, 0x3C, 0x24, // 00073C24
2083 0x00, 0x07, 0x54, 0x01, // 00075401
2084 0x00, 0x07, 0x16, 0x00, // 00071600
2085 0x00, 0x07, 0x6C, 0x01, // 00076C01
2086 0x00, 0x07, 0x2C, 0x98, // 00072C98
2087 0x00, 0x06, 0xBC, 0x16, // 0006BC16
2088 0x00, 0x06, 0x94, 0x2A, // 0006942A
2089 0x00, 0x00, 0x00, 0x00, // 00000000
2090 0x00, 0x06, 0xAC, 0x2B, // 0006AC2B
2091 0x00, 0x07, 0x7C, 0x01, // 00077C01
2092 0x00, 0x07, 0x3D, 0xFF, // 00073DFF
2093 0x00, 0x07, 0x54, 0x00, // 00075400
2094 0x00, 0x07, 0x14, 0x00, // 00071400
2095 0x00, 0x07, 0x5C, 0x01, // 00075C01
2096 0x00, 0x07, 0x1E, 0x00, // 00071E00
2097 0x00, 0x07, 0x6C, 0x00, // 00076C00
2098 0x00, 0x07, 0x2C, 0x90, // 00072C90
2099 0x00, 0x06, 0xBC, 0x14, // 0006BC14
2100 0x00, 0x06, 0x94, 0x1C, // 0006941C
2101 0x00, 0x06, 0x9C, 0x26, // 00069C26
2102 0x00, 0x06, 0x9C, 0x2E, // 00069C2E
2103 0x00, 0x06, 0xAC, 0x1D, // 0006AC1D
2104 0x00, 0x06, 0xAC, 0x27, // 0006AC27
2105 0x00, 0x06, 0xAC, 0x2F, // 0006AC2F
2106 0x00, 0x07, 0x4C, 0x00, // 00074C00
2107 0x00, 0x07, 0x0C, 0x04, // 00070C04
2108 0x00, 0x07, 0x54, 0x00, // 00075400
2109 0x00, 0x07, 0x14, 0x10, // 00071410
2110 0x00, 0x00, 0x00, 0x00, // 00000000
2111 0x00, 0x06, 0x88, 0x4B, // 0006884B
2112 0x00, 0x00, 0x00, 0x00, // 00000000
2113 0x00, 0x06, 0x94, 0x06, // 00069406
2114 0x00, 0x00, 0x00, 0x00, // 00000000
2115 0x00, 0x07, 0x5C, 0x01, // 00075C01
2116 0x00, 0x07, 0x1E, 0x62, // 00071E62
2117 0x00, 0x06, 0x10, 0x78, // 00061078
2118 0x00, 0x07, 0x64, 0x00, // 00076400
2119 0x00, 0x07, 0x24, 0x00, // 00072400
2120 0x00, 0x07, 0x5C, 0x00, // 00075C00
2121 0x00, 0x07, 0x1F, 0x18, // 00071F18
2122 0x00, 0x06, 0x98, 0x22, // 00069822
2123 0x00, 0x08, 0x92, 0x41, // 00089241
2124 0x00, 0x02, 0x9E, 0xF0, // 00029EF0
2125 0x00, 0x07, 0x5C, 0x00, // 00075C00
2126 0x00, 0x07, 0x1C, 0x00, // 00071C00
2127 0x00, 0x07, 0x6C, 0x00, // 00076C00
2128 0x00, 0x07, 0x2C, 0x80, // 00072C80
2129 0x00, 0x07, 0x74, 0x00, // 00077400
2130 0x00, 0x07, 0x34, 0x04, // 00073404
2131 0x00, 0x0A, 0xED, 0xC0, // 000AEDC0
2132 0x00, 0x02, 0x9F, 0x08, // 00029F08
2133 0x00, 0x08, 0x1B, 0xC6, // 00081BC6
2134 0x00, 0x07, 0x6C, 0x00, // 00076C00
2135 0x00, 0x07, 0x2C, 0x40, // 00072C40
2136 0x00, 0x07, 0x74, 0x02, // 00077402
2137 0x00, 0x07, 0x34, 0x00, // 00073400
2138 0x00, 0x0A, 0xED, 0xC0, // 000AEDC0
2139 0x00, 0x02, 0x9F, 0x08, // 00029F08
2140 0x00, 0x08, 0x1B, 0xC6, // 00081BC6
2141 0x00, 0x07, 0x6C, 0x00, // 00076C00
2142 0x00, 0x07, 0x2C, 0x04, // 00072C04
2143 0x00, 0x07, 0x74, 0x00, // 00077400
2144 0x00, 0x07, 0x34, 0x20, // 00073420
2145 0x00, 0x04, 0x17, 0x00, // 00041700
2146 0x00, 0x0A, 0xED, 0xC0, // 000AEDC0
2147 0x00, 0x02, 0x9F, 0x08, // 00029F08
2148 0x00, 0x08, 0x1B, 0xC6, // 00081BC6
2149 0x00, 0x0A, 0xD2, 0x41, // 000AD241
2150 0x00, 0x02, 0x9F, 0x10, // 00029F10
2151 0x00, 0x07, 0x5C, 0x00, // 00075C00
2152 0x00, 0x07, 0x1C, 0x00, // 00071C00
2153 0x00, 0x07, 0x64, 0x00, // 00076400
2154 0x00, 0x07, 0x27, 0x18, // 00072718
2155 0x00, 0x00, 0x00, 0x00, // 00000000
2156 0x00, 0x06, 0x98, 0x3B, // 0006983B
2157 0x00, 0x06, 0x9C, 0x75, // 00069C75
2158 0x00, 0x06, 0xA0, 0x53, // 0006A053
2159 0x00, 0x06, 0x28, 0x77, // 00062877
2160 0x00, 0x07, 0x54, 0x01, // 00075401
2161 0x00, 0x07, 0x16, 0x40, // 00071640
2162 0x00, 0x07, 0x64, 0x00, // 00076400
2163 0x00, 0x07, 0x24, 0x90, // 00072490
2164 0x00, 0x0B, 0x49, 0x7D, // 000B497D
2165 0x00, 0x07, 0x44, 0x01, // 00074401
2166 0x00, 0x07, 0x06, 0x6C, // 0007066C
2167 0x00, 0x06, 0x90, 0x1E, // 0006901E
2168 0x00, 0x06, 0xA0, 0x1F, // 0006A01F
2169 0x00, 0x06, 0x88, 0x14, // 00068814
2170 0x00, 0x06, 0x80, 0x22, // 00068022
2171 0x00, 0x04, 0x0F, 0x08, // 00040F08
2172 0x00, 0x04, 0x17, 0x08, // 00041708
2173 0x00, 0x04, 0x1F, 0x08, // 00041F08
2174 0x00, 0x04, 0x27, 0x08, // 00042708
2175 0x00, 0x08, 0xAD, 0x40, // 0008AD40
2176 0x00, 0x02, 0x9F, 0x20, // 00029F20
2177 0x00, 0x0B, 0x49, 0x40, // 000B4940
2178 0x00, 0x0B, 0x52, 0x40, // 000B5240
2179 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2180 0x00, 0x0B, 0x64, 0x40, // 000B6440
2181 0x00, 0x07, 0x88, 0x0D, // 0007880D
2182 0x00, 0x07, 0x90, 0x0D, // 0007900D
2183 0x00, 0x07, 0x98, 0x0D, // 0007980D
2184 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
2185 0x00, 0x07, 0x54, 0x01, // 00075401
2186 0x00, 0x07, 0x16, 0x50, // 00071650
2187 0x00, 0x07, 0x64, 0x00, // 00076400
2188 0x00, 0x07, 0x26, 0x90, // 00072690
2189 0x00, 0x0B, 0x49, 0x7D, // 000B497D
2190 0x00, 0x07, 0x44, 0x01, // 00074401
2191 0x00, 0x07, 0x06, 0x70, // 00070670
2192 0x00, 0x06, 0x94, 0x20, // 00069420
2193 0x00, 0x06, 0xA4, 0x21, // 0006A421
2194 0x00, 0x06, 0x8C, 0x15, // 00068C15
2195 0x00, 0x06, 0x80, 0x22, // 00068022
2196 0x00, 0x0B, 0x52, 0x75, // 000B5275
2197 0x00, 0x04, 0x0F, 0x08, // 00040F08
2198 0x00, 0x04, 0x0F, 0x08, // 00040F08
2199 0x00, 0x04, 0x0F, 0x08, // 00040F08
2200 0x00, 0x04, 0x0F, 0x08, // 00040F08
2201 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2202 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2203 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2204 0x00, 0x07, 0x8C, 0x0E, // 00078C0E
2205 0x00, 0x06, 0x94, 0x15, // 00069415
2206 0x00, 0x02, 0x1C, 0x0E, // 00021C0E
2207 0x00, 0x07, 0x4C, 0x06, // 00074C06
2208 0x00, 0x07, 0x0C, 0xD3, // 00070CD3
2209 0x00, 0x00, 0x00, 0x00, // 00000000
2210 0x00, 0x00, 0x00, 0x00, // 00000000
2211 0x00, 0x00, 0x00, 0x00, // 00000000
2212 0x00, 0x06, 0x88, 0x0F, // 0006880F
2213 0x00, 0x07, 0x4C, 0x01, // 00074C01
2214 0x00, 0x07, 0x0E, 0x32, // 00070E32
2215 0x00, 0x07, 0x64, 0x01, // 00076401
2216 0x00, 0x07, 0x26, 0x70, // 00072670
2217 0x00, 0x07, 0x6C, 0x00, // 00076C00
2218 0x00, 0x07, 0x2E, 0x90, // 00072E90
2219 0x00, 0x06, 0x8C, 0x22, // 00068C22
2220 0x00, 0x04, 0x80, 0x4F, // 0004804F
2221 0x00, 0x06, 0x08, 0x78, // 00060878
2222 0x00, 0x06, 0xA4, 0x24, // 0006A424
2223 0x00, 0x06, 0xAC, 0x25, // 0006AC25
2224 0x00, 0x06, 0x5C, 0x3C, // 00065C3C
2225 0x00, 0x06, 0x5C, 0x3B, // 00065C3B
2226 0x00, 0x08, 0x89, 0x40, // 00088940
2227 0x00, 0x02, 0x9F, 0x10, // 00029F10
2228 0x00, 0x02, 0x19, 0x1D, // 0002191D
2229 0x00, 0x02, 0x81, 0x28, // 00028128
2230 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
2231 0x00, 0x07, 0x6C, 0x06, // 00076C06
2232 0x00, 0x07, 0x2C, 0xEB, // 00072CEB
2233 0x00, 0x00, 0x00, 0x00, // 00000000
2234 0x00, 0x00, 0x00, 0x00, // 00000000
2235 0x00, 0x00, 0x00, 0x00, // 00000000
2236 0x00, 0x00, 0x00, 0x00, // 00000000
2237 0x00, 0x07, 0x44, 0x01, // 00074401
2238 0x00, 0x07, 0x06, 0x61, // 00070661
2239 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
2240 0x00, 0x07, 0x0C, 0x00, // 00070C00
2241 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2242 0x00, 0x06, 0x80, 0x22, // 00068022
2243 0x00, 0x0A, 0xC7, 0x82, // 000AC782
2244 0x00, 0x02, 0x9E, 0x20, // 00029E20
2245 0x00, 0x0A, 0xC7, 0x81, // 000AC781
2246 0x00, 0x02, 0x9E, 0x10, // 00029E10
2247 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2248 0x00, 0x02, 0x81, 0x28, // 00028128
2249 0x00, 0x00, 0x00, 0x00, // 00000000
2250 0x00, 0x07, 0x54, 0x04, // 00075404
2251 0x00, 0x07, 0x14, 0x00, // 00071400
2252 0x00, 0x06, 0x30, 0x2C, // 0006302C
2253 0x00, 0x08, 0x92, 0x41, // 00089241
2254 0x00, 0x02, 0x88, 0x10, // 00028810
2255 0x00, 0x02, 0x19, 0x0C, // 0002190C
2256 0x00, 0x02, 0x81, 0x28, // 00028128
2257 0x00, 0x0A, 0xF6, 0x41, // 000AF641
2258 0x00, 0x02, 0x9E, 0x10, // 00029E10
2259 0x00, 0x02, 0x18, 0xFA, // 000218FA
2260 0x00, 0x02, 0x81, 0x28, // 00028128
2261 0x00, 0x06, 0x30, 0x2C, // 0006302C
2262 0x00, 0x08, 0x92, 0x41, // 00089241
2263 0x00, 0x02, 0x88, 0x10, // 00028810
2264 0x00, 0x02, 0x19, 0x0C, // 0002190C
2265 0x00, 0x02, 0x81, 0x28, // 00028128
2266 0x00, 0x0A, 0xF6, 0x41, // 000AF641
2267 0x00, 0x02, 0x9F, 0x10, // 00029F10
2268 0x00, 0x02, 0x19, 0x03, // 00021903
2269 0x00, 0x02, 0x81, 0x28, // 00028128
2270 0x00, 0x06, 0x38, 0x52, // 00063852
2271 0x00, 0x06, 0x30, 0x2C, // 0006302C
2272 0x00, 0x09, 0xBF, 0x7A, // 0009BF7A
2273 0x00, 0x00, 0x00, 0x00, // 00000000
2274 0x00, 0x0A, 0xFF, 0x41, // 000AFF41
2275 0x00, 0x02, 0x9E, 0x08, // 00029E08
2276 0x00, 0x0B, 0x36, 0x41, // 000B3641
2277 0x00, 0x00, 0x00, 0x00, // 00000000
2278 0x00, 0x00, 0x00, 0x00, // 00000000
2279 0x00, 0x00, 0x00, 0x00, // 00000000
2280 0x00, 0x06, 0xB0, 0x2C, // 0006B02C
2281 0x00, 0x00, 0x00, 0x00, // 00000000
2282 0x00, 0x08, 0x92, 0x40, // 00089240
2283 0x00, 0x02, 0x88, 0x10, // 00028810
2284 0x00, 0x02, 0x18, 0xE4, // 000218E4
2285 0x00, 0x02, 0x81, 0x28, // 00028128
2286 0x00, 0x00, 0x00, 0x00, // 00000000
2287 0x00, 0x0B, 0x40, 0x7D, // 000B407D
2288 0x00, 0x00, 0x00, 0x00, // 00000000
2289 0x00, 0x00, 0x00, 0x00, // 00000000
2290 0x00, 0x00, 0x00, 0x00, // 00000000
2291 0x00, 0x06, 0x84, 0x15, // 00068415
2292 0x00, 0x04, 0x35, 0x08, // 00043508
2293 0x00, 0x04, 0xB8, 0x16, // 0004B816
2294 0x00, 0x00, 0x00, 0x00, // 00000000
2295 0x00, 0x0C, 0x06, 0x27, // 000C0627
2296 0x00, 0x04, 0x35, 0x18, // 00043518
2297 0x00, 0x04, 0xB8, 0x1E, // 0004B81E
2298 0x00, 0x00, 0x00, 0x00, // 00000000
2299 0x00, 0x0E, 0x06, 0x27, // 000E0627
2300 0x00, 0x04, 0x35, 0x08, // 00043508
2301 0x00, 0x04, 0xB8, 0x16, // 0004B816
2302 0x00, 0x00, 0x00, 0x00, // 00000000
2303 0x00, 0x0C, 0x0E, 0x27, // 000C0E27
2304 0x00, 0x04, 0x35, 0x08, // 00043508
2305 0x00, 0x04, 0xB8, 0x0E, // 0004B80E
2306 0x00, 0x00, 0x00, 0x00, // 00000000
2307 0x00, 0x0E, 0x0E, 0x27, // 000E0E27
2308 0x00, 0x04, 0x35, 0x08, // 00043508
2309 0x00, 0x04, 0xB8, 0x16, // 0004B816
2310 0x00, 0x00, 0x00, 0x00, // 00000000
2311 0x00, 0x0C, 0x16, 0x27, // 000C1627
2312 0x00, 0x04, 0x35, 0x18, // 00043518
2313 0x00, 0x04, 0xB8, 0x1E, // 0004B81E
2314 0x00, 0x00, 0x00, 0x00, // 00000000
2315 0x00, 0x0E, 0x16, 0x27, // 000E1627
2316 0x00, 0x04, 0x35, 0x08, // 00043508
2317 0x00, 0x04, 0xB8, 0x16, // 0004B816
2318 0x00, 0x00, 0x00, 0x00, // 00000000
2319 0x00, 0x0C, 0x1E, 0x27, // 000C1E27
2320 0x00, 0x04, 0x35, 0x08, // 00043508
2321 0x00, 0x04, 0xB8, 0x0E, // 0004B80E
2322 0x00, 0x00, 0x00, 0x00, // 00000000
2323 0x00, 0x0E, 0x1E, 0x27, // 000E1E27
2324 0x00, 0x07, 0x64, 0x01, // 00076401
2325 0x00, 0x00, 0x00, 0x00, // 00000000
2326 0x00, 0x07, 0x27, 0x12, // 00072712
2327 0x00, 0x07, 0x80, 0x0D, // 0007800D
2328 0x00, 0x07, 0x88, 0x0D, // 0007880D
2329 0x00, 0x07, 0x90, 0x0D, // 0007900D
2330 0x00, 0x07, 0x98, 0x0D, // 0007980D
2331 0x00, 0x06, 0xA0, 0x22, // 0006A022
2332 0x00, 0x07, 0x80, 0x0F, // 0007800F
2333 0x00, 0x07, 0x88, 0x0F, // 0007880F
2334 0x00, 0x07, 0x90, 0x0F, // 0007900F
2335 0x00, 0x07, 0x98, 0x07, // 00079807
2336 0x00, 0x06, 0x2C, 0x79, // 00062C79
2337 0x00, 0x00, 0x00, 0x00, // 00000000
2338 0x00, 0x0C, 0x09, 0x0D, // 000C090D
2339 0x00, 0x0C, 0x11, 0x0D, // 000C110D
2340 0x00, 0x0C, 0x19, 0x0D, // 000C190D
2341 0x00, 0x0C, 0x21, 0x0D, // 000C210D
2342 0x00, 0x00, 0x00, 0x00, // 00000000
2343 0x00, 0x00, 0x00, 0x00, // 00000000
2344 0x00, 0x00, 0x00, 0x00, // 00000000
2345 0x00, 0x06, 0x8C, 0x66, // 00068C66
2346 0x00, 0x06, 0x94, 0x67, // 00069467
2347 0x00, 0x06, 0x9C, 0x68, // 00069C68
2348 0x00, 0x06, 0xA4, 0x69, // 0006A469
2349 0x00, 0x06, 0x00, 0x7A, // 0006007A
2350 0x00, 0x00, 0x00, 0x00, // 00000000
2351 0x00, 0x08, 0x80, 0x40, // 00088040
2352 0x00, 0x02, 0x9F, 0x10, // 00029F10
2353 0x00, 0x02, 0x19, 0xF8, // 000219F8
2354 0x00, 0x02, 0x81, 0x28, // 00028128
2355 0x00, 0x06, 0x00, 0x24, // 00060024
2356 0x00, 0x06, 0x08, 0x78, // 00060878
2357 0x00, 0x06, 0x18, 0x76, // 00061876
2358 0x00, 0x07, 0x54, 0x01, // 00075401
2359 0x00, 0x07, 0x16, 0x00, // 00071600
2360 0x00, 0x08, 0x89, 0x41, // 00088941
2361 0x00, 0x02, 0x9F, 0x08, // 00029F08
2362 0x00, 0x06, 0x00, 0x2C, // 0006002C
2363 0x00, 0x06, 0x08, 0x1C, // 0006081C
2364 0x00, 0x08, 0x80, 0xC1, // 000880C1
2365 0x00, 0x02, 0x86, 0x08, // 00028608
2366 0x00, 0x08, 0x00, 0xC2, // 000800C2
2367 0x00, 0x08, 0x9B, 0x41, // 00089B41
2368 0x00, 0x02, 0x9E, 0x08, // 00029E08
2369 0x00, 0x09, 0x80, 0x7F, // 0009807F
2370 0x00, 0x06, 0x14, 0x7B, // 0006147B
2371 0x00, 0x06, 0x1C, 0x7A, // 00061C7A
2372 0x00, 0x08, 0x92, 0x40, // 00089240
2373 0x00, 0x02, 0x9F, 0x28, // 00029F28
2374 0x00, 0x08, 0x98, 0xC3, // 000898C3
2375 0x00, 0x02, 0x87, 0x10, // 00028710
2376 0x00, 0x0B, 0x52, 0x40, // 000B5240
2377 0x00, 0x02, 0x81, 0x08, // 00028108
2378 0x00, 0x0B, 0x40, 0x40, // 000B4040
2379 0x00, 0x00, 0x00, 0x00, // 00000000
2380 0x00, 0x06, 0x94, 0x7B, // 0006947B
2381 0x00, 0x07, 0x54, 0x00, // 00075400
2382 0x00, 0x07, 0x14, 0x12, // 00071412
2383 0x00, 0x07, 0x5C, 0x01, // 00075C01
2384 0x00, 0x07, 0x1E, 0x00, // 00071E00
2385 0x00, 0x08, 0xA0, 0xC2, // 0008A0C2
2386 0x00, 0x02, 0x88, 0x10, // 00028810
2387 0x00, 0x02, 0x19, 0xF8, // 000219F8
2388 0x00, 0x02, 0x81, 0x28, // 00028128
2389 0x00, 0x06, 0x24, 0x2A, // 0006242A
2390 0x00, 0x08, 0xA3, 0xC4, // 0008A3C4
2391 0x00, 0x02, 0x9F, 0x10, // 00029F10
2392 0x00, 0x02, 0x19, 0xF8, // 000219F8
2393 0x00, 0x02, 0x81, 0x28, // 00028128
2394 0x00, 0x07, 0x5C, 0x01, // 00075C01
2395 0x00, 0x07, 0x1E, 0x01, // 00071E01
2396 0x00, 0x07, 0x44, 0x00, // 00074400
2397 0x00, 0x07, 0x04, 0x09, // 00070409
2398 0x00, 0x06, 0x08, 0x69, // 00060869
2399 0x00, 0x06, 0x9C, 0x22, // 00069C22
2400 0x00, 0x06, 0x10, 0x6A, // 0006106A
2401 0x00, 0x08, 0x89, 0x40, // 00088940
2402 0x00, 0x02, 0x9F, 0x10, // 00029F10
2403 0x00, 0x02, 0x19, 0xA4, // 000219A4
2404 0x00, 0x02, 0x81, 0x28, // 00028128
2405 0x00, 0x08, 0x92, 0x41, // 00089241
2406 0x00, 0x02, 0x9F, 0x10, // 00029F10
2407 0x00, 0x02, 0x19, 0xA4, // 000219A4
2408 0x00, 0x02, 0x81, 0x28, // 00028128
2409 0x00, 0x08, 0x80, 0x41, // 00088041
2410 0x00, 0x07, 0x55, 0x5C, // 0007555C
2411 0x00, 0x07, 0x14, 0x00, // 00071400
2412 0x00, 0x07, 0x5D, 0x04, // 00075D04
2413 0x00, 0x07, 0x1C, 0x00, // 00071C00
2414 0x00, 0x07, 0x65, 0x58, // 00076558
2415 0x00, 0x07, 0x24, 0x00, // 00072400
2416 0x00, 0x07, 0x6D, 0x14, // 00076D14
2417 0x00, 0x07, 0x2C, 0x00, // 00072C00
2418 0x00, 0x07, 0x94, 0x0F, // 0007940F
2419 0x00, 0x07, 0x9C, 0x0F, // 00079C0F
2420 0x00, 0x07, 0xA4, 0x0F, // 0007A40F
2421 0x00, 0x07, 0xAC, 0x0F, // 0007AC0F
2422 0x00, 0x06, 0x38, 0x3A, // 0006383A
2423 0x00, 0x0B, 0x76, 0x7D, // 000B767D
2424 0x00, 0x06, 0x10, 0x6C, // 0006106C
2425 0x00, 0x0A, 0xFF, 0x5F, // 000AFF5F
2426 0x00, 0x06, 0x84, 0x05, // 00068405
2427 0x00, 0x02, 0x9F, 0x18, // 00029F18
2428 0x00, 0x09, 0x3F, 0x54, // 00093F54
2429 0x00, 0x02, 0x86, 0x08, // 00028608
2430 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2431 0x00, 0x00, 0x00, 0x00, // 00000000
2432 0x00, 0x06, 0xB4, 0x15, // 0006B415
2433 0x00, 0x07, 0x77, 0xFC, // 000777FC
2434 0x00, 0x07, 0x34, 0x00, // 00073400
2435 0x00, 0x06, 0x00, 0x78, // 00060078
2436 0x00, 0x00, 0x00, 0x00, // 00000000
2437 0x00, 0x08, 0x80, 0x41, // 00088041
2438 0x00, 0x02, 0x9F, 0x08, // 00029F08
2439 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2440 0x00, 0x01, 0x4E, 0x80, // 00014E80
2441 0x00, 0x00, 0x00, 0x00, // 00000000
2442 0x00, 0x09, 0x80, 0x87, // 00098087
2443 0x00, 0x09, 0x88, 0x87, // 00098887
2444 0x00, 0x0C, 0x20, 0x12, // 000C2012
2445 0x00, 0x0E, 0x21, 0x12, // 000E2112
2446 0x00, 0x00, 0x00, 0x00, // 00000000
2447 0x00, 0x00, 0x00, 0x00, // 00000000
2448 0x00, 0x00, 0x00, 0x00, // 00000000
2449 0x00, 0x0C, 0x28, 0x12, // 000C2812
2450 0x00, 0x0E, 0x29, 0x12, // 000E2912
2451 0x00, 0x00, 0x00, 0x00, // 00000000
2452 0x00, 0x00, 0x00, 0x00, // 00000000
2453 0x00, 0x00, 0x00, 0x00, // 00000000
2454 0x00, 0x09, 0x84, 0x48, // 00098448
2455 0x00, 0x09, 0x8D, 0x48, // 00098D48
2456 0x00, 0x08, 0x92, 0x40, // 00089240
2457 0x00, 0x02, 0x9F, 0x20, // 00029F20
2458 0x00, 0x09, 0xA4, 0x48, // 0009A448
2459 0x00, 0x08, 0x04, 0x40, // 00080440
2460 0x00, 0x09, 0xAD, 0x48, // 0009AD48
2461 0x00, 0x08, 0x0D, 0x40, // 00080D40
2462 0x00, 0x0A, 0xE4, 0xC6, // 000AE4C6
2463 0x00, 0x0A, 0xC0, 0xC6, // 000AC0C6
2464 0x00, 0x0A, 0xED, 0xC6, // 000AEDC6
2465 0x00, 0x0A, 0xC9, 0xC6, // 000AC9C6
2466 0x00, 0x00, 0x00, 0x00, // 00000000
2467 0x00, 0x07, 0xE4, 0x0F, // 0007E40F
2468 0x00, 0x07, 0xC4, 0x0F, // 0007C40F
2469 0x00, 0x07, 0xEC, 0x0F, // 0007EC0F
2470 0x00, 0x07, 0xCC, 0x0F, // 0007CC0F
2471 0x00, 0x06, 0x00, 0x69, // 00060069
2472 0x00, 0x07, 0x4C, 0x01, // 00074C01
2473 0x00, 0x07, 0x0E, 0x65, // 00070E65
2474 0x00, 0x08, 0x00, 0x41, // 00080041
2475 0x00, 0x06, 0x1C, 0x64, // 00061C64
2476 0x00, 0x07, 0x54, 0x00, // 00075400
2477 0x00, 0x07, 0x14, 0x39, // 00071439
2478 0x00, 0x06, 0x88, 0x22, // 00068822
2479 0x00, 0x04, 0x0F, 0x00, // 00040F00
2480 0x00, 0x08, 0x90, 0xC2, // 000890C2
2481 0x00, 0x02, 0x9E, 0x28, // 00029E28
2482 0x00, 0x08, 0x9B, 0x40, // 00089B40
2483 0x00, 0x02, 0x9F, 0x08, // 00029F08
2484 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2485 0x00, 0x0B, 0x40, 0x40, // 000B4040
2486 0x00, 0x08, 0x09, 0x41, // 00080941
2487 0x00, 0x00, 0x00, 0x00, // 00000000
2488 0x00, 0x00, 0x00, 0x00, // 00000000
2489 0x00, 0x06, 0x80, 0x69, // 00068069
2490 0x00, 0x07, 0x88, 0x07, // 00078807
2491 0x00, 0x07, 0x4C, 0x01, // 00074C01
2492 0x00, 0x0B, 0x76, 0x75, // 000B7675
2493 0x00, 0x07, 0x0E, 0x01, // 00070E01
2494 0x00, 0x07, 0x44, 0x00, // 00074400
2495 0x00, 0x07, 0x04, 0x04, // 00070404
2496 0x00, 0x00, 0x00, 0x00, // 00000000
2497 0x00, 0x00, 0x00, 0x00, // 00000000
2498 0x00, 0x0B, 0x52, 0x40, // 000B5240
2499 0x00, 0x06, 0x80, 0x4B, // 0006804B
2500 0x00, 0x07, 0x44, 0x00, // 00074400
2501 0x00, 0x07, 0x05, 0x3D, // 0007053D
2502 0x00, 0x06, 0xB4, 0x15, // 0006B415
2503 0x00, 0x06, 0x8C, 0x2A, // 00068C2A
2504 0x00, 0x06, 0x94, 0x72, // 00069472
2505 0x00, 0x06, 0x80, 0x4B, // 0006804B
2506 0x00, 0x06, 0x00, 0x24, // 00060024
2507 0x00, 0x06, 0x08, 0x78, // 00060878
2508 0x00, 0x06, 0x18, 0x76, // 00061876
2509 0x00, 0x07, 0x54, 0x01, // 00075401
2510 0x00, 0x07, 0x16, 0x00, // 00071600
2511 0x00, 0x08, 0x89, 0x41, // 00088941
2512 0x00, 0x02, 0x9F, 0x08, // 00029F08
2513 0x00, 0x06, 0x00, 0x2C, // 0006002C
2514 0x00, 0x06, 0x08, 0x20, // 00060820
2515 0x00, 0x08, 0x80, 0xC1, // 000880C1
2516 0x00, 0x02, 0x86, 0x08, // 00028608
2517 0x00, 0x08, 0x00, 0xC2, // 000800C2
2518 0x00, 0x06, 0x0C, 0x26, // 00060C26
2519 0x00, 0x06, 0x14, 0x1C, // 0006141C
2520 0x00, 0x07, 0x5C, 0x01, // 00075C01
2521 0x00, 0x07, 0x1E, 0x00, // 00071E00
2522 0x00, 0x08, 0x89, 0xC2, // 000889C2
2523 0x00, 0x02, 0x86, 0x08, // 00028608
2524 0x00, 0x08, 0x09, 0xC3, // 000809C3
2525 0x00, 0x06, 0x24, 0x24, // 00062424
2526 0x00, 0x09, 0x22, 0xC4, // 000922C4
2527 0x00, 0x02, 0x86, 0x08, // 00028608
2528 0x00, 0x08, 0x24, 0xC3, // 000824C3
2529 0x00, 0x09, 0x29, 0xC4, // 000929C4
2530 0x00, 0x02, 0x86, 0x08, // 00028608
2531 0x00, 0x08, 0x0C, 0x40, // 00080C40
2532 0x00, 0x06, 0x24, 0x2E, // 0006242E
2533 0x00, 0x09, 0x22, 0xC4, // 000922C4
2534 0x00, 0x02, 0x86, 0x08, // 00028608
2535 0x00, 0x08, 0x24, 0xC3, // 000824C3
2536 0x00, 0x09, 0x29, 0xC4, // 000929C4
2537 0x00, 0x02, 0x86, 0x08, // 00028608
2538 0x00, 0x08, 0x0C, 0x40, // 00080C40
2539 0x00, 0x07, 0x54, 0x00, // 00075400
2540 0x00, 0x07, 0x14, 0x20, // 00071420
2541 0x00, 0x00, 0x00, 0x00, // 00000000
2542 0x00, 0x08, 0x80, 0xC2, // 000880C2
2543 0x00, 0x02, 0x86, 0x10, // 00028610
2544 0x00, 0x02, 0x1A, 0x86, // 00021A86
2545 0x00, 0x02, 0x81, 0x28, // 00028128
2546 0x00, 0x08, 0x89, 0xC2, // 000889C2
2547 0x00, 0x02, 0x86, 0x10, // 00028610
2548 0x00, 0x02, 0x1A, 0x86, // 00021A86
2549 0x00, 0x02, 0x81, 0x28, // 00028128
2550 0x00, 0x06, 0x28, 0x3A, // 0006283A
2551 0x00, 0x00, 0x00, 0x00, // 00000000
2552 0x00, 0x0A, 0xED, 0x5F, // 000AED5F
2553 0x00, 0x02, 0x9F, 0x18, // 00029F18
2554 0x00, 0x09, 0x2D, 0x54, // 00092D54
2555 0x00, 0x02, 0x86, 0x08, // 00028608
2556 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2557 0x00, 0x04, 0xB8, 0x0D, // 0004B80D
2558 0x00, 0x00, 0x00, 0x00, // 00000000
2559 0x00, 0x09, 0xBF, 0x7C, // 0009BF7C
2560 0x00, 0x06, 0x00, 0x78, // 00060078
2561 0x00, 0x00, 0x00, 0x00, // 00000000
2562 0x00, 0x08, 0x80, 0x41, // 00088041
2563 0x00, 0x02, 0x9F, 0x08, // 00029F08
2564 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2565 0x00, 0x01, 0x0D, 0x10, // 00010D10
2566 0x00, 0x06, 0x20, 0x76, // 00062076
2567 0x00, 0x09, 0x86, 0x8D, // 0009868D
2568 0x00, 0x09, 0x8E, 0x8D, // 00098E8D
2569 0x00, 0x08, 0xA4, 0x40, // 0008A440
2570 0x00, 0x02, 0x9F, 0x08, // 00029F08
2571 0x00, 0x08, 0x08, 0x40, // 00080840
2572 0x00, 0x0C, 0x31, 0x08, // 000C3108
2573 0x00, 0x0E, 0x31, 0x09, // 000E3109
2574 0x00, 0x00, 0x00, 0x00, // 00000000
2575 0x00, 0x00, 0x00, 0x00, // 00000000
2576 0x00, 0x0C, 0x01, 0x08, // 000C0108
2577 0x00, 0x0E, 0x01, 0x09, // 000E0109
2578 0x00, 0x00, 0x00, 0x00, // 00000000
2579 0x00, 0x00, 0x00, 0x00, // 00000000
2580 0x00, 0x00, 0x00, 0x00, // 00000000
2581 0x00, 0x0A, 0xF6, 0x7C, // 000AF67C
2582 0x00, 0x09, 0x9F, 0x7F, // 00099F7F
2583 0x00, 0x02, 0x82, 0x08, // 00028208
2584 0x00, 0x08, 0x36, 0x42, // 00083642
2585 0x00, 0x0A, 0xC0, 0x7C, // 000AC07C
2586 0x00, 0x09, 0xBF, 0x7F, // 0009BF7F
2587 0x00, 0x02, 0x82, 0x08, // 00028208
2588 0x00, 0x08, 0x00, 0x42, // 00080042
2589 0x00, 0x00, 0x00, 0x00, // 00000000
2590 0x00, 0x07, 0xF4, 0x0C, // 0007F40C
2591 0x00, 0x00, 0x00, 0x00, // 00000000
2592 0x00, 0x07, 0xC4, 0x0C, // 0007C40C
2593 0x00, 0x02, 0x16, 0x52, // 00021652
2594 0x00, 0x07, 0x4C, 0x06, // 00074C06
2595 0x00, 0x07, 0x0E, 0x56, // 00070E56
2596 0x00, 0x00, 0x00, 0x00, // 00000000
2597 0x00, 0x00, 0x00, 0x00, // 00000000
2598 0x00, 0x00, 0x00, 0x00, // 00000000
2599 0x00, 0x06, 0x88, 0x0F, // 0006880F
2600 0x00, 0x06, 0x00, 0x7B, // 0006007B
2601 0x00, 0x06, 0x10, 0x74, // 00061074
2602 0x00, 0x08, 0x00, 0x41, // 00080041
2603 0x00, 0x07, 0x5C, 0x00, // 00075C00
2604 0x00, 0x07, 0x1C, 0x30, // 00071C30
2605 0x00, 0x08, 0x92, 0x40, // 00089240
2606 0x00, 0x02, 0x9E, 0x18, // 00029E18
2607 0x00, 0x08, 0x88, 0xC3, // 000888C3
2608 0x00, 0x02, 0x9E, 0x08, // 00029E08
2609 0x00, 0x02, 0x15, 0xDB, // 000215DB
2610 0x00, 0x07, 0x4C, 0x06, // 00074C06
2611 0x00, 0x07, 0x0E, 0x66, // 00070E66
2612 0x00, 0x06, 0x80, 0x7B, // 0006807B
2613 0x00, 0x00, 0x00, 0x00, // 00000000
2614 0x00, 0x00, 0x00, 0x00, // 00000000
2615 0x00, 0x06, 0x88, 0x0E, // 0006880E
2616 0x00, 0x06, 0x00, 0x78, // 00060078
2617 0x00, 0x06, 0x08, 0x24, // 00060824
2618 0x00, 0x08, 0x80, 0x41, // 00088041
2619 0x00, 0x02, 0x9F, 0x08, // 00029F08
2620 0x00, 0x06, 0x08, 0x2C, // 0006082C
2621 0x00, 0x06, 0x34, 0x26, // 00063426
2622 0x00, 0x00, 0x00, 0x00, // 00000000
2623 0x00, 0x08, 0x86, 0xC1, // 000886C1
2624 0x00, 0x07, 0x5C, 0x00, // 00075C00
2625 0x00, 0x07, 0x1F, 0x00, // 00071F00
2626 0x00, 0x07, 0x54, 0x01, // 00075401
2627 0x00, 0x07, 0x16, 0x00, // 00071600
2628 0x00, 0x08, 0xA8, 0xC3, // 0008A8C3
2629 0x00, 0x02, 0x87, 0x08, // 00028708
2630 0x00, 0x08, 0x80, 0xC2, // 000880C2
2631 0x00, 0x06, 0x20, 0x74, // 00062074
2632 0x00, 0x08, 0x28, 0xC3, // 000828C3
2633 0x00, 0x02, 0x86, 0x08, // 00028608
2634 0x00, 0x08, 0x00, 0xC2, // 000800C2
2635 0x00, 0x06, 0x18, 0x79, // 00061879
2636 0x00, 0x06, 0x14, 0x6E, // 0006146E
2637 0x00, 0x08, 0xA4, 0x41, // 0008A441
2638 0x00, 0x02, 0x9E, 0x20, // 00029E20
2639 0x00, 0x08, 0xBB, 0x42, // 0008BB42
2640 0x00, 0x02, 0x9E, 0x10, // 00029E10
2641 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
2642 0x00, 0x08, 0x10, 0x40, // 00081040
2643 0x00, 0x00, 0x00, 0x00, // 00000000
2644 0x00, 0x00, 0x00, 0x00, // 00000000
2645 0x00, 0x06, 0x98, 0x79, // 00069879
2646 0x00, 0x06, 0x94, 0x6E, // 0006946E
2647 0x00, 0x00, 0x00, 0x00, // 00000000
2648 0x00, 0x06, 0x00, 0x78, // 00060078
2649 0x00, 0x06, 0x08, 0x24, // 00060824
2650 0x00, 0x08, 0x80, 0x41, // 00088041
2651 0x00, 0x02, 0x9F, 0x08, // 00029F08
2652 0x00, 0x06, 0x08, 0x2C, // 0006082C
2653 0x00, 0x06, 0x00, 0x1C, // 0006001C
2654 0x00, 0x07, 0x54, 0x01, // 00075401
2655 0x00, 0x07, 0x16, 0x00, // 00071600
2656 0x00, 0x06, 0x18, 0x71, // 00061871
2657 0x00, 0x00, 0x00, 0x00, // 00000000
2658 0x00, 0x06, 0x24, 0x6B, // 0006246B
2659 0x00, 0x08, 0xA9, 0xC0, // 0008A9C0
2660 0x00, 0x02, 0x86, 0x08, // 00028608
2661 0x00, 0x08, 0x2D, 0xC2, // 00082DC2
2662 0x00, 0x08, 0xB4, 0x41, // 0008B441
2663 0x00, 0x02, 0x9F, 0x10, // 00029F10
2664 0x00, 0x02, 0x1A, 0xA5, // 00021AA5
2665 0x00, 0x02, 0x81, 0x28, // 00028128
2666 0x00, 0x08, 0xB5, 0x42, // 0008B542
2667 0x00, 0x02, 0x86, 0x10, // 00028610
2668 0x00, 0x02, 0x1A, 0xA5, // 00021AA5
2669 0x00, 0x02, 0x81, 0x28, // 00028128
2670 0x00, 0x06, 0x34, 0x26, // 00063426
2671 0x00, 0x0A, 0xD1, 0x41, // 000AD141
2672 0x00, 0x0A, 0xF6, 0x7E, // 000AF67E
2673 0x00, 0x08, 0x12, 0xC6, // 000812C6
2674 0x00, 0x0B, 0x64, 0x40, // 000B6440
2675 0x00, 0x0A, 0xC2, 0x7E, // 000AC27E
2676 0x00, 0x00, 0x00, 0x00, // 00000000
2677 0x00, 0x00, 0x00, 0x00, // 00000000
2678 0x00, 0x06, 0xA4, 0x6B, // 0006A46B
2679 0x00, 0x07, 0x64, 0x00, // 00076400
2680 0x00, 0x07, 0x24, 0x25, // 00072425
2681 0x00, 0x08, 0x93, 0xC5, // 000893C5
2682 0x00, 0x06, 0xA8, 0x71, // 0006A871
2683 0x00, 0x08, 0x9C, 0xC2, // 00089CC2
2684 0x00, 0x02, 0x88, 0x10, // 00028810
2685 0x00, 0x02, 0x1B, 0x86, // 00021B86
2686 0x00, 0x02, 0x81, 0x28, // 00028128
2687 0x00, 0x06, 0x00, 0x78, // 00060078
2688 0x00, 0x06, 0x18, 0x52, // 00061852
2689 0x00, 0x07, 0x54, 0x08, // 00075408
2690 0x00, 0x07, 0x14, 0x00, // 00071400
2691 0x00, 0x07, 0x7C, 0x06, // 00077C06
2692 0x00, 0x07, 0x3E, 0xFD, // 00073EFD
2693 0x00, 0x08, 0x80, 0x41, // 00088041
2694 0x00, 0x02, 0x9F, 0x20, // 00029F20
2695 0x00, 0x0A, 0xC3, 0xC2, // 000AC3C2
2696 0x00, 0x02, 0x9E, 0x10, // 00029E10
2697 0x00, 0x02, 0x1B, 0xA7, // 00021BA7
2698 0x00, 0x02, 0x81, 0x28, // 00028128
2699 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
2700 0x00, 0x06, 0x34, 0x26, // 00063426
2701 0x00, 0x06, 0x3C, 0x1C, // 00063C1C
2702 0x00, 0x07, 0x54, 0x01, // 00075401
2703 0x00, 0x07, 0x16, 0x00, // 00071600
2704 0x00, 0x06, 0x18, 0x70, // 00061870
2705 0x00, 0x08, 0x86, 0xC7, // 000886C7
2706 0x00, 0x02, 0x86, 0x08, // 00028608
2707 0x00, 0x08, 0x00, 0xC2, // 000800C2
2708 0x00, 0x07, 0x64, 0x00, // 00076400
2709 0x00, 0x07, 0x24, 0x25, // 00072425
2710 0x00, 0x06, 0x28, 0x79, // 00062879
2711 0x00, 0x08, 0x93, 0xC0, // 000893C0
2712 0x00, 0x06, 0x80, 0x70, // 00068070
2713 0x00, 0x08, 0x94, 0xC2, // 000894C2
2714 0x00, 0x02, 0x88, 0x38, // 00028838
2715 0x00, 0x08, 0xBD, 0x41, // 0008BD41
2716 0x00, 0x02, 0x9E, 0x08, // 00029E08
2717 0x00, 0x09, 0xAD, 0x41, // 0009AD41
2718 0x00, 0x07, 0x7C, 0x06, // 00077C06
2719 0x00, 0x07, 0x3E, 0xFD, // 00073EFD
2720 0x00, 0x02, 0x1B, 0xB0, // 00021BB0
2721 0x00, 0x02, 0x81, 0x28, // 00028128
2722 0x00, 0x06, 0xA8, 0x79, // 0006A879
2723 0x00, 0x06, 0xB8, 0x0F, // 0006B80F
2724 0x00, 0x06, 0x14, 0x26, // 00061426
2725 0x00, 0x06, 0x20, 0x7D, // 0006207D
2726 0x00, 0x06, 0x28, 0x7C, // 0006287C
2727 0x00, 0x08, 0x32, 0x60, // 00083260
2728 0x00, 0x02, 0x86, 0x18, // 00028618
2729 0x00, 0x08, 0x2D, 0xC4, // 00082DC4
2730 0x00, 0x0B, 0x64, 0x40, // 000B6440
2731 0x00, 0x02, 0x81, 0x08, // 00028108
2732 0x00, 0x0B, 0x64, 0x7F, // 000B647F
2733 0x00, 0x00, 0x00, 0x00, // 00000000
2734 0x00, 0x00, 0x00, 0x00, // 00000000
2735 0x00, 0x06, 0xA8, 0x7C, // 0006A87C
2736 0x00, 0x06, 0xA0, 0x7D, // 0006A07D
2737 0x00, 0x07, 0x7C, 0x00, // 00077C00
2738 0x00, 0x07, 0x3C, 0x01, // 00073C01
2739 0x00, 0x06, 0x00, 0x7C, // 0006007C
2740 0x00, 0x06, 0x30, 0x79, // 00063079
2741 0x00, 0x08, 0xBF, 0xC0, // 0008BFC0
2742 0x00, 0x02, 0x88, 0xC0, // 000288C0
2743 0x00, 0x08, 0xB6, 0x41, // 0008B641
2744 0x00, 0x02, 0x9E, 0xB0, // 00029EB0
2745 0x00, 0x0B, 0x40, 0x40, // 000B4040
2746 0x00, 0x08, 0xBA, 0xC1, // 0008BAC1
2747 0x00, 0x06, 0x34, 0x6E, // 0006346E
2748 0x00, 0x08, 0xBF, 0xC6, // 0008BFC6
2749 0x00, 0x07, 0x5C, 0x00, // 00075C00
2750 0x00, 0x07, 0x1F, 0x00, // 00071F00
2751 0x00, 0x07, 0x54, 0x01, // 00075401
2752 0x00, 0x07, 0x16, 0x00, // 00071600
2753 0x00, 0x08, 0xAF, 0xC3, // 0008AFC3
2754 0x00, 0x02, 0x87, 0x08, // 00028708
2755 0x00, 0x08, 0xBF, 0xC2, // 0008BFC2
2756 0x00, 0x08, 0x2F, 0xC3, // 00082FC3
2757 0x00, 0x02, 0x86, 0x08, // 00028608
2758 0x00, 0x08, 0x3F, 0xC2, // 00083FC2
2759 0x00, 0x00, 0x00, 0x00, // 00000000
2760 0x00, 0x02, 0x1C, 0x15, // 00021C15
2761 0x00, 0x07, 0x4C, 0x06, // 00074C06
2762 0x00, 0x07, 0x0E, 0xFD, // 00070EFD
2763 0x00, 0x00, 0x00, 0x00, // 00000000
2764 0x00, 0x00, 0x00, 0x00, // 00000000
2765 0x00, 0x06, 0x80, 0x7C, // 0006807C
2766 0x00, 0x06, 0x88, 0x0F, // 0006880F
2767 0x00, 0x00, 0x00, 0x00, // 00000000
2768 0x00, 0x06, 0x04, 0x64, // 00060464
2769 0x00, 0x06, 0x0C, 0x72, // 00060C72
2770 0x00, 0x06, 0x10, 0x74, // 00061074
2771 0x00, 0x08, 0x80, 0x40, // 00088040
2772 0x00, 0x02, 0x9F, 0x40, // 00029F40
2773 0x00, 0x08, 0x89, 0x40, // 00088940
2774 0x00, 0x02, 0x9F, 0x10, // 00029F10
2775 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2776 0x00, 0x02, 0x81, 0x28, // 00028128
2777 0x00, 0x08, 0x92, 0x40, // 00089240
2778 0x00, 0x02, 0x9E, 0x10, // 00029E10
2779 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2780 0x00, 0x02, 0x81, 0x28, // 00028128
2781 0x00, 0x07, 0x44, 0x01, // 00074401
2782 0x00, 0x07, 0x06, 0x61, // 00070661
2783 0x00, 0x07, 0x4C, 0x00, // 00074C00
2784 0x00, 0x07, 0x0C, 0x01, // 00070C01
2785 0x00, 0x00, 0x00, 0x00, // 00000000
2786 0x00, 0x06, 0x80, 0x22, // 00068022
2787 0x00, 0x04, 0x07, 0x00, // 00040700
2788 0x00, 0x0A, 0xC9, 0xC0, // 000AC9C0
2789 0x00, 0x02, 0x9F, 0x10, // 00029F10
2790 0x00, 0x08, 0x80, 0x41, // 00088041
2791 0x00, 0x02, 0x81, 0x10, // 00028110
2792 0x00, 0x02, 0x1B, 0x68, // 00021B68
2793 0x00, 0x02, 0x81, 0x28, // 00028128
2794 0x00, 0x07, 0x80, 0x07, // 00078007
2795 0x00, 0x07, 0x44, 0x01, // 00074401
2796 0x00, 0x07, 0x06, 0x61, // 00070661
2797 0x00, 0x07, 0x4C, 0x0C, // 00074C0C
2798 0x00, 0x07, 0x0C, 0x00, // 00070C00
2799 0x00, 0x06, 0x14, 0x64, // 00061464
2800 0x00, 0x06, 0x80, 0x22, // 00068022
2801 0x00, 0x0A, 0xC7, 0x81, // 000AC781
2802 0x00, 0x02, 0x9E, 0x08, // 00029E08
2803 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2804 0x00, 0x00, 0x00, 0x00, // 00000000
2805 0x00, 0x00, 0x00, 0x00, // 00000000
2806 0x00, 0x00, 0x00, 0x00, // 00000000
2807 0x00, 0x06, 0x94, 0x64, // 00069464
2808 0x00, 0x07, 0x44, 0x01, // 00074401
2809 0x00, 0x07, 0x06, 0x69, // 00070669
2810 0x00, 0x07, 0x4C, 0x00, // 00074C00
2811 0x00, 0x07, 0x0C, 0x02, // 00070C02
2812 0x00, 0x06, 0x10, 0x7A, // 0006107A
2813 0x00, 0x06, 0x20, 0x1C, // 0006201C
2814 0x00, 0x06, 0x80, 0x22, // 00068022
2815 0x00, 0x0A, 0xC3, 0x81, // 000AC381
2816 0x00, 0x02, 0x9F, 0x10, // 00029F10
2817 0x00, 0x0B, 0x52, 0x7F, // 000B527F
2818 0x00, 0x02, 0x81, 0x48, // 00028148
2819 0x00, 0x08, 0x9A, 0x41, // 00089A41
2820 0x00, 0x02, 0x9E, 0x38, // 00029E38
2821 0x00, 0x06, 0x00, 0x78, // 00060078
2822 0x00, 0x06, 0x08, 0x24, // 00060824
2823 0x00, 0x08, 0x80, 0x41, // 00088041
2824 0x00, 0x02, 0x9F, 0x08, // 00029F08
2825 0x00, 0x06, 0x08, 0x2C, // 0006082C
2826 0x00, 0x0B, 0x52, 0x40, // 000B5240
2827 0x00, 0x0A, 0xE1, 0x7E, // 000AE17E
2828 0x00, 0x00, 0x00, 0x00, // 00000000
2829 0x00, 0x00, 0x00, 0x00, // 00000000
2830 0x00, 0x06, 0x90, 0x7A, // 0006907A
2831 0x00, 0x06, 0xA0, 0x1C, // 0006A01C
2832 0x00, 0x07, 0x44, 0x01, // 00074401
2833 0x00, 0x07, 0x06, 0x69, // 00070669
2834 0x00, 0x07, 0x4C, 0x00, // 00074C00
2835 0x00, 0x07, 0x0C, 0x01, // 00070C01
2836 0x00, 0x07, 0x44, 0x01, // 00074401
2837 0x00, 0x07, 0x06, 0x6C, // 0007066C
2838 0x00, 0x06, 0x80, 0x22, // 00068022
2839 0x00, 0x0A, 0xCF, 0x81, // 000ACF81
2840 0x00, 0x06, 0x18, 0x77, // 00061877
2841 0x00, 0x06, 0x80, 0x22, // 00068022
2842 0x00, 0x0B, 0x09, 0xC3, // 000B09C3
2843 0x00, 0x02, 0x9E, 0x10, // 00029E10
2844 0x00, 0x02, 0x1B, 0x68, // 00021B68
2845 0x00, 0x02, 0x81, 0x28, // 00028128
2846 0x00, 0x06, 0x24, 0x6B, // 0006246B
2847 0x00, 0x0B, 0x1B, 0x41, // 000B1B41
2848 0x00, 0x06, 0x14, 0x65, // 00061465
2849 0x00, 0x06, 0x04, 0x6A, // 0006046A
2850 0x00, 0x08, 0x28, 0x41, // 00082841
2851 0x00, 0x02, 0x9F, 0x08, // 00029F08
2852 0x00, 0x08, 0x82, 0xC0, // 000882C0
2853 0x00, 0x08, 0xA4, 0x40, // 0008A440
2854 0x00, 0x02, 0x9E, 0x10, // 00029E10
2855 0x00, 0x02, 0x1B, 0x66, // 00021B66
2856 0x00, 0x02, 0x81, 0x28, // 00028128
2857 0x00, 0x0B, 0x40, 0x41, // 000B4041
2858 0x00, 0x0B, 0x64, 0x40, // 000B6440
2859 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2860 0x00, 0x0B, 0x76, 0x40, // 000B7640
2861 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2862 0x00, 0x08, 0x9B, 0x40, // 00089B40
2863 0x00, 0x02, 0x9E, 0x28, // 00029E28
2864 0x00, 0x04, 0x27, 0x08, // 00042708
2865 0x00, 0x04, 0x2F, 0x08, // 00042F08
2866 0x00, 0x04, 0x37, 0x08, // 00043708
2867 0x00, 0x04, 0x3F, 0x08, // 00043F08
2868 0x00, 0x07, 0xA0, 0x0D, // 0007A00D
2869 0x00, 0x07, 0xA8, 0x0D, // 0007A80D
2870 0x00, 0x07, 0xB0, 0x0D, // 0007B00D
2871 0x00, 0x07, 0xB8, 0x0D, // 0007B80D
2872 0x00, 0x06, 0x98, 0x77, // 00069877
2873 0x00, 0x06, 0x84, 0x6A, // 0006846A
2874 0x00, 0x00, 0x00, 0x00, // 00000000
2875 0x00, 0x06, 0x00, 0x6D, // 0006006D
2876 0x00, 0x00, 0x00, 0x00, // 00000000
2877 0x00, 0x08, 0x80, 0x41, // 00088041
2878 0x00, 0x00, 0x00, 0x00, // 00000000
2879 0x00, 0x00, 0x00, 0x00, // 00000000
2880 0x00, 0x00, 0x00, 0x00, // 00000000
2881 0x00, 0x06, 0xC0, 0x6D, // 0006C06D
2882 0x00, 0x00, 0x00, 0x00, // 00000000
2883 0x00, 0x02, 0x3F, 0xCC, // 00023FCC
2884 0x00, 0x07, 0x6C, 0x06, // 00076C06
2885 0x00, 0x07, 0x2F, 0x78, // 00072F78
2886 0x00, 0x00, 0x00, 0x00, // 00000000
2887 0x00, 0x00, 0x00, 0x00, // 00000000
2888 0x00, 0x00, 0x00, 0x00, // 00000000
2889 0x00, 0x00, 0x00, 0x00, // 00000000
2890 0x00, 0x02, 0x19, 0x5B, // 0002195B
2891 0x00, 0x02, 0x81, 0x28, // 00028128
2892 0x00, 0x00, 0x00, 0x00, // 00000000
2893 0x00, 0x00, 0x00, 0x00, // 00000000
2894 0x00, 0x00, 0x00, 0x00, // 00000000
2895 0x00, 0x00, 0x00, 0x00, // 00000000
2896 0x00, 0x00, 0x00, 0x00, // 00000000
2897 0x00, 0x00, 0xC1, 0x80, // 0000C180
2898 0x00, 0x00, 0x00, 0x00, // 00000000
2899 0x00, 0x00, 0x00, 0x00, // 00000000
2900 0x00, 0x00, 0x00, 0x00, // 00000000
2901 0x00, 0x00, 0x00, 0x00, // 00000000
2902 0x00, 0x00, 0x00, 0x00, // 00000000
2903 0x00, 0x00, 0x00, 0x00, // 00000000
2904 0x00, 0x06, 0x00, 0x1C, // 0006001C
2905 0x00, 0x07, 0x6C, 0x01, // 00076C01
2906 0x00, 0x07, 0x2E, 0x00, // 00072E00
2907 0x00, 0x07, 0x7C, 0x01, // 00077C01
2908 0x00, 0x07, 0x3E, 0x68, // 00073E68
2909 0x00, 0x0A, 0xF1, 0x7E, // 000AF17E
2910 0x00, 0x09, 0x00, 0xC6, // 000900C6
2911 0x00, 0x02, 0x88, 0x08, // 00028808
2912 0x00, 0x08, 0x00, 0xC5, // 000800C5
2913 0x00, 0x06, 0x2C, 0x64, // 00062C64
2914 0x00, 0x0A, 0x00, 0x7F, // 000A007F
2915 0x00, 0x06, 0x20, 0x7A, // 0006207A
2916 0x00, 0x06, 0xB8, 0x22, // 0006B822
2917 0x00, 0x04, 0x3F, 0x00, // 00043F00
2918 0x00, 0x08, 0xA4, 0x40, // 0008A440
2919 0x00, 0x02, 0x9E, 0x08, // 00029E08
2920 0x00, 0x08, 0x3F, 0xC0, // 00083FC0
2921 0x00, 0x08, 0xAD, 0x40, // 0008AD40
2922 0x00, 0x02, 0x9F, 0x10, // 00029F10
2923 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
2924 0x00, 0x02, 0x81, 0x28, // 00028128
2925 0x00, 0x06, 0x2C, 0x7F, // 00062C7F
2926 0x00, 0x08, 0xA4, 0x40, // 0008A440
2927 0x00, 0x02, 0x9E, 0x08, // 00029E08
2928 0x00, 0x0B, 0x6D, 0x6F, // 000B6D6F
2929 0x00, 0x0B, 0x40, 0x7F, // 000B407F
2930 0x00, 0x02, 0x1A, 0xAD, // 00021AAD
2931 0x00, 0x06, 0xB0, 0x1C, // 0006B01C
2932 0x00, 0x0A, 0xFF, 0x7E, // 000AFF7E
2933 0x00, 0x00, 0x00, 0x00, // 00000000
2934 0x00, 0x06, 0x84, 0x72, // 00068472
2935 0x00, 0x06, 0xAC, 0x7F, // 0006AC7F
2936 0x00, 0x07, 0xB8, 0x07, // 0007B807
2937 0x00, 0x06, 0x10, 0x2C, // 0006102C
2938 0x00, 0x0B, 0x64, 0x6D, // 000B646D
2939 0x00, 0x0A, 0xD2, 0x7E, // 000AD27E
2940 0x00, 0x0B, 0x5B, 0x7F, // 000B5B7F
2941 0x00, 0x00, 0x00, 0x00, // 00000000
2942 0x00, 0x02, 0x81, 0x20, // 00028120
2943 0x00, 0x06, 0x90, 0x1C, // 0006901C
2944 0x00, 0x06, 0x90, 0x20, // 00069020
2945 0x00, 0x06, 0x9C, 0x7B, // 00069C7B
2946 0x00, 0x0B, 0x64, 0x6E, // 000B646E
2947 0x00, 0x06, 0x34, 0x6D, // 0006346D
2948 0x00, 0x00, 0x00, 0x00, // 00000000
2949 0x00, 0x00, 0x00, 0x00, // 00000000
2950 0x00, 0x06, 0xA4, 0x7F, // 0006A47F
2951 0x00, 0x06, 0xB4, 0x0F, // 0006B40F
2952 0x00, 0x06, 0xB4, 0x6C, // 0006B46C
2953 0x00, 0x0B, 0x76, 0x7F, // 000B767F
2954 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2955 0x00, 0x0B, 0x6D, 0x40, // 000B6D40
2956 0x00, 0x08, 0x3F, 0x40, // 00083F40
2957 0x00, 0x0B, 0x40, 0x40, // 000B4040
2958 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2959 0x00, 0x06, 0xB4, 0x6B, // 0006B46B
2960 0x00, 0x04, 0xB0, 0x0D, // 0004B00D
2961 0x00, 0x00, 0x00, 0x00, // 00000000
2962 0x00, 0x09, 0xB6, 0x7C, // 0009B67C
2963 0x00, 0x01, 0x05, 0x10, // 00010510
2964 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
2965 0x00, 0x02, 0x82, 0x08, // 00028208
2966 0x00, 0x08, 0x00, 0x42, // 00080042
2967 0x00, 0x0B, 0x7F, 0x40, // 000B7F40
2968 0x00, 0x09, 0xB6, 0x7F, // 0009B67F
2969 0x00, 0x02, 0x82, 0x08, // 00028208
2970 0x00, 0x08, 0x3F, 0x42, // 00083F42
2971 0x00, 0x07, 0x84, 0x0C, // 0007840C
2972 0x00, 0x0B, 0x40, 0x40, // 000B4040
2973 0x00, 0x09, 0xA6, 0x7F, // 0009A67F
2974 0x00, 0x07, 0xBC, 0x0C, // 0007BC0C
2975 0x00, 0x07, 0x64, 0x00, // 00076400
2976 0x00, 0x07, 0x24, 0x30, // 00072430
2977 0x00, 0x08, 0x2D, 0x41, // 00082D41
2978 0x00, 0x08, 0xA4, 0xC5, // 0008A4C5
2979 0x00, 0x02, 0x9F, 0x10, // 00029F10
2980 0x00, 0x02, 0x1B, 0xBE, // 00021BBE
2981 0x00, 0x02, 0x81, 0x28, // 00028128
2982 0x00, 0x07, 0x7C, 0x00, // 00077C00
2983 0x00, 0x07, 0x3F, 0x18, // 00073F18
2984 0x00, 0x06, 0x00, 0x78, // 00060078
2985 0x00, 0x06, 0x10, 0x24, // 00061024
2986 0x00, 0x08, 0x80, 0x41, // 00088041
2987 0x00, 0x00, 0x00, 0x00, // 00000000
2988 0x00, 0x02, 0x9F, 0x18, // 00029F18
2989 0x00, 0x07, 0x7C, 0x00, // 00077C00
2990 0x00, 0x07, 0x3C, 0x00, // 00073C00
2991 0x00, 0x06, 0x10, 0x2C, // 0006102C
2992 0x00, 0x00, 0x00, 0x00, // 00000000
2993 0x00, 0x0A, 0xD2, 0x7E, // 000AD27E
2994 0x00, 0x00, 0x00, 0x00, // 00000000
2995 0x00, 0x00, 0x00, 0x00, // 00000000
2996 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
2997 0x00, 0x06, 0x04, 0x64, // 00060464
2998 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
2999 0x00, 0x08, 0x80, 0x41, // 00088041
3000 0x00, 0x00, 0xDE, 0x87, // 0000DE87
3001 0x00, 0x06, 0x90, 0x1C, // 0006901C
3002 0x00, 0x06, 0x90, 0x20, // 00069020
3003 0x00, 0x06, 0x9C, 0x62, // 00069C62
3004 0x00, 0x06, 0x9C, 0x6E, // 00069C6E
3005 0x00, 0x06, 0x9C, 0x63, // 00069C63
3006 0x00, 0x06, 0xAC, 0x7D, // 0006AC7D
3007 0x00, 0x00, 0x00, 0x00, // 00000000
3008 0x00, 0x06, 0x04, 0x73, // 00060473
3009 0x00, 0x07, 0x5C, 0x01, // 00075C01
3010 0x00, 0x07, 0x1E, 0x00, // 00071E00
3011 0x00, 0x08, 0x80, 0x41, // 00088041
3012 0x00, 0x02, 0x9E, 0x10, // 00029E10
3013 0x00, 0x02, 0x1B, 0x7F, // 00021B7F
3014 0x00, 0x02, 0x81, 0x28, // 00028128
3015 0x00, 0x0B, 0x40, 0x7F, // 000B407F
3016 0x00, 0x08, 0x12, 0x42, // 00081242
3017 0x00, 0x09, 0x1B, 0xC2, // 00091BC2
3018 0x00, 0x02, 0x87, 0x08, // 00028708
3019 0x00, 0x08, 0x92, 0xC3, // 000892C3
3020 0x00, 0x06, 0x84, 0x73, // 00068473
3021 0x00, 0x07, 0x64, 0x00, // 00076400
3022 0x00, 0x07, 0x27, 0x00, // 00072700
3023 0x00, 0x07, 0x7C, 0x00, // 00077C00
3024 0x00, 0x07, 0x3C, 0x00, // 00073C00
3025 0x00, 0x0B, 0x5B, 0x40, // 000B5B40
3026 0x00, 0x0B, 0x6D, 0x7F, // 000B6D7F
3027 0x00, 0x06, 0xA4, 0x05, // 0006A405
3028 0x00, 0x01, 0x41, 0x80, // 00014180
3029 0x00, 0x06, 0xB8, 0x22, // 0006B822
3030 0x00, 0x07, 0x98, 0x0F, // 0007980F
3031 0x00, 0x00, 0x00, 0x00, // 00000000
3032 0x00, 0x07, 0x98, 0x0F, // 0007980F
3033 0x00, 0x00, 0xC1, 0x87, // 0000C187
3034 0x00, 0x06, 0x90, 0x1C, // 0006901C
3035 0x00, 0x06, 0x9C, 0x62, // 00069C62
3036 0x00, 0x00, 0x00, 0x00, // 00000000
3037 0x00, 0x06, 0x9C, 0x63, // 00069C63
3038 0x00, 0x06, 0x9C, 0x6E, // 00069C6E
3039 0x00, 0x06, 0xAC, 0x7D, // 0006AC7D
3040 0x00, 0x00, 0xC1, 0x07, // 0000C107
3041 0x00, 0x0B, 0x40, 0x40, // 000B4040
3042 0x00, 0x00, 0x00, 0x00, // 00000000
3043 0x00, 0x00, 0x00, 0x00, // 00000000
3044 0x00, 0x00, 0x00, 0x00, // 00000000
3045 0x00, 0x06, 0x84, 0x62, // 00068462
3046 0x00, 0x06, 0x84, 0x63, // 00068463
3047 0x00, 0x06, 0x04, 0x62, // 00060462
3048 0x00, 0x06, 0x1C, 0x63, // 00061C63
3049 0x00, 0x0A, 0x0F, 0x41, // 000A0F41
3050 0x00, 0x08, 0x97, 0xC0, // 000897C0
3051 0x00, 0x08, 0x1B, 0xC2, // 00081BC2
3052 0x00, 0x0A, 0x12, 0x47, // 000A1247
3053 0x00, 0x07, 0x65, 0x00, // 00076500
3054 0x00, 0x07, 0x24, 0x00, // 00072400
3055 0x00, 0x07, 0x6D, 0x00, // 00076D00
3056 0x00, 0x07, 0x2C, 0x00, // 00072C00
3057 0x00, 0x07, 0x75, 0x00, // 00077500
3058 0x00, 0x07, 0x34, 0x00, // 00073400
3059 0x00, 0x0C, 0x12, 0x25, // 000C1225
3060 0x00, 0x0E, 0x11, 0x24, // 000E1124
3061 0x00, 0x0E, 0x13, 0x26, // 000E1326
3062 0x00, 0x00, 0x00, 0x00, // 00000000
3063 0x00, 0x00, 0x00, 0x00, // 00000000
3064 0x00, 0x06, 0x04, 0x6C, // 0006046C
3065 0x00, 0x00, 0xC1, 0x07, // 0000C107
3066 0x00, 0x09, 0x12, 0xC0, // 000912C0
3067 0x00, 0x06, 0xBC, 0x62, // 0006BC62
3068 0x00, 0x06, 0x9C, 0x63, // 00069C63
3069 0x00, 0x00, 0x00, 0x00, // 00000000
3070 0x00, 0x06, 0x94, 0x6C, // 0006946C
3071 0x00, 0x06, 0x94, 0x0F, // 0006940F
3072 0x00, 0x03, 0x33, 0x33, // 00033333
3073 0x00, 0x00, 0x00, 0x00, // 00000000
3074 0x00, 0x00, 0x00, 0x00, // 00000000
3075 0x00, 0x00, 0x00, 0x00, // 00000000
3076 0x00, 0x00, 0x00, 0x00, // 00000000
3077 0x00, 0x00, 0x00, 0x00, // 00000000
3078 0x00, 0x00, 0x00, 0x00, // 00000000
3079};
3080
3081struct i2c_block {
3082 const unsigned char *data;
3083 unsigned len;
3084};
3085
3086static struct i2c_block maspcm[] = {
3087 { maspcm_array1, sizeof(maspcm_array1) },
3088 { maspcm_array2, sizeof(maspcm_array2) },
3089 { maspcm_array3, sizeof(maspcm_array3) },
3090 { maspcm_array4, sizeof(maspcm_array4) },
3091 { maspcm_array5, sizeof(maspcm_array5) },
3092 { maspcm_array6, sizeof(maspcm_array6) },
3093 { maspcm_array7, sizeof(maspcm_array7) },
3094 { maspcm_array8, sizeof(maspcm_array8) },
3095 { maspcm_array9, sizeof(maspcm_array9) },
3096 { maspcm_array10, sizeof(maspcm_array10) },
3097};
3098
3099/************ End of MAS pcm codec ************/
3100
3101#define WAVRECORD_QUIT BUTTON_OFF
3102
3103#define CFGFILE_VERSION 0 /* Current config file version */
3104#define CFGFILE_MINVERSION 0 /* Minimum config file version to accept */
3105
3106#define PCM_MAIN_IO_CONTROL 0x0661
3107#define PCM_IF_STATUS_CONTROL 0x0662
3108#define PCM_OFREQ_CONTROL 0x0663
3109#define PCM_OUTPUT_CLOCK_CONF 0x0664
3110#define PCM_FRAME_COUNTER 0x0665
3111#define PCM_APP_RUNNING 0x0666
3112#define PCM_SAMPLE_RATE_STATUS 0x0667
3113#define PCM_BUFFER_ERROR_COUNTER 0x0668
3114#define PCM_SOFT_MUTE 0x0669
3115#define PCM_SPDIF_CHANNEL_STATUS 0x066a
3116#define PCM_SAMPLE_RATE 0x066b
3117#define PCM_VOL_OUT_LL 0x066c
3118#define PCM_VOL_OUT_RL 0x066d
3119#define PCM_VOL_OUT_LR 0x066e
3120#define PCM_VOL_OUT_RR 0x066f
3121#define PCM_VOL_IN_LL 0x0670
3122#define PCM_VOL_IN_RL 0x0671
3123#define PCM_VOL_IN_LR 0x0672
3124#define PCM_VOL_IN_RR 0x0673
3125
3126#define IRQ3 (*((volatile unsigned long*)0x0900010C))
3127
3128#define LOW_WATER_CHUNKSIZE (256*1024)
3129
3130/* declarations */
3131
3132struct riff_header
3133{
3134 uint8_t riff_id[4]; /* 00h - "RIFF" */
3135 uint32_t riff_size; /* 04h - sz following headers + data_size */
3136 /* format header */
3137 uint8_t format[4]; /* 08h - "WAVE" */
3138 uint8_t format_id[4]; /* 0Ch - "fmt " */
3139 uint32_t format_size; /* 10h - 16 for PCM (sz format data) */
3140 /* format data */
3141 uint16_t audio_format; /* 14h - 1=PCM */
3142 uint16_t num_channels; /* 16h - 1=M, 2=S, etc. */
3143 uint32_t sample_rate; /* 18h - HZ */
3144 uint32_t byte_rate; /* 1Ch - num_channels*sample_rate*bits_per_sample/8 */
3145 uint16_t block_align; /* 20h - num_channels*bits_per_samples/8 */
3146 uint16_t bits_per_sample; /* 22h - 8=8 bits, 16=16 bits, etc. */
3147 /* Not for audio_format=1 (PCM) */
3148/* unsigned short extra_param_size; 24h - size of extra data */
3149/* unsigned char *extra_params; */
3150 /* data header */
3151 uint8_t data_id[4]; /* 24h - "data" */
3152 uint32_t data_size; /* 28h - num_samples*num_channels*bits_per_sample/8 */
3153/* unsigned char *data; 2ch - actual sound data */
3154} __attribute__((packed));
3155
3156#define RIFF_FMT_HEADER_SIZE 12 /* format -> format_size */
3157#define RIFF_FMT_DATA_SIZE 16 /* audio_format -> bits_per_sample */
3158#define RIFF_DATA_HEADER_SIZE 8 /* data_id -> data_size */
3159
3160#define PCM_DEPTH_BYTES 2
3161#define PCM_DEPTH_BITS 16
3162
3163/* Define our own source constants since REC_SRC_FMRADIO will intrude on the count */
3164enum {
3165 WAV_SRC_LINE = 0,
3166 WAV_SRC_MIC,
3167#ifdef HAVE_SPDIF_REC
3168 WAV_SRC_SPDIF,
3169#endif
3170 WAV_NUM_SRC,
3171};
3172
3173void rec_tick(void) __attribute__((interrupt_handler));
3174
3175/* settings */
3176struct rec_config {
3177 int samplerate; /* index */
3178 int channels;
3179 int source;
3180};
3181
3182struct rec_config reccfg_disk = { 7, 1, 0 };
3183struct rec_config reccfg; /* running config */
3184
3185static const char cfg_filename[] = "wavrecord.cfg";
3186static char *samplerate_str[9] = { "8000", "11025", "12000",
3187 "16000", "22050", "24000",
3188 "32000", "44100", "48000" };
3189static char *channel_str[2] = { "mono", "stereo" };
3190static char *source_str[WAV_NUM_SRC] = { "line in", "mic",
3191 HAVE_SPDIF_REC_("spdif",) };
3192
3193struct configdata disk_config[] = {
3194 { TYPE_ENUM, 0, 9, { .int_p = &reccfg_disk.samplerate }, "sample rate",
3195 samplerate_str },
3196 { TYPE_ENUM, 0, 2, { .int_p = &reccfg_disk.channels }, "channels",
3197 channel_str },
3198 { TYPE_ENUM, 0, WAV_NUM_SRC, { .int_p = &reccfg_disk.source }, "source",
3199 source_str },
3200};
3201
3202static char recfilename[MAX_PATH];
3203
3204static unsigned char *aud_buf;
3205static ssize_t aud_size;
3206static unsigned char *plug_buf;
3207
3208static int aud_read = 0;
3209static volatile int aud_write = 0;
3210static volatile int num_rec_bytes = 0;
3211
3212static const struct riff_header header_template =
3213{
3214 /* "RIFF" header */
3215 { 'R', 'I', 'F', 'F' }, /* riff_id */
3216 0, /* riff_size (*) */
3217 /* format header */
3218 { 'W', 'A', 'V', 'E' }, /* format */
3219 { 'f', 'm', 't', ' ' }, /* format_id */
3220 htole32(16), /* format_size */
3221 /* format data */
3222 htole16(1), /* audio_format */
3223 0, /* num_channels (*) */
3224 0, /* sample_rate (*) */
3225 0, /* byte_rate (*) */
3226 0, /* block_align (*) */
3227 htole16(PCM_DEPTH_BITS), /* bits_per_sample */
3228 /* data header */
3229 { 'd', 'a', 't', 'a' }, /* data_id */
3230 0 /* data_size (*) */
3231 /* (*) updated during ENC_END_FILE event */
3232};
3233
3234/** i2c, MAS configuration **/
3235
3236void i2c_random_write(int addr, int cmd, const unsigned char* data, int size)
3237{
3238 plug_buf[0] = cmd;
3239 rb->memcpy(plug_buf+1, data, size);
3240
3241 rb->i2c_begin();
3242 rb->i2c_write(addr, plug_buf, size+1);
3243 rb->i2c_end();
3244}
3245
3246void mas_freeze(void)
3247{
3248 static const unsigned char freeze[] = { 0x00, 0x00 };
3249
3250 /* Freeze DSP */
3251 i2c_random_write(MAS_ADR, MAS_DATA_WRITE, freeze, sizeof(freeze));
3252 /* mas_run(0); in core implementation */
3253
3254 /* stop all internal transfers */
3255 rb->mas_writereg(0x3b, 0x00318); /* stopdma 1 */
3256 rb->mas_writereg(0x43, 0x00300); /* stopdma 2 */
3257 rb->mas_writereg(0x4b, 0); /* stopdma 3 */
3258 rb->mas_writereg(0x53, 0x00318); /* stopdma 4 */
3259 rb->mas_writereg(0x6b, 0); /* stopdma 5 */
3260 rb->mas_writereg(0xbb, 0x00318); /* stopdma 6 */
3261 rb->mas_writereg(0xc3, 0x00300); /* stopdma 7 */
3262 rb->mas_writereg(0x06, 0); /* stopdma 8 */
3263}
3264
3265void mas_download_pcm(void)
3266{
3267 static const unsigned char runi2s[] = { 0x10, 0x00 };
3268 unsigned i;
3269
3270 mas_freeze();
3271
3272 /* Download program to MAS memory */
3273 for ( i = 0; i < (sizeof(maspcm)/sizeof(struct i2c_block)); i++ )
3274 i2c_random_write(MAS_ADR, MAS_DATA_WRITE, maspcm[i].data, maspcm[i].len);
3275
3276 rb->mas_writereg(0x6b, 0xc0000); /* Reconfigure data to program memory */
3277
3278 /* Start execution at D0:1000 */
3279 i2c_random_write(MAS_ADR, MAS_DATA_WRITE, runi2s, sizeof(runi2s));
3280 /* mas_run(0x1000); in core implementation */
3281}
3282
3283void mas_restore(void)
3284{
3285 static const unsigned char resetdsp[] = { 0x88, 0x00 };
3286 static const unsigned char initdsp[] = { 0x8c, 0x00 };
3287 unsigned long val;
3288
3289 i2c_random_write(MAS_ADR, MAS_CONTROL, resetdsp, sizeof(resetdsp));
3290 /* mas_direct_config_write(MAS_CONTROL, 0x8d00); in core implementation */
3291 rb->sleep(1);
3292 i2c_random_write(MAS_ADR, MAS_CONTROL, initdsp, sizeof(initdsp));
3293 /* mas_direct_config_write(MAS_CONTROL, 0x8c00); in core implementation */
3294
3295 /* Stop the current application */
3296 val = 0;
3297 rb->mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
3298 do
3299 rb->mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
3300 while(val);
3301
3302#ifdef HAVE_SPDIF_OUT
3303 val = 0x0009; /* Disable SDO and SDI, low impedance S/PDIF outputs */
3304#else
3305 val = 0x002d; /* Disable SDO and SDI, disable S/PDIF output */
3306#endif
3307 rb->mas_writemem(MAS_BANK_D0, MAS_D0_INTERFACE_CONTROL, &val, 1);
3308
3309 val = 0x0025; /* Set Demand mode and validate all settings */
3310 rb->mas_writemem(MAS_BANK_D0, MAS_D0_IO_CONTROL_MAIN, &val, 1);
3311
3312 val = 0x000c; /* Start the Layer2/3 decoder applications */
3313 rb->mas_writemem(MAS_BANK_D0, MAS_D0_APP_SELECT, &val, 1);
3314 do
3315 rb->mas_readmem(MAS_BANK_D0, MAS_D0_APP_RUNNING, &val, 1);
3316 while((val & 0x000c) != 0x000c);
3317}
3318
3319/** Very basic recording engine **/
3320
3321void rec_tick(void)
3322{
3323 int d1, d2, d3;
3324
3325 ICR |= 0x0010; /* Begin with setting the IRQ to edge sensitive */
3326
3327 if(!(PADRH & 0x80))
3328 { /* /EOD is low - transfer 36 bytes (9 sample pairs, 1 MASPCM DMA block) */
3329 asm volatile (
3330 "add %[buf], %[writ] \n" /* write pos -> addr */
3331 "mov #9, %[i] \n" /* block size = 9*4 */
3332
3333 ".r_loop: \n"
3334 "xor.b #0x08, @(r0,gbr) \n" /* set PR active */
3335 ".r_wait1: \n"
3336 "mov.b @%[pbdh], %[scrt] \n" /* wait for RTW */
3337 "cmp/pz %[scrt] \n"
3338 "bf .r_wait1 \n"
3339
3340 "mov.b @%[mas], %[data] \n" /* read data from MAS */
3341 "xor.b #0x08, @(r0,gbr) \n" /* set PR inactive */
3342 "extu.b %[data], %[data] \n"
3343
3344 "xor.b #0x08, @(r0,gbr) \n" /* set PR active */
3345 ".r_wait2: \n"
3346 "mov.b @%[pbdh], %[scrt] \n" /* wait for RTW */
3347 "cmp/pz %[scrt] \n"
3348 "bf .r_wait2 \n"
3349
3350 "mov.b @%[mas], %[scrt] \n" /* read data from MAS */
3351 "xor.b #0x08, @(r0,gbr) \n" /* set PR inactive */
3352 "shll8 %[data] \n"
3353 "extu.b %[scrt], %[scrt] \n"
3354 "or %[scrt], %[data] \n"
3355
3356 "xor.b #0x08, @(r0,gbr) \n" /* set PR active */
3357 ".r_wait3: \n"
3358 "mov.b @%[pbdh], %[scrt] \n" /* wait for RTW */
3359 "cmp/pz %[scrt] \n"
3360 "bf .r_wait3 \n"
3361
3362 "mov.b @%[mas], %[scrt] \n" /* read data from MAS */
3363 "xor.b #0x08, @(r0,gbr) \n" /* set PR inactive */
3364 "shll8 %[data] \n"
3365 "extu.b %[scrt], %[scrt] \n"
3366 "or %[scrt], %[data] \n"
3367
3368 "xor.b #0x08, @(r0,gbr) \n" /* set PR active */
3369 ".r_wait4: \n"
3370 "mov.b @%[pbdh], %[scrt] \n" /* wait for RTW */
3371 "cmp/pz %[scrt] \n"
3372 "bf .r_wait4 \n"
3373
3374 "mov.b @%[mas], %[scrt] \n" /* read data from MAS */
3375 "xor.b #0x08, @(r0,gbr) \n" /* set PR inactive */
3376 "shll8 %[data] \n"
3377 "extu.b %[scrt], %[scrt] \n"
3378 "or %[scrt], %[data] \n"
3379
3380 "mov.l %[data], @%[writ] \n"
3381
3382 "add #4, %[writ] \n" /* advance buffer pointer */
3383 "cmp/hi %[writ], %[end] \n"
3384 "bt .r_nowrap \n"
3385 "mov %[buf], %[writ] \n" /* wrap if necessary */
3386 ".r_nowrap: \n"
3387
3388 "add #-1, %[i] \n" /* count down block size */
3389 "cmp/pl %[i] \n" /* exit if zero */
3390 "bt .r_loop \n"
3391
3392 ".r_end: \n"
3393 "sub %[buf], %[writ] \n" /* eddr -> write pos */
3394 : /* outputs */
3395 [writ]"+r"(aud_write),
3396 [i] "=&r"(d1),
3397 [data]"=&r"(d2),
3398 [scrt]"=&r"(d3)
3399 : /* inputs */
3400 [buf] "r"(aud_buf),
3401 [end] "r"(aud_buf + aud_size),
3402 [padh]"z"(PADRH_ADDR),
3403 [pbdh]"r"(PBDRH_ADDR),
3404 [mas] "r"(0x04000000)
3405 );
3406 num_rec_bytes += 36;
3407 }
3408}
3409
3410void rec_tick_enable(bool on)
3411{
3412 int oldlevel = disable_irq_save();
3413
3414 if(on)
3415 {
3416 IPRA = (IPRA & 0xfff0) | 0x000b;
3417 ICR &= ~0x0010; /* IRQ3 level sensitive */
3418 IPRB &= 0xff0f; /* Disable IRQ6 */
3419 }
3420 else
3421 {
3422 IPRA &= 0xfff0;
3423 ICR &= ~0x0002; /* Set IRQ6 to level sensitive and back again. */
3424 ICR |= 0x0002; /* This will clear a pending request. */
3425 IPRB = (IPRB & 0xff0f) | 0x0080; /* Reenable IRQ6 */
3426 }
3427
3428 restore_irq(oldlevel);
3429}
3430
3431void hijack_interrupts(bool on)
3432{
3433 static bool taken = false;
3434 static unsigned long orig_IRQ3;
3435
3436 if (on && !taken)
3437 {
3438 orig_IRQ3 = IRQ3;
3439 IRQ3 = (unsigned long)rec_tick;
3440 }
3441 else if (!on && taken)
3442 {
3443 IRQ3 = orig_IRQ3;
3444 }
3445 taken = on;
3446}
3447
3448static bool update_wav_header(char *filename, int sample_rate,
3449 int num_channels, int num_bytes)
3450{
3451 struct riff_header hdr;
3452 int fd;
3453 bool ret;
3454
3455 fd = rb->open(filename, O_RDWR);
3456 if (fd < 0)
3457 return false;
3458
3459 rb->memcpy(&hdr, &header_template, sizeof (struct riff_header));
3460
3461 /* "RIFF" header */
3462 hdr.riff_size = htole32(RIFF_FMT_HEADER_SIZE + RIFF_FMT_DATA_SIZE
3463 + RIFF_DATA_HEADER_SIZE + num_bytes);
3464
3465 /* format data */
3466 hdr.num_channels = htole16(num_channels);
3467 hdr.sample_rate = htole32(sample_rate);
3468 hdr.byte_rate = htole32(sample_rate * num_channels * PCM_DEPTH_BYTES);
3469 hdr.block_align = htole16(num_channels * PCM_DEPTH_BYTES);
3470
3471 /* data header */
3472 hdr.data_size = htole32(num_bytes);
3473
3474 ret = (rb->write(fd, &hdr, sizeof (struct riff_header))
3475 == sizeof (struct riff_header));
3476 rb->close(fd);
3477 return ret;
3478}
3479
3480static int record_file(char *filename)
3481{
3482 bool recording, saving;
3483 int fd, low_water, i;
3484 int bytes_written;
3485 int button;
3486 unsigned long mas;
3487
3488 static const unsigned sampr[9][2] = {
3489 {0, 8000}, {1, 11025}, {2, 12000},
3490 {4, 16000}, {5, 22050}, {6, 24000},
3491 {8, 32000}, {9, 44100}, {10, 48000}
3492 };
3493
3494 fd = rb->open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666);
3495 if (fd < 0)
3496 {
3497 rb->splash(2*HZ, "Couldn't create WAV file");
3498 return PLUGIN_ERROR;
3499 }
3500 /* write template header */
3501 if (rb->write(fd, &header_template, sizeof (struct riff_header))
3502 != sizeof (struct riff_header))
3503 {
3504 rb->close(fd);
3505 rb->splash(2*HZ, "Write error");
3506 return PLUGIN_ERROR;
3507 }
3508
3509 rb->sound_set_pitch(PITCH_SPEED_100); /* reset pitch */
3510 mas_download_pcm();
3511 num_rec_bytes = 0;
3512 bytes_written = 0;
3513
3514 rb->lcd_clear_display();
3515 rb->lcd_puts(0, 0, filename);
3516
3517 switch (reccfg.source)
3518 {
3519 case WAV_SRC_LINE:
3520 rb->mas_codec_writereg(0, (rb->global_settings->rec_left_gain << 12)
3521 | (rb->global_settings->rec_right_gain << 8)
3522 | 0x07);
3523 rb->mas_codec_writereg(8, 0);
3524 break;
3525
3526 case WAV_SRC_MIC:
3527 rb->mas_codec_writereg(0, (rb->global_settings->rec_mic_gain << 4)
3528 | 0x0d);
3529 rb->mas_codec_writereg(8, 0x8000); /* Copy left channel to right */
3530 break;
3531
3532#ifdef HAVE_SPDIF_REC
3533 case WAV_SRC_SPDIF:
3534 rb->mas_codec_writereg(0, 0x01);
3535 break;
3536#endif
3537 }
3538
3539#ifdef HAVE_SPDIF_REC
3540 if (reccfg.source == WAV_SRC_SPDIF)
3541 rb->lcd_putsf(0, 1, "16bit %s", channel_str[reccfg.channels]);
3542 else
3543#endif
3544 rb->lcd_putsf(0, 1, "%sHz 16bit %s",
3545 samplerate_str[reccfg.samplerate], channel_str[reccfg.channels]);
3546
3547 rb->lcd_update();
3548
3549 mas = 0x0060 /* no framing, little endian */
3550 | ((reccfg.channels == 0) ? 0x10 : 0) /* mono/stereo */
3551 | sampr[reccfg.samplerate][0];
3552 rb->mas_writemem(MAS_BANK_D0, PCM_SAMPLE_RATE, &mas, 1);
3553
3554#ifdef HAVE_SPDIF_OUT
3555 mas = 0x0009; /* Disable SDO and SDI, low impedance S/PDIF outputs */
3556#else
3557 mas = 0x002d; /* Disable SDO and SDI, disable S/PDIF output */
3558#endif
3559 rb->mas_writemem(MAS_BANK_D0, PCM_IF_STATUS_CONTROL, &mas, 1);
3560
3561#ifdef HAVE_SPDIF_IN
3562 if (reccfg.source == AUDIO_SRC_SPDIF)
3563 mas = 0x2225; /* recording, S/PDIF input, validate */
3564 else
3565#endif
3566 mas = 0x2125; /* recording, ADC input, validate */
3567 rb->mas_writemem(MAS_BANK_D0, PCM_MAIN_IO_CONTROL, &mas, 1);
3568
3569 mas = 0x80001; /* avoid distortion (overflow on full-range input samples) */
3570 rb->mas_writemem(MAS_BANK_D0, PCM_VOL_IN_LL, &mas, 1); /* LL */
3571 rb->mas_writemem(MAS_BANK_D0, PCM_VOL_IN_RR, &mas, 1); /* RR */
3572
3573 hijack_interrupts(true);
3574 rec_tick_enable(true);
3575 recording = true;
3576 saving = false;
3577 low_water = 5 /* seconds */
3578 * PCM_DEPTH_BYTES
3579 * sampr[reccfg.samplerate][1] /* samples per second */
3580 * (reccfg.channels + 1);
3581
3582 while (recording || saving)
3583 {
3584 int to_save, write_now, result;
3585
3586 if (saving)
3587 {
3588 to_save = num_rec_bytes - bytes_written;
3589 if (to_save > aud_size)
3590 {
3591 rec_tick_enable(false);
3592#if (CONFIG_STORAGE & STORAGE_MMC)
3593 rb->splash(HZ, "Data overrun (slow MMC)");
3594#else
3595 rb->splash(HZ, "Data overrun");
3596#endif
3597 recording = false;
3598 saving = false;
3599 break;
3600 }
3601 write_now = MIN(to_save, aud_size - aud_read);
3602#if (CONFIG_STORAGE & STORAGE_MMC)
3603 write_now = MIN(write_now, 256*1024);
3604#else
3605 write_now = MIN(write_now, 1024*1024);
3606#endif
3607 result = rb->write(fd, aud_buf + aud_read, write_now);
3608 if (result < 0)
3609 {
3610 rec_tick_enable(false);
3611 rb->splash(HZ, "Write error");
3612 recording = false;
3613 saving = false;
3614 break;
3615 }
3616 bytes_written += result;
3617 if (result != write_now)
3618 {
3619 rec_tick_enable(false);
3620 rb->splash(HZ, "Disk full");
3621 recording = false;
3622 saving = false;
3623 break;
3624 }
3625 if (bytes_written >= 0x7fe00000)
3626 {
3627 rec_tick_enable(false);
3628 rb->splash(HZ, "Max file size reached");
3629 recording = false;
3630 saving = false;
3631 break;
3632 }
3633 aud_read += write_now;
3634 if (aud_read == aud_size)
3635 aud_read = 0;
3636
3637 if (to_save == write_now)
3638 saving = false;
3639
3640 rb->yield();
3641 button = rb->button_get(false);
3642 }
3643 else
3644 {
3645 button = rb->button_get_w_tmo(HZ/2);
3646 if (aud_size - (num_rec_bytes - bytes_written) < low_water)
3647 saving = true;
3648 }
3649 if (button == BUTTON_OFF)
3650 {
3651 rec_tick_enable(false);
3652 recording = false;
3653 saving = true;
3654 }
3655 rb->lcd_putsf(0, 2, "Bytes: %d", num_rec_bytes);
3656 rb->lcd_update();
3657 }
3658 /* read sample rate from MAS */
3659 rb->mas_readmem(MAS_BANK_D0, PCM_SAMPLE_RATE_STATUS, &mas, 1);
3660 rb->close(fd);
3661
3662 hijack_interrupts(false);
3663 mas_restore();
3664 rb->sound_set(SOUND_CHANNELS, rb->global_settings->channel_config);
3665 rb->sound_set(SOUND_STEREO_WIDTH, rb->global_settings->stereo_width);
3666
3667 for (i = 0; i < 9; i++)
3668 {
3669 if (sampr[i][0] == mas)
3670 break;
3671 }
3672 if (i == 9 || !(update_wav_header(filename, sampr[i][1],
3673 (reccfg.channels + 1), bytes_written)))
3674 {
3675 rb->splash(HZ, "Updating WAV header failed");
3676 }
3677
3678 return PLUGIN_OK;
3679}
3680
3681static int recording_menu(void)
3682{
3683 int menupos = 3;
3684 int rc = 0;
3685 bool done = false;
3686
3687 static const struct opt_items freqs[9] = {
3688 { "8000Hz", TALK_ID(8, UNIT_KHZ) },
3689 { "11025Hz", TALK_ID(11, UNIT_KHZ) },
3690 { "12000Hz", TALK_ID(12, UNIT_KHZ) },
3691 { "16000Hz", TALK_ID(16, UNIT_KHZ) },
3692 { "22050Hz", TALK_ID(22, UNIT_KHZ) },
3693 { "24000Hz", TALK_ID(24, UNIT_KHZ) },
3694 { "32000Hz", TALK_ID(32, UNIT_KHZ) },
3695 { "44100Hz", TALK_ID(44, UNIT_KHZ) },
3696 { "48000Hz", TALK_ID(48, UNIT_KHZ) },
3697 };
3698 static const struct opt_items chans[2] = {
3699 { STR(LANG_CHANNEL_MONO) },
3700 { STR(LANG_CHANNEL_STEREO) },
3701 };
3702 static const struct opt_items srcs[WAV_NUM_SRC] = {
3703 { "Line In", -1 },
3704 { "Microphone", -1 },
3705#ifdef HAVE_SPDIF_REC
3706 { "S/PDIF", -1 },
3707#endif
3708 };
3709
3710 MENUITEM_STRINGLIST(menu, "WAV Recording", NULL, "Set sample rate",
3711 "Set channels", "Set Source", "Start recording", "Quit");
3712
3713 while (!done)
3714 {
3715 switch (rb->do_menu(&menu, &menupos, NULL, false))
3716 {
3717 case 0: /* Set sample rate */
3718 rb->set_option("Sample rate", &reccfg.samplerate, INT, freqs, 9, NULL);
3719 break;
3720
3721 case 1: /* Set channels */
3722 rb->set_option("Channels", &reccfg.channels, INT, chans, 2, NULL);
3723 break;
3724
3725 case 2: /* Set source */
3726 rb->set_option("Source", &reccfg.source, INT, srcs, WAV_NUM_SRC, NULL);
3727 break;
3728
3729 case 3: /* Start recording */
3730 rb->create_numbered_filename(recfilename,
3731 rb->global_settings->rec_directory,
3732 "rec_", ".wav", 4
3733 IF_CNFN_NUM_(, NULL));
3734 rc = record_file(recfilename);
3735 done = true;
3736 break;
3737
3738 case 4: /* Quit */
3739 rc = PLUGIN_OK;
3740 done = true;
3741 break;
3742
3743 case MENU_ATTACHED_USB:
3744 rc = PLUGIN_USB_CONNECTED;
3745 done = true;
3746 break;
3747 }
3748 }
3749 return rc;
3750}
3751
3752/* plugin entry point */
3753enum plugin_status plugin_start(const void* parameter)
3754{
3755 size_t buf_size;
3756 int align;
3757 int rc;
3758 const char *recbasedir;
3759
3760 (void)parameter;
3761
3762 plug_buf = rb->plugin_get_buffer(&buf_size);
3763 if (buf_size < 6700) /* needed for i2c transfer */
3764 {
3765 rb->splash(HZ, "Out of memory.");
3766 return PLUGIN_ERROR;
3767 }
3768
3769 recbasedir = rb->global_settings->rec_directory;
3770 if (rb->strcmp(recbasedir, "/") && !rb->dir_exists(recbasedir))
3771 {
3772 rc = rb->mkdir(recbasedir);
3773 if (rc < 0)
3774 {
3775 rb->splashf(HZ*2, "Can't create directory %s. Error %d.",
3776 recbasedir, rc);
3777 return PLUGIN_ERROR;
3778 }
3779 }
3780
3781 aud_buf = rb->plugin_get_audio_buffer(&buf_size);
3782 aud_size = buf_size;
3783 align = (-(long)aud_buf) & 3;
3784 aud_buf += align;
3785 aud_size -= align;
3786 aud_size &= ~3;
3787
3788 configfile_load(cfg_filename, disk_config,
3789 sizeof(disk_config) / sizeof(disk_config[0]),
3790 CFGFILE_MINVERSION);
3791 rb->memcpy(&reccfg, &reccfg_disk, sizeof(reccfg)); /* copy to running config */
3792
3793 rc = recording_menu();
3794
3795 if (rb->memcmp(&reccfg, &reccfg_disk, sizeof(reccfg))) /* save settings if changed */
3796 {
3797 rb->memcpy(&reccfg_disk, &reccfg, sizeof(reccfg));
3798 configfile_save(cfg_filename, disk_config,
3799 sizeof(disk_config) / sizeof(disk_config[0]),
3800 CFGFILE_VERSION);
3801 }
3802 return rc;
3803
3804#if 0
3805#if (CONFIG_STORAGE & STORAGE_MMC)
3806 return record_file("/<MMC1>/test.wav");
3807#else
3808 return record_file("/test.wav");
3809#endif
3810#endif
3811}
diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c
index a8447c9952..b18cdc21f8 100644
--- a/apps/plugins/wormlet.c
+++ b/apps/plugins/wormlet.c
@@ -46,36 +46,8 @@ static long max_cycle;
46 when a new argh is made */ 46 when a new argh is made */
47#define MIN_ARGH_DIST 5 47#define MIN_ARGH_DIST 5
48 48
49#if (CONFIG_KEYPAD == RECORDER_PAD) 49#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
50#define BTN_DIR_UP BUTTON_UP 50 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
51#define BTN_DIR_DOWN BUTTON_DOWN
52#define BTN_DIR_LEFT BUTTON_LEFT
53#define BTN_DIR_RIGHT BUTTON_RIGHT
54#define BTN_PLAYER2_DIR1 BUTTON_F2
55#define BTN_PLAYER2_DIR2 BUTTON_F3
56#define BTN_STARTPAUSE BUTTON_PLAY
57#define BTN_QUIT BUTTON_OFF
58#define BTN_STOPRESET BUTTON_ON
59#define BTN_TOGGLE_KEYS BUTTON_F1
60
61#if BUTTON_REMOTE != 0
62#define BTN_RC_UP BUTTON_RC_VOL_UP
63#define BTN_RC_DOWN BUTTON_RC_VOL_DOWN
64#define REMOTE
65#define MULTIPLAYER
66#endif
67
68#elif (CONFIG_KEYPAD == ONDIO_PAD)
69#define BTN_DIR_UP BUTTON_UP
70#define BTN_DIR_DOWN BUTTON_DOWN
71#define BTN_DIR_LEFT BUTTON_LEFT
72#define BTN_DIR_RIGHT BUTTON_RIGHT
73#define BTN_STARTPAUSE (BUTTON_MENU|BUTTON_REL)
74#define BTN_QUIT (BUTTON_OFF|BUTTON_REL)
75#define BTN_STOPRESET (BUTTON_OFF|BUTTON_MENU)
76
77#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
78 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
79 51
80#define BTN_DIR_UP BUTTON_MENU 52#define BTN_DIR_UP BUTTON_MENU
81#define BTN_DIR_DOWN BUTTON_PLAY 53#define BTN_DIR_DOWN BUTTON_PLAY
diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c
index b923e23986..e2cccba8fc 100644
--- a/apps/plugins/xobox.c
+++ b/apps/plugins/xobox.c
@@ -115,24 +115,6 @@
115#define DOWN BUTTON_SCROLL_DOWN 115#define DOWN BUTTON_SCROLL_DOWN
116#define PAUSE BUTTON_PLAY 116#define PAUSE BUTTON_PLAY
117 117
118#elif CONFIG_KEYPAD == RECORDER_PAD
119
120#define QUIT BUTTON_OFF
121#define LEFT BUTTON_LEFT
122#define RIGHT BUTTON_RIGHT
123#define DOWN BUTTON_DOWN
124#define UP BUTTON_UP
125#define PAUSE BUTTON_PLAY
126
127#elif CONFIG_KEYPAD == ONDIO_PAD
128
129#define QUIT BUTTON_OFF
130#define LEFT BUTTON_LEFT
131#define RIGHT BUTTON_RIGHT
132#define DOWN BUTTON_DOWN
133#define UP BUTTON_UP
134#define PAUSE BUTTON_MENU
135
136#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) 118#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
137 119
138#define QUIT BUTTON_BACK 120#define QUIT BUTTON_BACK
diff --git a/apps/plugins/zxbox/keymaps.h b/apps/plugins/zxbox/keymaps.h
index c2d434415c..967b979883 100644
--- a/apps/plugins/zxbox/keymaps.h
+++ b/apps/plugins/zxbox/keymaps.h
@@ -47,24 +47,8 @@
47#define ZX_SELECT BUTTON_SELECT 47#define ZX_SELECT BUTTON_SELECT
48#define ZX_MENU BUTTON_PLAY 48#define ZX_MENU BUTTON_PLAY
49 49
50#elif CONFIG_KEYPAD == RECORDER_PAD
51#define ZX_SELECT BUTTON_PLAY
52#define ZX_MENU BUTTON_F1
53#define ZX_LEFT BUTTON_LEFT
54#define ZX_RIGHT BUTTON_RIGHT
55#define ZX_UP BUTTON_UP
56#define ZX_DOWN BUTTON_DOWN
57
58#elif CONFIG_KEYPAD == ONDIO_PAD
59#define ZX_SELECT BUTTON_MENU
60#define ZX_MENU BUTTON_OFF
61#define ZX_LEFT BUTTON_LEFT
62#define ZX_RIGHT BUTTON_RIGHT
63#define ZX_UP BUTTON_UP
64#define ZX_DOWN BUTTON_DOWN
65
66#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD 50#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
67#define ZX_SELECT BUTTON_SELECT 51#define ZX_SELECT BUTTON_SELECT
68#define ZX_MENU BUTTON_PLAY 52#define ZX_MENU BUTTON_PLAY
69#define ZX_LEFT BUTTON_LEFT 53#define ZX_LEFT BUTTON_LEFT
70#define ZX_RIGHT BUTTON_RIGHT 54#define ZX_RIGHT BUTTON_RIGHT
diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c
index 046f07379d..4dc50e2ae8 100644
--- a/apps/plugins/zxbox/zxbox_keyb.c
+++ b/apps/plugins/zxbox/zxbox_keyb.c
@@ -7,12 +7,6 @@
7#define O_BINARY 0 7#define O_BINARY 0
8#endif 8#endif
9 9
10#if CONFIG_KEYPAD == RECORDER_PAD
11#define BUTTONBAR_HEIGHT 8
12#else
13#define BUTTONBAR_HEIGHT 0
14#endif
15
16#define DEFAULT_MARGIN 6 10#define DEFAULT_MARGIN 6
17#define KBD_BUF_SIZE 500 11#define KBD_BUF_SIZE 500
18#define kbd_loaded false 12#define kbd_loaded false
@@ -27,22 +21,6 @@
27#define KBD_UP BUTTON_UP 21#define KBD_UP BUTTON_UP
28#define KBD_DOWN BUTTON_DOWN 22#define KBD_DOWN BUTTON_DOWN
29 23
30#elif CONFIG_KEYPAD == RECORDER_PAD
31#define KBD_SELECT BUTTON_PLAY
32#define KBD_ABORT BUTTON_OFF
33#define KBD_LEFT BUTTON_LEFT
34#define KBD_RIGHT BUTTON_RIGHT
35#define KBD_UP BUTTON_UP
36#define KBD_DOWN BUTTON_DOWN
37
38#elif CONFIG_KEYPAD == ONDIO_PAD /* restricted Ondio keypad */
39#define KBD_SELECT BUTTON_MENU
40#define KBD_ABORT BUTTON_OFF
41#define KBD_LEFT BUTTON_LEFT
42#define KBD_RIGHT BUTTON_RIGHT
43#define KBD_UP BUTTON_UP
44#define KBD_DOWN BUTTON_DOWN
45
46#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ 24#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
47 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 25 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
48 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 26 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
@@ -412,7 +390,7 @@ int zx_kbd_input(char* text/*, int buflen*/)
412 param[l].font_h = param[l].font->height; 390 param[l].font_h = param[l].font->height;
413 391
414 /* check if FONT_UI fits the screen */ 392 /* check if FONT_UI fits the screen */
415 if (2*param[l].font_h+3 + BUTTONBAR_HEIGHT > 393 if (2*param[l].font_h+3 >
416 rb->screens[l]->getheight()) { 394 rb->screens[l]->getheight()) {
417 param[l].font = rb->font_get(FONT_SYSFIXED); 395 param[l].font = rb->font_get(FONT_SYSFIXED);
418 param[l].font_h = param[l].font->height; 396 param[l].font_h = param[l].font->height;
@@ -492,10 +470,10 @@ int zx_kbd_input(char* text/*, int buflen*/)
492 param[l].lines = param[l].DEFAULT_LINES; 470 param[l].lines = param[l].DEFAULT_LINES;
493 param[l].keyboard_margin = DEFAULT_MARGIN; 471 param[l].keyboard_margin = DEFAULT_MARGIN;
494 } else { 472 } else {
495 param[l].lines = (rb->screens[l]->lcdheight - BUTTONBAR_HEIGHT - 473 param[l].lines = (rb->screens[l]->lcdheight -
496 statusbar_size) / param[l].font_h - 1; 474 statusbar_size) / param[l].font_h - 1;
497 param[l].keyboard_margin = rb->screens[l]->lcdheight - 475 param[l].keyboard_margin = rb->screens[l]->lcdheight -
498 BUTTONBAR_HEIGHT - statusbar_size - 476 statusbar_size -
499 (param[l].lines+1)*param[l].font_h; 477 (param[l].lines+1)*param[l].font_h;
500 if (param[l].keyboard_margin < 3) { 478 if (param[l].keyboard_margin < 3) {
501 param[l].lines--; 479 param[l].lines--;