2291 lines
		
	
	
		
			101 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			2291 lines
		
	
	
		
			101 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * ESFMu: emulator for the ESS "ESFM" enhanced OPL3 clone
 | |
|  * Copyright (C) 2023 Kagamiin~
 | |
|  *
 | |
|  * This file includes code and data from the Nuked OPL3 project, copyright (C)
 | |
|  * 2013-2023 Nuke.YKT. Its usage, modification and redistribution is allowed
 | |
|  * under the terms of the GNU Lesser General Public License version 2.1 or
 | |
|  * later.
 | |
|  *
 | |
|  * ESFMu is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU Lesser General Public License as
 | |
|  * published by the Free Software Foundation, either version 2.1
 | |
|  * of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * ESFMu is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU Lesser General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public License
 | |
|  * along with ESFMu. If not, see <https://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * ESFMu wouldn't have been possible without the hard work and dedication of
 | |
|  * the retro computer hardware research and preservation community.
 | |
|  *
 | |
|  * I'd like to thank:
 | |
|  *  - Nuke.YKT
 | |
|  *        Developer of Nuked OPL3, which was the basis for ESFMu's code and
 | |
|  *        also a great learning resource on Yamaha FM synthesis for myself.
 | |
|  *        Nuke.YKT also gives shoutouts on behalf of Nuked OPL3 to:
 | |
|  *        - MAME Development Team(Jarek Burczynski, Tatsuyuki Satoh):
 | |
|  *              Feedback and Rhythm part calculation information.
 | |
|  *        - forums.submarine.org.uk(carbon14, opl3):
 | |
|  *              Tremolo and phase generator calculation information.
 | |
|  *        - OPLx decapsulated(Matthew Gambrell, Olli Niemitalo):
 | |
|  *              OPL2 ROMs.
 | |
|  *        - siliconpr0n.org(John McMaster, digshadow):
 | |
|  *              YMF262 and VRC VII decaps and die shots.
 | |
|  * - rainwarrior
 | |
|  *       For performing the initial research on ESFM drivers and documenting
 | |
|  *       ESS's patent on native mode operator organization.
 | |
|  * - jwt27
 | |
|  *       For kickstarting the ESFM research project and compiling rainwarrior's
 | |
|  *       findings and more in an accessible document ("ESFM Demystified").
 | |
|  * - pachuco/CatButts
 | |
|  *       For documenting ESS's patent on ESFM's feedback implementation, which
 | |
|  *       was vital in getting ESFMu's sound output to be accurate.
 | |
|  * - And everybody who helped out with real hardware testing
 | |
|  */
 | |
| 
 | |
| #include "esfm.h"
 | |
| #include <stdint.h>
 | |
| #include <stdlib.h>
 | |
| #include <stddef.h>
 | |
| #include <string.h>
 | |
| #include <stdbool.h>
 | |
| 
 | |
| /*
 | |
|  * Log-scale quarter sine table extracted from OPL3 ROM; taken straight from
 | |
|  * Nuked OPL3 source code.
 | |
|  * TODO: Extract sine table from ESFM die scans... does ESFM even use a sine
 | |
|  * table? Patent documents give a hint to a possible method of generating sine
 | |
|  * waves using some sort of boolean logic wizardry (lol)
 | |
|  * Optimization: All 8 waveforms are calculated and unfolded from the actual
 | |
|  * data in OPL3's ROM. Negative entries are marked by 0x8000.
 | |
|  */
 | |
| static const uint16_t logsinrom[1024*8] = {
 | |
| 	// wave 0
 | |
| 	0x0859, 0x06c3, 0x0607, 0x058b, 0x052e, 0x04e4, 0x04a6, 0x0471, 
 | |
| 	0x0443, 0x041a, 0x03f5, 0x03d3, 0x03b5, 0x0398, 0x037e, 0x0365, 
 | |
| 	0x034e, 0x0339, 0x0324, 0x0311, 0x02ff, 0x02ed, 0x02dc, 0x02cd, 
 | |
| 	0x02bd, 0x02af, 0x02a0, 0x0293, 0x0286, 0x0279, 0x026d, 0x0261, 
 | |
| 	0x0256, 0x024b, 0x0240, 0x0236, 0x022c, 0x0222, 0x0218, 0x020f, 
 | |
| 	0x0206, 0x01fd, 0x01f5, 0x01ec, 0x01e4, 0x01dc, 0x01d4, 0x01cd, 
 | |
| 	0x01c5, 0x01be, 0x01b7, 0x01b0, 0x01a9, 0x01a2, 0x019b, 0x0195, 
 | |
| 	0x018f, 0x0188, 0x0182, 0x017c, 0x0177, 0x0171, 0x016b, 0x0166, 
 | |
| 	0x0160, 0x015b, 0x0155, 0x0150, 0x014b, 0x0146, 0x0141, 0x013c, 
 | |
| 	0x0137, 0x0133, 0x012e, 0x0129, 0x0125, 0x0121, 0x011c, 0x0118, 
 | |
| 	0x0114, 0x010f, 0x010b, 0x0107, 0x0103, 0x00ff, 0x00fb, 0x00f8, 
 | |
| 	0x00f4, 0x00f0, 0x00ec, 0x00e9, 0x00e5, 0x00e2, 0x00de, 0x00db, 
 | |
| 	0x00d7, 0x00d4, 0x00d1, 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 
 | |
| 	0x00be, 0x00bb, 0x00b8, 0x00b5, 0x00b2, 0x00af, 0x00ac, 0x00a9, 
 | |
| 	0x00a7, 0x00a4, 0x00a1, 0x009f, 0x009c, 0x0099, 0x0097, 0x0094, 
 | |
| 	0x0092, 0x008f, 0x008d, 0x008a, 0x0088, 0x0086, 0x0083, 0x0081, 
 | |
| 	0x007f, 0x007d, 0x007a, 0x0078, 0x0076, 0x0074, 0x0072, 0x0070, 
 | |
| 	0x006e, 0x006c, 0x006a, 0x0068, 0x0066, 0x0064, 0x0062, 0x0060, 
 | |
| 	0x005e, 0x005c, 0x005b, 0x0059, 0x0057, 0x0055, 0x0053, 0x0052, 
 | |
| 	0x0050, 0x004e, 0x004d, 0x004b, 0x004a, 0x0048, 0x0046, 0x0045, 
 | |
| 	0x0043, 0x0042, 0x0040, 0x003f, 0x003e, 0x003c, 0x003b, 0x0039, 
 | |
| 	0x0038, 0x0037, 0x0035, 0x0034, 0x0033, 0x0031, 0x0030, 0x002f, 
 | |
| 	0x002e, 0x002d, 0x002b, 0x002a, 0x0029, 0x0028, 0x0027, 0x0026, 
 | |
| 	0x0025, 0x0024, 0x0023, 0x0022, 0x0021, 0x0020, 0x001f, 0x001e, 
 | |
| 	0x001d, 0x001c, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0017, 
 | |
| 	0x0016, 0x0015, 0x0014, 0x0014, 0x0013, 0x0012, 0x0011, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000f, 0x000e, 0x000d, 0x000d, 0x000c, 0x000c, 
 | |
| 	0x000b, 0x000a, 0x000a, 0x0009, 0x0009, 0x0008, 0x0008, 0x0007, 
 | |
| 	0x0007, 0x0007, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 
 | |
| 	0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 
 | |
| 	0x0004, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0007, 0x0007, 
 | |
| 	0x0007, 0x0008, 0x0008, 0x0009, 0x0009, 0x000a, 0x000a, 0x000b, 
 | |
| 	0x000c, 0x000c, 0x000d, 0x000d, 0x000e, 0x000f, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0011, 0x0012, 0x0013, 0x0014, 0x0014, 0x0015, 0x0016, 
 | |
| 	0x0017, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 
 | |
| 	0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 
 | |
| 	0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002d, 0x002e, 
 | |
| 	0x002f, 0x0030, 0x0031, 0x0033, 0x0034, 0x0035, 0x0037, 0x0038, 
 | |
| 	0x0039, 0x003b, 0x003c, 0x003e, 0x003f, 0x0040, 0x0042, 0x0043, 
 | |
| 	0x0045, 0x0046, 0x0048, 0x004a, 0x004b, 0x004d, 0x004e, 0x0050, 
 | |
| 	0x0052, 0x0053, 0x0055, 0x0057, 0x0059, 0x005b, 0x005c, 0x005e, 
 | |
| 	0x0060, 0x0062, 0x0064, 0x0066, 0x0068, 0x006a, 0x006c, 0x006e, 
 | |
| 	0x0070, 0x0072, 0x0074, 0x0076, 0x0078, 0x007a, 0x007d, 0x007f, 
 | |
| 	0x0081, 0x0083, 0x0086, 0x0088, 0x008a, 0x008d, 0x008f, 0x0092, 
 | |
| 	0x0094, 0x0097, 0x0099, 0x009c, 0x009f, 0x00a1, 0x00a4, 0x00a7, 
 | |
| 	0x00a9, 0x00ac, 0x00af, 0x00b2, 0x00b5, 0x00b8, 0x00bb, 0x00be, 
 | |
| 	0x00c1, 0x00c4, 0x00c7, 0x00ca, 0x00cd, 0x00d1, 0x00d4, 0x00d7, 
 | |
| 	0x00db, 0x00de, 0x00e2, 0x00e5, 0x00e9, 0x00ec, 0x00f0, 0x00f4, 
 | |
| 	0x00f8, 0x00fb, 0x00ff, 0x0103, 0x0107, 0x010b, 0x010f, 0x0114, 
 | |
| 	0x0118, 0x011c, 0x0121, 0x0125, 0x0129, 0x012e, 0x0133, 0x0137, 
 | |
| 	0x013c, 0x0141, 0x0146, 0x014b, 0x0150, 0x0155, 0x015b, 0x0160, 
 | |
| 	0x0166, 0x016b, 0x0171, 0x0177, 0x017c, 0x0182, 0x0188, 0x018f, 
 | |
| 	0x0195, 0x019b, 0x01a2, 0x01a9, 0x01b0, 0x01b7, 0x01be, 0x01c5, 
 | |
| 	0x01cd, 0x01d4, 0x01dc, 0x01e4, 0x01ec, 0x01f5, 0x01fd, 0x0206, 
 | |
| 	0x020f, 0x0218, 0x0222, 0x022c, 0x0236, 0x0240, 0x024b, 0x0256, 
 | |
| 	0x0261, 0x026d, 0x0279, 0x0286, 0x0293, 0x02a0, 0x02af, 0x02bd, 
 | |
| 	0x02cd, 0x02dc, 0x02ed, 0x02ff, 0x0311, 0x0324, 0x0339, 0x034e, 
 | |
| 	0x0365, 0x037e, 0x0398, 0x03b5, 0x03d3, 0x03f5, 0x041a, 0x0443, 
 | |
| 	0x0471, 0x04a6, 0x04e4, 0x052e, 0x058b, 0x0607, 0x06c3, 0x0859, 
 | |
| 	0x8859, 0x86c3, 0x8607, 0x858b, 0x852e, 0x84e4, 0x84a6, 0x8471, 
 | |
| 	0x8443, 0x841a, 0x83f5, 0x83d3, 0x83b5, 0x8398, 0x837e, 0x8365, 
 | |
| 	0x834e, 0x8339, 0x8324, 0x8311, 0x82ff, 0x82ed, 0x82dc, 0x82cd, 
 | |
| 	0x82bd, 0x82af, 0x82a0, 0x8293, 0x8286, 0x8279, 0x826d, 0x8261, 
 | |
| 	0x8256, 0x824b, 0x8240, 0x8236, 0x822c, 0x8222, 0x8218, 0x820f, 
 | |
| 	0x8206, 0x81fd, 0x81f5, 0x81ec, 0x81e4, 0x81dc, 0x81d4, 0x81cd, 
 | |
| 	0x81c5, 0x81be, 0x81b7, 0x81b0, 0x81a9, 0x81a2, 0x819b, 0x8195, 
 | |
| 	0x818f, 0x8188, 0x8182, 0x817c, 0x8177, 0x8171, 0x816b, 0x8166, 
 | |
| 	0x8160, 0x815b, 0x8155, 0x8150, 0x814b, 0x8146, 0x8141, 0x813c, 
 | |
| 	0x8137, 0x8133, 0x812e, 0x8129, 0x8125, 0x8121, 0x811c, 0x8118, 
 | |
| 	0x8114, 0x810f, 0x810b, 0x8107, 0x8103, 0x80ff, 0x80fb, 0x80f8, 
 | |
| 	0x80f4, 0x80f0, 0x80ec, 0x80e9, 0x80e5, 0x80e2, 0x80de, 0x80db, 
 | |
| 	0x80d7, 0x80d4, 0x80d1, 0x80cd, 0x80ca, 0x80c7, 0x80c4, 0x80c1, 
 | |
| 	0x80be, 0x80bb, 0x80b8, 0x80b5, 0x80b2, 0x80af, 0x80ac, 0x80a9, 
 | |
| 	0x80a7, 0x80a4, 0x80a1, 0x809f, 0x809c, 0x8099, 0x8097, 0x8094, 
 | |
| 	0x8092, 0x808f, 0x808d, 0x808a, 0x8088, 0x8086, 0x8083, 0x8081, 
 | |
| 	0x807f, 0x807d, 0x807a, 0x8078, 0x8076, 0x8074, 0x8072, 0x8070, 
 | |
| 	0x806e, 0x806c, 0x806a, 0x8068, 0x8066, 0x8064, 0x8062, 0x8060, 
 | |
| 	0x805e, 0x805c, 0x805b, 0x8059, 0x8057, 0x8055, 0x8053, 0x8052, 
 | |
| 	0x8050, 0x804e, 0x804d, 0x804b, 0x804a, 0x8048, 0x8046, 0x8045, 
 | |
| 	0x8043, 0x8042, 0x8040, 0x803f, 0x803e, 0x803c, 0x803b, 0x8039, 
 | |
| 	0x8038, 0x8037, 0x8035, 0x8034, 0x8033, 0x8031, 0x8030, 0x802f, 
 | |
| 	0x802e, 0x802d, 0x802b, 0x802a, 0x8029, 0x8028, 0x8027, 0x8026, 
 | |
| 	0x8025, 0x8024, 0x8023, 0x8022, 0x8021, 0x8020, 0x801f, 0x801e, 
 | |
| 	0x801d, 0x801c, 0x801b, 0x801a, 0x8019, 0x8018, 0x8017, 0x8017, 
 | |
| 	0x8016, 0x8015, 0x8014, 0x8014, 0x8013, 0x8012, 0x8011, 0x8011, 
 | |
| 	0x8010, 0x800f, 0x800f, 0x800e, 0x800d, 0x800d, 0x800c, 0x800c, 
 | |
| 	0x800b, 0x800a, 0x800a, 0x8009, 0x8009, 0x8008, 0x8008, 0x8007, 
 | |
| 	0x8007, 0x8007, 0x8006, 0x8006, 0x8005, 0x8005, 0x8005, 0x8004, 
 | |
| 	0x8004, 0x8004, 0x8003, 0x8003, 0x8003, 0x8002, 0x8002, 0x8002, 
 | |
| 	0x8002, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8002, 
 | |
| 	0x8002, 0x8002, 0x8002, 0x8003, 0x8003, 0x8003, 0x8004, 0x8004, 
 | |
| 	0x8004, 0x8005, 0x8005, 0x8005, 0x8006, 0x8006, 0x8007, 0x8007, 
 | |
| 	0x8007, 0x8008, 0x8008, 0x8009, 0x8009, 0x800a, 0x800a, 0x800b, 
 | |
| 	0x800c, 0x800c, 0x800d, 0x800d, 0x800e, 0x800f, 0x800f, 0x8010, 
 | |
| 	0x8011, 0x8011, 0x8012, 0x8013, 0x8014, 0x8014, 0x8015, 0x8016, 
 | |
| 	0x8017, 0x8017, 0x8018, 0x8019, 0x801a, 0x801b, 0x801c, 0x801d, 
 | |
| 	0x801e, 0x801f, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 
 | |
| 	0x8026, 0x8027, 0x8028, 0x8029, 0x802a, 0x802b, 0x802d, 0x802e, 
 | |
| 	0x802f, 0x8030, 0x8031, 0x8033, 0x8034, 0x8035, 0x8037, 0x8038, 
 | |
| 	0x8039, 0x803b, 0x803c, 0x803e, 0x803f, 0x8040, 0x8042, 0x8043, 
 | |
| 	0x8045, 0x8046, 0x8048, 0x804a, 0x804b, 0x804d, 0x804e, 0x8050, 
 | |
| 	0x8052, 0x8053, 0x8055, 0x8057, 0x8059, 0x805b, 0x805c, 0x805e, 
 | |
| 	0x8060, 0x8062, 0x8064, 0x8066, 0x8068, 0x806a, 0x806c, 0x806e, 
 | |
| 	0x8070, 0x8072, 0x8074, 0x8076, 0x8078, 0x807a, 0x807d, 0x807f, 
 | |
| 	0x8081, 0x8083, 0x8086, 0x8088, 0x808a, 0x808d, 0x808f, 0x8092, 
 | |
| 	0x8094, 0x8097, 0x8099, 0x809c, 0x809f, 0x80a1, 0x80a4, 0x80a7, 
 | |
| 	0x80a9, 0x80ac, 0x80af, 0x80b2, 0x80b5, 0x80b8, 0x80bb, 0x80be, 
 | |
| 	0x80c1, 0x80c4, 0x80c7, 0x80ca, 0x80cd, 0x80d1, 0x80d4, 0x80d7, 
 | |
| 	0x80db, 0x80de, 0x80e2, 0x80e5, 0x80e9, 0x80ec, 0x80f0, 0x80f4, 
 | |
| 	0x80f8, 0x80fb, 0x80ff, 0x8103, 0x8107, 0x810b, 0x810f, 0x8114, 
 | |
| 	0x8118, 0x811c, 0x8121, 0x8125, 0x8129, 0x812e, 0x8133, 0x8137, 
 | |
| 	0x813c, 0x8141, 0x8146, 0x814b, 0x8150, 0x8155, 0x815b, 0x8160, 
 | |
| 	0x8166, 0x816b, 0x8171, 0x8177, 0x817c, 0x8182, 0x8188, 0x818f, 
 | |
| 	0x8195, 0x819b, 0x81a2, 0x81a9, 0x81b0, 0x81b7, 0x81be, 0x81c5, 
 | |
| 	0x81cd, 0x81d4, 0x81dc, 0x81e4, 0x81ec, 0x81f5, 0x81fd, 0x8206, 
 | |
| 	0x820f, 0x8218, 0x8222, 0x822c, 0x8236, 0x8240, 0x824b, 0x8256, 
 | |
| 	0x8261, 0x826d, 0x8279, 0x8286, 0x8293, 0x82a0, 0x82af, 0x82bd, 
 | |
| 	0x82cd, 0x82dc, 0x82ed, 0x82ff, 0x8311, 0x8324, 0x8339, 0x834e, 
 | |
| 	0x8365, 0x837e, 0x8398, 0x83b5, 0x83d3, 0x83f5, 0x841a, 0x8443, 
 | |
| 	0x8471, 0x84a6, 0x84e4, 0x852e, 0x858b, 0x8607, 0x86c3, 0x8859, 
 | |
| 	// wave 1
 | |
| 	0x0859, 0x06c3, 0x0607, 0x058b, 0x052e, 0x04e4, 0x04a6, 0x0471, 
 | |
| 	0x0443, 0x041a, 0x03f5, 0x03d3, 0x03b5, 0x0398, 0x037e, 0x0365, 
 | |
| 	0x034e, 0x0339, 0x0324, 0x0311, 0x02ff, 0x02ed, 0x02dc, 0x02cd, 
 | |
| 	0x02bd, 0x02af, 0x02a0, 0x0293, 0x0286, 0x0279, 0x026d, 0x0261, 
 | |
| 	0x0256, 0x024b, 0x0240, 0x0236, 0x022c, 0x0222, 0x0218, 0x020f, 
 | |
| 	0x0206, 0x01fd, 0x01f5, 0x01ec, 0x01e4, 0x01dc, 0x01d4, 0x01cd, 
 | |
| 	0x01c5, 0x01be, 0x01b7, 0x01b0, 0x01a9, 0x01a2, 0x019b, 0x0195, 
 | |
| 	0x018f, 0x0188, 0x0182, 0x017c, 0x0177, 0x0171, 0x016b, 0x0166, 
 | |
| 	0x0160, 0x015b, 0x0155, 0x0150, 0x014b, 0x0146, 0x0141, 0x013c, 
 | |
| 	0x0137, 0x0133, 0x012e, 0x0129, 0x0125, 0x0121, 0x011c, 0x0118, 
 | |
| 	0x0114, 0x010f, 0x010b, 0x0107, 0x0103, 0x00ff, 0x00fb, 0x00f8, 
 | |
| 	0x00f4, 0x00f0, 0x00ec, 0x00e9, 0x00e5, 0x00e2, 0x00de, 0x00db, 
 | |
| 	0x00d7, 0x00d4, 0x00d1, 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 
 | |
| 	0x00be, 0x00bb, 0x00b8, 0x00b5, 0x00b2, 0x00af, 0x00ac, 0x00a9, 
 | |
| 	0x00a7, 0x00a4, 0x00a1, 0x009f, 0x009c, 0x0099, 0x0097, 0x0094, 
 | |
| 	0x0092, 0x008f, 0x008d, 0x008a, 0x0088, 0x0086, 0x0083, 0x0081, 
 | |
| 	0x007f, 0x007d, 0x007a, 0x0078, 0x0076, 0x0074, 0x0072, 0x0070, 
 | |
| 	0x006e, 0x006c, 0x006a, 0x0068, 0x0066, 0x0064, 0x0062, 0x0060, 
 | |
| 	0x005e, 0x005c, 0x005b, 0x0059, 0x0057, 0x0055, 0x0053, 0x0052, 
 | |
| 	0x0050, 0x004e, 0x004d, 0x004b, 0x004a, 0x0048, 0x0046, 0x0045, 
 | |
| 	0x0043, 0x0042, 0x0040, 0x003f, 0x003e, 0x003c, 0x003b, 0x0039, 
 | |
| 	0x0038, 0x0037, 0x0035, 0x0034, 0x0033, 0x0031, 0x0030, 0x002f, 
 | |
| 	0x002e, 0x002d, 0x002b, 0x002a, 0x0029, 0x0028, 0x0027, 0x0026, 
 | |
| 	0x0025, 0x0024, 0x0023, 0x0022, 0x0021, 0x0020, 0x001f, 0x001e, 
 | |
| 	0x001d, 0x001c, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0017, 
 | |
| 	0x0016, 0x0015, 0x0014, 0x0014, 0x0013, 0x0012, 0x0011, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000f, 0x000e, 0x000d, 0x000d, 0x000c, 0x000c, 
 | |
| 	0x000b, 0x000a, 0x000a, 0x0009, 0x0009, 0x0008, 0x0008, 0x0007, 
 | |
| 	0x0007, 0x0007, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 
 | |
| 	0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 
 | |
| 	0x0004, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0007, 0x0007, 
 | |
| 	0x0007, 0x0008, 0x0008, 0x0009, 0x0009, 0x000a, 0x000a, 0x000b, 
 | |
| 	0x000c, 0x000c, 0x000d, 0x000d, 0x000e, 0x000f, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0011, 0x0012, 0x0013, 0x0014, 0x0014, 0x0015, 0x0016, 
 | |
| 	0x0017, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 
 | |
| 	0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 
 | |
| 	0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002d, 0x002e, 
 | |
| 	0x002f, 0x0030, 0x0031, 0x0033, 0x0034, 0x0035, 0x0037, 0x0038, 
 | |
| 	0x0039, 0x003b, 0x003c, 0x003e, 0x003f, 0x0040, 0x0042, 0x0043, 
 | |
| 	0x0045, 0x0046, 0x0048, 0x004a, 0x004b, 0x004d, 0x004e, 0x0050, 
 | |
| 	0x0052, 0x0053, 0x0055, 0x0057, 0x0059, 0x005b, 0x005c, 0x005e, 
 | |
| 	0x0060, 0x0062, 0x0064, 0x0066, 0x0068, 0x006a, 0x006c, 0x006e, 
 | |
| 	0x0070, 0x0072, 0x0074, 0x0076, 0x0078, 0x007a, 0x007d, 0x007f, 
 | |
| 	0x0081, 0x0083, 0x0086, 0x0088, 0x008a, 0x008d, 0x008f, 0x0092, 
 | |
| 	0x0094, 0x0097, 0x0099, 0x009c, 0x009f, 0x00a1, 0x00a4, 0x00a7, 
 | |
| 	0x00a9, 0x00ac, 0x00af, 0x00b2, 0x00b5, 0x00b8, 0x00bb, 0x00be, 
 | |
| 	0x00c1, 0x00c4, 0x00c7, 0x00ca, 0x00cd, 0x00d1, 0x00d4, 0x00d7, 
 | |
| 	0x00db, 0x00de, 0x00e2, 0x00e5, 0x00e9, 0x00ec, 0x00f0, 0x00f4, 
 | |
| 	0x00f8, 0x00fb, 0x00ff, 0x0103, 0x0107, 0x010b, 0x010f, 0x0114, 
 | |
| 	0x0118, 0x011c, 0x0121, 0x0125, 0x0129, 0x012e, 0x0133, 0x0137, 
 | |
| 	0x013c, 0x0141, 0x0146, 0x014b, 0x0150, 0x0155, 0x015b, 0x0160, 
 | |
| 	0x0166, 0x016b, 0x0171, 0x0177, 0x017c, 0x0182, 0x0188, 0x018f, 
 | |
| 	0x0195, 0x019b, 0x01a2, 0x01a9, 0x01b0, 0x01b7, 0x01be, 0x01c5, 
 | |
| 	0x01cd, 0x01d4, 0x01dc, 0x01e4, 0x01ec, 0x01f5, 0x01fd, 0x0206, 
 | |
| 	0x020f, 0x0218, 0x0222, 0x022c, 0x0236, 0x0240, 0x024b, 0x0256, 
 | |
| 	0x0261, 0x026d, 0x0279, 0x0286, 0x0293, 0x02a0, 0x02af, 0x02bd, 
 | |
| 	0x02cd, 0x02dc, 0x02ed, 0x02ff, 0x0311, 0x0324, 0x0339, 0x034e, 
 | |
| 	0x0365, 0x037e, 0x0398, 0x03b5, 0x03d3, 0x03f5, 0x041a, 0x0443, 
 | |
| 	0x0471, 0x04a6, 0x04e4, 0x052e, 0x058b, 0x0607, 0x06c3, 0x0859, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	// wave 2
 | |
| 	0x0859, 0x06c3, 0x0607, 0x058b, 0x052e, 0x04e4, 0x04a6, 0x0471, 
 | |
| 	0x0443, 0x041a, 0x03f5, 0x03d3, 0x03b5, 0x0398, 0x037e, 0x0365, 
 | |
| 	0x034e, 0x0339, 0x0324, 0x0311, 0x02ff, 0x02ed, 0x02dc, 0x02cd, 
 | |
| 	0x02bd, 0x02af, 0x02a0, 0x0293, 0x0286, 0x0279, 0x026d, 0x0261, 
 | |
| 	0x0256, 0x024b, 0x0240, 0x0236, 0x022c, 0x0222, 0x0218, 0x020f, 
 | |
| 	0x0206, 0x01fd, 0x01f5, 0x01ec, 0x01e4, 0x01dc, 0x01d4, 0x01cd, 
 | |
| 	0x01c5, 0x01be, 0x01b7, 0x01b0, 0x01a9, 0x01a2, 0x019b, 0x0195, 
 | |
| 	0x018f, 0x0188, 0x0182, 0x017c, 0x0177, 0x0171, 0x016b, 0x0166, 
 | |
| 	0x0160, 0x015b, 0x0155, 0x0150, 0x014b, 0x0146, 0x0141, 0x013c, 
 | |
| 	0x0137, 0x0133, 0x012e, 0x0129, 0x0125, 0x0121, 0x011c, 0x0118, 
 | |
| 	0x0114, 0x010f, 0x010b, 0x0107, 0x0103, 0x00ff, 0x00fb, 0x00f8, 
 | |
| 	0x00f4, 0x00f0, 0x00ec, 0x00e9, 0x00e5, 0x00e2, 0x00de, 0x00db, 
 | |
| 	0x00d7, 0x00d4, 0x00d1, 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 
 | |
| 	0x00be, 0x00bb, 0x00b8, 0x00b5, 0x00b2, 0x00af, 0x00ac, 0x00a9, 
 | |
| 	0x00a7, 0x00a4, 0x00a1, 0x009f, 0x009c, 0x0099, 0x0097, 0x0094, 
 | |
| 	0x0092, 0x008f, 0x008d, 0x008a, 0x0088, 0x0086, 0x0083, 0x0081, 
 | |
| 	0x007f, 0x007d, 0x007a, 0x0078, 0x0076, 0x0074, 0x0072, 0x0070, 
 | |
| 	0x006e, 0x006c, 0x006a, 0x0068, 0x0066, 0x0064, 0x0062, 0x0060, 
 | |
| 	0x005e, 0x005c, 0x005b, 0x0059, 0x0057, 0x0055, 0x0053, 0x0052, 
 | |
| 	0x0050, 0x004e, 0x004d, 0x004b, 0x004a, 0x0048, 0x0046, 0x0045, 
 | |
| 	0x0043, 0x0042, 0x0040, 0x003f, 0x003e, 0x003c, 0x003b, 0x0039, 
 | |
| 	0x0038, 0x0037, 0x0035, 0x0034, 0x0033, 0x0031, 0x0030, 0x002f, 
 | |
| 	0x002e, 0x002d, 0x002b, 0x002a, 0x0029, 0x0028, 0x0027, 0x0026, 
 | |
| 	0x0025, 0x0024, 0x0023, 0x0022, 0x0021, 0x0020, 0x001f, 0x001e, 
 | |
| 	0x001d, 0x001c, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0017, 
 | |
| 	0x0016, 0x0015, 0x0014, 0x0014, 0x0013, 0x0012, 0x0011, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000f, 0x000e, 0x000d, 0x000d, 0x000c, 0x000c, 
 | |
| 	0x000b, 0x000a, 0x000a, 0x0009, 0x0009, 0x0008, 0x0008, 0x0007, 
 | |
| 	0x0007, 0x0007, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 
 | |
| 	0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 
 | |
| 	0x0004, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0007, 0x0007, 
 | |
| 	0x0007, 0x0008, 0x0008, 0x0009, 0x0009, 0x000a, 0x000a, 0x000b, 
 | |
| 	0x000c, 0x000c, 0x000d, 0x000d, 0x000e, 0x000f, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0011, 0x0012, 0x0013, 0x0014, 0x0014, 0x0015, 0x0016, 
 | |
| 	0x0017, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 
 | |
| 	0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 
 | |
| 	0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002d, 0x002e, 
 | |
| 	0x002f, 0x0030, 0x0031, 0x0033, 0x0034, 0x0035, 0x0037, 0x0038, 
 | |
| 	0x0039, 0x003b, 0x003c, 0x003e, 0x003f, 0x0040, 0x0042, 0x0043, 
 | |
| 	0x0045, 0x0046, 0x0048, 0x004a, 0x004b, 0x004d, 0x004e, 0x0050, 
 | |
| 	0x0052, 0x0053, 0x0055, 0x0057, 0x0059, 0x005b, 0x005c, 0x005e, 
 | |
| 	0x0060, 0x0062, 0x0064, 0x0066, 0x0068, 0x006a, 0x006c, 0x006e, 
 | |
| 	0x0070, 0x0072, 0x0074, 0x0076, 0x0078, 0x007a, 0x007d, 0x007f, 
 | |
| 	0x0081, 0x0083, 0x0086, 0x0088, 0x008a, 0x008d, 0x008f, 0x0092, 
 | |
| 	0x0094, 0x0097, 0x0099, 0x009c, 0x009f, 0x00a1, 0x00a4, 0x00a7, 
 | |
| 	0x00a9, 0x00ac, 0x00af, 0x00b2, 0x00b5, 0x00b8, 0x00bb, 0x00be, 
 | |
| 	0x00c1, 0x00c4, 0x00c7, 0x00ca, 0x00cd, 0x00d1, 0x00d4, 0x00d7, 
 | |
| 	0x00db, 0x00de, 0x00e2, 0x00e5, 0x00e9, 0x00ec, 0x00f0, 0x00f4, 
 | |
| 	0x00f8, 0x00fb, 0x00ff, 0x0103, 0x0107, 0x010b, 0x010f, 0x0114, 
 | |
| 	0x0118, 0x011c, 0x0121, 0x0125, 0x0129, 0x012e, 0x0133, 0x0137, 
 | |
| 	0x013c, 0x0141, 0x0146, 0x014b, 0x0150, 0x0155, 0x015b, 0x0160, 
 | |
| 	0x0166, 0x016b, 0x0171, 0x0177, 0x017c, 0x0182, 0x0188, 0x018f, 
 | |
| 	0x0195, 0x019b, 0x01a2, 0x01a9, 0x01b0, 0x01b7, 0x01be, 0x01c5, 
 | |
| 	0x01cd, 0x01d4, 0x01dc, 0x01e4, 0x01ec, 0x01f5, 0x01fd, 0x0206, 
 | |
| 	0x020f, 0x0218, 0x0222, 0x022c, 0x0236, 0x0240, 0x024b, 0x0256, 
 | |
| 	0x0261, 0x026d, 0x0279, 0x0286, 0x0293, 0x02a0, 0x02af, 0x02bd, 
 | |
| 	0x02cd, 0x02dc, 0x02ed, 0x02ff, 0x0311, 0x0324, 0x0339, 0x034e, 
 | |
| 	0x0365, 0x037e, 0x0398, 0x03b5, 0x03d3, 0x03f5, 0x041a, 0x0443, 
 | |
| 	0x0471, 0x04a6, 0x04e4, 0x052e, 0x058b, 0x0607, 0x06c3, 0x0859, 
 | |
| 	0x0859, 0x06c3, 0x0607, 0x058b, 0x052e, 0x04e4, 0x04a6, 0x0471, 
 | |
| 	0x0443, 0x041a, 0x03f5, 0x03d3, 0x03b5, 0x0398, 0x037e, 0x0365, 
 | |
| 	0x034e, 0x0339, 0x0324, 0x0311, 0x02ff, 0x02ed, 0x02dc, 0x02cd, 
 | |
| 	0x02bd, 0x02af, 0x02a0, 0x0293, 0x0286, 0x0279, 0x026d, 0x0261, 
 | |
| 	0x0256, 0x024b, 0x0240, 0x0236, 0x022c, 0x0222, 0x0218, 0x020f, 
 | |
| 	0x0206, 0x01fd, 0x01f5, 0x01ec, 0x01e4, 0x01dc, 0x01d4, 0x01cd, 
 | |
| 	0x01c5, 0x01be, 0x01b7, 0x01b0, 0x01a9, 0x01a2, 0x019b, 0x0195, 
 | |
| 	0x018f, 0x0188, 0x0182, 0x017c, 0x0177, 0x0171, 0x016b, 0x0166, 
 | |
| 	0x0160, 0x015b, 0x0155, 0x0150, 0x014b, 0x0146, 0x0141, 0x013c, 
 | |
| 	0x0137, 0x0133, 0x012e, 0x0129, 0x0125, 0x0121, 0x011c, 0x0118, 
 | |
| 	0x0114, 0x010f, 0x010b, 0x0107, 0x0103, 0x00ff, 0x00fb, 0x00f8, 
 | |
| 	0x00f4, 0x00f0, 0x00ec, 0x00e9, 0x00e5, 0x00e2, 0x00de, 0x00db, 
 | |
| 	0x00d7, 0x00d4, 0x00d1, 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 
 | |
| 	0x00be, 0x00bb, 0x00b8, 0x00b5, 0x00b2, 0x00af, 0x00ac, 0x00a9, 
 | |
| 	0x00a7, 0x00a4, 0x00a1, 0x009f, 0x009c, 0x0099, 0x0097, 0x0094, 
 | |
| 	0x0092, 0x008f, 0x008d, 0x008a, 0x0088, 0x0086, 0x0083, 0x0081, 
 | |
| 	0x007f, 0x007d, 0x007a, 0x0078, 0x0076, 0x0074, 0x0072, 0x0070, 
 | |
| 	0x006e, 0x006c, 0x006a, 0x0068, 0x0066, 0x0064, 0x0062, 0x0060, 
 | |
| 	0x005e, 0x005c, 0x005b, 0x0059, 0x0057, 0x0055, 0x0053, 0x0052, 
 | |
| 	0x0050, 0x004e, 0x004d, 0x004b, 0x004a, 0x0048, 0x0046, 0x0045, 
 | |
| 	0x0043, 0x0042, 0x0040, 0x003f, 0x003e, 0x003c, 0x003b, 0x0039, 
 | |
| 	0x0038, 0x0037, 0x0035, 0x0034, 0x0033, 0x0031, 0x0030, 0x002f, 
 | |
| 	0x002e, 0x002d, 0x002b, 0x002a, 0x0029, 0x0028, 0x0027, 0x0026, 
 | |
| 	0x0025, 0x0024, 0x0023, 0x0022, 0x0021, 0x0020, 0x001f, 0x001e, 
 | |
| 	0x001d, 0x001c, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0017, 
 | |
| 	0x0016, 0x0015, 0x0014, 0x0014, 0x0013, 0x0012, 0x0011, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000f, 0x000e, 0x000d, 0x000d, 0x000c, 0x000c, 
 | |
| 	0x000b, 0x000a, 0x000a, 0x0009, 0x0009, 0x0008, 0x0008, 0x0007, 
 | |
| 	0x0007, 0x0007, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 
 | |
| 	0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0002, 0x0002, 0x0003, 0x0003, 0x0003, 0x0004, 0x0004, 
 | |
| 	0x0004, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0007, 0x0007, 
 | |
| 	0x0007, 0x0008, 0x0008, 0x0009, 0x0009, 0x000a, 0x000a, 0x000b, 
 | |
| 	0x000c, 0x000c, 0x000d, 0x000d, 0x000e, 0x000f, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0011, 0x0012, 0x0013, 0x0014, 0x0014, 0x0015, 0x0016, 
 | |
| 	0x0017, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 
 | |
| 	0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 
 | |
| 	0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002d, 0x002e, 
 | |
| 	0x002f, 0x0030, 0x0031, 0x0033, 0x0034, 0x0035, 0x0037, 0x0038, 
 | |
| 	0x0039, 0x003b, 0x003c, 0x003e, 0x003f, 0x0040, 0x0042, 0x0043, 
 | |
| 	0x0045, 0x0046, 0x0048, 0x004a, 0x004b, 0x004d, 0x004e, 0x0050, 
 | |
| 	0x0052, 0x0053, 0x0055, 0x0057, 0x0059, 0x005b, 0x005c, 0x005e, 
 | |
| 	0x0060, 0x0062, 0x0064, 0x0066, 0x0068, 0x006a, 0x006c, 0x006e, 
 | |
| 	0x0070, 0x0072, 0x0074, 0x0076, 0x0078, 0x007a, 0x007d, 0x007f, 
 | |
| 	0x0081, 0x0083, 0x0086, 0x0088, 0x008a, 0x008d, 0x008f, 0x0092, 
 | |
| 	0x0094, 0x0097, 0x0099, 0x009c, 0x009f, 0x00a1, 0x00a4, 0x00a7, 
 | |
| 	0x00a9, 0x00ac, 0x00af, 0x00b2, 0x00b5, 0x00b8, 0x00bb, 0x00be, 
 | |
| 	0x00c1, 0x00c4, 0x00c7, 0x00ca, 0x00cd, 0x00d1, 0x00d4, 0x00d7, 
 | |
| 	0x00db, 0x00de, 0x00e2, 0x00e5, 0x00e9, 0x00ec, 0x00f0, 0x00f4, 
 | |
| 	0x00f8, 0x00fb, 0x00ff, 0x0103, 0x0107, 0x010b, 0x010f, 0x0114, 
 | |
| 	0x0118, 0x011c, 0x0121, 0x0125, 0x0129, 0x012e, 0x0133, 0x0137, 
 | |
| 	0x013c, 0x0141, 0x0146, 0x014b, 0x0150, 0x0155, 0x015b, 0x0160, 
 | |
| 	0x0166, 0x016b, 0x0171, 0x0177, 0x017c, 0x0182, 0x0188, 0x018f, 
 | |
| 	0x0195, 0x019b, 0x01a2, 0x01a9, 0x01b0, 0x01b7, 0x01be, 0x01c5, 
 | |
| 	0x01cd, 0x01d4, 0x01dc, 0x01e4, 0x01ec, 0x01f5, 0x01fd, 0x0206, 
 | |
| 	0x020f, 0x0218, 0x0222, 0x022c, 0x0236, 0x0240, 0x024b, 0x0256, 
 | |
| 	0x0261, 0x026d, 0x0279, 0x0286, 0x0293, 0x02a0, 0x02af, 0x02bd, 
 | |
| 	0x02cd, 0x02dc, 0x02ed, 0x02ff, 0x0311, 0x0324, 0x0339, 0x034e, 
 | |
| 	0x0365, 0x037e, 0x0398, 0x03b5, 0x03d3, 0x03f5, 0x041a, 0x0443, 
 | |
| 	0x0471, 0x04a6, 0x04e4, 0x052e, 0x058b, 0x0607, 0x06c3, 0x0859, 
 | |
| 	// wave 3
 | |
| 	0x0859, 0x06c3, 0x0607, 0x058b, 0x052e, 0x04e4, 0x04a6, 0x0471, 
 | |
| 	0x0443, 0x041a, 0x03f5, 0x03d3, 0x03b5, 0x0398, 0x037e, 0x0365, 
 | |
| 	0x034e, 0x0339, 0x0324, 0x0311, 0x02ff, 0x02ed, 0x02dc, 0x02cd, 
 | |
| 	0x02bd, 0x02af, 0x02a0, 0x0293, 0x0286, 0x0279, 0x026d, 0x0261, 
 | |
| 	0x0256, 0x024b, 0x0240, 0x0236, 0x022c, 0x0222, 0x0218, 0x020f, 
 | |
| 	0x0206, 0x01fd, 0x01f5, 0x01ec, 0x01e4, 0x01dc, 0x01d4, 0x01cd, 
 | |
| 	0x01c5, 0x01be, 0x01b7, 0x01b0, 0x01a9, 0x01a2, 0x019b, 0x0195, 
 | |
| 	0x018f, 0x0188, 0x0182, 0x017c, 0x0177, 0x0171, 0x016b, 0x0166, 
 | |
| 	0x0160, 0x015b, 0x0155, 0x0150, 0x014b, 0x0146, 0x0141, 0x013c, 
 | |
| 	0x0137, 0x0133, 0x012e, 0x0129, 0x0125, 0x0121, 0x011c, 0x0118, 
 | |
| 	0x0114, 0x010f, 0x010b, 0x0107, 0x0103, 0x00ff, 0x00fb, 0x00f8, 
 | |
| 	0x00f4, 0x00f0, 0x00ec, 0x00e9, 0x00e5, 0x00e2, 0x00de, 0x00db, 
 | |
| 	0x00d7, 0x00d4, 0x00d1, 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 
 | |
| 	0x00be, 0x00bb, 0x00b8, 0x00b5, 0x00b2, 0x00af, 0x00ac, 0x00a9, 
 | |
| 	0x00a7, 0x00a4, 0x00a1, 0x009f, 0x009c, 0x0099, 0x0097, 0x0094, 
 | |
| 	0x0092, 0x008f, 0x008d, 0x008a, 0x0088, 0x0086, 0x0083, 0x0081, 
 | |
| 	0x007f, 0x007d, 0x007a, 0x0078, 0x0076, 0x0074, 0x0072, 0x0070, 
 | |
| 	0x006e, 0x006c, 0x006a, 0x0068, 0x0066, 0x0064, 0x0062, 0x0060, 
 | |
| 	0x005e, 0x005c, 0x005b, 0x0059, 0x0057, 0x0055, 0x0053, 0x0052, 
 | |
| 	0x0050, 0x004e, 0x004d, 0x004b, 0x004a, 0x0048, 0x0046, 0x0045, 
 | |
| 	0x0043, 0x0042, 0x0040, 0x003f, 0x003e, 0x003c, 0x003b, 0x0039, 
 | |
| 	0x0038, 0x0037, 0x0035, 0x0034, 0x0033, 0x0031, 0x0030, 0x002f, 
 | |
| 	0x002e, 0x002d, 0x002b, 0x002a, 0x0029, 0x0028, 0x0027, 0x0026, 
 | |
| 	0x0025, 0x0024, 0x0023, 0x0022, 0x0021, 0x0020, 0x001f, 0x001e, 
 | |
| 	0x001d, 0x001c, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0017, 
 | |
| 	0x0016, 0x0015, 0x0014, 0x0014, 0x0013, 0x0012, 0x0011, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000f, 0x000e, 0x000d, 0x000d, 0x000c, 0x000c, 
 | |
| 	0x000b, 0x000a, 0x000a, 0x0009, 0x0009, 0x0008, 0x0008, 0x0007, 
 | |
| 	0x0007, 0x0007, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 
 | |
| 	0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x0859, 0x06c3, 0x0607, 0x058b, 0x052e, 0x04e4, 0x04a6, 0x0471, 
 | |
| 	0x0443, 0x041a, 0x03f5, 0x03d3, 0x03b5, 0x0398, 0x037e, 0x0365, 
 | |
| 	0x034e, 0x0339, 0x0324, 0x0311, 0x02ff, 0x02ed, 0x02dc, 0x02cd, 
 | |
| 	0x02bd, 0x02af, 0x02a0, 0x0293, 0x0286, 0x0279, 0x026d, 0x0261, 
 | |
| 	0x0256, 0x024b, 0x0240, 0x0236, 0x022c, 0x0222, 0x0218, 0x020f, 
 | |
| 	0x0206, 0x01fd, 0x01f5, 0x01ec, 0x01e4, 0x01dc, 0x01d4, 0x01cd, 
 | |
| 	0x01c5, 0x01be, 0x01b7, 0x01b0, 0x01a9, 0x01a2, 0x019b, 0x0195, 
 | |
| 	0x018f, 0x0188, 0x0182, 0x017c, 0x0177, 0x0171, 0x016b, 0x0166, 
 | |
| 	0x0160, 0x015b, 0x0155, 0x0150, 0x014b, 0x0146, 0x0141, 0x013c, 
 | |
| 	0x0137, 0x0133, 0x012e, 0x0129, 0x0125, 0x0121, 0x011c, 0x0118, 
 | |
| 	0x0114, 0x010f, 0x010b, 0x0107, 0x0103, 0x00ff, 0x00fb, 0x00f8, 
 | |
| 	0x00f4, 0x00f0, 0x00ec, 0x00e9, 0x00e5, 0x00e2, 0x00de, 0x00db, 
 | |
| 	0x00d7, 0x00d4, 0x00d1, 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 
 | |
| 	0x00be, 0x00bb, 0x00b8, 0x00b5, 0x00b2, 0x00af, 0x00ac, 0x00a9, 
 | |
| 	0x00a7, 0x00a4, 0x00a1, 0x009f, 0x009c, 0x0099, 0x0097, 0x0094, 
 | |
| 	0x0092, 0x008f, 0x008d, 0x008a, 0x0088, 0x0086, 0x0083, 0x0081, 
 | |
| 	0x007f, 0x007d, 0x007a, 0x0078, 0x0076, 0x0074, 0x0072, 0x0070, 
 | |
| 	0x006e, 0x006c, 0x006a, 0x0068, 0x0066, 0x0064, 0x0062, 0x0060, 
 | |
| 	0x005e, 0x005c, 0x005b, 0x0059, 0x0057, 0x0055, 0x0053, 0x0052, 
 | |
| 	0x0050, 0x004e, 0x004d, 0x004b, 0x004a, 0x0048, 0x0046, 0x0045, 
 | |
| 	0x0043, 0x0042, 0x0040, 0x003f, 0x003e, 0x003c, 0x003b, 0x0039, 
 | |
| 	0x0038, 0x0037, 0x0035, 0x0034, 0x0033, 0x0031, 0x0030, 0x002f, 
 | |
| 	0x002e, 0x002d, 0x002b, 0x002a, 0x0029, 0x0028, 0x0027, 0x0026, 
 | |
| 	0x0025, 0x0024, 0x0023, 0x0022, 0x0021, 0x0020, 0x001f, 0x001e, 
 | |
| 	0x001d, 0x001c, 0x001b, 0x001a, 0x0019, 0x0018, 0x0017, 0x0017, 
 | |
| 	0x0016, 0x0015, 0x0014, 0x0014, 0x0013, 0x0012, 0x0011, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000f, 0x000e, 0x000d, 0x000d, 0x000c, 0x000c, 
 | |
| 	0x000b, 0x000a, 0x000a, 0x0009, 0x0009, 0x0008, 0x0008, 0x0007, 
 | |
| 	0x0007, 0x0007, 0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0004, 
 | |
| 	0x0004, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	// wave 4
 | |
| 	0x0859, 0x0607, 0x052e, 0x04a6, 0x0443, 0x03f5, 0x03b5, 0x037e, 
 | |
| 	0x034e, 0x0324, 0x02ff, 0x02dc, 0x02bd, 0x02a0, 0x0286, 0x026d, 
 | |
| 	0x0256, 0x0240, 0x022c, 0x0218, 0x0206, 0x01f5, 0x01e4, 0x01d4, 
 | |
| 	0x01c5, 0x01b7, 0x01a9, 0x019b, 0x018f, 0x0182, 0x0177, 0x016b, 
 | |
| 	0x0160, 0x0155, 0x014b, 0x0141, 0x0137, 0x012e, 0x0125, 0x011c, 
 | |
| 	0x0114, 0x010b, 0x0103, 0x00fb, 0x00f4, 0x00ec, 0x00e5, 0x00de, 
 | |
| 	0x00d7, 0x00d1, 0x00ca, 0x00c4, 0x00be, 0x00b8, 0x00b2, 0x00ac, 
 | |
| 	0x00a7, 0x00a1, 0x009c, 0x0097, 0x0092, 0x008d, 0x0088, 0x0083, 
 | |
| 	0x007f, 0x007a, 0x0076, 0x0072, 0x006e, 0x006a, 0x0066, 0x0062, 
 | |
| 	0x005e, 0x005b, 0x0057, 0x0053, 0x0050, 0x004d, 0x004a, 0x0046, 
 | |
| 	0x0043, 0x0040, 0x003e, 0x003b, 0x0038, 0x0035, 0x0033, 0x0030, 
 | |
| 	0x002e, 0x002b, 0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f, 
 | |
| 	0x001d, 0x001b, 0x0019, 0x0017, 0x0016, 0x0014, 0x0013, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000d, 0x000c, 0x000b, 0x000a, 0x0009, 0x0008, 
 | |
| 	0x0007, 0x0006, 0x0005, 0x0005, 0x0004, 0x0003, 0x0003, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0003, 0x0003, 0x0004, 0x0005, 0x0005, 0x0006, 0x0007, 
 | |
| 	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0013, 0x0014, 0x0016, 0x0017, 0x0019, 0x001b, 0x001d, 
 | |
| 	0x001f, 0x0021, 0x0023, 0x0025, 0x0027, 0x0029, 0x002b, 0x002e, 
 | |
| 	0x0030, 0x0033, 0x0035, 0x0038, 0x003b, 0x003e, 0x0040, 0x0043, 
 | |
| 	0x0046, 0x004a, 0x004d, 0x0050, 0x0053, 0x0057, 0x005b, 0x005e, 
 | |
| 	0x0062, 0x0066, 0x006a, 0x006e, 0x0072, 0x0076, 0x007a, 0x007f, 
 | |
| 	0x0083, 0x0088, 0x008d, 0x0092, 0x0097, 0x009c, 0x00a1, 0x00a7, 
 | |
| 	0x00ac, 0x00b2, 0x00b8, 0x00be, 0x00c4, 0x00ca, 0x00d1, 0x00d7, 
 | |
| 	0x00de, 0x00e5, 0x00ec, 0x00f4, 0x00fb, 0x0103, 0x010b, 0x0114, 
 | |
| 	0x011c, 0x0125, 0x012e, 0x0137, 0x0141, 0x014b, 0x0155, 0x0160, 
 | |
| 	0x016b, 0x0177, 0x0182, 0x018f, 0x019b, 0x01a9, 0x01b7, 0x01c5, 
 | |
| 	0x01d4, 0x01e4, 0x01f5, 0x0206, 0x0218, 0x022c, 0x0240, 0x0256, 
 | |
| 	0x026d, 0x0286, 0x02a0, 0x02bd, 0x02dc, 0x02ff, 0x0324, 0x034e, 
 | |
| 	0x037e, 0x03b5, 0x03f5, 0x0443, 0x04a6, 0x052e, 0x0607, 0x0859, 
 | |
| 	0x8859, 0x8607, 0x852e, 0x84a6, 0x8443, 0x83f5, 0x83b5, 0x837e, 
 | |
| 	0x834e, 0x8324, 0x82ff, 0x82dc, 0x82bd, 0x82a0, 0x8286, 0x826d, 
 | |
| 	0x8256, 0x8240, 0x822c, 0x8218, 0x8206, 0x81f5, 0x81e4, 0x81d4, 
 | |
| 	0x81c5, 0x81b7, 0x81a9, 0x819b, 0x818f, 0x8182, 0x8177, 0x816b, 
 | |
| 	0x8160, 0x8155, 0x814b, 0x8141, 0x8137, 0x812e, 0x8125, 0x811c, 
 | |
| 	0x8114, 0x810b, 0x8103, 0x80fb, 0x80f4, 0x80ec, 0x80e5, 0x80de, 
 | |
| 	0x80d7, 0x80d1, 0x80ca, 0x80c4, 0x80be, 0x80b8, 0x80b2, 0x80ac, 
 | |
| 	0x80a7, 0x80a1, 0x809c, 0x8097, 0x8092, 0x808d, 0x8088, 0x8083, 
 | |
| 	0x807f, 0x807a, 0x8076, 0x8072, 0x806e, 0x806a, 0x8066, 0x8062, 
 | |
| 	0x805e, 0x805b, 0x8057, 0x8053, 0x8050, 0x804d, 0x804a, 0x8046, 
 | |
| 	0x8043, 0x8040, 0x803e, 0x803b, 0x8038, 0x8035, 0x8033, 0x8030, 
 | |
| 	0x802e, 0x802b, 0x8029, 0x8027, 0x8025, 0x8023, 0x8021, 0x801f, 
 | |
| 	0x801d, 0x801b, 0x8019, 0x8017, 0x8016, 0x8014, 0x8013, 0x8011, 
 | |
| 	0x8010, 0x800f, 0x800d, 0x800c, 0x800b, 0x800a, 0x8009, 0x8008, 
 | |
| 	0x8007, 0x8006, 0x8005, 0x8005, 0x8004, 0x8003, 0x8003, 0x8002, 
 | |
| 	0x8002, 0x8001, 0x8001, 0x8001, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8001, 0x8001, 0x8002, 
 | |
| 	0x8002, 0x8003, 0x8003, 0x8004, 0x8005, 0x8005, 0x8006, 0x8007, 
 | |
| 	0x8008, 0x8009, 0x800a, 0x800b, 0x800c, 0x800d, 0x800f, 0x8010, 
 | |
| 	0x8011, 0x8013, 0x8014, 0x8016, 0x8017, 0x8019, 0x801b, 0x801d, 
 | |
| 	0x801f, 0x8021, 0x8023, 0x8025, 0x8027, 0x8029, 0x802b, 0x802e, 
 | |
| 	0x8030, 0x8033, 0x8035, 0x8038, 0x803b, 0x803e, 0x8040, 0x8043, 
 | |
| 	0x8046, 0x804a, 0x804d, 0x8050, 0x8053, 0x8057, 0x805b, 0x805e, 
 | |
| 	0x8062, 0x8066, 0x806a, 0x806e, 0x8072, 0x8076, 0x807a, 0x807f, 
 | |
| 	0x8083, 0x8088, 0x808d, 0x8092, 0x8097, 0x809c, 0x80a1, 0x80a7, 
 | |
| 	0x80ac, 0x80b2, 0x80b8, 0x80be, 0x80c4, 0x80ca, 0x80d1, 0x80d7, 
 | |
| 	0x80de, 0x80e5, 0x80ec, 0x80f4, 0x80fb, 0x8103, 0x810b, 0x8114, 
 | |
| 	0x811c, 0x8125, 0x812e, 0x8137, 0x8141, 0x814b, 0x8155, 0x8160, 
 | |
| 	0x816b, 0x8177, 0x8182, 0x818f, 0x819b, 0x81a9, 0x81b7, 0x81c5, 
 | |
| 	0x81d4, 0x81e4, 0x81f5, 0x8206, 0x8218, 0x822c, 0x8240, 0x8256, 
 | |
| 	0x826d, 0x8286, 0x82a0, 0x82bd, 0x82dc, 0x82ff, 0x8324, 0x834e, 
 | |
| 	0x837e, 0x83b5, 0x83f5, 0x8443, 0x84a6, 0x852e, 0x8607, 0x8859, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	// wave 5
 | |
| 	0x0859, 0x0607, 0x052e, 0x04a6, 0x0443, 0x03f5, 0x03b5, 0x037e, 
 | |
| 	0x034e, 0x0324, 0x02ff, 0x02dc, 0x02bd, 0x02a0, 0x0286, 0x026d, 
 | |
| 	0x0256, 0x0240, 0x022c, 0x0218, 0x0206, 0x01f5, 0x01e4, 0x01d4, 
 | |
| 	0x01c5, 0x01b7, 0x01a9, 0x019b, 0x018f, 0x0182, 0x0177, 0x016b, 
 | |
| 	0x0160, 0x0155, 0x014b, 0x0141, 0x0137, 0x012e, 0x0125, 0x011c, 
 | |
| 	0x0114, 0x010b, 0x0103, 0x00fb, 0x00f4, 0x00ec, 0x00e5, 0x00de, 
 | |
| 	0x00d7, 0x00d1, 0x00ca, 0x00c4, 0x00be, 0x00b8, 0x00b2, 0x00ac, 
 | |
| 	0x00a7, 0x00a1, 0x009c, 0x0097, 0x0092, 0x008d, 0x0088, 0x0083, 
 | |
| 	0x007f, 0x007a, 0x0076, 0x0072, 0x006e, 0x006a, 0x0066, 0x0062, 
 | |
| 	0x005e, 0x005b, 0x0057, 0x0053, 0x0050, 0x004d, 0x004a, 0x0046, 
 | |
| 	0x0043, 0x0040, 0x003e, 0x003b, 0x0038, 0x0035, 0x0033, 0x0030, 
 | |
| 	0x002e, 0x002b, 0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f, 
 | |
| 	0x001d, 0x001b, 0x0019, 0x0017, 0x0016, 0x0014, 0x0013, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000d, 0x000c, 0x000b, 0x000a, 0x0009, 0x0008, 
 | |
| 	0x0007, 0x0006, 0x0005, 0x0005, 0x0004, 0x0003, 0x0003, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0003, 0x0003, 0x0004, 0x0005, 0x0005, 0x0006, 0x0007, 
 | |
| 	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0013, 0x0014, 0x0016, 0x0017, 0x0019, 0x001b, 0x001d, 
 | |
| 	0x001f, 0x0021, 0x0023, 0x0025, 0x0027, 0x0029, 0x002b, 0x002e, 
 | |
| 	0x0030, 0x0033, 0x0035, 0x0038, 0x003b, 0x003e, 0x0040, 0x0043, 
 | |
| 	0x0046, 0x004a, 0x004d, 0x0050, 0x0053, 0x0057, 0x005b, 0x005e, 
 | |
| 	0x0062, 0x0066, 0x006a, 0x006e, 0x0072, 0x0076, 0x007a, 0x007f, 
 | |
| 	0x0083, 0x0088, 0x008d, 0x0092, 0x0097, 0x009c, 0x00a1, 0x00a7, 
 | |
| 	0x00ac, 0x00b2, 0x00b8, 0x00be, 0x00c4, 0x00ca, 0x00d1, 0x00d7, 
 | |
| 	0x00de, 0x00e5, 0x00ec, 0x00f4, 0x00fb, 0x0103, 0x010b, 0x0114, 
 | |
| 	0x011c, 0x0125, 0x012e, 0x0137, 0x0141, 0x014b, 0x0155, 0x0160, 
 | |
| 	0x016b, 0x0177, 0x0182, 0x018f, 0x019b, 0x01a9, 0x01b7, 0x01c5, 
 | |
| 	0x01d4, 0x01e4, 0x01f5, 0x0206, 0x0218, 0x022c, 0x0240, 0x0256, 
 | |
| 	0x026d, 0x0286, 0x02a0, 0x02bd, 0x02dc, 0x02ff, 0x0324, 0x034e, 
 | |
| 	0x037e, 0x03b5, 0x03f5, 0x0443, 0x04a6, 0x052e, 0x0607, 0x0859, 
 | |
| 	0x0859, 0x0607, 0x052e, 0x04a6, 0x0443, 0x03f5, 0x03b5, 0x037e, 
 | |
| 	0x034e, 0x0324, 0x02ff, 0x02dc, 0x02bd, 0x02a0, 0x0286, 0x026d, 
 | |
| 	0x0256, 0x0240, 0x022c, 0x0218, 0x0206, 0x01f5, 0x01e4, 0x01d4, 
 | |
| 	0x01c5, 0x01b7, 0x01a9, 0x019b, 0x018f, 0x0182, 0x0177, 0x016b, 
 | |
| 	0x0160, 0x0155, 0x014b, 0x0141, 0x0137, 0x012e, 0x0125, 0x011c, 
 | |
| 	0x0114, 0x010b, 0x0103, 0x00fb, 0x00f4, 0x00ec, 0x00e5, 0x00de, 
 | |
| 	0x00d7, 0x00d1, 0x00ca, 0x00c4, 0x00be, 0x00b8, 0x00b2, 0x00ac, 
 | |
| 	0x00a7, 0x00a1, 0x009c, 0x0097, 0x0092, 0x008d, 0x0088, 0x0083, 
 | |
| 	0x007f, 0x007a, 0x0076, 0x0072, 0x006e, 0x006a, 0x0066, 0x0062, 
 | |
| 	0x005e, 0x005b, 0x0057, 0x0053, 0x0050, 0x004d, 0x004a, 0x0046, 
 | |
| 	0x0043, 0x0040, 0x003e, 0x003b, 0x0038, 0x0035, 0x0033, 0x0030, 
 | |
| 	0x002e, 0x002b, 0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f, 
 | |
| 	0x001d, 0x001b, 0x0019, 0x0017, 0x0016, 0x0014, 0x0013, 0x0011, 
 | |
| 	0x0010, 0x000f, 0x000d, 0x000c, 0x000b, 0x000a, 0x0009, 0x0008, 
 | |
| 	0x0007, 0x0006, 0x0005, 0x0005, 0x0004, 0x0003, 0x0003, 0x0002, 
 | |
| 	0x0002, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 
 | |
| 	0x0002, 0x0003, 0x0003, 0x0004, 0x0005, 0x0005, 0x0006, 0x0007, 
 | |
| 	0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000f, 0x0010, 
 | |
| 	0x0011, 0x0013, 0x0014, 0x0016, 0x0017, 0x0019, 0x001b, 0x001d, 
 | |
| 	0x001f, 0x0021, 0x0023, 0x0025, 0x0027, 0x0029, 0x002b, 0x002e, 
 | |
| 	0x0030, 0x0033, 0x0035, 0x0038, 0x003b, 0x003e, 0x0040, 0x0043, 
 | |
| 	0x0046, 0x004a, 0x004d, 0x0050, 0x0053, 0x0057, 0x005b, 0x005e, 
 | |
| 	0x0062, 0x0066, 0x006a, 0x006e, 0x0072, 0x0076, 0x007a, 0x007f, 
 | |
| 	0x0083, 0x0088, 0x008d, 0x0092, 0x0097, 0x009c, 0x00a1, 0x00a7, 
 | |
| 	0x00ac, 0x00b2, 0x00b8, 0x00be, 0x00c4, 0x00ca, 0x00d1, 0x00d7, 
 | |
| 	0x00de, 0x00e5, 0x00ec, 0x00f4, 0x00fb, 0x0103, 0x010b, 0x0114, 
 | |
| 	0x011c, 0x0125, 0x012e, 0x0137, 0x0141, 0x014b, 0x0155, 0x0160, 
 | |
| 	0x016b, 0x0177, 0x0182, 0x018f, 0x019b, 0x01a9, 0x01b7, 0x01c5, 
 | |
| 	0x01d4, 0x01e4, 0x01f5, 0x0206, 0x0218, 0x022c, 0x0240, 0x0256, 
 | |
| 	0x026d, 0x0286, 0x02a0, 0x02bd, 0x02dc, 0x02ff, 0x0324, 0x034e, 
 | |
| 	0x037e, 0x03b5, 0x03f5, 0x0443, 0x04a6, 0x052e, 0x0607, 0x0859, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 
 | |
| 	// wave 6
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 
 | |
| 	// wave 7
 | |
| 	0x0000, 0x0008, 0x0010, 0x0018, 0x0020, 0x0028, 0x0030, 0x0038, 
 | |
| 	0x0040, 0x0048, 0x0050, 0x0058, 0x0060, 0x0068, 0x0070, 0x0078, 
 | |
| 	0x0080, 0x0088, 0x0090, 0x0098, 0x00a0, 0x00a8, 0x00b0, 0x00b8, 
 | |
| 	0x00c0, 0x00c8, 0x00d0, 0x00d8, 0x00e0, 0x00e8, 0x00f0, 0x00f8, 
 | |
| 	0x0100, 0x0108, 0x0110, 0x0118, 0x0120, 0x0128, 0x0130, 0x0138, 
 | |
| 	0x0140, 0x0148, 0x0150, 0x0158, 0x0160, 0x0168, 0x0170, 0x0178, 
 | |
| 	0x0180, 0x0188, 0x0190, 0x0198, 0x01a0, 0x01a8, 0x01b0, 0x01b8, 
 | |
| 	0x01c0, 0x01c8, 0x01d0, 0x01d8, 0x01e0, 0x01e8, 0x01f0, 0x01f8, 
 | |
| 	0x0200, 0x0208, 0x0210, 0x0218, 0x0220, 0x0228, 0x0230, 0x0238, 
 | |
| 	0x0240, 0x0248, 0x0250, 0x0258, 0x0260, 0x0268, 0x0270, 0x0278, 
 | |
| 	0x0280, 0x0288, 0x0290, 0x0298, 0x02a0, 0x02a8, 0x02b0, 0x02b8, 
 | |
| 	0x02c0, 0x02c8, 0x02d0, 0x02d8, 0x02e0, 0x02e8, 0x02f0, 0x02f8, 
 | |
| 	0x0300, 0x0308, 0x0310, 0x0318, 0x0320, 0x0328, 0x0330, 0x0338, 
 | |
| 	0x0340, 0x0348, 0x0350, 0x0358, 0x0360, 0x0368, 0x0370, 0x0378, 
 | |
| 	0x0380, 0x0388, 0x0390, 0x0398, 0x03a0, 0x03a8, 0x03b0, 0x03b8, 
 | |
| 	0x03c0, 0x03c8, 0x03d0, 0x03d8, 0x03e0, 0x03e8, 0x03f0, 0x03f8, 
 | |
| 	0x0400, 0x0408, 0x0410, 0x0418, 0x0420, 0x0428, 0x0430, 0x0438, 
 | |
| 	0x0440, 0x0448, 0x0450, 0x0458, 0x0460, 0x0468, 0x0470, 0x0478, 
 | |
| 	0x0480, 0x0488, 0x0490, 0x0498, 0x04a0, 0x04a8, 0x04b0, 0x04b8, 
 | |
| 	0x04c0, 0x04c8, 0x04d0, 0x04d8, 0x04e0, 0x04e8, 0x04f0, 0x04f8, 
 | |
| 	0x0500, 0x0508, 0x0510, 0x0518, 0x0520, 0x0528, 0x0530, 0x0538, 
 | |
| 	0x0540, 0x0548, 0x0550, 0x0558, 0x0560, 0x0568, 0x0570, 0x0578, 
 | |
| 	0x0580, 0x0588, 0x0590, 0x0598, 0x05a0, 0x05a8, 0x05b0, 0x05b8, 
 | |
| 	0x05c0, 0x05c8, 0x05d0, 0x05d8, 0x05e0, 0x05e8, 0x05f0, 0x05f8, 
 | |
| 	0x0600, 0x0608, 0x0610, 0x0618, 0x0620, 0x0628, 0x0630, 0x0638, 
 | |
| 	0x0640, 0x0648, 0x0650, 0x0658, 0x0660, 0x0668, 0x0670, 0x0678, 
 | |
| 	0x0680, 0x0688, 0x0690, 0x0698, 0x06a0, 0x06a8, 0x06b0, 0x06b8, 
 | |
| 	0x06c0, 0x06c8, 0x06d0, 0x06d8, 0x06e0, 0x06e8, 0x06f0, 0x06f8, 
 | |
| 	0x0700, 0x0708, 0x0710, 0x0718, 0x0720, 0x0728, 0x0730, 0x0738, 
 | |
| 	0x0740, 0x0748, 0x0750, 0x0758, 0x0760, 0x0768, 0x0770, 0x0778, 
 | |
| 	0x0780, 0x0788, 0x0790, 0x0798, 0x07a0, 0x07a8, 0x07b0, 0x07b8, 
 | |
| 	0x07c0, 0x07c8, 0x07d0, 0x07d8, 0x07e0, 0x07e8, 0x07f0, 0x07f8, 
 | |
| 	0x0800, 0x0808, 0x0810, 0x0818, 0x0820, 0x0828, 0x0830, 0x0838, 
 | |
| 	0x0840, 0x0848, 0x0850, 0x0858, 0x0860, 0x0868, 0x0870, 0x0878, 
 | |
| 	0x0880, 0x0888, 0x0890, 0x0898, 0x08a0, 0x08a8, 0x08b0, 0x08b8, 
 | |
| 	0x08c0, 0x08c8, 0x08d0, 0x08d8, 0x08e0, 0x08e8, 0x08f0, 0x08f8, 
 | |
| 	0x0900, 0x0908, 0x0910, 0x0918, 0x0920, 0x0928, 0x0930, 0x0938, 
 | |
| 	0x0940, 0x0948, 0x0950, 0x0958, 0x0960, 0x0968, 0x0970, 0x0978, 
 | |
| 	0x0980, 0x0988, 0x0990, 0x0998, 0x09a0, 0x09a8, 0x09b0, 0x09b8, 
 | |
| 	0x09c0, 0x09c8, 0x09d0, 0x09d8, 0x09e0, 0x09e8, 0x09f0, 0x09f8, 
 | |
| 	0x0a00, 0x0a08, 0x0a10, 0x0a18, 0x0a20, 0x0a28, 0x0a30, 0x0a38, 
 | |
| 	0x0a40, 0x0a48, 0x0a50, 0x0a58, 0x0a60, 0x0a68, 0x0a70, 0x0a78, 
 | |
| 	0x0a80, 0x0a88, 0x0a90, 0x0a98, 0x0aa0, 0x0aa8, 0x0ab0, 0x0ab8, 
 | |
| 	0x0ac0, 0x0ac8, 0x0ad0, 0x0ad8, 0x0ae0, 0x0ae8, 0x0af0, 0x0af8, 
 | |
| 	0x0b00, 0x0b08, 0x0b10, 0x0b18, 0x0b20, 0x0b28, 0x0b30, 0x0b38, 
 | |
| 	0x0b40, 0x0b48, 0x0b50, 0x0b58, 0x0b60, 0x0b68, 0x0b70, 0x0b78, 
 | |
| 	0x0b80, 0x0b88, 0x0b90, 0x0b98, 0x0ba0, 0x0ba8, 0x0bb0, 0x0bb8, 
 | |
| 	0x0bc0, 0x0bc8, 0x0bd0, 0x0bd8, 0x0be0, 0x0be8, 0x0bf0, 0x0bf8, 
 | |
| 	0x0c00, 0x0c08, 0x0c10, 0x0c18, 0x0c20, 0x0c28, 0x0c30, 0x0c38, 
 | |
| 	0x0c40, 0x0c48, 0x0c50, 0x0c58, 0x0c60, 0x0c68, 0x0c70, 0x0c78, 
 | |
| 	0x0c80, 0x0c88, 0x0c90, 0x0c98, 0x0ca0, 0x0ca8, 0x0cb0, 0x0cb8, 
 | |
| 	0x0cc0, 0x0cc8, 0x0cd0, 0x0cd8, 0x0ce0, 0x0ce8, 0x0cf0, 0x0cf8, 
 | |
| 	0x0d00, 0x0d08, 0x0d10, 0x0d18, 0x0d20, 0x0d28, 0x0d30, 0x0d38, 
 | |
| 	0x0d40, 0x0d48, 0x0d50, 0x0d58, 0x0d60, 0x0d68, 0x0d70, 0x0d78, 
 | |
| 	0x0d80, 0x0d88, 0x0d90, 0x0d98, 0x0da0, 0x0da8, 0x0db0, 0x0db8, 
 | |
| 	0x0dc0, 0x0dc8, 0x0dd0, 0x0dd8, 0x0de0, 0x0de8, 0x0df0, 0x0df8, 
 | |
| 	0x0e00, 0x0e08, 0x0e10, 0x0e18, 0x0e20, 0x0e28, 0x0e30, 0x0e38, 
 | |
| 	0x0e40, 0x0e48, 0x0e50, 0x0e58, 0x0e60, 0x0e68, 0x0e70, 0x0e78, 
 | |
| 	0x0e80, 0x0e88, 0x0e90, 0x0e98, 0x0ea0, 0x0ea8, 0x0eb0, 0x0eb8, 
 | |
| 	0x0ec0, 0x0ec8, 0x0ed0, 0x0ed8, 0x0ee0, 0x0ee8, 0x0ef0, 0x0ef8, 
 | |
| 	0x0f00, 0x0f08, 0x0f10, 0x0f18, 0x0f20, 0x0f28, 0x0f30, 0x0f38, 
 | |
| 	0x0f40, 0x0f48, 0x0f50, 0x0f58, 0x0f60, 0x0f68, 0x0f70, 0x0f78, 
 | |
| 	0x0f80, 0x0f88, 0x0f90, 0x0f98, 0x0fa0, 0x0fa8, 0x0fb0, 0x0fb8, 
 | |
| 	0x0fc0, 0x0fc8, 0x0fd0, 0x0fd8, 0x0fe0, 0x0fe8, 0x0ff0, 0x0ff8, 
 | |
| 	0x8ff8, 0x8ff0, 0x8fe8, 0x8fe0, 0x8fd8, 0x8fd0, 0x8fc8, 0x8fc0, 
 | |
| 	0x8fb8, 0x8fb0, 0x8fa8, 0x8fa0, 0x8f98, 0x8f90, 0x8f88, 0x8f80, 
 | |
| 	0x8f78, 0x8f70, 0x8f68, 0x8f60, 0x8f58, 0x8f50, 0x8f48, 0x8f40, 
 | |
| 	0x8f38, 0x8f30, 0x8f28, 0x8f20, 0x8f18, 0x8f10, 0x8f08, 0x8f00, 
 | |
| 	0x8ef8, 0x8ef0, 0x8ee8, 0x8ee0, 0x8ed8, 0x8ed0, 0x8ec8, 0x8ec0, 
 | |
| 	0x8eb8, 0x8eb0, 0x8ea8, 0x8ea0, 0x8e98, 0x8e90, 0x8e88, 0x8e80, 
 | |
| 	0x8e78, 0x8e70, 0x8e68, 0x8e60, 0x8e58, 0x8e50, 0x8e48, 0x8e40, 
 | |
| 	0x8e38, 0x8e30, 0x8e28, 0x8e20, 0x8e18, 0x8e10, 0x8e08, 0x8e00, 
 | |
| 	0x8df8, 0x8df0, 0x8de8, 0x8de0, 0x8dd8, 0x8dd0, 0x8dc8, 0x8dc0, 
 | |
| 	0x8db8, 0x8db0, 0x8da8, 0x8da0, 0x8d98, 0x8d90, 0x8d88, 0x8d80, 
 | |
| 	0x8d78, 0x8d70, 0x8d68, 0x8d60, 0x8d58, 0x8d50, 0x8d48, 0x8d40, 
 | |
| 	0x8d38, 0x8d30, 0x8d28, 0x8d20, 0x8d18, 0x8d10, 0x8d08, 0x8d00, 
 | |
| 	0x8cf8, 0x8cf0, 0x8ce8, 0x8ce0, 0x8cd8, 0x8cd0, 0x8cc8, 0x8cc0, 
 | |
| 	0x8cb8, 0x8cb0, 0x8ca8, 0x8ca0, 0x8c98, 0x8c90, 0x8c88, 0x8c80, 
 | |
| 	0x8c78, 0x8c70, 0x8c68, 0x8c60, 0x8c58, 0x8c50, 0x8c48, 0x8c40, 
 | |
| 	0x8c38, 0x8c30, 0x8c28, 0x8c20, 0x8c18, 0x8c10, 0x8c08, 0x8c00, 
 | |
| 	0x8bf8, 0x8bf0, 0x8be8, 0x8be0, 0x8bd8, 0x8bd0, 0x8bc8, 0x8bc0, 
 | |
| 	0x8bb8, 0x8bb0, 0x8ba8, 0x8ba0, 0x8b98, 0x8b90, 0x8b88, 0x8b80, 
 | |
| 	0x8b78, 0x8b70, 0x8b68, 0x8b60, 0x8b58, 0x8b50, 0x8b48, 0x8b40, 
 | |
| 	0x8b38, 0x8b30, 0x8b28, 0x8b20, 0x8b18, 0x8b10, 0x8b08, 0x8b00, 
 | |
| 	0x8af8, 0x8af0, 0x8ae8, 0x8ae0, 0x8ad8, 0x8ad0, 0x8ac8, 0x8ac0, 
 | |
| 	0x8ab8, 0x8ab0, 0x8aa8, 0x8aa0, 0x8a98, 0x8a90, 0x8a88, 0x8a80, 
 | |
| 	0x8a78, 0x8a70, 0x8a68, 0x8a60, 0x8a58, 0x8a50, 0x8a48, 0x8a40, 
 | |
| 	0x8a38, 0x8a30, 0x8a28, 0x8a20, 0x8a18, 0x8a10, 0x8a08, 0x8a00, 
 | |
| 	0x89f8, 0x89f0, 0x89e8, 0x89e0, 0x89d8, 0x89d0, 0x89c8, 0x89c0, 
 | |
| 	0x89b8, 0x89b0, 0x89a8, 0x89a0, 0x8998, 0x8990, 0x8988, 0x8980, 
 | |
| 	0x8978, 0x8970, 0x8968, 0x8960, 0x8958, 0x8950, 0x8948, 0x8940, 
 | |
| 	0x8938, 0x8930, 0x8928, 0x8920, 0x8918, 0x8910, 0x8908, 0x8900, 
 | |
| 	0x88f8, 0x88f0, 0x88e8, 0x88e0, 0x88d8, 0x88d0, 0x88c8, 0x88c0, 
 | |
| 	0x88b8, 0x88b0, 0x88a8, 0x88a0, 0x8898, 0x8890, 0x8888, 0x8880, 
 | |
| 	0x8878, 0x8870, 0x8868, 0x8860, 0x8858, 0x8850, 0x8848, 0x8840, 
 | |
| 	0x8838, 0x8830, 0x8828, 0x8820, 0x8818, 0x8810, 0x8808, 0x8800, 
 | |
| 	0x87f8, 0x87f0, 0x87e8, 0x87e0, 0x87d8, 0x87d0, 0x87c8, 0x87c0, 
 | |
| 	0x87b8, 0x87b0, 0x87a8, 0x87a0, 0x8798, 0x8790, 0x8788, 0x8780, 
 | |
| 	0x8778, 0x8770, 0x8768, 0x8760, 0x8758, 0x8750, 0x8748, 0x8740, 
 | |
| 	0x8738, 0x8730, 0x8728, 0x8720, 0x8718, 0x8710, 0x8708, 0x8700, 
 | |
| 	0x86f8, 0x86f0, 0x86e8, 0x86e0, 0x86d8, 0x86d0, 0x86c8, 0x86c0, 
 | |
| 	0x86b8, 0x86b0, 0x86a8, 0x86a0, 0x8698, 0x8690, 0x8688, 0x8680, 
 | |
| 	0x8678, 0x8670, 0x8668, 0x8660, 0x8658, 0x8650, 0x8648, 0x8640, 
 | |
| 	0x8638, 0x8630, 0x8628, 0x8620, 0x8618, 0x8610, 0x8608, 0x8600, 
 | |
| 	0x85f8, 0x85f0, 0x85e8, 0x85e0, 0x85d8, 0x85d0, 0x85c8, 0x85c0, 
 | |
| 	0x85b8, 0x85b0, 0x85a8, 0x85a0, 0x8598, 0x8590, 0x8588, 0x8580, 
 | |
| 	0x8578, 0x8570, 0x8568, 0x8560, 0x8558, 0x8550, 0x8548, 0x8540, 
 | |
| 	0x8538, 0x8530, 0x8528, 0x8520, 0x8518, 0x8510, 0x8508, 0x8500, 
 | |
| 	0x84f8, 0x84f0, 0x84e8, 0x84e0, 0x84d8, 0x84d0, 0x84c8, 0x84c0, 
 | |
| 	0x84b8, 0x84b0, 0x84a8, 0x84a0, 0x8498, 0x8490, 0x8488, 0x8480, 
 | |
| 	0x8478, 0x8470, 0x8468, 0x8460, 0x8458, 0x8450, 0x8448, 0x8440, 
 | |
| 	0x8438, 0x8430, 0x8428, 0x8420, 0x8418, 0x8410, 0x8408, 0x8400, 
 | |
| 	0x83f8, 0x83f0, 0x83e8, 0x83e0, 0x83d8, 0x83d0, 0x83c8, 0x83c0, 
 | |
| 	0x83b8, 0x83b0, 0x83a8, 0x83a0, 0x8398, 0x8390, 0x8388, 0x8380, 
 | |
| 	0x8378, 0x8370, 0x8368, 0x8360, 0x8358, 0x8350, 0x8348, 0x8340, 
 | |
| 	0x8338, 0x8330, 0x8328, 0x8320, 0x8318, 0x8310, 0x8308, 0x8300, 
 | |
| 	0x82f8, 0x82f0, 0x82e8, 0x82e0, 0x82d8, 0x82d0, 0x82c8, 0x82c0, 
 | |
| 	0x82b8, 0x82b0, 0x82a8, 0x82a0, 0x8298, 0x8290, 0x8288, 0x8280, 
 | |
| 	0x8278, 0x8270, 0x8268, 0x8260, 0x8258, 0x8250, 0x8248, 0x8240, 
 | |
| 	0x8238, 0x8230, 0x8228, 0x8220, 0x8218, 0x8210, 0x8208, 0x8200, 
 | |
| 	0x81f8, 0x81f0, 0x81e8, 0x81e0, 0x81d8, 0x81d0, 0x81c8, 0x81c0, 
 | |
| 	0x81b8, 0x81b0, 0x81a8, 0x81a0, 0x8198, 0x8190, 0x8188, 0x8180, 
 | |
| 	0x8178, 0x8170, 0x8168, 0x8160, 0x8158, 0x8150, 0x8148, 0x8140, 
 | |
| 	0x8138, 0x8130, 0x8128, 0x8120, 0x8118, 0x8110, 0x8108, 0x8100, 
 | |
| 	0x80f8, 0x80f0, 0x80e8, 0x80e0, 0x80d8, 0x80d0, 0x80c8, 0x80c0, 
 | |
| 	0x80b8, 0x80b0, 0x80a8, 0x80a0, 0x8098, 0x8090, 0x8088, 0x8080, 
 | |
| 	0x8078, 0x8070, 0x8068, 0x8060, 0x8058, 0x8050, 0x8048, 0x8040, 
 | |
| 	0x8038, 0x8030, 0x8028, 0x8020, 0x8018, 0x8010, 0x8008, 0x8000,
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Inverse exponent table extracted from OPL3 ROM; taken straight from
 | |
|  * Nuked OPL3 source code.
 | |
|  * TODO: Verify if ESFM uses an exponent table or if it possibly uses another
 | |
|  * method to skirt around Yamaha's patents?
 | |
|  * Optimization: All entries are shifted left by one from the actual data in
 | |
|  * OPL3's ROM.
 | |
|  */
 | |
| static const uint16_t exprom[256] = {
 | |
| 	0xff4, 0xfea, 0xfde, 0xfd4, 0xfc8, 0xfbe, 0xfb4, 0xfa8,
 | |
| 	0xf9e, 0xf92, 0xf88, 0xf7e, 0xf72, 0xf68, 0xf5c, 0xf52,
 | |
| 	0xf48, 0xf3e, 0xf32, 0xf28, 0xf1e, 0xf14, 0xf08, 0xefe,
 | |
| 	0xef4, 0xeea, 0xee0, 0xed4, 0xeca, 0xec0, 0xeb6, 0xeac,
 | |
| 	0xea2, 0xe98, 0xe8e, 0xe84, 0xe7a, 0xe70, 0xe66, 0xe5c,
 | |
| 	0xe52, 0xe48, 0xe3e, 0xe34, 0xe2a, 0xe20, 0xe16, 0xe0c,
 | |
| 	0xe04, 0xdfa, 0xdf0, 0xde6, 0xddc, 0xdd2, 0xdca, 0xdc0,
 | |
| 	0xdb6, 0xdac, 0xda4, 0xd9a, 0xd90, 0xd88, 0xd7e, 0xd74,
 | |
| 	0xd6a, 0xd62, 0xd58, 0xd50, 0xd46, 0xd3c, 0xd34, 0xd2a,
 | |
| 	0xd22, 0xd18, 0xd10, 0xd06, 0xcfe, 0xcf4, 0xcec, 0xce2,
 | |
| 	0xcda, 0xcd0, 0xcc8, 0xcbe, 0xcb6, 0xcae, 0xca4, 0xc9c,
 | |
| 	0xc92, 0xc8a, 0xc82, 0xc78, 0xc70, 0xc68, 0xc60, 0xc56,
 | |
| 	0xc4e, 0xc46, 0xc3c, 0xc34, 0xc2c, 0xc24, 0xc1c, 0xc12,
 | |
| 	0xc0a, 0xc02, 0xbfa, 0xbf2, 0xbea, 0xbe0, 0xbd8, 0xbd0,
 | |
| 	0xbc8, 0xbc0, 0xbb8, 0xbb0, 0xba8, 0xba0, 0xb98, 0xb90,
 | |
| 	0xb88, 0xb80, 0xb78, 0xb70, 0xb68, 0xb60, 0xb58, 0xb50,
 | |
| 	0xb48, 0xb40, 0xb38, 0xb32, 0xb2a, 0xb22, 0xb1a, 0xb12,
 | |
| 	0xb0a, 0xb02, 0xafc, 0xaf4, 0xaec, 0xae4, 0xade, 0xad6,
 | |
| 	0xace, 0xac6, 0xac0, 0xab8, 0xab0, 0xaa8, 0xaa2, 0xa9a,
 | |
| 	0xa92, 0xa8c, 0xa84, 0xa7c, 0xa76, 0xa6e, 0xa68, 0xa60,
 | |
| 	0xa58, 0xa52, 0xa4a, 0xa44, 0xa3c, 0xa36, 0xa2e, 0xa28,
 | |
| 	0xa20, 0xa18, 0xa12, 0xa0c, 0xa04, 0x9fe, 0x9f6, 0x9f0,
 | |
| 	0x9e8, 0x9e2, 0x9da, 0x9d4, 0x9ce, 0x9c6, 0x9c0, 0x9b8,
 | |
| 	0x9b2, 0x9ac, 0x9a4, 0x99e, 0x998, 0x990, 0x98a, 0x984,
 | |
| 	0x97c, 0x976, 0x970, 0x96a, 0x962, 0x95c, 0x956, 0x950,
 | |
| 	0x948, 0x942, 0x93c, 0x936, 0x930, 0x928, 0x922, 0x91c,
 | |
| 	0x916, 0x910, 0x90a, 0x904, 0x8fc, 0x8f6, 0x8f0, 0x8ea,
 | |
| 	0x8e4, 0x8de, 0x8d8, 0x8d2, 0x8cc, 0x8c6, 0x8c0, 0x8ba,
 | |
| 	0x8b4, 0x8ae, 0x8a8, 0x8a2, 0x89c, 0x896, 0x890, 0x88a,
 | |
| 	0x884, 0x87e, 0x878, 0x872, 0x86c, 0x866, 0x860, 0x85a,
 | |
| 	0x854, 0x850, 0x84a, 0x844, 0x83e, 0x838, 0x832, 0x82c,
 | |
| 	0x828, 0x822, 0x81c, 0x816, 0x810, 0x80c, 0x806, 0x800
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Frequency multiplier table multiplied by 2; taken straight from Nuked OPL3
 | |
|  * source code.
 | |
|  */
 | |
| static const uint8_t mt[16] = {
 | |
| 	1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 20, 24, 24, 30, 30
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * This is used during the envelope generation to apply KSL to the envelope by
 | |
|  * determining how much to shift right the keyscale attenuation value before
 | |
|  * adding it to the envelope level.
 | |
|  */
 | |
| static const uint8_t kslshift[4] = {
 | |
| 	8, 1, 2, 0
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * This encodes which emulation mode channels are the secondary channel in a
 | |
|  * 4-op channel pair (where the entry is non-negative), and which is the
 | |
|  * corresponding primary channel for that secondary channel.
 | |
|  */
 | |
| static const int emu_4op_secondary_to_primary[18] =
 | |
| {
 | |
| 	-1, -1, -1, 0,  1,  2, -1, -1, -1,
 | |
| 	-1, -1, -1, 9, 10, 11, -1, -1, -1
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Envelope generator dither table, taken straight from Nuked OPL3 source code.
 | |
|  */
 | |
| static const uint8_t eg_incstep[4][4] = {
 | |
| 	{ 0, 0, 0, 0 },
 | |
| 	{ 1, 0, 0, 0 },
 | |
| 	{ 1, 0, 1, 0 },
 | |
| 	{ 1, 1, 1, 0 }
 | |
| };
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static inline int13
 | |
| ESFM_envelope_wavegen(uint3 waveform, int16 phase, uint10 envelope)
 | |
| {
 | |
| 	int13 out;
 | |
| 	uint16 lookup = logsinrom[((uint16)waveform << 10) | (phase & 0x3ff)];
 | |
| 	uint16 level = (lookup & 0x1fff) + (envelope << 3);
 | |
| 	if (level > 0x1fff)
 | |
| 	{
 | |
| 		level = 0x1fff;
 | |
| 	}
 | |
| 	out = exprom[level & 0xff] >> (level >> 8);
 | |
| 	if (lookup & 0x8000)
 | |
| 	{
 | |
| 		out = -out;
 | |
| 	}
 | |
| 	return out;
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_envelope_calc(esfm_slot *slot)
 | |
| {
 | |
| 	uint8 nonzero;
 | |
| 	uint8 rate;
 | |
| 	uint5 rate_hi;
 | |
| 	uint2 rate_lo;
 | |
| 	uint4 reg_rate = 0;
 | |
| 	uint4 ks;
 | |
| 	uint8 eg_shift, shift;
 | |
| 	bool eg_off;
 | |
| 	uint9 eg_rout;
 | |
| 	int16 eg_inc;
 | |
| 	bool reset = 0;
 | |
| 	bool key_on;
 | |
| 	bool key_on_signal;
 | |
| 
 | |
| 	key_on = *slot->in.key_on;
 | |
| 	if (!slot->chip->native_mode)
 | |
| 	{
 | |
| 		int pair_primary_idx = emu_4op_secondary_to_primary[slot->channel->channel_idx];
 | |
| 		if (pair_primary_idx >= 0)
 | |
| 		{
 | |
| 			esfm_channel *pair_primary = &slot->channel->chip->channels[pair_primary_idx];
 | |
| 			if (pair_primary->emu_mode_4op_enable)
 | |
| 			{
 | |
| 				key_on = *pair_primary->slots[0].in.key_on;
 | |
| 			}
 | |
| 		}
 | |
| 		else if ((slot->channel->channel_idx == 7 || slot->channel->channel_idx == 8)
 | |
| 			&& slot->slot_idx == 1)
 | |
| 		{
 | |
| 			key_on = slot->channel->key_on_2;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	slot->in.eg_output = slot->in.eg_position + (slot->t_level << 2)
 | |
| 		+ (slot->in.eg_ksl_offset >> kslshift[slot->ksl]);
 | |
| 	if (slot->tremolo_en)
 | |
| 	{
 | |
| 		uint8 tremolo;
 | |
| 		if (slot->chip->native_mode)
 | |
| 		{
 | |
| 			tremolo = slot->channel->chip->tremolo >> ((!slot->tremolo_deep << 1) + 2);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			tremolo = slot->channel->chip->tremolo >> ((!slot->chip->emu_tremolo_deep << 1) + 2);
 | |
| 		}
 | |
| 		slot->in.eg_output += tremolo;
 | |
| 	}
 | |
| 	
 | |
| 	if (slot->in.eg_delay_run && slot->in.eg_delay_counter < 32768)
 | |
| 	{
 | |
| 		slot->in.eg_delay_counter++;
 | |
| 	}
 | |
| 	
 | |
| 	// triggers on key-on edge
 | |
| 	if (key_on && !slot->in.key_on_gate)
 | |
| 	{
 | |
| 		slot->in.eg_delay_run = 1;
 | |
| 		slot->in.eg_delay_counter = 0;
 | |
| 		slot->in.eg_delay_transitioned_01 = 0;
 | |
| 		slot->in.eg_delay_transitioned_01_gate = 0;
 | |
| 		slot->in.eg_delay_transitioned_10 = 0;
 | |
| 		slot->in.eg_delay_transitioned_10_gate = 0;
 | |
| 		slot->in.eg_delay_counter_compare = 0;
 | |
| 		if (slot->env_delay > 0)
 | |
| 		{
 | |
| 			slot->in.eg_delay_counter_compare = 256 << slot->env_delay;
 | |
| 		}
 | |
| 	}
 | |
| 	else if (!key_on)
 | |
| 	{
 | |
| 		slot->in.eg_delay_run = 0;
 | |
| 	}
 | |
| 	
 | |
| 	// TODO: is this really how the chip behaves? Can it only transition the envelope delay once? Am I implementing this in a sane way? I feel like this is a roundabout hack.
 | |
| 	if ((slot->in.eg_delay_transitioned_10 && !slot->in.eg_delay_transitioned_10_gate) ||
 | |
| 		(slot->in.eg_delay_transitioned_01 && !slot->in.eg_delay_transitioned_01_gate)
 | |
| 	)
 | |
| 	{
 | |
| 		slot->in.eg_delay_counter_compare = 0;
 | |
| 		if (slot->env_delay > 0)
 | |
| 		{
 | |
| 			slot->in.eg_delay_counter_compare = 256 << slot->env_delay;
 | |
| 		}
 | |
| 		if (slot->in.eg_delay_transitioned_10)
 | |
| 		{
 | |
| 			slot->in.eg_delay_transitioned_10_gate = 1;
 | |
| 		}
 | |
| 		if (slot->in.eg_delay_transitioned_01)
 | |
| 		{
 | |
| 			slot->in.eg_delay_transitioned_01_gate = 1;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	if (key_on && ((slot->in.eg_delay_counter >= slot->in.eg_delay_counter_compare) || !slot->chip->native_mode))
 | |
| 	{
 | |
| 		key_on_signal = 1;
 | |
| 	} else {
 | |
| 		key_on_signal = 0;
 | |
| 	}
 | |
| 	
 | |
| 	if (key_on && slot->in.eg_state == EG_RELEASE)
 | |
| 	{
 | |
| 
 | |
| 		if ((slot->in.eg_delay_counter >= slot->in.eg_delay_counter_compare) || !slot->chip->native_mode)
 | |
| 		{
 | |
| 			reset = 1;
 | |
| 			reg_rate = slot->attack_rate;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			reg_rate = slot->release_rate;
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		switch (slot->in.eg_state)
 | |
| 		{
 | |
| 			case EG_ATTACK:
 | |
| 				reg_rate = slot->attack_rate;
 | |
| 				break;
 | |
| 			case EG_DECAY:
 | |
| 				reg_rate = slot->decay_rate;
 | |
| 				break;
 | |
| 			case EG_SUSTAIN:
 | |
| 				if (!slot->env_sustaining)
 | |
| 				{
 | |
| 					reg_rate = slot->release_rate;
 | |
| 				}
 | |
| 				break;
 | |
| 			case EG_RELEASE:
 | |
| 				reg_rate = slot->release_rate;
 | |
| 				break;
 | |
| 		}
 | |
| 	}
 | |
| 	slot->in.key_on_gate = key_on;
 | |
| 	slot->in.phase_reset = reset;
 | |
| 	ks = slot->in.keyscale >> ((!slot->ksr) << 1);
 | |
| 	nonzero = (reg_rate != 0);
 | |
| 	rate = ks + (reg_rate << 2);
 | |
| 	rate_hi = rate >> 2;
 | |
| 	rate_lo = rate & 0x03;
 | |
| 	if (rate_hi & 0x10)
 | |
| 	{
 | |
| 		rate_hi = 0x0f;
 | |
| 	}
 | |
| 	eg_shift = rate_hi + slot->chip->eg_clocks;
 | |
| 	shift = 0;
 | |
| 	if (nonzero)
 | |
| 	{
 | |
| 		if (rate_hi < 12)
 | |
| 		{
 | |
| 			if (slot->chip->eg_tick)
 | |
| 			{
 | |
| 				switch (eg_shift)
 | |
| 				{
 | |
| 					case 12:
 | |
| 						shift = 1;
 | |
| 						break;
 | |
| 					case 13:
 | |
| 						shift = (rate_lo >> 1) & 0x01;
 | |
| 						break;
 | |
| 					case 14:
 | |
| 						shift = rate_lo & 0x01;
 | |
| 						break;
 | |
| 					default:
 | |
| 						break;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			shift = (rate_hi & 0x03)
 | |
| 				+ eg_incstep[rate_lo][slot->chip->global_timer & 0x03];
 | |
| 			if (shift & 0x04)
 | |
| 			{
 | |
| 				shift = 0x03;
 | |
| 			}
 | |
| 			if (!shift)
 | |
| 			{
 | |
| 				shift = slot->chip->eg_tick;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	eg_rout = slot->in.eg_position;
 | |
| 	eg_inc = 0;
 | |
| 	eg_off = 0;
 | |
| 	/* Instant attack */
 | |
| 	if (reset && rate_hi == 0x0f)
 | |
| 	{
 | |
| 		eg_rout = 0x00;
 | |
| 	}
 | |
| 	/* Envelope off */
 | |
| 	if ((slot->in.eg_position & 0x1f8) == 0x1f8)
 | |
| 	{
 | |
| 		eg_off = 1;
 | |
| 	}
 | |
| 	if (slot->in.eg_state != EG_ATTACK && !reset && eg_off)
 | |
| 	{
 | |
| 		eg_rout = 0x1ff;
 | |
| 	}
 | |
| 	switch (slot->in.eg_state)
 | |
| 	{
 | |
| 		case EG_ATTACK:
 | |
| 			if (slot->in.eg_position == 0)
 | |
| 			{
 | |
| 				slot->in.eg_state = EG_DECAY;
 | |
| 			}
 | |
| 			else if (key_on_signal && shift > 0 && rate_hi != 0x0f)
 | |
| 			{
 | |
| 				eg_inc = ~slot->in.eg_position >> (4 - shift);
 | |
| 			}
 | |
| 			break;
 | |
| 		case EG_DECAY:
 | |
| 			if ((slot->in.eg_position >> 4) == slot->sustain_lvl)
 | |
| 			{
 | |
| 				slot->in.eg_state = EG_SUSTAIN;
 | |
| 			}
 | |
| 			else if (!eg_off && !reset && shift > 0)
 | |
| 			{
 | |
| 				eg_inc = 1 << (shift - 1);
 | |
| 			}
 | |
| 			break;
 | |
| 		case EG_SUSTAIN:
 | |
| 		case EG_RELEASE:
 | |
| 			if (!eg_off && !reset && shift > 0)
 | |
| 			{
 | |
| 				eg_inc = 1 << (shift - 1);
 | |
| 			}
 | |
| 			break;
 | |
| 	}
 | |
| 	slot->in.eg_position = (eg_rout + eg_inc) & 0x1ff;
 | |
| 	/* Key off */
 | |
| 	if (reset)
 | |
| 	{
 | |
| 		slot->in.eg_state = EG_ATTACK;
 | |
| 	}
 | |
| 	if (!key_on_signal)
 | |
| 	{
 | |
| 		slot->in.eg_state = EG_RELEASE;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_phase_generate(esfm_slot *slot)
 | |
| {
 | |
| 	esfm_chip *chip;
 | |
| 	uint10 f_num;
 | |
| 	uint32 basefreq;
 | |
| 	bool rm_xor, n_bit;
 | |
| 	uint23 noise;
 | |
| 	uint10 phase;
 | |
| 
 | |
| 	chip = slot->chip;
 | |
| 	f_num = slot->f_num;
 | |
| 	if (slot->vibrato_en)
 | |
| 	{
 | |
| 		int8_t range;
 | |
| 		uint8_t vibpos;
 | |
| 
 | |
| 		range = (f_num >> 7) & 7;
 | |
| 		vibpos = chip->vibrato_pos;
 | |
| 
 | |
| 		if (!(vibpos & 3))
 | |
| 		{
 | |
| 			range = 0;
 | |
| 		}
 | |
| 		else if (vibpos & 1)
 | |
| 		{
 | |
| 			range >>= 1;
 | |
| 		}
 | |
| 		range >>= !slot->vibrato_deep;
 | |
| 
 | |
| 		if (vibpos & 4)
 | |
| 		{
 | |
| 			range = -range;
 | |
| 		}
 | |
| 		f_num += range;
 | |
| 	}
 | |
| 	basefreq = (f_num << slot->block) >> 1;
 | |
| 	phase = (uint10)(slot->in.phase_acc >> 9);
 | |
| 	if (slot->in.phase_reset)
 | |
| 	{
 | |
| 		slot->in.phase_acc = 0;
 | |
| 	}
 | |
| 	slot->in.phase_acc += (basefreq * mt[slot->mult]) >> 1;
 | |
| 	slot->in.phase_acc &= (1 << 19) - 1;
 | |
| 	slot->in.phase_out = phase;
 | |
| 	/* Noise mode (rhythm) sounds */
 | |
| 	noise = chip->lfsr;
 | |
| 	if (slot->slot_idx == 3 && slot->rhy_noise)
 | |
| 	{
 | |
| 		esfm_slot *prev_slot = &slot->channel->slots[2];
 | |
| 
 | |
| 		chip->rm_hh_bit2 = (phase >> 2) & 1;
 | |
| 		chip->rm_hh_bit3 = (phase >> 3) & 1;
 | |
| 		chip->rm_hh_bit7 = (phase >> 7) & 1;
 | |
| 		chip->rm_hh_bit8 = (phase >> 8) & 1;
 | |
| 
 | |
| 		chip->rm_tc_bit3 = (prev_slot->in.phase_out >> 3) & 1;
 | |
| 		chip->rm_tc_bit5 = (prev_slot->in.phase_out >> 5) & 1;
 | |
| 
 | |
| 		rm_xor = (chip->rm_hh_bit2 ^ chip->rm_hh_bit7)
 | |
| 			   | (chip->rm_hh_bit3 ^ chip->rm_tc_bit5)
 | |
| 			   | (chip->rm_tc_bit3 ^ chip->rm_tc_bit5);
 | |
| 
 | |
| 		switch(slot->rhy_noise)
 | |
| 		{
 | |
| 			case 1:
 | |
| 				// SD
 | |
| 				slot->in.phase_out = (chip->rm_hh_bit8 << 9)
 | |
| 					| ((chip->rm_hh_bit8 ^ (noise & 1)) << 8);
 | |
| 				break;
 | |
| 			case 2:
 | |
| 				// HH
 | |
| 				slot->in.phase_out = rm_xor << 9;
 | |
| 				if (rm_xor ^ (noise & 1))
 | |
| 				{
 | |
| 					slot->in.phase_out |= 0xd0;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					slot->in.phase_out |= 0x34;
 | |
| 				}
 | |
| 				break;
 | |
| 			case 3:
 | |
| 				// TC
 | |
| 				slot->in.phase_out = (rm_xor << 9) | 0x80;
 | |
| 				break;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	n_bit = ((noise >> 14) ^ noise) & 0x01;
 | |
| 	chip->lfsr = (noise >> 1) | (n_bit << 22);
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_phase_generate_emu(esfm_slot *slot)
 | |
| {
 | |
| 	esfm_chip *chip;
 | |
| 	uint3 block;
 | |
| 	uint10 f_num;
 | |
| 	uint32 basefreq;
 | |
| 	bool rm_xor, n_bit;
 | |
| 	uint23 noise;
 | |
| 	uint10 phase;
 | |
| 	int pair_primary_idx;
 | |
| 
 | |
| 	chip = slot->chip;
 | |
| 	block = slot->channel->slots[0].block;
 | |
| 	f_num = slot->channel->slots[0].f_num;
 | |
| 
 | |
| 	pair_primary_idx = emu_4op_secondary_to_primary[slot->channel->channel_idx];
 | |
| 	if (pair_primary_idx >= 0)
 | |
| 	{
 | |
| 		esfm_channel *pair_primary = &slot->channel->chip->channels[pair_primary_idx];
 | |
| 		if (pair_primary->emu_mode_4op_enable)
 | |
| 		{
 | |
| 			block = pair_primary->slots[0].block;
 | |
| 			f_num = pair_primary->slots[0].f_num;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (slot->vibrato_en)
 | |
| 	{
 | |
| 		int8_t range;
 | |
| 		uint8_t vibpos;
 | |
| 
 | |
| 		range = (f_num >> 7) & 7;
 | |
| 		vibpos = chip->vibrato_pos;
 | |
| 
 | |
| 		if (!(vibpos & 3))
 | |
| 		{
 | |
| 			range = 0;
 | |
| 		}
 | |
| 		else if (vibpos & 1)
 | |
| 		{
 | |
| 			range >>= 1;
 | |
| 		}
 | |
| 		range >>= !chip->emu_vibrato_deep;
 | |
| 
 | |
| 		if (vibpos & 4)
 | |
| 		{
 | |
| 			range = -range;
 | |
| 		}
 | |
| 		f_num += range;
 | |
| 	}
 | |
| 	basefreq = (f_num << block) >> 1;
 | |
| 	phase = (uint10)(slot->in.phase_acc >> 9);
 | |
| 	if (slot->in.phase_reset)
 | |
| 	{
 | |
| 		slot->in.phase_acc = 0;
 | |
| 	}
 | |
| 	slot->in.phase_acc += (basefreq * mt[slot->mult]) >> 1;
 | |
| 	slot->in.phase_acc &= (1 << 19) - 1;
 | |
| 	slot->in.phase_out = phase;
 | |
| 
 | |
| 	/* Noise mode (rhythm) sounds */
 | |
| 	noise = chip->lfsr;
 | |
| 	// HH
 | |
| 	if (slot->channel->channel_idx == 7 && slot->slot_idx == 0)
 | |
| 	{
 | |
| 		chip->rm_hh_bit2 = (phase >> 2) & 1;
 | |
| 		chip->rm_hh_bit3 = (phase >> 3) & 1;
 | |
| 		chip->rm_hh_bit7 = (phase >> 7) & 1;
 | |
| 		chip->rm_hh_bit8 = (phase >> 8) & 1;
 | |
| 	}
 | |
| 	// TC
 | |
| 	if (slot->channel->channel_idx == 8 && slot->slot_idx == 1)
 | |
| 	{
 | |
| 		chip->rm_tc_bit3 = (phase >> 3) & 1;
 | |
| 		chip->rm_tc_bit5 = (phase >> 5) & 1;
 | |
| 	}
 | |
| 	if (chip->emu_rhy_mode_flags & 0x20)
 | |
| 	{
 | |
| 		rm_xor = (chip->rm_hh_bit2 ^ chip->rm_hh_bit7)
 | |
| 			   | (chip->rm_hh_bit3 ^ chip->rm_tc_bit5)
 | |
| 			   | (chip->rm_tc_bit3 ^ chip->rm_tc_bit5);
 | |
| 		if (slot->channel->channel_idx == 7)
 | |
| 		{
 | |
| 			if (slot->slot_idx == 0) {
 | |
| 				// HH
 | |
| 				slot->in.phase_out = rm_xor << 9;
 | |
| 				if (rm_xor ^ (noise & 1))
 | |
| 				{
 | |
| 					slot->in.phase_out |= 0xd0;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					slot->in.phase_out |= 0x34;
 | |
| 				}
 | |
| 			}
 | |
| 			else if (slot->slot_idx == 1)
 | |
| 			{
 | |
| 				// SD
 | |
| 				slot->in.phase_out = (chip->rm_hh_bit8 << 9)
 | |
| 					| ((chip->rm_hh_bit8 ^ (noise & 1)) << 8);
 | |
| 			}
 | |
| 		}
 | |
| 		else if (slot->channel->channel_idx == 8 && slot->slot_idx == 1)
 | |
| 		{
 | |
| 			// TC
 | |
| 			slot->in.phase_out = (rm_xor << 9) | 0x80;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	n_bit = ((noise >> 14) ^ noise) & 0x01;
 | |
| 	chip->lfsr = (noise >> 1) | (n_bit << 22);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * TODO: Figure out what's ACTUALLY going on inside the real chip!
 | |
|  * This is not accurate at all, but it's the closest I was able to get with
 | |
|  * empirical testing (and it's closer than nothing).
 | |
|  */
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static int16
 | |
| ESFM_slot3_noise3_mod_input_calc(esfm_slot *slot)
 | |
| {
 | |
| 	esfm_channel *channel = slot->channel;
 | |
| 	int16 phase;
 | |
| 	int13 output_buf = *channel->slots[1].in.mod_input;
 | |
| 	int i;
 | |
| 	
 | |
| 	// Go through previous slots' partial results and recalculate outputs
 | |
| 	// (we skip slot 0 because its calculation happens at the end, not at the beginning)
 | |
| 	for (i = 1; i < 3; i++)
 | |
| 	{
 | |
| 		// double the pitch
 | |
| 		phase = channel->slots[i].in.phase_acc >> 8;
 | |
| 		if (channel->slots[i].mod_in_level)
 | |
| 		{
 | |
| 			phase += output_buf >> (7 - channel->slots[i].mod_in_level);
 | |
| 		}
 | |
| 		output_buf = ESFM_envelope_wavegen(channel->slots[2].waveform, phase, channel->slots[i].in.eg_output);
 | |
| 	}
 | |
| 
 | |
| 	return output_buf >> (8 - slot->mod_in_level);
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_slot_generate(esfm_slot *slot)
 | |
| {
 | |
| 	int16 phase = slot->in.phase_out;
 | |
| 	if (slot->mod_in_level)
 | |
| 	{
 | |
| 		if (slot->slot_idx == 3 && slot->rhy_noise == 3)
 | |
| 		{
 | |
| 			phase += ESFM_slot3_noise3_mod_input_calc(slot);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			phase += *slot->in.mod_input >> (7 - slot->mod_in_level);
 | |
| 		}
 | |
| 	}
 | |
| 	slot->in.output = ESFM_envelope_wavegen(slot->waveform, phase, slot->in.eg_output);
 | |
| 	if (slot->output_level)
 | |
| 	{
 | |
| 		int13 output_value = slot->in.output >> (7 - slot->output_level);
 | |
| 		slot->channel->output[0] += output_value & slot->out_enable[0];
 | |
| 		slot->channel->output[1] += output_value & slot->out_enable[1];
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_slot_generate_emu(esfm_slot *slot)
 | |
| {
 | |
| 	const esfm_chip *chip = slot->chip;
 | |
| 	uint3 waveform = slot->waveform & (chip->emu_newmode != 0 ? 0x07 : 0x03);
 | |
| 	bool rhythm_slot_double_volume = (slot->chip->emu_rhy_mode_flags & 0x20) != 0
 | |
| 		&& slot->channel->channel_idx >= 6 && slot->channel->channel_idx < 9;
 | |
| 	int16 phase = slot->in.phase_out;
 | |
| 	int14 output_value;
 | |
| 
 | |
| 	phase += *slot->in.mod_input & slot->in.emu_mod_enable;
 | |
| 	slot->in.output = ESFM_envelope_wavegen(waveform, phase, slot->in.eg_output);
 | |
| 	output_value = (slot->in.output & slot->in.emu_output_enable) << rhythm_slot_double_volume;
 | |
| 	if (chip->emu_newmode)
 | |
| 	{
 | |
| 		slot->channel->output[0] += output_value & slot->channel->slots[0].out_enable[0];
 | |
| 		slot->channel->output[1] += output_value & slot->channel->slots[0].out_enable[1];
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		slot->channel->output[0] += output_value;
 | |
| 		slot->channel->output[1] += output_value;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_process_feedback(esfm_chip *chip)
 | |
| {
 | |
| 	int channel_idx;
 | |
| 
 | |
| 	for (channel_idx = 0; channel_idx < 18; channel_idx++)
 | |
| 	{
 | |
| 		esfm_slot *slot = &chip->channels[channel_idx].slots[0];
 | |
| 		uint32 basefreq, phase_offset;
 | |
| 		uint3 block;
 | |
| 		uint10 f_num;
 | |
| 		int32_t wave_out, wave_last;
 | |
| 		int32_t phase_feedback;
 | |
| 		uint32_t iter_counter;
 | |
| 		uint3 waveform;
 | |
| 		uint3 mod_in_shift;
 | |
| 		uint32_t phase, phase_acc;
 | |
| 		uint10 eg_output;
 | |
| 
 | |
| 		if (slot->mod_in_level && (chip->native_mode || (slot->in.mod_input == &slot->in.feedback_buf)))
 | |
| 		{
 | |
| 			if (chip->native_mode)
 | |
| 			{
 | |
| 				waveform = slot->waveform;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				waveform = slot->waveform & (0x03 | (0x02 << (chip->emu_newmode != 0)));
 | |
| 			}
 | |
| 			f_num = slot->f_num;
 | |
| 			block = slot->block;
 | |
| 			basefreq = (f_num << block) >> 1;
 | |
| 			phase_offset = (basefreq * mt[slot->mult]) >> 1;
 | |
| 			mod_in_shift = 7 - slot->mod_in_level;
 | |
| 			phase_acc = (uint32_t)(slot->in.phase_acc - phase_offset * 28);
 | |
| 			eg_output = slot->in.eg_output;
 | |
| 
 | |
| 			// ASM optimizaions!
 | |
| #if defined(__GNUC__) && defined(__x86_64__)
 | |
| 			asm (
 | |
| 				"movzbq  %[wave], %%r8               \n\t"
 | |
| 				"shll    $11, %%r8d                  \n\t"
 | |
| 				"leaq    %[sinrom], %%rax            \n\t"
 | |
| 				"addq    %%rax, %%r8                 \n\t"
 | |
| 				"leaq    %[exprom], %%r9             \n\t"
 | |
| 				"movzwl  %[eg_out], %%r10d           \n\t"
 | |
| 				"shll    $3, %%r10d                  \n\t"
 | |
| 				"xorl    %%r11d, %%r11d              \n\t"
 | |
| 				"movl    %%r11d, %[out]              \n\t"
 | |
| 				"movl    $29, %%edx                  \n"
 | |
| 				"1:                                  \n\t"
 | |
| 				// phase_feedback = (wave_out + wave_last) >> 2;
 | |
| 				"movl    %[out], %[p_fb]             \n\t"
 | |
| 				"addl    %%r11d, %[p_fb]             \n\t"
 | |
| 				"sarl    $2, %[p_fb]                 \n\t"
 | |
| 				// wave_last = wave_out
 | |
| 				"movl    %[out], %%r11d              \n\t"
 | |
| 				// phase = phase_feedback >> mod_in_shift;
 | |
| 				"movl    %[p_fb], %%eax              \n\t"
 | |
| 				"movb    %[mod_in], %%cl             \n\t"
 | |
| 				"sarl    %%cl, %%eax                 \n\t"
 | |
| 				// phase += phase_acc >> 9;
 | |
| 				"movl    %[p_acc], %%ebx             \n\t"
 | |
| 				"sarl    $9, %%ebx                   \n\t"
 | |
| 				"addl    %%ebx, %%eax                \n\t"
 | |
| 				// lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)];
 | |
| 				"andq    $0x3ff, %%rax               \n\t"
 | |
| 				"movzwl  (%%r8, %%rax, 2), %%ebx     \n\t"
 | |
| 				"movl    %%ebx, %%eax                \n\t"
 | |
| 				// level = (lookup & 0x1fff) + (envelope << 3);
 | |
| 				"movl    $0x1fff, %%ecx              \n\t"
 | |
| 				"andl    %%ecx, %%eax                \n\t"
 | |
| 				"addl    %%r10d, %%eax               \n\t"
 | |
| 				// if (level > 0x1fff) level = 0x1fff;
 | |
| 				"cmpl    %%ecx, %%eax                \n\t"
 | |
| 				"cmoval  %%ecx, %%eax                \n\t"
 | |
| 				// wave_out = exprom[level & 0xff] >> (level >> 8);
 | |
| 				"movb    %%ah, %%cl                  \n\t"
 | |
| 				"movzbl  %%al, %%eax                 \n\t"
 | |
| 				"movzwl  (%%r9, %%rax, 2), %[out]    \n\t"
 | |
| 				"shrl    %%cl, %[out]                \n\t"
 | |
| 				// if (lookup & 0x8000) wave_out = -wave_out;
 | |
| 				// in other words, lookup is negative
 | |
| 				"movl    %[out], %%ecx               \n\t"
 | |
| 				"negl    %%ecx                       \n\t"
 | |
| 				"testw   %%bx, %%bx                  \n\t"
 | |
| 				"cmovsl  %%ecx, %[out]               \n\t"
 | |
| 				// phase_acc += phase_offset
 | |
| 				"addl    %[p_off], %[p_acc]          \n\t"
 | |
| 				// loop
 | |
| 				"decl    %%edx                       \n\t"
 | |
| 				"jne     1b                          \n\t"
 | |
| 				: [p_fb]   "=&r" (phase_feedback),
 | |
| 				  [p_acc]  "+r"  (phase_acc),
 | |
| 				  [out]    "=&r" (wave_out)
 | |
| 				: [p_off]  "r"   (phase_offset),
 | |
| 				  [mod_in] "r"   (mod_in_shift),
 | |
| 				  [wave]   "g"   (waveform),
 | |
| 				  [eg_out] "g"   (eg_output),
 | |
| 				  [sinrom] "m"   (logsinrom),
 | |
| 				  [exprom] "m"   (exprom)
 | |
| 				: "cc", "ax", "bx", "cx", "dx", "r8", "r9", "r10", "r11"
 | |
| 			);
 | |
| #elif defined(__GNUC__) && defined(__i386__)
 | |
| 			asm (
 | |
| 				"movzbl  %b[wave], %%eax             \n\t"
 | |
| 				"shll    $11, %%eax                  \n\t"
 | |
| 				"leal    %[sinrom], %%edi            \n\t"
 | |
| 				"addl    %%eax, %%edi                \n\t"
 | |
| 				"shlw    $3, %[eg_out]               \n\t"
 | |
| 				"xorl    %[out], %[out]              \n\t"
 | |
| 				"movl    %[out], %[last]             \n\t"
 | |
| 				"movl    $29, %[i]                   \n"
 | |
| 				"1:                                  \n\t"
 | |
| 				// phase_feedback = (wave_out + wave_last) >> 2;
 | |
| 				"movl    %[out], %%eax               \n\t"
 | |
| 				"addl    %[last], %%eax              \n\t"
 | |
| 				"sarl    $2, %%eax                   \n\t"
 | |
| 				"movl    %%eax, %[p_fb]              \n\t"
 | |
| 				// wave_last = wave_out
 | |
| 				"movl    %[out], %[last]             \n\t"
 | |
| 				// phase = phase_feedback >> mod_in_shift;
 | |
| 				"movb    %[mod_in], %%cl             \n\t"
 | |
| 				"sarl    %%cl, %%eax                 \n\t"
 | |
| 				// phase += phase_acc >> 9;
 | |
| 				"movl    %[p_acc], %%ebx             \n\t"
 | |
| 				"shrl    $9, %%ebx                   \n\t"
 | |
| 				"addl    %%ebx, %%eax                \n\t"
 | |
| 				// lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)];
 | |
| 				"andl    $0x3ff, %%eax               \n\t"
 | |
| 				"movzwl  (%%edi, %%eax, 2), %%ebx    \n\t"
 | |
| 				"movl    %%ebx, %%eax                \n\t"
 | |
| 				// level = (lookup & 0x1fff) + (envelope << 3);
 | |
| 				"movl    $0x1fff, %%ecx              \n\t"
 | |
| 				"andl    %%ecx, %%eax                \n\t"
 | |
| 				"addw    %[eg_out], %%ax             \n\t"
 | |
| 				// if (level > 0x1fff) level = 0x1fff;
 | |
| 				"cmpl    %%ecx, %%eax                \n\t"
 | |
| 				"cmoval  %%ecx, %%eax                \n\t"
 | |
| 				// wave_out = exprom[level & 0xff] >> (level >> 8);
 | |
| 				"movb    %%ah, %%cl                  \n\t"
 | |
| 				"movzbl  %%al, %%eax                 \n\t"
 | |
| 				"leal    %[exprom], %[out]           \n\t"
 | |
| 				"movzwl  (%[out], %%eax, 2), %[out]  \n\t"
 | |
| 				"shrl    %%cl, %[out]                \n\t"
 | |
| 				// if (lookup & 0x8000) wave_out = -wave_out;
 | |
| 				// in other words, lookup is negative
 | |
| 				"movl    %[out], %%ecx               \n\t"
 | |
| 				"negl    %%ecx                       \n\t"
 | |
| 				"testw   %%bx, %%bx                  \n\t"
 | |
| 				"cmovsl  %%ecx, %[out]               \n\t"
 | |
| 				// phase_acc += phase_offset
 | |
| 				"addl    %[p_off], %[p_acc]          \n\t"
 | |
| 				// loop
 | |
| 				"decl    %[i]                        \n\t"
 | |
| 				"jne     1b                          \n\t"
 | |
| 				: [p_fb]   "=&m" (phase_feedback),
 | |
| 				  [p_acc]  "+r"  (phase_acc),
 | |
| 				  [out]    "=&r" (wave_out),
 | |
| 				  [last]   "=&m" (wave_last),
 | |
| 				  [eg_out] "+m"  (eg_output)
 | |
| 				: [p_off]  "m"   (phase_offset),
 | |
| 				  [mod_in] "m"   (mod_in_shift),
 | |
| 				  [wave]   "m"   (waveform),
 | |
| 				  [sinrom] "m"   (logsinrom),
 | |
| 				  [exprom] "m"   (exprom),
 | |
| 				  [i]      "m"   (iter_counter)
 | |
| 				: "cc", "ax", "bx", "cx", "di"
 | |
| 			);
 | |
| #elif defined(__GNUC__) && defined(__arm__)
 | |
| 			asm (
 | |
| 				"movs    r3, #0                     \n\t"
 | |
| 				"movs    %[out], #0                 \n\t"
 | |
| 				"ldr     r8, =0x1fff                \n\t"
 | |
| 				"movs    r2, #29                    \n"
 | |
| 				"1:                                 \n\t"
 | |
| 				// phase_feedback = (wave_out + wave_last) >> 2;
 | |
| 				"adds    %[p_fb], %[out], r3        \n\t"
 | |
| 				"asrs    %[p_fb], %[p_fb], #2       \n\t"
 | |
| 				// wave_last = wave_out
 | |
| 				"mov     r3, %[out]                 \n\t"
 | |
| 				// phase = phase_feedback >> mod_in_shift;
 | |
| 				"asr     r0, %[p_fb], %[mod_in]     \n\t"
 | |
| 				// phase += phase_acc >> 9;
 | |
| 				"add     r0, r0, %[p_acc], asr #9   \n\t"
 | |
| 				// lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)];
 | |
| 				"lsls    r0, r0, #22                \n\t"
 | |
| 				"lsrs    r0, r0, #21                \n\t"
 | |
| 				"ldrsh   r1, [%[sinrom], r0]        \n\t"
 | |
| 				// level = (lookup & 0x1fff) + (envelope << 3);
 | |
| 				"and     r0, r8, r1                 \n\t"
 | |
| 				"add     r0, r0, %[eg_out], lsl #3  \n\t"
 | |
| 				// if (level > 0x1fff) level = 0x1fff;
 | |
| 				"cmp     r0, r8                     \n\t"
 | |
| 				"it      hi                         \n\t"
 | |
| 				"movhi   r0, r8                     \n\t"
 | |
| 				// wave_out = exprom[level & 0xff] >> (level >> 8);
 | |
| 				"lsrs    %[out], r0, #8             \n\t"
 | |
| 				"ands    r0, r0, #255               \n\t"
 | |
| 				"lsls    r0, r0, #1                 \n\t"
 | |
| 				"ldrh    r0, [%[exprom], r0]        \n\t"
 | |
| 				"lsr     %[out], r0, %[out]         \n\t"
 | |
| 				// if (lookup & 0x8000) wave_out = -wave_out;
 | |
| 				// in other words, lookup is negative
 | |
| 				"tst     r1, r1                     \n\t"
 | |
| 				"it      mi                         \n\t"
 | |
| 				"negmi   %[out], %[out]             \n\t"
 | |
| 				// phase_acc += phase_offset
 | |
| 				"adds    %[p_acc], %[p_acc], %[p_off]\n\t"
 | |
| 				// loop
 | |
| 				"subs    r2, r2, #1                 \n\t"
 | |
| 				"bne     1b                         \n\t"
 | |
| 				: [p_fb]   "=&r" (phase_feedback),
 | |
| 				  [p_acc]  "+r"  (phase_acc),
 | |
| 				  [out]    "=&r" (wave_out)
 | |
| 				: [p_off]  "r"   (phase_offset),
 | |
| 				  [mod_in] "r"   (mod_in_shift),
 | |
| 				  [eg_out] "r"   (eg_output),
 | |
| 				  [sinrom] "r"   (logsinrom + waveform * 1024),
 | |
| 				  [exprom] "r"   (exprom)
 | |
| 				: "cc", "r0", "r1", "r2", "r3", "r8"
 | |
| 			);
 | |
| #else
 | |
| 			wave_out = 0;
 | |
| 			wave_last = 0;
 | |
| 			for (iter_counter = 0; iter_counter < 29; iter_counter++)
 | |
| 			{
 | |
| 				phase_feedback = (wave_out + wave_last) >> 2;
 | |
| 				wave_last = wave_out;
 | |
| 				phase = phase_feedback >> mod_in_shift;
 | |
| 				phase += phase_acc >> 9;
 | |
| 				wave_out = ESFM_envelope_wavegen(waveform, phase, eg_output);
 | |
| 				phase_acc += phase_offset;
 | |
| 			}
 | |
| #endif
 | |
| 
 | |
| 			// TODO: Figure out - is this how the ESFM chip does it, like the
 | |
| 			// patent literally says? (it's really hacky...)
 | |
| 			//   slot->in.output = wave_out;
 | |
| 
 | |
| 			// This would be the more canonical way to do it, reusing the rest of
 | |
| 			// the synthesis pipeline to finish the calculation:
 | |
| 			if (chip->native_mode)
 | |
| 			{
 | |
| 				slot->in.feedback_buf = phase_feedback;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				slot->in.feedback_buf = phase_feedback >> (7 - slot->mod_in_level);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_process_channel(esfm_channel *channel)
 | |
| {
 | |
| 	int slot_idx;
 | |
| 	channel->output[0] = channel->output[1] = 0;
 | |
| 	for (slot_idx = 0; slot_idx < 4; slot_idx++)
 | |
| 	{
 | |
| 		esfm_slot *slot = &channel->slots[slot_idx];
 | |
| 		ESFM_envelope_calc(slot);
 | |
| 		ESFM_phase_generate(slot);
 | |
| 		if(slot_idx > 0)
 | |
| 		{
 | |
| 			ESFM_slot_generate(slot);
 | |
| 		}
 | |
| 	}
 | |
| 	// ESFM feedback calculation takes a large number of clock cycles, so
 | |
| 	// defer slot 0 generation to the end
 | |
| 	// TODO: verify this behavior on real hardware
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_process_channel_emu(esfm_channel *channel)
 | |
| {
 | |
| 	int slot_idx;
 | |
| 	channel->output[0] = channel->output[1] = 0;
 | |
| 	for (slot_idx = 0; slot_idx < 2; slot_idx++)
 | |
| 	{
 | |
| 		esfm_slot *slot = &channel->slots[slot_idx];
 | |
| 		ESFM_envelope_calc(slot);
 | |
| 		ESFM_phase_generate_emu(slot);
 | |
| 		if(slot_idx > 0)
 | |
| 		{
 | |
| 			ESFM_slot_generate_emu(slot);
 | |
| 		}
 | |
| 	}
 | |
| 	// ESFM feedback calculation takes a large number of clock cycles, so
 | |
| 	// defer slot 0 generation to the end
 | |
| 	// TODO: verify this behavior on real hardware
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static int16_t
 | |
| ESFM_clip_sample(int32 sample)
 | |
| {
 | |
| 	// TODO: Supposedly, the real ESFM chip actually overflows rather than
 | |
| 	// clipping. Verify that.
 | |
| 	if (sample > 32767)
 | |
| 	{
 | |
| 		sample = 32767;
 | |
| 	}
 | |
| 	else if (sample < -32768)
 | |
| 	{
 | |
| 		sample = -32768;
 | |
| 	}
 | |
| 	return (int16_t)sample;
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| static void
 | |
| ESFM_update_timers(esfm_chip *chip)
 | |
| {
 | |
| 	// Tremolo
 | |
| 	if ((chip->global_timer & 0x3f) == 0x3f)
 | |
| 	{
 | |
| 		chip->tremolo_pos = (chip->tremolo_pos + 1) % 210;
 | |
| 		if (chip->tremolo_pos < 105)
 | |
| 		{
 | |
| 			chip->tremolo = chip->tremolo_pos;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			chip->tremolo = (210 - chip->tremolo_pos);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Vibrato
 | |
| 	if ((chip->global_timer & 0x3ff) == 0x3ff)
 | |
| 	{
 | |
| 		chip->vibrato_pos = (chip->vibrato_pos + 1) & 0x07;
 | |
| 	}
 | |
| 
 | |
| 	chip->global_timer = (chip->global_timer + 1) & 0x3ff;
 | |
| 
 | |
| 	// Envelope generator dither clocks
 | |
| 	chip->eg_clocks = 0;
 | |
| 	if (chip->eg_timer)
 | |
| 	{
 | |
| 		uint8 shift = 0;
 | |
| 		while (shift < 36 && ((chip->eg_timer >> shift) & 1) == 0)
 | |
| 		{
 | |
| 			shift++;
 | |
| 		}
 | |
| 
 | |
| 		if (shift <= 12)
 | |
| 		{
 | |
| 			chip->eg_clocks = shift + 1;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (chip->eg_tick || chip->eg_timer_overflow)
 | |
| 	{
 | |
| 		if (chip->eg_timer == (1llu << 36) - 1)
 | |
| 		{
 | |
| 			chip->eg_timer = 0;
 | |
| 			chip->eg_timer_overflow = 1;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			chip->eg_timer++;
 | |
| 			chip->eg_timer_overflow = 0;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	chip->eg_tick ^= 1;
 | |
| }
 | |
| 
 | |
| #define KEY_ON_REGS_START (18 * 4 * 8)
 | |
| /* ------------------------------------------------------------------------- */
 | |
| int
 | |
| ESFM_reg_write_chan_idx(esfm_chip *chip, uint16_t reg)
 | |
| {
 | |
| 	int which_reg = -1;
 | |
| 	if (chip->native_mode)
 | |
| 	{
 | |
| 		bool is_key_on_reg = reg >= KEY_ON_REGS_START && reg < (KEY_ON_REGS_START + 20);
 | |
| 		if (is_key_on_reg)
 | |
| 		{
 | |
| 			which_reg = reg - KEY_ON_REGS_START;
 | |
| 		}
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		uint8_t reg_low = reg & 0xff;
 | |
| 		bool high = reg & 0x100;
 | |
| 		bool is_key_on_reg = reg_low >= 0xb0 && reg_low < 0xb9;
 | |
| 		if (is_key_on_reg)
 | |
| 		{
 | |
| 			which_reg = (reg_low & 0x0f) + high * 9;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return which_reg;
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| void
 | |
| ESFM_update_write_buffer(esfm_chip *chip)
 | |
| {
 | |
| 	esfm_write_buf *write_buf;
 | |
| 	bool note_off_written[20];
 | |
| 	bool bassdrum_written = false;
 | |
| 	int i;
 | |
| 	for (i = 0; i < 20; i++)
 | |
| 	{
 | |
| 		note_off_written[i] = false;
 | |
| 	}
 | |
| 	while((write_buf = &chip->write_buf[chip->write_buf_start]),
 | |
| 		write_buf->valid && write_buf->timestamp <= chip->write_buf_timestamp)
 | |
| 	{
 | |
| 		int is_which_note_on_reg =
 | |
| 			ESFM_reg_write_chan_idx(chip, write_buf->address);
 | |
| 		if (is_which_note_on_reg >= 0)
 | |
| 		{
 | |
| 			if ((chip->native_mode && (write_buf->data & 0x01) == 0)
 | |
| 				|| (!chip->native_mode && (write_buf->data & 0x20) == 0)
 | |
| 			)
 | |
| 			{
 | |
| 				// this is a note off command; note down that we got note off for this channel
 | |
| 				note_off_written[is_which_note_on_reg] = true;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				// this is a note on command; have we gotten a note off for this channel in this cycle?
 | |
| 				if (note_off_written[is_which_note_on_reg])
 | |
| 				{
 | |
| 					// we have a conflict; let the note off be processed first and defer the
 | |
| 					// rest of the buffer to the next cycle
 | |
| 					break;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		if ((chip->native_mode && write_buf->address == 0x4bd)
 | |
| 			|| (!chip->native_mode && (write_buf->address & 0xff) == 0xbd)
 | |
| 		)
 | |
| 		{
 | |
| 			// bassdrum register write (rhythm mode note-on/off control)
 | |
| 			// have we already written to the bassdrum register in this cycle
 | |
| 			if (bassdrum_written) {
 | |
| 				// we have a conflict
 | |
| 				break;
 | |
| 			}
 | |
| 			bassdrum_written = true;
 | |
| 		}
 | |
| 
 | |
| 		write_buf->valid = 0;
 | |
| 		ESFM_write_reg(chip, write_buf->address, write_buf->data);
 | |
| 		chip->write_buf_start = (chip->write_buf_start + 1) % ESFM_WRITEBUF_SIZE;
 | |
| 	}
 | |
| 
 | |
| 	chip->write_buf_timestamp++;
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| void
 | |
| ESFM_generate(esfm_chip *chip, int16_t *buf)
 | |
| {
 | |
| 	int channel_idx;
 | |
| 
 | |
| 	chip->output_accm[0] = chip->output_accm[1] = 0;
 | |
| 	for (channel_idx = 0; channel_idx < 18; channel_idx++)
 | |
| 	{
 | |
| 		esfm_channel *channel = &chip->channels[channel_idx];
 | |
| 		if (chip->native_mode)
 | |
| 		{
 | |
| 			ESFM_process_channel(channel);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			ESFM_process_channel_emu(channel);
 | |
| 		}
 | |
| 	}
 | |
| 	ESFM_process_feedback(chip);
 | |
| 	for (channel_idx = 0; channel_idx < 18; channel_idx++)
 | |
| 	{
 | |
| 		esfm_channel *channel = &chip->channels[channel_idx];
 | |
| 		if (chip->native_mode)
 | |
| 		{
 | |
| 			ESFM_slot_generate(&channel->slots[0]);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			ESFM_slot_generate_emu(&channel->slots[0]);
 | |
| 		}
 | |
| 		chip->output_accm[0] += channel->output[0];
 | |
| 		chip->output_accm[1] += channel->output[1];
 | |
| 	}
 | |
| 
 | |
| 	buf[0] = ESFM_clip_sample(chip->output_accm[0]);
 | |
| 	buf[1] = ESFM_clip_sample(chip->output_accm[1]);
 | |
| 
 | |
| 	ESFM_update_timers(chip);
 | |
| 	ESFM_update_write_buffer(chip);
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| int16_t
 | |
| ESFM_get_channel_output_native(esfm_chip *chip, int channel_idx)
 | |
| {
 | |
| 	int16_t result;
 | |
| 	int32_t temp_mix = 0;
 | |
| 	int i;
 | |
| 	
 | |
| 	if (channel_idx < 0 || channel_idx >= 18)
 | |
| 	{
 | |
| 		return 0;
 | |
| 	}
 | |
| 	
 | |
| 	for (i = 0; i < 4; i++)
 | |
| 	{
 | |
| 		esfm_slot *slot = &chip->channels[channel_idx].slots[i];
 | |
| 		
 | |
| 		if (slot->output_level)
 | |
| 		{
 | |
| 			int13 output_value = slot->in.output >> (7 - slot->output_level);
 | |
| 			temp_mix += output_value & slot->out_enable[0];
 | |
| 			temp_mix += output_value & slot->out_enable[1];
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	if (temp_mix > 32767)
 | |
| 	{
 | |
| 		temp_mix = 32767;
 | |
| 	}
 | |
| 	else if (temp_mix < -32768)
 | |
| 	{
 | |
| 		temp_mix = -32768;
 | |
| 	}
 | |
| 	result = temp_mix;
 | |
| 	return result;
 | |
| }
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| void
 | |
| ESFM_generate_stream(esfm_chip *chip, int16_t *sndptr, uint32_t num_samples)
 | |
| {
 | |
| 	uint32_t i;
 | |
| 
 | |
| 	for (i = 0; i < num_samples; i++)
 | |
| 	{
 | |
| 		ESFM_generate(chip, sndptr);
 | |
| 		sndptr += 2;
 | |
| 	}
 | |
| }
 | 
