diff --git a/code/difftb.inc b/code/difftb.inc deleted file mode 100644 index 76abbf21..00000000 --- a/code/difftb.inc +++ /dev/null @@ -1,1443 +0,0 @@ -;****************************************************************************** -;* O P E N T S -;****************************************************************************** -;* SPDX-License-Identifier: GPL-3.0-or-later -;* Copyright 2025 Electronic Arts Inc. -;* Copyright 2026 OpenTS contributors -;* -;* Contains material derived from Electronic Arts source code. -;* Modified by OpenTS contributors, 2026. -;* EA's GPLv3 Section 7 additional terms and supplemental warranty -;* disclaimers apply; see LICENSE.md. -;****************************************************************************** - -;**************************************************************************** -;* dwDiffTable - ADPCM Lookup table for sample differences -;**************************************************************************** - - align 4 - -dwDiffTable DD 0 ; Index = 0 Token = 0 - DD 1 ; Index = 0 Token = 1 - DD 3 ; Index = 0 Token = 2 - DD 4 ; Index = 0 Token = 3 - DD 7 ; Index = 0 Token = 4 - DD 8 ; Index = 0 Token = 5 - DD 10 ; Index = 0 Token = 6 - DD 11 ; Index = 0 Token = 7 - DD 0 ; Index = 0 Token = 8 - DD -1 ; Index = 0 Token = 9 - DD -3 ; Index = 0 Token = 10 - DD -4 ; Index = 0 Token = 11 - DD -7 ; Index = 0 Token = 12 - DD -8 ; Index = 0 Token = 13 - DD -10 ; Index = 0 Token = 14 - DD -11 ; Index = 0 Token = 15 - DD 1 ; Index = 1 Token = 0 - DD 3 ; Index = 1 Token = 1 - DD 5 ; Index = 1 Token = 2 - DD 7 ; Index = 1 Token = 3 - DD 9 ; Index = 1 Token = 4 - DD 11 ; Index = 1 Token = 5 - DD 13 ; Index = 1 Token = 6 - DD 15 ; Index = 1 Token = 7 - DD -1 ; Index = 1 Token = 8 - DD -3 ; Index = 1 Token = 9 - DD -5 ; Index = 1 Token = 10 - DD -7 ; Index = 1 Token = 11 - DD -9 ; Index = 1 Token = 12 - DD -11 ; Index = 1 Token = 13 - DD -13 ; Index = 1 Token = 14 - DD -15 ; Index = 1 Token = 15 - DD 1 ; Index = 2 Token = 0 - DD 3 ; Index = 2 Token = 1 - DD 5 ; Index = 2 Token = 2 - DD 7 ; Index = 2 Token = 3 - DD 10 ; Index = 2 Token = 4 - DD 12 ; Index = 2 Token = 5 - DD 14 ; Index = 2 Token = 6 - DD 16 ; Index = 2 Token = 7 - DD -1 ; Index = 2 Token = 8 - DD -3 ; Index = 2 Token = 9 - DD -5 ; Index = 2 Token = 10 - DD -7 ; Index = 2 Token = 11 - DD -10 ; Index = 2 Token = 12 - DD -12 ; Index = 2 Token = 13 - DD -14 ; Index = 2 Token = 14 - DD -16 ; Index = 2 Token = 15 - DD 1 ; Index = 3 Token = 0 - DD 3 ; Index = 3 Token = 1 - DD 6 ; Index = 3 Token = 2 - DD 8 ; Index = 3 Token = 3 - DD 11 ; Index = 3 Token = 4 - DD 13 ; Index = 3 Token = 5 - DD 16 ; Index = 3 Token = 6 - DD 18 ; Index = 3 Token = 7 - DD -1 ; Index = 3 Token = 8 - DD -3 ; Index = 3 Token = 9 - DD -6 ; Index = 3 Token = 10 - DD -8 ; Index = 3 Token = 11 - DD -11 ; Index = 3 Token = 12 - DD -13 ; Index = 3 Token = 13 - DD -16 ; Index = 3 Token = 14 - DD -18 ; Index = 3 Token = 15 - DD 1 ; Index = 4 Token = 0 - DD 3 ; Index = 4 Token = 1 - DD 6 ; Index = 4 Token = 2 - DD 8 ; Index = 4 Token = 3 - DD 12 ; Index = 4 Token = 4 - DD 14 ; Index = 4 Token = 5 - DD 17 ; Index = 4 Token = 6 - DD 19 ; Index = 4 Token = 7 - DD -1 ; Index = 4 Token = 8 - DD -3 ; Index = 4 Token = 9 - DD -6 ; Index = 4 Token = 10 - DD -8 ; Index = 4 Token = 11 - DD -12 ; Index = 4 Token = 12 - DD -14 ; Index = 4 Token = 13 - DD -17 ; Index = 4 Token = 14 - DD -19 ; Index = 4 Token = 15 - DD 1 ; Index = 5 Token = 0 - DD 4 ; Index = 5 Token = 1 - DD 7 ; Index = 5 Token = 2 - DD 10 ; Index = 5 Token = 3 - DD 13 ; Index = 5 Token = 4 - DD 16 ; Index = 5 Token = 5 - DD 19 ; Index = 5 Token = 6 - DD 22 ; Index = 5 Token = 7 - DD -1 ; Index = 5 Token = 8 - DD -4 ; Index = 5 Token = 9 - DD -7 ; Index = 5 Token = 10 - DD -10 ; Index = 5 Token = 11 - DD -13 ; Index = 5 Token = 12 - DD -16 ; Index = 5 Token = 13 - DD -19 ; Index = 5 Token = 14 - DD -22 ; Index = 5 Token = 15 - DD 1 ; Index = 6 Token = 0 - DD 4 ; Index = 6 Token = 1 - DD 7 ; Index = 6 Token = 2 - DD 10 ; Index = 6 Token = 3 - DD 14 ; Index = 6 Token = 4 - DD 17 ; Index = 6 Token = 5 - DD 20 ; Index = 6 Token = 6 - DD 23 ; Index = 6 Token = 7 - DD -1 ; Index = 6 Token = 8 - DD -4 ; Index = 6 Token = 9 - DD -7 ; Index = 6 Token = 10 - DD -10 ; Index = 6 Token = 11 - DD -14 ; Index = 6 Token = 12 - DD -17 ; Index = 6 Token = 13 - DD -20 ; Index = 6 Token = 14 - DD -23 ; Index = 6 Token = 15 - DD 1 ; Index = 7 Token = 0 - DD 4 ; Index = 7 Token = 1 - DD 8 ; Index = 7 Token = 2 - DD 11 ; Index = 7 Token = 3 - DD 15 ; Index = 7 Token = 4 - DD 18 ; Index = 7 Token = 5 - DD 22 ; Index = 7 Token = 6 - DD 25 ; Index = 7 Token = 7 - DD -1 ; Index = 7 Token = 8 - DD -4 ; Index = 7 Token = 9 - DD -8 ; Index = 7 Token = 10 - DD -11 ; Index = 7 Token = 11 - DD -15 ; Index = 7 Token = 12 - DD -18 ; Index = 7 Token = 13 - DD -22 ; Index = 7 Token = 14 - DD -25 ; Index = 7 Token = 15 - DD 2 ; Index = 8 Token = 0 - DD 6 ; Index = 8 Token = 1 - DD 10 ; Index = 8 Token = 2 - DD 14 ; Index = 8 Token = 3 - DD 18 ; Index = 8 Token = 4 - DD 22 ; Index = 8 Token = 5 - DD 26 ; Index = 8 Token = 6 - DD 30 ; Index = 8 Token = 7 - DD -2 ; Index = 8 Token = 8 - DD -6 ; Index = 8 Token = 9 - DD -10 ; Index = 8 Token = 10 - DD -14 ; Index = 8 Token = 11 - DD -18 ; Index = 8 Token = 12 - DD -22 ; Index = 8 Token = 13 - DD -26 ; Index = 8 Token = 14 - DD -30 ; Index = 8 Token = 15 - DD 2 ; Index = 9 Token = 0 - DD 6 ; Index = 9 Token = 1 - DD 10 ; Index = 9 Token = 2 - DD 14 ; Index = 9 Token = 3 - DD 19 ; Index = 9 Token = 4 - DD 23 ; Index = 9 Token = 5 - DD 27 ; Index = 9 Token = 6 - DD 31 ; Index = 9 Token = 7 - DD -2 ; Index = 9 Token = 8 - DD -6 ; Index = 9 Token = 9 - DD -10 ; Index = 9 Token = 10 - DD -14 ; Index = 9 Token = 11 - DD -19 ; Index = 9 Token = 12 - DD -23 ; Index = 9 Token = 13 - DD -27 ; Index = 9 Token = 14 - DD -31 ; Index = 9 Token = 15 - DD 2 ; Index = 10 Token = 0 - DD 6 ; Index = 10 Token = 1 - DD 11 ; Index = 10 Token = 2 - DD 15 ; Index = 10 Token = 3 - DD 21 ; Index = 10 Token = 4 - DD 25 ; Index = 10 Token = 5 - DD 30 ; Index = 10 Token = 6 - DD 34 ; Index = 10 Token = 7 - DD -2 ; Index = 10 Token = 8 - DD -6 ; Index = 10 Token = 9 - DD -11 ; Index = 10 Token = 10 - DD -15 ; Index = 10 Token = 11 - DD -21 ; Index = 10 Token = 12 - DD -25 ; Index = 10 Token = 13 - DD -30 ; Index = 10 Token = 14 - DD -34 ; Index = 10 Token = 15 - DD 2 ; Index = 11 Token = 0 - DD 7 ; Index = 11 Token = 1 - DD 12 ; Index = 11 Token = 2 - DD 17 ; Index = 11 Token = 3 - DD 23 ; Index = 11 Token = 4 - DD 28 ; Index = 11 Token = 5 - DD 33 ; Index = 11 Token = 6 - DD 38 ; Index = 11 Token = 7 - DD -2 ; Index = 11 Token = 8 - DD -7 ; Index = 11 Token = 9 - DD -12 ; Index = 11 Token = 10 - DD -17 ; Index = 11 Token = 11 - DD -23 ; Index = 11 Token = 12 - DD -28 ; Index = 11 Token = 13 - DD -33 ; Index = 11 Token = 14 - DD -38 ; Index = 11 Token = 15 - DD 2 ; Index = 12 Token = 0 - DD 7 ; Index = 12 Token = 1 - DD 13 ; Index = 12 Token = 2 - DD 18 ; Index = 12 Token = 3 - DD 25 ; Index = 12 Token = 4 - DD 30 ; Index = 12 Token = 5 - DD 36 ; Index = 12 Token = 6 - DD 41 ; Index = 12 Token = 7 - DD -2 ; Index = 12 Token = 8 - DD -7 ; Index = 12 Token = 9 - DD -13 ; Index = 12 Token = 10 - DD -18 ; Index = 12 Token = 11 - DD -25 ; Index = 12 Token = 12 - DD -30 ; Index = 12 Token = 13 - DD -36 ; Index = 12 Token = 14 - DD -41 ; Index = 12 Token = 15 - DD 3 ; Index = 13 Token = 0 - DD 9 ; Index = 13 Token = 1 - DD 15 ; Index = 13 Token = 2 - DD 21 ; Index = 13 Token = 3 - DD 28 ; Index = 13 Token = 4 - DD 34 ; Index = 13 Token = 5 - DD 40 ; Index = 13 Token = 6 - DD 46 ; Index = 13 Token = 7 - DD -3 ; Index = 13 Token = 8 - DD -9 ; Index = 13 Token = 9 - DD -15 ; Index = 13 Token = 10 - DD -21 ; Index = 13 Token = 11 - DD -28 ; Index = 13 Token = 12 - DD -34 ; Index = 13 Token = 13 - DD -40 ; Index = 13 Token = 14 - DD -46 ; Index = 13 Token = 15 - DD 3 ; Index = 14 Token = 0 - DD 10 ; Index = 14 Token = 1 - DD 17 ; Index = 14 Token = 2 - DD 24 ; Index = 14 Token = 3 - DD 31 ; Index = 14 Token = 4 - DD 38 ; Index = 14 Token = 5 - DD 45 ; Index = 14 Token = 6 - DD 52 ; Index = 14 Token = 7 - DD -3 ; Index = 14 Token = 8 - DD -10 ; Index = 14 Token = 9 - DD -17 ; Index = 14 Token = 10 - DD -24 ; Index = 14 Token = 11 - DD -31 ; Index = 14 Token = 12 - DD -38 ; Index = 14 Token = 13 - DD -45 ; Index = 14 Token = 14 - DD -52 ; Index = 14 Token = 15 - DD 3 ; Index = 15 Token = 0 - DD 10 ; Index = 15 Token = 1 - DD 18 ; Index = 15 Token = 2 - DD 25 ; Index = 15 Token = 3 - DD 34 ; Index = 15 Token = 4 - DD 41 ; Index = 15 Token = 5 - DD 49 ; Index = 15 Token = 6 - DD 56 ; Index = 15 Token = 7 - DD -3 ; Index = 15 Token = 8 - DD -10 ; Index = 15 Token = 9 - DD -18 ; Index = 15 Token = 10 - DD -25 ; Index = 15 Token = 11 - DD -34 ; Index = 15 Token = 12 - DD -41 ; Index = 15 Token = 13 - DD -49 ; Index = 15 Token = 14 - DD -56 ; Index = 15 Token = 15 - DD 4 ; Index = 16 Token = 0 - DD 12 ; Index = 16 Token = 1 - DD 21 ; Index = 16 Token = 2 - DD 29 ; Index = 16 Token = 3 - DD 38 ; Index = 16 Token = 4 - DD 46 ; Index = 16 Token = 5 - DD 55 ; Index = 16 Token = 6 - DD 63 ; Index = 16 Token = 7 - DD -4 ; Index = 16 Token = 8 - DD -12 ; Index = 16 Token = 9 - DD -21 ; Index = 16 Token = 10 - DD -29 ; Index = 16 Token = 11 - DD -38 ; Index = 16 Token = 12 - DD -46 ; Index = 16 Token = 13 - DD -55 ; Index = 16 Token = 14 - DD -63 ; Index = 16 Token = 15 - DD 4 ; Index = 17 Token = 0 - DD 13 ; Index = 17 Token = 1 - DD 22 ; Index = 17 Token = 2 - DD 31 ; Index = 17 Token = 3 - DD 41 ; Index = 17 Token = 4 - DD 50 ; Index = 17 Token = 5 - DD 59 ; Index = 17 Token = 6 - DD 68 ; Index = 17 Token = 7 - DD -4 ; Index = 17 Token = 8 - DD -13 ; Index = 17 Token = 9 - DD -22 ; Index = 17 Token = 10 - DD -31 ; Index = 17 Token = 11 - DD -41 ; Index = 17 Token = 12 - DD -50 ; Index = 17 Token = 13 - DD -59 ; Index = 17 Token = 14 - DD -68 ; Index = 17 Token = 15 - DD 5 ; Index = 18 Token = 0 - DD 15 ; Index = 18 Token = 1 - DD 25 ; Index = 18 Token = 2 - DD 35 ; Index = 18 Token = 3 - DD 46 ; Index = 18 Token = 4 - DD 56 ; Index = 18 Token = 5 - DD 66 ; Index = 18 Token = 6 - DD 76 ; Index = 18 Token = 7 - DD -5 ; Index = 18 Token = 8 - DD -15 ; Index = 18 Token = 9 - DD -25 ; Index = 18 Token = 10 - DD -35 ; Index = 18 Token = 11 - DD -46 ; Index = 18 Token = 12 - DD -56 ; Index = 18 Token = 13 - DD -66 ; Index = 18 Token = 14 - DD -76 ; Index = 18 Token = 15 - DD 5 ; Index = 19 Token = 0 - DD 16 ; Index = 19 Token = 1 - DD 27 ; Index = 19 Token = 2 - DD 38 ; Index = 19 Token = 3 - DD 50 ; Index = 19 Token = 4 - DD 61 ; Index = 19 Token = 5 - DD 72 ; Index = 19 Token = 6 - DD 83 ; Index = 19 Token = 7 - DD -5 ; Index = 19 Token = 8 - DD -16 ; Index = 19 Token = 9 - DD -27 ; Index = 19 Token = 10 - DD -38 ; Index = 19 Token = 11 - DD -50 ; Index = 19 Token = 12 - DD -61 ; Index = 19 Token = 13 - DD -72 ; Index = 19 Token = 14 - DD -83 ; Index = 19 Token = 15 - DD 6 ; Index = 20 Token = 0 - DD 18 ; Index = 20 Token = 1 - DD 31 ; Index = 20 Token = 2 - DD 43 ; Index = 20 Token = 3 - DD 56 ; Index = 20 Token = 4 - DD 68 ; Index = 20 Token = 5 - DD 81 ; Index = 20 Token = 6 - DD 93 ; Index = 20 Token = 7 - DD -6 ; Index = 20 Token = 8 - DD -18 ; Index = 20 Token = 9 - DD -31 ; Index = 20 Token = 10 - DD -43 ; Index = 20 Token = 11 - DD -56 ; Index = 20 Token = 12 - DD -68 ; Index = 20 Token = 13 - DD -81 ; Index = 20 Token = 14 - DD -93 ; Index = 20 Token = 15 - DD 6 ; Index = 21 Token = 0 - DD 19 ; Index = 21 Token = 1 - DD 33 ; Index = 21 Token = 2 - DD 46 ; Index = 21 Token = 3 - DD 61 ; Index = 21 Token = 4 - DD 74 ; Index = 21 Token = 5 - DD 88 ; Index = 21 Token = 6 - DD 101 ; Index = 21 Token = 7 - DD -6 ; Index = 21 Token = 8 - DD -19 ; Index = 21 Token = 9 - DD -33 ; Index = 21 Token = 10 - DD -46 ; Index = 21 Token = 11 - DD -61 ; Index = 21 Token = 12 - DD -74 ; Index = 21 Token = 13 - DD -88 ; Index = 21 Token = 14 - DD -101 ; Index = 21 Token = 15 - DD 7 ; Index = 22 Token = 0 - DD 22 ; Index = 22 Token = 1 - DD 37 ; Index = 22 Token = 2 - DD 52 ; Index = 22 Token = 3 - DD 67 ; Index = 22 Token = 4 - DD 82 ; Index = 22 Token = 5 - DD 97 ; Index = 22 Token = 6 - DD 112 ; Index = 22 Token = 7 - DD -7 ; Index = 22 Token = 8 - DD -22 ; Index = 22 Token = 9 - DD -37 ; Index = 22 Token = 10 - DD -52 ; Index = 22 Token = 11 - DD -67 ; Index = 22 Token = 12 - DD -82 ; Index = 22 Token = 13 - DD -97 ; Index = 22 Token = 14 - DD -112 ; Index = 22 Token = 15 - DD 8 ; Index = 23 Token = 0 - DD 24 ; Index = 23 Token = 1 - DD 41 ; Index = 23 Token = 2 - DD 57 ; Index = 23 Token = 3 - DD 74 ; Index = 23 Token = 4 - DD 90 ; Index = 23 Token = 5 - DD 107 ; Index = 23 Token = 6 - DD 123 ; Index = 23 Token = 7 - DD -8 ; Index = 23 Token = 8 - DD -24 ; Index = 23 Token = 9 - DD -41 ; Index = 23 Token = 10 - DD -57 ; Index = 23 Token = 11 - DD -74 ; Index = 23 Token = 12 - DD -90 ; Index = 23 Token = 13 - DD -107 ; Index = 23 Token = 14 - DD -123 ; Index = 23 Token = 15 - DD 9 ; Index = 24 Token = 0 - DD 27 ; Index = 24 Token = 1 - DD 45 ; Index = 24 Token = 2 - DD 63 ; Index = 24 Token = 3 - DD 82 ; Index = 24 Token = 4 - DD 100 ; Index = 24 Token = 5 - DD 118 ; Index = 24 Token = 6 - DD 136 ; Index = 24 Token = 7 - DD -9 ; Index = 24 Token = 8 - DD -27 ; Index = 24 Token = 9 - DD -45 ; Index = 24 Token = 10 - DD -63 ; Index = 24 Token = 11 - DD -82 ; Index = 24 Token = 12 - DD -100 ; Index = 24 Token = 13 - DD -118 ; Index = 24 Token = 14 - DD -136 ; Index = 24 Token = 15 - DD 10 ; Index = 25 Token = 0 - DD 30 ; Index = 25 Token = 1 - DD 50 ; Index = 25 Token = 2 - DD 70 ; Index = 25 Token = 3 - DD 90 ; Index = 25 Token = 4 - DD 110 ; Index = 25 Token = 5 - DD 130 ; Index = 25 Token = 6 - DD 150 ; Index = 25 Token = 7 - DD -10 ; Index = 25 Token = 8 - DD -30 ; Index = 25 Token = 9 - DD -50 ; Index = 25 Token = 10 - DD -70 ; Index = 25 Token = 11 - DD -90 ; Index = 25 Token = 12 - DD -110 ; Index = 25 Token = 13 - DD -130 ; Index = 25 Token = 14 - DD -150 ; Index = 25 Token = 15 - DD 11 ; Index = 26 Token = 0 - DD 33 ; Index = 26 Token = 1 - DD 55 ; Index = 26 Token = 2 - DD 77 ; Index = 26 Token = 3 - DD 99 ; Index = 26 Token = 4 - DD 121 ; Index = 26 Token = 5 - DD 143 ; Index = 26 Token = 6 - DD 165 ; Index = 26 Token = 7 - DD -11 ; Index = 26 Token = 8 - DD -33 ; Index = 26 Token = 9 - DD -55 ; Index = 26 Token = 10 - DD -77 ; Index = 26 Token = 11 - DD -99 ; Index = 26 Token = 12 - DD -121 ; Index = 26 Token = 13 - DD -143 ; Index = 26 Token = 14 - DD -165 ; Index = 26 Token = 15 - DD 12 ; Index = 27 Token = 0 - DD 36 ; Index = 27 Token = 1 - DD 60 ; Index = 27 Token = 2 - DD 84 ; Index = 27 Token = 3 - DD 109 ; Index = 27 Token = 4 - DD 133 ; Index = 27 Token = 5 - DD 157 ; Index = 27 Token = 6 - DD 181 ; Index = 27 Token = 7 - DD -12 ; Index = 27 Token = 8 - DD -36 ; Index = 27 Token = 9 - DD -60 ; Index = 27 Token = 10 - DD -84 ; Index = 27 Token = 11 - DD -109 ; Index = 27 Token = 12 - DD -133 ; Index = 27 Token = 13 - DD -157 ; Index = 27 Token = 14 - DD -181 ; Index = 27 Token = 15 - DD 13 ; Index = 28 Token = 0 - DD 39 ; Index = 28 Token = 1 - DD 66 ; Index = 28 Token = 2 - DD 92 ; Index = 28 Token = 3 - DD 120 ; Index = 28 Token = 4 - DD 146 ; Index = 28 Token = 5 - DD 173 ; Index = 28 Token = 6 - DD 199 ; Index = 28 Token = 7 - DD -13 ; Index = 28 Token = 8 - DD -39 ; Index = 28 Token = 9 - DD -66 ; Index = 28 Token = 10 - DD -92 ; Index = 28 Token = 11 - DD -120 ; Index = 28 Token = 12 - DD -146 ; Index = 28 Token = 13 - DD -173 ; Index = 28 Token = 14 - DD -199 ; Index = 28 Token = 15 - DD 14 ; Index = 29 Token = 0 - DD 43 ; Index = 29 Token = 1 - DD 73 ; Index = 29 Token = 2 - DD 102 ; Index = 29 Token = 3 - DD 132 ; Index = 29 Token = 4 - DD 161 ; Index = 29 Token = 5 - DD 191 ; Index = 29 Token = 6 - DD 220 ; Index = 29 Token = 7 - DD -14 ; Index = 29 Token = 8 - DD -43 ; Index = 29 Token = 9 - DD -73 ; Index = 29 Token = 10 - DD -102 ; Index = 29 Token = 11 - DD -132 ; Index = 29 Token = 12 - DD -161 ; Index = 29 Token = 13 - DD -191 ; Index = 29 Token = 14 - DD -220 ; Index = 29 Token = 15 - DD 16 ; Index = 30 Token = 0 - DD 48 ; Index = 30 Token = 1 - DD 81 ; Index = 30 Token = 2 - DD 113 ; Index = 30 Token = 3 - DD 146 ; Index = 30 Token = 4 - DD 178 ; Index = 30 Token = 5 - DD 211 ; Index = 30 Token = 6 - DD 243 ; Index = 30 Token = 7 - DD -16 ; Index = 30 Token = 8 - DD -48 ; Index = 30 Token = 9 - DD -81 ; Index = 30 Token = 10 - DD -113 ; Index = 30 Token = 11 - DD -146 ; Index = 30 Token = 12 - DD -178 ; Index = 30 Token = 13 - DD -211 ; Index = 30 Token = 14 - DD -243 ; Index = 30 Token = 15 - DD 17 ; Index = 31 Token = 0 - DD 52 ; Index = 31 Token = 1 - DD 88 ; Index = 31 Token = 2 - DD 123 ; Index = 31 Token = 3 - DD 160 ; Index = 31 Token = 4 - DD 195 ; Index = 31 Token = 5 - DD 231 ; Index = 31 Token = 6 - DD 266 ; Index = 31 Token = 7 - DD -17 ; Index = 31 Token = 8 - DD -52 ; Index = 31 Token = 9 - DD -88 ; Index = 31 Token = 10 - DD -123 ; Index = 31 Token = 11 - DD -160 ; Index = 31 Token = 12 - DD -195 ; Index = 31 Token = 13 - DD -231 ; Index = 31 Token = 14 - DD -266 ; Index = 31 Token = 15 - DD 19 ; Index = 32 Token = 0 - DD 58 ; Index = 32 Token = 1 - DD 97 ; Index = 32 Token = 2 - DD 136 ; Index = 32 Token = 3 - DD 176 ; Index = 32 Token = 4 - DD 215 ; Index = 32 Token = 5 - DD 254 ; Index = 32 Token = 6 - DD 293 ; Index = 32 Token = 7 - DD -19 ; Index = 32 Token = 8 - DD -58 ; Index = 32 Token = 9 - DD -97 ; Index = 32 Token = 10 - DD -136 ; Index = 32 Token = 11 - DD -176 ; Index = 32 Token = 12 - DD -215 ; Index = 32 Token = 13 - DD -254 ; Index = 32 Token = 14 - DD -293 ; Index = 32 Token = 15 - DD 21 ; Index = 33 Token = 0 - DD 64 ; Index = 33 Token = 1 - DD 107 ; Index = 33 Token = 2 - DD 150 ; Index = 33 Token = 3 - DD 194 ; Index = 33 Token = 4 - DD 237 ; Index = 33 Token = 5 - DD 280 ; Index = 33 Token = 6 - DD 323 ; Index = 33 Token = 7 - DD -21 ; Index = 33 Token = 8 - DD -64 ; Index = 33 Token = 9 - DD -107 ; Index = 33 Token = 10 - DD -150 ; Index = 33 Token = 11 - DD -194 ; Index = 33 Token = 12 - DD -237 ; Index = 33 Token = 13 - DD -280 ; Index = 33 Token = 14 - DD -323 ; Index = 33 Token = 15 - DD 23 ; Index = 34 Token = 0 - DD 70 ; Index = 34 Token = 1 - DD 118 ; Index = 34 Token = 2 - DD 165 ; Index = 34 Token = 3 - DD 213 ; Index = 34 Token = 4 - DD 260 ; Index = 34 Token = 5 - DD 308 ; Index = 34 Token = 6 - DD 355 ; Index = 34 Token = 7 - DD -23 ; Index = 34 Token = 8 - DD -70 ; Index = 34 Token = 9 - DD -118 ; Index = 34 Token = 10 - DD -165 ; Index = 34 Token = 11 - DD -213 ; Index = 34 Token = 12 - DD -260 ; Index = 34 Token = 13 - DD -308 ; Index = 34 Token = 14 - DD -355 ; Index = 34 Token = 15 - DD 26 ; Index = 35 Token = 0 - DD 78 ; Index = 35 Token = 1 - DD 130 ; Index = 35 Token = 2 - DD 182 ; Index = 35 Token = 3 - DD 235 ; Index = 35 Token = 4 - DD 287 ; Index = 35 Token = 5 - DD 339 ; Index = 35 Token = 6 - DD 391 ; Index = 35 Token = 7 - DD -26 ; Index = 35 Token = 8 - DD -78 ; Index = 35 Token = 9 - DD -130 ; Index = 35 Token = 10 - DD -182 ; Index = 35 Token = 11 - DD -235 ; Index = 35 Token = 12 - DD -287 ; Index = 35 Token = 13 - DD -339 ; Index = 35 Token = 14 - DD -391 ; Index = 35 Token = 15 - DD 28 ; Index = 36 Token = 0 - DD 85 ; Index = 36 Token = 1 - DD 143 ; Index = 36 Token = 2 - DD 200 ; Index = 36 Token = 3 - DD 258 ; Index = 36 Token = 4 - DD 315 ; Index = 36 Token = 5 - DD 373 ; Index = 36 Token = 6 - DD 430 ; Index = 36 Token = 7 - DD -28 ; Index = 36 Token = 8 - DD -85 ; Index = 36 Token = 9 - DD -143 ; Index = 36 Token = 10 - DD -200 ; Index = 36 Token = 11 - DD -258 ; Index = 36 Token = 12 - DD -315 ; Index = 36 Token = 13 - DD -373 ; Index = 36 Token = 14 - DD -430 ; Index = 36 Token = 15 - DD 31 ; Index = 37 Token = 0 - DD 94 ; Index = 37 Token = 1 - DD 157 ; Index = 37 Token = 2 - DD 220 ; Index = 37 Token = 3 - DD 284 ; Index = 37 Token = 4 - DD 347 ; Index = 37 Token = 5 - DD 410 ; Index = 37 Token = 6 - DD 473 ; Index = 37 Token = 7 - DD -31 ; Index = 37 Token = 8 - DD -94 ; Index = 37 Token = 9 - DD -157 ; Index = 37 Token = 10 - DD -220 ; Index = 37 Token = 11 - DD -284 ; Index = 37 Token = 12 - DD -347 ; Index = 37 Token = 13 - DD -410 ; Index = 37 Token = 14 - DD -473 ; Index = 37 Token = 15 - DD 34 ; Index = 38 Token = 0 - DD 103 ; Index = 38 Token = 1 - DD 173 ; Index = 38 Token = 2 - DD 242 ; Index = 38 Token = 3 - DD 313 ; Index = 38 Token = 4 - DD 382 ; Index = 38 Token = 5 - DD 452 ; Index = 38 Token = 6 - DD 521 ; Index = 38 Token = 7 - DD -34 ; Index = 38 Token = 8 - DD -103 ; Index = 38 Token = 9 - DD -173 ; Index = 38 Token = 10 - DD -242 ; Index = 38 Token = 11 - DD -313 ; Index = 38 Token = 12 - DD -382 ; Index = 38 Token = 13 - DD -452 ; Index = 38 Token = 14 - DD -521 ; Index = 38 Token = 15 - DD 38 ; Index = 39 Token = 0 - DD 114 ; Index = 39 Token = 1 - DD 191 ; Index = 39 Token = 2 - DD 267 ; Index = 39 Token = 3 - DD 345 ; Index = 39 Token = 4 - DD 421 ; Index = 39 Token = 5 - DD 498 ; Index = 39 Token = 6 - DD 574 ; Index = 39 Token = 7 - DD -38 ; Index = 39 Token = 8 - DD -114 ; Index = 39 Token = 9 - DD -191 ; Index = 39 Token = 10 - DD -267 ; Index = 39 Token = 11 - DD -345 ; Index = 39 Token = 12 - DD -421 ; Index = 39 Token = 13 - DD -498 ; Index = 39 Token = 14 - DD -574 ; Index = 39 Token = 15 - DD 42 ; Index = 40 Token = 0 - DD 126 ; Index = 40 Token = 1 - DD 210 ; Index = 40 Token = 2 - DD 294 ; Index = 40 Token = 3 - DD 379 ; Index = 40 Token = 4 - DD 463 ; Index = 40 Token = 5 - DD 547 ; Index = 40 Token = 6 - DD 631 ; Index = 40 Token = 7 - DD -42 ; Index = 40 Token = 8 - DD -126 ; Index = 40 Token = 9 - DD -210 ; Index = 40 Token = 10 - DD -294 ; Index = 40 Token = 11 - DD -379 ; Index = 40 Token = 12 - DD -463 ; Index = 40 Token = 13 - DD -547 ; Index = 40 Token = 14 - DD -631 ; Index = 40 Token = 15 - DD 46 ; Index = 41 Token = 0 - DD 138 ; Index = 41 Token = 1 - DD 231 ; Index = 41 Token = 2 - DD 323 ; Index = 41 Token = 3 - DD 417 ; Index = 41 Token = 4 - DD 509 ; Index = 41 Token = 5 - DD 602 ; Index = 41 Token = 6 - DD 694 ; Index = 41 Token = 7 - DD -46 ; Index = 41 Token = 8 - DD -138 ; Index = 41 Token = 9 - DD -231 ; Index = 41 Token = 10 - DD -323 ; Index = 41 Token = 11 - DD -417 ; Index = 41 Token = 12 - DD -509 ; Index = 41 Token = 13 - DD -602 ; Index = 41 Token = 14 - DD -694 ; Index = 41 Token = 15 - DD 51 ; Index = 42 Token = 0 - DD 153 ; Index = 42 Token = 1 - DD 255 ; Index = 42 Token = 2 - DD 357 ; Index = 42 Token = 3 - DD 459 ; Index = 42 Token = 4 - DD 561 ; Index = 42 Token = 5 - DD 663 ; Index = 42 Token = 6 - DD 765 ; Index = 42 Token = 7 - DD -51 ; Index = 42 Token = 8 - DD -153 ; Index = 42 Token = 9 - DD -255 ; Index = 42 Token = 10 - DD -357 ; Index = 42 Token = 11 - DD -459 ; Index = 42 Token = 12 - DD -561 ; Index = 42 Token = 13 - DD -663 ; Index = 42 Token = 14 - DD -765 ; Index = 42 Token = 15 - DD 56 ; Index = 43 Token = 0 - DD 168 ; Index = 43 Token = 1 - DD 280 ; Index = 43 Token = 2 - DD 392 ; Index = 43 Token = 3 - DD 505 ; Index = 43 Token = 4 - DD 617 ; Index = 43 Token = 5 - DD 729 ; Index = 43 Token = 6 - DD 841 ; Index = 43 Token = 7 - DD -56 ; Index = 43 Token = 8 - DD -168 ; Index = 43 Token = 9 - DD -280 ; Index = 43 Token = 10 - DD -392 ; Index = 43 Token = 11 - DD -505 ; Index = 43 Token = 12 - DD -617 ; Index = 43 Token = 13 - DD -729 ; Index = 43 Token = 14 - DD -841 ; Index = 43 Token = 15 - DD 61 ; Index = 44 Token = 0 - DD 184 ; Index = 44 Token = 1 - DD 308 ; Index = 44 Token = 2 - DD 431 ; Index = 44 Token = 3 - DD 555 ; Index = 44 Token = 4 - DD 678 ; Index = 44 Token = 5 - DD 802 ; Index = 44 Token = 6 - DD 925 ; Index = 44 Token = 7 - DD -61 ; Index = 44 Token = 8 - DD -184 ; Index = 44 Token = 9 - DD -308 ; Index = 44 Token = 10 - DD -431 ; Index = 44 Token = 11 - DD -555 ; Index = 44 Token = 12 - DD -678 ; Index = 44 Token = 13 - DD -802 ; Index = 44 Token = 14 - DD -925 ; Index = 44 Token = 15 - DD 68 ; Index = 45 Token = 0 - DD 204 ; Index = 45 Token = 1 - DD 340 ; Index = 45 Token = 2 - DD 476 ; Index = 45 Token = 3 - DD 612 ; Index = 45 Token = 4 - DD 748 ; Index = 45 Token = 5 - DD 884 ; Index = 45 Token = 6 - DD 1020 ; Index = 45 Token = 7 - DD -68 ; Index = 45 Token = 8 - DD -204 ; Index = 45 Token = 9 - DD -340 ; Index = 45 Token = 10 - DD -476 ; Index = 45 Token = 11 - DD -612 ; Index = 45 Token = 12 - DD -748 ; Index = 45 Token = 13 - DD -884 ; Index = 45 Token = 14 - DD -1020 ; Index = 45 Token = 15 - DD 74 ; Index = 46 Token = 0 - DD 223 ; Index = 46 Token = 1 - DD 373 ; Index = 46 Token = 2 - DD 522 ; Index = 46 Token = 3 - DD 672 ; Index = 46 Token = 4 - DD 821 ; Index = 46 Token = 5 - DD 971 ; Index = 46 Token = 6 - DD 1120 ; Index = 46 Token = 7 - DD -74 ; Index = 46 Token = 8 - DD -223 ; Index = 46 Token = 9 - DD -373 ; Index = 46 Token = 10 - DD -522 ; Index = 46 Token = 11 - DD -672 ; Index = 46 Token = 12 - DD -821 ; Index = 46 Token = 13 - DD -971 ; Index = 46 Token = 14 - DD -1120 ; Index = 46 Token = 15 - DD 82 ; Index = 47 Token = 0 - DD 246 ; Index = 47 Token = 1 - DD 411 ; Index = 47 Token = 2 - DD 575 ; Index = 47 Token = 3 - DD 740 ; Index = 47 Token = 4 - DD 904 ; Index = 47 Token = 5 - DD 1069 ; Index = 47 Token = 6 - DD 1233 ; Index = 47 Token = 7 - DD -82 ; Index = 47 Token = 8 - DD -246 ; Index = 47 Token = 9 - DD -411 ; Index = 47 Token = 10 - DD -575 ; Index = 47 Token = 11 - DD -740 ; Index = 47 Token = 12 - DD -904 ; Index = 47 Token = 13 - DD -1069 ; Index = 47 Token = 14 - DD -1233 ; Index = 47 Token = 15 - DD 90 ; Index = 48 Token = 0 - DD 271 ; Index = 48 Token = 1 - DD 452 ; Index = 48 Token = 2 - DD 633 ; Index = 48 Token = 3 - DD 814 ; Index = 48 Token = 4 - DD 995 ; Index = 48 Token = 5 - DD 1176 ; Index = 48 Token = 6 - DD 1357 ; Index = 48 Token = 7 - DD -90 ; Index = 48 Token = 8 - DD -271 ; Index = 48 Token = 9 - DD -452 ; Index = 48 Token = 10 - DD -633 ; Index = 48 Token = 11 - DD -814 ; Index = 48 Token = 12 - DD -995 ; Index = 48 Token = 13 - DD -1176 ; Index = 48 Token = 14 - DD -1357 ; Index = 48 Token = 15 - DD 99 ; Index = 49 Token = 0 - DD 298 ; Index = 49 Token = 1 - DD 497 ; Index = 49 Token = 2 - DD 696 ; Index = 49 Token = 3 - DD 895 ; Index = 49 Token = 4 - DD 1094 ; Index = 49 Token = 5 - DD 1293 ; Index = 49 Token = 6 - DD 1492 ; Index = 49 Token = 7 - DD -99 ; Index = 49 Token = 8 - DD -298 ; Index = 49 Token = 9 - DD -497 ; Index = 49 Token = 10 - DD -696 ; Index = 49 Token = 11 - DD -895 ; Index = 49 Token = 12 - DD -1094 ; Index = 49 Token = 13 - DD -1293 ; Index = 49 Token = 14 - DD -1492 ; Index = 49 Token = 15 - DD 109 ; Index = 50 Token = 0 - DD 328 ; Index = 50 Token = 1 - DD 547 ; Index = 50 Token = 2 - DD 766 ; Index = 50 Token = 3 - DD 985 ; Index = 50 Token = 4 - DD 1204 ; Index = 50 Token = 5 - DD 1423 ; Index = 50 Token = 6 - DD 1642 ; Index = 50 Token = 7 - DD -109 ; Index = 50 Token = 8 - DD -328 ; Index = 50 Token = 9 - DD -547 ; Index = 50 Token = 10 - DD -766 ; Index = 50 Token = 11 - DD -985 ; Index = 50 Token = 12 - DD -1204 ; Index = 50 Token = 13 - DD -1423 ; Index = 50 Token = 14 - DD -1642 ; Index = 50 Token = 15 - DD 120 ; Index = 51 Token = 0 - DD 360 ; Index = 51 Token = 1 - DD 601 ; Index = 51 Token = 2 - DD 841 ; Index = 51 Token = 3 - DD 1083 ; Index = 51 Token = 4 - DD 1323 ; Index = 51 Token = 5 - DD 1564 ; Index = 51 Token = 6 - DD 1804 ; Index = 51 Token = 7 - DD -120 ; Index = 51 Token = 8 - DD -360 ; Index = 51 Token = 9 - DD -601 ; Index = 51 Token = 10 - DD -841 ; Index = 51 Token = 11 - DD -1083 ; Index = 51 Token = 12 - DD -1323 ; Index = 51 Token = 13 - DD -1564 ; Index = 51 Token = 14 - DD -1804 ; Index = 51 Token = 15 - DD 132 ; Index = 52 Token = 0 - DD 397 ; Index = 52 Token = 1 - DD 662 ; Index = 52 Token = 2 - DD 927 ; Index = 52 Token = 3 - DD 1192 ; Index = 52 Token = 4 - DD 1457 ; Index = 52 Token = 5 - DD 1722 ; Index = 52 Token = 6 - DD 1987 ; Index = 52 Token = 7 - DD -132 ; Index = 52 Token = 8 - DD -397 ; Index = 52 Token = 9 - DD -662 ; Index = 52 Token = 10 - DD -927 ; Index = 52 Token = 11 - DD -1192 ; Index = 52 Token = 12 - DD -1457 ; Index = 52 Token = 13 - DD -1722 ; Index = 52 Token = 14 - DD -1987 ; Index = 52 Token = 15 - DD 145 ; Index = 53 Token = 0 - DD 436 ; Index = 53 Token = 1 - DD 728 ; Index = 53 Token = 2 - DD 1019 ; Index = 53 Token = 3 - DD 1311 ; Index = 53 Token = 4 - DD 1602 ; Index = 53 Token = 5 - DD 1894 ; Index = 53 Token = 6 - DD 2185 ; Index = 53 Token = 7 - DD -145 ; Index = 53 Token = 8 - DD -436 ; Index = 53 Token = 9 - DD -728 ; Index = 53 Token = 10 - DD -1019 ; Index = 53 Token = 11 - DD -1311 ; Index = 53 Token = 12 - DD -1602 ; Index = 53 Token = 13 - DD -1894 ; Index = 53 Token = 14 - DD -2185 ; Index = 53 Token = 15 - DD 160 ; Index = 54 Token = 0 - DD 480 ; Index = 54 Token = 1 - DD 801 ; Index = 54 Token = 2 - DD 1121 ; Index = 54 Token = 3 - DD 1442 ; Index = 54 Token = 4 - DD 1762 ; Index = 54 Token = 5 - DD 2083 ; Index = 54 Token = 6 - DD 2403 ; Index = 54 Token = 7 - DD -160 ; Index = 54 Token = 8 - DD -480 ; Index = 54 Token = 9 - DD -801 ; Index = 54 Token = 10 - DD -1121 ; Index = 54 Token = 11 - DD -1442 ; Index = 54 Token = 12 - DD -1762 ; Index = 54 Token = 13 - DD -2083 ; Index = 54 Token = 14 - DD -2403 ; Index = 54 Token = 15 - DD 176 ; Index = 55 Token = 0 - DD 528 ; Index = 55 Token = 1 - DD 881 ; Index = 55 Token = 2 - DD 1233 ; Index = 55 Token = 3 - DD 1587 ; Index = 55 Token = 4 - DD 1939 ; Index = 55 Token = 5 - DD 2292 ; Index = 55 Token = 6 - DD 2644 ; Index = 55 Token = 7 - DD -176 ; Index = 55 Token = 8 - DD -528 ; Index = 55 Token = 9 - DD -881 ; Index = 55 Token = 10 - DD -1233 ; Index = 55 Token = 11 - DD -1587 ; Index = 55 Token = 12 - DD -1939 ; Index = 55 Token = 13 - DD -2292 ; Index = 55 Token = 14 - DD -2644 ; Index = 55 Token = 15 - DD 194 ; Index = 56 Token = 0 - DD 582 ; Index = 56 Token = 1 - DD 970 ; Index = 56 Token = 2 - DD 1358 ; Index = 56 Token = 3 - DD 1746 ; Index = 56 Token = 4 - DD 2134 ; Index = 56 Token = 5 - DD 2522 ; Index = 56 Token = 6 - DD 2910 ; Index = 56 Token = 7 - DD -194 ; Index = 56 Token = 8 - DD -582 ; Index = 56 Token = 9 - DD -970 ; Index = 56 Token = 10 - DD -1358 ; Index = 56 Token = 11 - DD -1746 ; Index = 56 Token = 12 - DD -2134 ; Index = 56 Token = 13 - DD -2522 ; Index = 56 Token = 14 - DD -2910 ; Index = 56 Token = 15 - DD 213 ; Index = 57 Token = 0 - DD 639 ; Index = 57 Token = 1 - DD 1066 ; Index = 57 Token = 2 - DD 1492 ; Index = 57 Token = 3 - DD 1920 ; Index = 57 Token = 4 - DD 2346 ; Index = 57 Token = 5 - DD 2773 ; Index = 57 Token = 6 - DD 3199 ; Index = 57 Token = 7 - DD -213 ; Index = 57 Token = 8 - DD -639 ; Index = 57 Token = 9 - DD -1066 ; Index = 57 Token = 10 - DD -1492 ; Index = 57 Token = 11 - DD -1920 ; Index = 57 Token = 12 - DD -2346 ; Index = 57 Token = 13 - DD -2773 ; Index = 57 Token = 14 - DD -3199 ; Index = 57 Token = 15 - DD 234 ; Index = 58 Token = 0 - DD 703 ; Index = 58 Token = 1 - DD 1173 ; Index = 58 Token = 2 - DD 1642 ; Index = 58 Token = 3 - DD 2112 ; Index = 58 Token = 4 - DD 2581 ; Index = 58 Token = 5 - DD 3051 ; Index = 58 Token = 6 - DD 3520 ; Index = 58 Token = 7 - DD -234 ; Index = 58 Token = 8 - DD -703 ; Index = 58 Token = 9 - DD -1173 ; Index = 58 Token = 10 - DD -1642 ; Index = 58 Token = 11 - DD -2112 ; Index = 58 Token = 12 - DD -2581 ; Index = 58 Token = 13 - DD -3051 ; Index = 58 Token = 14 - DD -3520 ; Index = 58 Token = 15 - DD 258 ; Index = 59 Token = 0 - DD 774 ; Index = 59 Token = 1 - DD 1291 ; Index = 59 Token = 2 - DD 1807 ; Index = 59 Token = 3 - DD 2324 ; Index = 59 Token = 4 - DD 2840 ; Index = 59 Token = 5 - DD 3357 ; Index = 59 Token = 6 - DD 3873 ; Index = 59 Token = 7 - DD -258 ; Index = 59 Token = 8 - DD -774 ; Index = 59 Token = 9 - DD -1291 ; Index = 59 Token = 10 - DD -1807 ; Index = 59 Token = 11 - DD -2324 ; Index = 59 Token = 12 - DD -2840 ; Index = 59 Token = 13 - DD -3357 ; Index = 59 Token = 14 - DD -3873 ; Index = 59 Token = 15 - DD 284 ; Index = 60 Token = 0 - DD 852 ; Index = 60 Token = 1 - DD 1420 ; Index = 60 Token = 2 - DD 1988 ; Index = 60 Token = 3 - DD 2556 ; Index = 60 Token = 4 - DD 3124 ; Index = 60 Token = 5 - DD 3692 ; Index = 60 Token = 6 - DD 4260 ; Index = 60 Token = 7 - DD -284 ; Index = 60 Token = 8 - DD -852 ; Index = 60 Token = 9 - DD -1420 ; Index = 60 Token = 10 - DD -1988 ; Index = 60 Token = 11 - DD -2556 ; Index = 60 Token = 12 - DD -3124 ; Index = 60 Token = 13 - DD -3692 ; Index = 60 Token = 14 - DD -4260 ; Index = 60 Token = 15 - DD 312 ; Index = 61 Token = 0 - DD 936 ; Index = 61 Token = 1 - DD 1561 ; Index = 61 Token = 2 - DD 2185 ; Index = 61 Token = 3 - DD 2811 ; Index = 61 Token = 4 - DD 3435 ; Index = 61 Token = 5 - DD 4060 ; Index = 61 Token = 6 - DD 4684 ; Index = 61 Token = 7 - DD -312 ; Index = 61 Token = 8 - DD -936 ; Index = 61 Token = 9 - DD -1561 ; Index = 61 Token = 10 - DD -2185 ; Index = 61 Token = 11 - DD -2811 ; Index = 61 Token = 12 - DD -3435 ; Index = 61 Token = 13 - DD -4060 ; Index = 61 Token = 14 - DD -4684 ; Index = 61 Token = 15 - DD 343 ; Index = 62 Token = 0 - DD 1030 ; Index = 62 Token = 1 - DD 1717 ; Index = 62 Token = 2 - DD 2404 ; Index = 62 Token = 3 - DD 3092 ; Index = 62 Token = 4 - DD 3779 ; Index = 62 Token = 5 - DD 4466 ; Index = 62 Token = 6 - DD 5153 ; Index = 62 Token = 7 - DD -343 ; Index = 62 Token = 8 - DD -1030 ; Index = 62 Token = 9 - DD -1717 ; Index = 62 Token = 10 - DD -2404 ; Index = 62 Token = 11 - DD -3092 ; Index = 62 Token = 12 - DD -3779 ; Index = 62 Token = 13 - DD -4466 ; Index = 62 Token = 14 - DD -5153 ; Index = 62 Token = 15 - DD 378 ; Index = 63 Token = 0 - DD 1134 ; Index = 63 Token = 1 - DD 1890 ; Index = 63 Token = 2 - DD 2646 ; Index = 63 Token = 3 - DD 3402 ; Index = 63 Token = 4 - DD 4158 ; Index = 63 Token = 5 - DD 4914 ; Index = 63 Token = 6 - DD 5670 ; Index = 63 Token = 7 - DD -378 ; Index = 63 Token = 8 - DD -1134 ; Index = 63 Token = 9 - DD -1890 ; Index = 63 Token = 10 - DD -2646 ; Index = 63 Token = 11 - DD -3402 ; Index = 63 Token = 12 - DD -4158 ; Index = 63 Token = 13 - DD -4914 ; Index = 63 Token = 14 - DD -5670 ; Index = 63 Token = 15 - DD 415 ; Index = 64 Token = 0 - DD 1246 ; Index = 64 Token = 1 - DD 2078 ; Index = 64 Token = 2 - DD 2909 ; Index = 64 Token = 3 - DD 3742 ; Index = 64 Token = 4 - DD 4573 ; Index = 64 Token = 5 - DD 5405 ; Index = 64 Token = 6 - DD 6236 ; Index = 64 Token = 7 - DD -415 ; Index = 64 Token = 8 - DD -1246 ; Index = 64 Token = 9 - DD -2078 ; Index = 64 Token = 10 - DD -2909 ; Index = 64 Token = 11 - DD -3742 ; Index = 64 Token = 12 - DD -4573 ; Index = 64 Token = 13 - DD -5405 ; Index = 64 Token = 14 - DD -6236 ; Index = 64 Token = 15 - DD 457 ; Index = 65 Token = 0 - DD 1372 ; Index = 65 Token = 1 - DD 2287 ; Index = 65 Token = 2 - DD 3202 ; Index = 65 Token = 3 - DD 4117 ; Index = 65 Token = 4 - DD 5032 ; Index = 65 Token = 5 - DD 5947 ; Index = 65 Token = 6 - DD 6862 ; Index = 65 Token = 7 - DD -457 ; Index = 65 Token = 8 - DD -1372 ; Index = 65 Token = 9 - DD -2287 ; Index = 65 Token = 10 - DD -3202 ; Index = 65 Token = 11 - DD -4117 ; Index = 65 Token = 12 - DD -5032 ; Index = 65 Token = 13 - DD -5947 ; Index = 65 Token = 14 - DD -6862 ; Index = 65 Token = 15 - DD 503 ; Index = 66 Token = 0 - DD 1509 ; Index = 66 Token = 1 - DD 2516 ; Index = 66 Token = 2 - DD 3522 ; Index = 66 Token = 3 - DD 4529 ; Index = 66 Token = 4 - DD 5535 ; Index = 66 Token = 5 - DD 6542 ; Index = 66 Token = 6 - DD 7548 ; Index = 66 Token = 7 - DD -503 ; Index = 66 Token = 8 - DD -1509 ; Index = 66 Token = 9 - DD -2516 ; Index = 66 Token = 10 - DD -3522 ; Index = 66 Token = 11 - DD -4529 ; Index = 66 Token = 12 - DD -5535 ; Index = 66 Token = 13 - DD -6542 ; Index = 66 Token = 14 - DD -7548 ; Index = 66 Token = 15 - DD 553 ; Index = 67 Token = 0 - DD 1660 ; Index = 67 Token = 1 - DD 2767 ; Index = 67 Token = 2 - DD 3874 ; Index = 67 Token = 3 - DD 4981 ; Index = 67 Token = 4 - DD 6088 ; Index = 67 Token = 5 - DD 7195 ; Index = 67 Token = 6 - DD 8302 ; Index = 67 Token = 7 - DD -553 ; Index = 67 Token = 8 - DD -1660 ; Index = 67 Token = 9 - DD -2767 ; Index = 67 Token = 10 - DD -3874 ; Index = 67 Token = 11 - DD -4981 ; Index = 67 Token = 12 - DD -6088 ; Index = 67 Token = 13 - DD -7195 ; Index = 67 Token = 14 - DD -8302 ; Index = 67 Token = 15 - DD 608 ; Index = 68 Token = 0 - DD 1825 ; Index = 68 Token = 1 - DD 3043 ; Index = 68 Token = 2 - DD 4260 ; Index = 68 Token = 3 - DD 5479 ; Index = 68 Token = 4 - DD 6696 ; Index = 68 Token = 5 - DD 7914 ; Index = 68 Token = 6 - DD 9131 ; Index = 68 Token = 7 - DD -608 ; Index = 68 Token = 8 - DD -1825 ; Index = 68 Token = 9 - DD -3043 ; Index = 68 Token = 10 - DD -4260 ; Index = 68 Token = 11 - DD -5479 ; Index = 68 Token = 12 - DD -6696 ; Index = 68 Token = 13 - DD -7914 ; Index = 68 Token = 14 - DD -9131 ; Index = 68 Token = 15 - DD 669 ; Index = 69 Token = 0 - DD 2008 ; Index = 69 Token = 1 - DD 3348 ; Index = 69 Token = 2 - DD 4687 ; Index = 69 Token = 3 - DD 6027 ; Index = 69 Token = 4 - DD 7366 ; Index = 69 Token = 5 - DD 8706 ; Index = 69 Token = 6 - DD 10045 ; Index = 69 Token = 7 - DD -669 ; Index = 69 Token = 8 - DD -2008 ; Index = 69 Token = 9 - DD -3348 ; Index = 69 Token = 10 - DD -4687 ; Index = 69 Token = 11 - DD -6027 ; Index = 69 Token = 12 - DD -7366 ; Index = 69 Token = 13 - DD -8706 ; Index = 69 Token = 14 - DD -10045 ; Index = 69 Token = 15 - DD 736 ; Index = 70 Token = 0 - DD 2209 ; Index = 70 Token = 1 - DD 3683 ; Index = 70 Token = 2 - DD 5156 ; Index = 70 Token = 3 - DD 6630 ; Index = 70 Token = 4 - DD 8103 ; Index = 70 Token = 5 - DD 9577 ; Index = 70 Token = 6 - DD 11050 ; Index = 70 Token = 7 - DD -736 ; Index = 70 Token = 8 - DD -2209 ; Index = 70 Token = 9 - DD -3683 ; Index = 70 Token = 10 - DD -5156 ; Index = 70 Token = 11 - DD -6630 ; Index = 70 Token = 12 - DD -8103 ; Index = 70 Token = 13 - DD -9577 ; Index = 70 Token = 14 - DD -11050 ; Index = 70 Token = 15 - DD 810 ; Index = 71 Token = 0 - DD 2431 ; Index = 71 Token = 1 - DD 4052 ; Index = 71 Token = 2 - DD 5673 ; Index = 71 Token = 3 - DD 7294 ; Index = 71 Token = 4 - DD 8915 ; Index = 71 Token = 5 - DD 10536 ; Index = 71 Token = 6 - DD 12157 ; Index = 71 Token = 7 - DD -810 ; Index = 71 Token = 8 - DD -2431 ; Index = 71 Token = 9 - DD -4052 ; Index = 71 Token = 10 - DD -5673 ; Index = 71 Token = 11 - DD -7294 ; Index = 71 Token = 12 - DD -8915 ; Index = 71 Token = 13 - DD -10536 ; Index = 71 Token = 14 - DD -12157 ; Index = 71 Token = 15 - DD 891 ; Index = 72 Token = 0 - DD 2674 ; Index = 72 Token = 1 - DD 4457 ; Index = 72 Token = 2 - DD 6240 ; Index = 72 Token = 3 - DD 8023 ; Index = 72 Token = 4 - DD 9806 ; Index = 72 Token = 5 - DD 11589 ; Index = 72 Token = 6 - DD 13372 ; Index = 72 Token = 7 - DD -891 ; Index = 72 Token = 8 - DD -2674 ; Index = 72 Token = 9 - DD -4457 ; Index = 72 Token = 10 - DD -6240 ; Index = 72 Token = 11 - DD -8023 ; Index = 72 Token = 12 - DD -9806 ; Index = 72 Token = 13 - DD -11589 ; Index = 72 Token = 14 - DD -13372 ; Index = 72 Token = 15 - DD 980 ; Index = 73 Token = 0 - DD 2941 ; Index = 73 Token = 1 - DD 4902 ; Index = 73 Token = 2 - DD 6863 ; Index = 73 Token = 3 - DD 8825 ; Index = 73 Token = 4 - DD 10786 ; Index = 73 Token = 5 - DD 12747 ; Index = 73 Token = 6 - DD 14708 ; Index = 73 Token = 7 - DD -980 ; Index = 73 Token = 8 - DD -2941 ; Index = 73 Token = 9 - DD -4902 ; Index = 73 Token = 10 - DD -6863 ; Index = 73 Token = 11 - DD -8825 ; Index = 73 Token = 12 - DD -10786 ; Index = 73 Token = 13 - DD -12747 ; Index = 73 Token = 14 - DD -14708 ; Index = 73 Token = 15 - DD 1078 ; Index = 74 Token = 0 - DD 3235 ; Index = 74 Token = 1 - DD 5393 ; Index = 74 Token = 2 - DD 7550 ; Index = 74 Token = 3 - DD 9708 ; Index = 74 Token = 4 - DD 11865 ; Index = 74 Token = 5 - DD 14023 ; Index = 74 Token = 6 - DD 16180 ; Index = 74 Token = 7 - DD -1078 ; Index = 74 Token = 8 - DD -3235 ; Index = 74 Token = 9 - DD -5393 ; Index = 74 Token = 10 - DD -7550 ; Index = 74 Token = 11 - DD -9708 ; Index = 74 Token = 12 - DD -11865 ; Index = 74 Token = 13 - DD -14023 ; Index = 74 Token = 14 - DD -16180 ; Index = 74 Token = 15 - DD 1186 ; Index = 75 Token = 0 - DD 3559 ; Index = 75 Token = 1 - DD 5932 ; Index = 75 Token = 2 - DD 8305 ; Index = 75 Token = 3 - DD 10679 ; Index = 75 Token = 4 - DD 13052 ; Index = 75 Token = 5 - DD 15425 ; Index = 75 Token = 6 - DD 17798 ; Index = 75 Token = 7 - DD -1186 ; Index = 75 Token = 8 - DD -3559 ; Index = 75 Token = 9 - DD -5932 ; Index = 75 Token = 10 - DD -8305 ; Index = 75 Token = 11 - DD -10679 ; Index = 75 Token = 12 - DD -13052 ; Index = 75 Token = 13 - DD -15425 ; Index = 75 Token = 14 - DD -17798 ; Index = 75 Token = 15 - DD 1305 ; Index = 76 Token = 0 - DD 3915 ; Index = 76 Token = 1 - DD 6526 ; Index = 76 Token = 2 - DD 9136 ; Index = 76 Token = 3 - DD 11747 ; Index = 76 Token = 4 - DD 14357 ; Index = 76 Token = 5 - DD 16968 ; Index = 76 Token = 6 - DD 19578 ; Index = 76 Token = 7 - DD -1305 ; Index = 76 Token = 8 - DD -3915 ; Index = 76 Token = 9 - DD -6526 ; Index = 76 Token = 10 - DD -9136 ; Index = 76 Token = 11 - DD -11747 ; Index = 76 Token = 12 - DD -14357 ; Index = 76 Token = 13 - DD -16968 ; Index = 76 Token = 14 - DD -19578 ; Index = 76 Token = 15 - DD 1435 ; Index = 77 Token = 0 - DD 4306 ; Index = 77 Token = 1 - DD 7178 ; Index = 77 Token = 2 - DD 10049 ; Index = 77 Token = 3 - DD 12922 ; Index = 77 Token = 4 - DD 15793 ; Index = 77 Token = 5 - DD 18665 ; Index = 77 Token = 6 - DD 21536 ; Index = 77 Token = 7 - DD -1435 ; Index = 77 Token = 8 - DD -4306 ; Index = 77 Token = 9 - DD -7178 ; Index = 77 Token = 10 - DD -10049 ; Index = 77 Token = 11 - DD -12922 ; Index = 77 Token = 12 - DD -15793 ; Index = 77 Token = 13 - DD -18665 ; Index = 77 Token = 14 - DD -21536 ; Index = 77 Token = 15 - DD 1579 ; Index = 78 Token = 0 - DD 4737 ; Index = 78 Token = 1 - DD 7896 ; Index = 78 Token = 2 - DD 11054 ; Index = 78 Token = 3 - DD 14214 ; Index = 78 Token = 4 - DD 17372 ; Index = 78 Token = 5 - DD 20531 ; Index = 78 Token = 6 - DD 23689 ; Index = 78 Token = 7 - DD -1579 ; Index = 78 Token = 8 - DD -4737 ; Index = 78 Token = 9 - DD -7896 ; Index = 78 Token = 10 - DD -11054 ; Index = 78 Token = 11 - DD -14214 ; Index = 78 Token = 12 - DD -17372 ; Index = 78 Token = 13 - DD -20531 ; Index = 78 Token = 14 - DD -23689 ; Index = 78 Token = 15 - DD 1737 ; Index = 79 Token = 0 - DD 5211 ; Index = 79 Token = 1 - DD 8686 ; Index = 79 Token = 2 - DD 12160 ; Index = 79 Token = 3 - DD 15636 ; Index = 79 Token = 4 - DD 19110 ; Index = 79 Token = 5 - DD 22585 ; Index = 79 Token = 6 - DD 26059 ; Index = 79 Token = 7 - DD -1737 ; Index = 79 Token = 8 - DD -5211 ; Index = 79 Token = 9 - DD -8686 ; Index = 79 Token = 10 - DD -12160 ; Index = 79 Token = 11 - DD -15636 ; Index = 79 Token = 12 - DD -19110 ; Index = 79 Token = 13 - DD -22585 ; Index = 79 Token = 14 - DD -26059 ; Index = 79 Token = 15 - DD 1911 ; Index = 80 Token = 0 - DD 5733 ; Index = 80 Token = 1 - DD 9555 ; Index = 80 Token = 2 - DD 13377 ; Index = 80 Token = 3 - DD 17200 ; Index = 80 Token = 4 - DD 21022 ; Index = 80 Token = 5 - DD 24844 ; Index = 80 Token = 6 - DD 28666 ; Index = 80 Token = 7 - DD -1911 ; Index = 80 Token = 8 - DD -5733 ; Index = 80 Token = 9 - DD -9555 ; Index = 80 Token = 10 - DD -13377 ; Index = 80 Token = 11 - DD -17200 ; Index = 80 Token = 12 - DD -21022 ; Index = 80 Token = 13 - DD -24844 ; Index = 80 Token = 14 - DD -28666 ; Index = 80 Token = 15 - DD 2102 ; Index = 81 Token = 0 - DD 6306 ; Index = 81 Token = 1 - DD 10511 ; Index = 81 Token = 2 - DD 14715 ; Index = 81 Token = 3 - DD 18920 ; Index = 81 Token = 4 - DD 23124 ; Index = 81 Token = 5 - DD 27329 ; Index = 81 Token = 6 - DD 31533 ; Index = 81 Token = 7 - DD -2102 ; Index = 81 Token = 8 - DD -6306 ; Index = 81 Token = 9 - DD -10511 ; Index = 81 Token = 10 - DD -14715 ; Index = 81 Token = 11 - DD -18920 ; Index = 81 Token = 12 - DD -23124 ; Index = 81 Token = 13 - DD -27329 ; Index = 81 Token = 14 - DD -31533 ; Index = 81 Token = 15 - DD 2312 ; Index = 82 Token = 0 - DD 6937 ; Index = 82 Token = 1 - DD 11562 ; Index = 82 Token = 2 - DD 16187 ; Index = 82 Token = 3 - DD 20812 ; Index = 82 Token = 4 - DD 25437 ; Index = 82 Token = 5 - DD 30062 ; Index = 82 Token = 6 - DD 34687 ; Index = 82 Token = 7 - DD -2312 ; Index = 82 Token = 8 - DD -6937 ; Index = 82 Token = 9 - DD -11562 ; Index = 82 Token = 10 - DD -16187 ; Index = 82 Token = 11 - DD -20812 ; Index = 82 Token = 12 - DD -25437 ; Index = 82 Token = 13 - DD -30062 ; Index = 82 Token = 14 - DD -34687 ; Index = 82 Token = 15 - DD 2543 ; Index = 83 Token = 0 - DD 7630 ; Index = 83 Token = 1 - DD 12718 ; Index = 83 Token = 2 - DD 17805 ; Index = 83 Token = 3 - DD 22893 ; Index = 83 Token = 4 - DD 27980 ; Index = 83 Token = 5 - DD 33068 ; Index = 83 Token = 6 - DD 38155 ; Index = 83 Token = 7 - DD -2543 ; Index = 83 Token = 8 - DD -7630 ; Index = 83 Token = 9 - DD -12718 ; Index = 83 Token = 10 - DD -17805 ; Index = 83 Token = 11 - DD -22893 ; Index = 83 Token = 12 - DD -27980 ; Index = 83 Token = 13 - DD -33068 ; Index = 83 Token = 14 - DD -38155 ; Index = 83 Token = 15 - DD 2798 ; Index = 84 Token = 0 - DD 8394 ; Index = 84 Token = 1 - DD 13990 ; Index = 84 Token = 2 - DD 19586 ; Index = 84 Token = 3 - DD 25183 ; Index = 84 Token = 4 - DD 30779 ; Index = 84 Token = 5 - DD 36375 ; Index = 84 Token = 6 - DD 41971 ; Index = 84 Token = 7 - DD -2798 ; Index = 84 Token = 8 - DD -8394 ; Index = 84 Token = 9 - DD -13990 ; Index = 84 Token = 10 - DD -19586 ; Index = 84 Token = 11 - DD -25183 ; Index = 84 Token = 12 - DD -30779 ; Index = 84 Token = 13 - DD -36375 ; Index = 84 Token = 14 - DD -41971 ; Index = 84 Token = 15 - DD 3077 ; Index = 85 Token = 0 - DD 9232 ; Index = 85 Token = 1 - DD 15388 ; Index = 85 Token = 2 - DD 21543 ; Index = 85 Token = 3 - DD 27700 ; Index = 85 Token = 4 - DD 33855 ; Index = 85 Token = 5 - DD 40011 ; Index = 85 Token = 6 - DD 46166 ; Index = 85 Token = 7 - DD -3077 ; Index = 85 Token = 8 - DD -9232 ; Index = 85 Token = 9 - DD -15388 ; Index = 85 Token = 10 - DD -21543 ; Index = 85 Token = 11 - DD -27700 ; Index = 85 Token = 12 - DD -33855 ; Index = 85 Token = 13 - DD -40011 ; Index = 85 Token = 14 - DD -46166 ; Index = 85 Token = 15 - DD 3385 ; Index = 86 Token = 0 - DD 10156 ; Index = 86 Token = 1 - DD 16928 ; Index = 86 Token = 2 - DD 23699 ; Index = 86 Token = 3 - DD 30471 ; Index = 86 Token = 4 - DD 37242 ; Index = 86 Token = 5 - DD 44014 ; Index = 86 Token = 6 - DD 50785 ; Index = 86 Token = 7 - DD -3385 ; Index = 86 Token = 8 - DD -10156 ; Index = 86 Token = 9 - DD -16928 ; Index = 86 Token = 10 - DD -23699 ; Index = 86 Token = 11 - DD -30471 ; Index = 86 Token = 12 - DD -37242 ; Index = 86 Token = 13 - DD -44014 ; Index = 86 Token = 14 - DD -50785 ; Index = 86 Token = 15 - DD 3724 ; Index = 87 Token = 0 - DD 11172 ; Index = 87 Token = 1 - DD 18621 ; Index = 87 Token = 2 - DD 26069 ; Index = 87 Token = 3 - DD 33518 ; Index = 87 Token = 4 - DD 40966 ; Index = 87 Token = 5 - DD 48415 ; Index = 87 Token = 6 - DD 55863 ; Index = 87 Token = 7 - DD -3724 ; Index = 87 Token = 8 - DD -11172 ; Index = 87 Token = 9 - DD -18621 ; Index = 87 Token = 10 - DD -26069 ; Index = 87 Token = 11 - DD -33518 ; Index = 87 Token = 12 - DD -40966 ; Index = 87 Token = 13 - DD -48415 ; Index = 87 Token = 14 - DD -55863 ; Index = 87 Token = 15 - DD 4095 ; Index = 88 Token = 0 - DD 12286 ; Index = 88 Token = 1 - DD 20478 ; Index = 88 Token = 2 - DD 28669 ; Index = 88 Token = 3 - DD 36862 ; Index = 88 Token = 4 - DD 45053 ; Index = 88 Token = 5 - DD 53245 ; Index = 88 Token = 6 - DD 61436 ; Index = 88 Token = 7 - DD -4095 ; Index = 88 Token = 8 - DD -12286 ; Index = 88 Token = 9 - DD -20478 ; Index = 88 Token = 10 - DD -28669 ; Index = 88 Token = 11 - DD -36862 ; Index = 88 Token = 12 - DD -45053 ; Index = 88 Token = 13 - DD -53245 ; Index = 88 Token = 14 - DD -61436 ; Index = 88 Token = 15 diff --git a/code/dsaudio.cpp b/code/dsaudio.cpp index b5aab4aa..910d20b2 100644 --- a/code/dsaudio.cpp +++ b/code/dsaudio.cpp @@ -989,11 +989,8 @@ int DSAudio::Play_Sample_Handle(void const *sample, int priority, int volume, in st->sosinfo.wBitSize = (RawHeader.Flags & AUD_FLAG_16BIT) ? 16 : 8; st->sosinfo.dwCompSize = RawHeader.Size; st->sosinfo.dwUnCompSize = RawHeader.Size * ( st->sosinfo.wBitSize / 4 ); - if (st->sosinfo.wBitSize == 16 && st->sosinfo.wChannels == 1) { - sosCODECInitStream(&st->sosinfo); - } else { - General_sosCODECInitStream(&st->sosinfo); - } + sosCODECInitStream(&st->sosinfo); + } /* @@ -2664,11 +2661,7 @@ int DSAudio::Sample_Copy(SampleTrackerType *st, void ** source, int * ssize, voi } st->sosinfo.lpSource = (char *)UncompBuffer; st->sosinfo.lpDest = (char *)dest; - if (st->sosinfo.wBitSize==16 && st->sosinfo.wChannels==1){ - sosCODECDecompressData(&st->sosinfo, dsize); - } else { - General_sosCODECDecompressData(&st->sosinfo, dsize); - } + sosCODECDecompressData(&st->sosinfo, dsize); dest = Audio_Add_Long_To_Pointer(dest, dsize); } datasize += dsize; diff --git a/code/indextb.inc b/code/indextb.inc deleted file mode 100644 index c250ed43..00000000 --- a/code/indextb.inc +++ /dev/null @@ -1,1443 +0,0 @@ -;****************************************************************************** -;* O P E N T S -;****************************************************************************** -;* SPDX-License-Identifier: GPL-3.0-or-later -;* Copyright 2025 Electronic Arts Inc. -;* Copyright 2026 OpenTS contributors -;* -;* Contains material derived from Electronic Arts source code. -;* Modified by OpenTS contributors, 2026. -;* EA's GPLv3 Section 7 additional terms and supplemental warranty -;* disclaimers apply; see LICENSE.md. -;****************************************************************************** - -;**************************************************************************** -;* wIndexTable - ADPCM Lookup table for indexes -;**************************************************************************** - - align 4 - -wIndexTable DW 0 * 2 ; Index = 0 Token = 0 - DW 0 * 2 ; Index = 0 Token = 1 - DW 0 * 2 ; Index = 0 Token = 2 - DW 0 * 2 ; Index = 0 Token = 3 - DW 32 * 2 ; Index = 0 Token = 4 - DW 64 * 2 ; Index = 0 Token = 5 - DW 96 * 2 ; Index = 0 Token = 6 - DW 128 * 2 ; Index = 0 Token = 7 - DW 0 * 2 ; Index = 0 Token = 8 - DW 0 * 2 ; Index = 0 Token = 9 - DW 0 * 2 ; Index = 0 Token = 10 - DW 0 * 2 ; Index = 0 Token = 11 - DW 32 * 2 ; Index = 0 Token = 12 - DW 64 * 2 ; Index = 0 Token = 13 - DW 96 * 2 ; Index = 0 Token = 14 - DW 128 * 2 ; Index = 0 Token = 15 - DW 0 * 2 ; Index = 1 Token = 0 - DW 0 * 2 ; Index = 1 Token = 1 - DW 0 * 2 ; Index = 1 Token = 2 - DW 0 * 2 ; Index = 1 Token = 3 - DW 48 * 2 ; Index = 1 Token = 4 - DW 80 * 2 ; Index = 1 Token = 5 - DW 112 * 2 ; Index = 1 Token = 6 - DW 144 * 2 ; Index = 1 Token = 7 - DW 0 * 2 ; Index = 1 Token = 8 - DW 0 * 2 ; Index = 1 Token = 9 - DW 0 * 2 ; Index = 1 Token = 10 - DW 0 * 2 ; Index = 1 Token = 11 - DW 48 * 2 ; Index = 1 Token = 12 - DW 80 * 2 ; Index = 1 Token = 13 - DW 112 * 2 ; Index = 1 Token = 14 - DW 144 * 2 ; Index = 1 Token = 15 - DW 16 * 2 ; Index = 2 Token = 0 - DW 16 * 2 ; Index = 2 Token = 1 - DW 16 * 2 ; Index = 2 Token = 2 - DW 16 * 2 ; Index = 2 Token = 3 - DW 64 * 2 ; Index = 2 Token = 4 - DW 96 * 2 ; Index = 2 Token = 5 - DW 128 * 2 ; Index = 2 Token = 6 - DW 160 * 2 ; Index = 2 Token = 7 - DW 16 * 2 ; Index = 2 Token = 8 - DW 16 * 2 ; Index = 2 Token = 9 - DW 16 * 2 ; Index = 2 Token = 10 - DW 16 * 2 ; Index = 2 Token = 11 - DW 64 * 2 ; Index = 2 Token = 12 - DW 96 * 2 ; Index = 2 Token = 13 - DW 128 * 2 ; Index = 2 Token = 14 - DW 160 * 2 ; Index = 2 Token = 15 - DW 32 * 2 ; Index = 3 Token = 0 - DW 32 * 2 ; Index = 3 Token = 1 - DW 32 * 2 ; Index = 3 Token = 2 - DW 32 * 2 ; Index = 3 Token = 3 - DW 80 * 2 ; Index = 3 Token = 4 - DW 112 * 2 ; Index = 3 Token = 5 - DW 144 * 2 ; Index = 3 Token = 6 - DW 176 * 2 ; Index = 3 Token = 7 - DW 32 * 2 ; Index = 3 Token = 8 - DW 32 * 2 ; Index = 3 Token = 9 - DW 32 * 2 ; Index = 3 Token = 10 - DW 32 * 2 ; Index = 3 Token = 11 - DW 80 * 2 ; Index = 3 Token = 12 - DW 112 * 2 ; Index = 3 Token = 13 - DW 144 * 2 ; Index = 3 Token = 14 - DW 176 * 2 ; Index = 3 Token = 15 - DW 48 * 2 ; Index = 4 Token = 0 - DW 48 * 2 ; Index = 4 Token = 1 - DW 48 * 2 ; Index = 4 Token = 2 - DW 48 * 2 ; Index = 4 Token = 3 - DW 96 * 2 ; Index = 4 Token = 4 - DW 128 * 2 ; Index = 4 Token = 5 - DW 160 * 2 ; Index = 4 Token = 6 - DW 192 * 2 ; Index = 4 Token = 7 - DW 48 * 2 ; Index = 4 Token = 8 - DW 48 * 2 ; Index = 4 Token = 9 - DW 48 * 2 ; Index = 4 Token = 10 - DW 48 * 2 ; Index = 4 Token = 11 - DW 96 * 2 ; Index = 4 Token = 12 - DW 128 * 2 ; Index = 4 Token = 13 - DW 160 * 2 ; Index = 4 Token = 14 - DW 192 * 2 ; Index = 4 Token = 15 - DW 64 * 2 ; Index = 5 Token = 0 - DW 64 * 2 ; Index = 5 Token = 1 - DW 64 * 2 ; Index = 5 Token = 2 - DW 64 * 2 ; Index = 5 Token = 3 - DW 112 * 2 ; Index = 5 Token = 4 - DW 144 * 2 ; Index = 5 Token = 5 - DW 176 * 2 ; Index = 5 Token = 6 - DW 208 * 2 ; Index = 5 Token = 7 - DW 64 * 2 ; Index = 5 Token = 8 - DW 64 * 2 ; Index = 5 Token = 9 - DW 64 * 2 ; Index = 5 Token = 10 - DW 64 * 2 ; Index = 5 Token = 11 - DW 112 * 2 ; Index = 5 Token = 12 - DW 144 * 2 ; Index = 5 Token = 13 - DW 176 * 2 ; Index = 5 Token = 14 - DW 208 * 2 ; Index = 5 Token = 15 - DW 80 * 2 ; Index = 6 Token = 0 - DW 80 * 2 ; Index = 6 Token = 1 - DW 80 * 2 ; Index = 6 Token = 2 - DW 80 * 2 ; Index = 6 Token = 3 - DW 128 * 2 ; Index = 6 Token = 4 - DW 160 * 2 ; Index = 6 Token = 5 - DW 192 * 2 ; Index = 6 Token = 6 - DW 224 * 2 ; Index = 6 Token = 7 - DW 80 * 2 ; Index = 6 Token = 8 - DW 80 * 2 ; Index = 6 Token = 9 - DW 80 * 2 ; Index = 6 Token = 10 - DW 80 * 2 ; Index = 6 Token = 11 - DW 128 * 2 ; Index = 6 Token = 12 - DW 160 * 2 ; Index = 6 Token = 13 - DW 192 * 2 ; Index = 6 Token = 14 - DW 224 * 2 ; Index = 6 Token = 15 - DW 96 * 2 ; Index = 7 Token = 0 - DW 96 * 2 ; Index = 7 Token = 1 - DW 96 * 2 ; Index = 7 Token = 2 - DW 96 * 2 ; Index = 7 Token = 3 - DW 144 * 2 ; Index = 7 Token = 4 - DW 176 * 2 ; Index = 7 Token = 5 - DW 208 * 2 ; Index = 7 Token = 6 - DW 240 * 2 ; Index = 7 Token = 7 - DW 96 * 2 ; Index = 7 Token = 8 - DW 96 * 2 ; Index = 7 Token = 9 - DW 96 * 2 ; Index = 7 Token = 10 - DW 96 * 2 ; Index = 7 Token = 11 - DW 144 * 2 ; Index = 7 Token = 12 - DW 176 * 2 ; Index = 7 Token = 13 - DW 208 * 2 ; Index = 7 Token = 14 - DW 240 * 2 ; Index = 7 Token = 15 - DW 112 * 2 ; Index = 8 Token = 0 - DW 112 * 2 ; Index = 8 Token = 1 - DW 112 * 2 ; Index = 8 Token = 2 - DW 112 * 2 ; Index = 8 Token = 3 - DW 160 * 2 ; Index = 8 Token = 4 - DW 192 * 2 ; Index = 8 Token = 5 - DW 224 * 2 ; Index = 8 Token = 6 - DW 256 * 2 ; Index = 8 Token = 7 - DW 112 * 2 ; Index = 8 Token = 8 - DW 112 * 2 ; Index = 8 Token = 9 - DW 112 * 2 ; Index = 8 Token = 10 - DW 112 * 2 ; Index = 8 Token = 11 - DW 160 * 2 ; Index = 8 Token = 12 - DW 192 * 2 ; Index = 8 Token = 13 - DW 224 * 2 ; Index = 8 Token = 14 - DW 256 * 2 ; Index = 8 Token = 15 - DW 128 * 2 ; Index = 9 Token = 0 - DW 128 * 2 ; Index = 9 Token = 1 - DW 128 * 2 ; Index = 9 Token = 2 - DW 128 * 2 ; Index = 9 Token = 3 - DW 176 * 2 ; Index = 9 Token = 4 - DW 208 * 2 ; Index = 9 Token = 5 - DW 240 * 2 ; Index = 9 Token = 6 - DW 272 * 2 ; Index = 9 Token = 7 - DW 128 * 2 ; Index = 9 Token = 8 - DW 128 * 2 ; Index = 9 Token = 9 - DW 128 * 2 ; Index = 9 Token = 10 - DW 128 * 2 ; Index = 9 Token = 11 - DW 176 * 2 ; Index = 9 Token = 12 - DW 208 * 2 ; Index = 9 Token = 13 - DW 240 * 2 ; Index = 9 Token = 14 - DW 272 * 2 ; Index = 9 Token = 15 - DW 144 * 2 ; Index = 10 Token = 0 - DW 144 * 2 ; Index = 10 Token = 1 - DW 144 * 2 ; Index = 10 Token = 2 - DW 144 * 2 ; Index = 10 Token = 3 - DW 192 * 2 ; Index = 10 Token = 4 - DW 224 * 2 ; Index = 10 Token = 5 - DW 256 * 2 ; Index = 10 Token = 6 - DW 288 * 2 ; Index = 10 Token = 7 - DW 144 * 2 ; Index = 10 Token = 8 - DW 144 * 2 ; Index = 10 Token = 9 - DW 144 * 2 ; Index = 10 Token = 10 - DW 144 * 2 ; Index = 10 Token = 11 - DW 192 * 2 ; Index = 10 Token = 12 - DW 224 * 2 ; Index = 10 Token = 13 - DW 256 * 2 ; Index = 10 Token = 14 - DW 288 * 2 ; Index = 10 Token = 15 - DW 160 * 2 ; Index = 11 Token = 0 - DW 160 * 2 ; Index = 11 Token = 1 - DW 160 * 2 ; Index = 11 Token = 2 - DW 160 * 2 ; Index = 11 Token = 3 - DW 208 * 2 ; Index = 11 Token = 4 - DW 240 * 2 ; Index = 11 Token = 5 - DW 272 * 2 ; Index = 11 Token = 6 - DW 304 * 2 ; Index = 11 Token = 7 - DW 160 * 2 ; Index = 11 Token = 8 - DW 160 * 2 ; Index = 11 Token = 9 - DW 160 * 2 ; Index = 11 Token = 10 - DW 160 * 2 ; Index = 11 Token = 11 - DW 208 * 2 ; Index = 11 Token = 12 - DW 240 * 2 ; Index = 11 Token = 13 - DW 272 * 2 ; Index = 11 Token = 14 - DW 304 * 2 ; Index = 11 Token = 15 - DW 176 * 2 ; Index = 12 Token = 0 - DW 176 * 2 ; Index = 12 Token = 1 - DW 176 * 2 ; Index = 12 Token = 2 - DW 176 * 2 ; Index = 12 Token = 3 - DW 224 * 2 ; Index = 12 Token = 4 - DW 256 * 2 ; Index = 12 Token = 5 - DW 288 * 2 ; Index = 12 Token = 6 - DW 320 * 2 ; Index = 12 Token = 7 - DW 176 * 2 ; Index = 12 Token = 8 - DW 176 * 2 ; Index = 12 Token = 9 - DW 176 * 2 ; Index = 12 Token = 10 - DW 176 * 2 ; Index = 12 Token = 11 - DW 224 * 2 ; Index = 12 Token = 12 - DW 256 * 2 ; Index = 12 Token = 13 - DW 288 * 2 ; Index = 12 Token = 14 - DW 320 * 2 ; Index = 12 Token = 15 - DW 192 * 2 ; Index = 13 Token = 0 - DW 192 * 2 ; Index = 13 Token = 1 - DW 192 * 2 ; Index = 13 Token = 2 - DW 192 * 2 ; Index = 13 Token = 3 - DW 240 * 2 ; Index = 13 Token = 4 - DW 272 * 2 ; Index = 13 Token = 5 - DW 304 * 2 ; Index = 13 Token = 6 - DW 336 * 2 ; Index = 13 Token = 7 - DW 192 * 2 ; Index = 13 Token = 8 - DW 192 * 2 ; Index = 13 Token = 9 - DW 192 * 2 ; Index = 13 Token = 10 - DW 192 * 2 ; Index = 13 Token = 11 - DW 240 * 2 ; Index = 13 Token = 12 - DW 272 * 2 ; Index = 13 Token = 13 - DW 304 * 2 ; Index = 13 Token = 14 - DW 336 * 2 ; Index = 13 Token = 15 - DW 208 * 2 ; Index = 14 Token = 0 - DW 208 * 2 ; Index = 14 Token = 1 - DW 208 * 2 ; Index = 14 Token = 2 - DW 208 * 2 ; Index = 14 Token = 3 - DW 256 * 2 ; Index = 14 Token = 4 - DW 288 * 2 ; Index = 14 Token = 5 - DW 320 * 2 ; Index = 14 Token = 6 - DW 352 * 2 ; Index = 14 Token = 7 - DW 208 * 2 ; Index = 14 Token = 8 - DW 208 * 2 ; Index = 14 Token = 9 - DW 208 * 2 ; Index = 14 Token = 10 - DW 208 * 2 ; Index = 14 Token = 11 - DW 256 * 2 ; Index = 14 Token = 12 - DW 288 * 2 ; Index = 14 Token = 13 - DW 320 * 2 ; Index = 14 Token = 14 - DW 352 * 2 ; Index = 14 Token = 15 - DW 224 * 2 ; Index = 15 Token = 0 - DW 224 * 2 ; Index = 15 Token = 1 - DW 224 * 2 ; Index = 15 Token = 2 - DW 224 * 2 ; Index = 15 Token = 3 - DW 272 * 2 ; Index = 15 Token = 4 - DW 304 * 2 ; Index = 15 Token = 5 - DW 336 * 2 ; Index = 15 Token = 6 - DW 368 * 2 ; Index = 15 Token = 7 - DW 224 * 2 ; Index = 15 Token = 8 - DW 224 * 2 ; Index = 15 Token = 9 - DW 224 * 2 ; Index = 15 Token = 10 - DW 224 * 2 ; Index = 15 Token = 11 - DW 272 * 2 ; Index = 15 Token = 12 - DW 304 * 2 ; Index = 15 Token = 13 - DW 336 * 2 ; Index = 15 Token = 14 - DW 368 * 2 ; Index = 15 Token = 15 - DW 240 * 2 ; Index = 16 Token = 0 - DW 240 * 2 ; Index = 16 Token = 1 - DW 240 * 2 ; Index = 16 Token = 2 - DW 240 * 2 ; Index = 16 Token = 3 - DW 288 * 2 ; Index = 16 Token = 4 - DW 320 * 2 ; Index = 16 Token = 5 - DW 352 * 2 ; Index = 16 Token = 6 - DW 384 * 2 ; Index = 16 Token = 7 - DW 240 * 2 ; Index = 16 Token = 8 - DW 240 * 2 ; Index = 16 Token = 9 - DW 240 * 2 ; Index = 16 Token = 10 - DW 240 * 2 ; Index = 16 Token = 11 - DW 288 * 2 ; Index = 16 Token = 12 - DW 320 * 2 ; Index = 16 Token = 13 - DW 352 * 2 ; Index = 16 Token = 14 - DW 384 * 2 ; Index = 16 Token = 15 - DW 256 * 2 ; Index = 17 Token = 0 - DW 256 * 2 ; Index = 17 Token = 1 - DW 256 * 2 ; Index = 17 Token = 2 - DW 256 * 2 ; Index = 17 Token = 3 - DW 304 * 2 ; Index = 17 Token = 4 - DW 336 * 2 ; Index = 17 Token = 5 - DW 368 * 2 ; Index = 17 Token = 6 - DW 400 * 2 ; Index = 17 Token = 7 - DW 256 * 2 ; Index = 17 Token = 8 - DW 256 * 2 ; Index = 17 Token = 9 - DW 256 * 2 ; Index = 17 Token = 10 - DW 256 * 2 ; Index = 17 Token = 11 - DW 304 * 2 ; Index = 17 Token = 12 - DW 336 * 2 ; Index = 17 Token = 13 - DW 368 * 2 ; Index = 17 Token = 14 - DW 400 * 2 ; Index = 17 Token = 15 - DW 272 * 2 ; Index = 18 Token = 0 - DW 272 * 2 ; Index = 18 Token = 1 - DW 272 * 2 ; Index = 18 Token = 2 - DW 272 * 2 ; Index = 18 Token = 3 - DW 320 * 2 ; Index = 18 Token = 4 - DW 352 * 2 ; Index = 18 Token = 5 - DW 384 * 2 ; Index = 18 Token = 6 - DW 416 * 2 ; Index = 18 Token = 7 - DW 272 * 2 ; Index = 18 Token = 8 - DW 272 * 2 ; Index = 18 Token = 9 - DW 272 * 2 ; Index = 18 Token = 10 - DW 272 * 2 ; Index = 18 Token = 11 - DW 320 * 2 ; Index = 18 Token = 12 - DW 352 * 2 ; Index = 18 Token = 13 - DW 384 * 2 ; Index = 18 Token = 14 - DW 416 * 2 ; Index = 18 Token = 15 - DW 288 * 2 ; Index = 19 Token = 0 - DW 288 * 2 ; Index = 19 Token = 1 - DW 288 * 2 ; Index = 19 Token = 2 - DW 288 * 2 ; Index = 19 Token = 3 - DW 336 * 2 ; Index = 19 Token = 4 - DW 368 * 2 ; Index = 19 Token = 5 - DW 400 * 2 ; Index = 19 Token = 6 - DW 432 * 2 ; Index = 19 Token = 7 - DW 288 * 2 ; Index = 19 Token = 8 - DW 288 * 2 ; Index = 19 Token = 9 - DW 288 * 2 ; Index = 19 Token = 10 - DW 288 * 2 ; Index = 19 Token = 11 - DW 336 * 2 ; Index = 19 Token = 12 - DW 368 * 2 ; Index = 19 Token = 13 - DW 400 * 2 ; Index = 19 Token = 14 - DW 432 * 2 ; Index = 19 Token = 15 - DW 304 * 2 ; Index = 20 Token = 0 - DW 304 * 2 ; Index = 20 Token = 1 - DW 304 * 2 ; Index = 20 Token = 2 - DW 304 * 2 ; Index = 20 Token = 3 - DW 352 * 2 ; Index = 20 Token = 4 - DW 384 * 2 ; Index = 20 Token = 5 - DW 416 * 2 ; Index = 20 Token = 6 - DW 448 * 2 ; Index = 20 Token = 7 - DW 304 * 2 ; Index = 20 Token = 8 - DW 304 * 2 ; Index = 20 Token = 9 - DW 304 * 2 ; Index = 20 Token = 10 - DW 304 * 2 ; Index = 20 Token = 11 - DW 352 * 2 ; Index = 20 Token = 12 - DW 384 * 2 ; Index = 20 Token = 13 - DW 416 * 2 ; Index = 20 Token = 14 - DW 448 * 2 ; Index = 20 Token = 15 - DW 320 * 2 ; Index = 21 Token = 0 - DW 320 * 2 ; Index = 21 Token = 1 - DW 320 * 2 ; Index = 21 Token = 2 - DW 320 * 2 ; Index = 21 Token = 3 - DW 368 * 2 ; Index = 21 Token = 4 - DW 400 * 2 ; Index = 21 Token = 5 - DW 432 * 2 ; Index = 21 Token = 6 - DW 464 * 2 ; Index = 21 Token = 7 - DW 320 * 2 ; Index = 21 Token = 8 - DW 320 * 2 ; Index = 21 Token = 9 - DW 320 * 2 ; Index = 21 Token = 10 - DW 320 * 2 ; Index = 21 Token = 11 - DW 368 * 2 ; Index = 21 Token = 12 - DW 400 * 2 ; Index = 21 Token = 13 - DW 432 * 2 ; Index = 21 Token = 14 - DW 464 * 2 ; Index = 21 Token = 15 - DW 336 * 2 ; Index = 22 Token = 0 - DW 336 * 2 ; Index = 22 Token = 1 - DW 336 * 2 ; Index = 22 Token = 2 - DW 336 * 2 ; Index = 22 Token = 3 - DW 384 * 2 ; Index = 22 Token = 4 - DW 416 * 2 ; Index = 22 Token = 5 - DW 448 * 2 ; Index = 22 Token = 6 - DW 480 * 2 ; Index = 22 Token = 7 - DW 336 * 2 ; Index = 22 Token = 8 - DW 336 * 2 ; Index = 22 Token = 9 - DW 336 * 2 ; Index = 22 Token = 10 - DW 336 * 2 ; Index = 22 Token = 11 - DW 384 * 2 ; Index = 22 Token = 12 - DW 416 * 2 ; Index = 22 Token = 13 - DW 448 * 2 ; Index = 22 Token = 14 - DW 480 * 2 ; Index = 22 Token = 15 - DW 352 * 2 ; Index = 23 Token = 0 - DW 352 * 2 ; Index = 23 Token = 1 - DW 352 * 2 ; Index = 23 Token = 2 - DW 352 * 2 ; Index = 23 Token = 3 - DW 400 * 2 ; Index = 23 Token = 4 - DW 432 * 2 ; Index = 23 Token = 5 - DW 464 * 2 ; Index = 23 Token = 6 - DW 496 * 2 ; Index = 23 Token = 7 - DW 352 * 2 ; Index = 23 Token = 8 - DW 352 * 2 ; Index = 23 Token = 9 - DW 352 * 2 ; Index = 23 Token = 10 - DW 352 * 2 ; Index = 23 Token = 11 - DW 400 * 2 ; Index = 23 Token = 12 - DW 432 * 2 ; Index = 23 Token = 13 - DW 464 * 2 ; Index = 23 Token = 14 - DW 496 * 2 ; Index = 23 Token = 15 - DW 368 * 2 ; Index = 24 Token = 0 - DW 368 * 2 ; Index = 24 Token = 1 - DW 368 * 2 ; Index = 24 Token = 2 - DW 368 * 2 ; Index = 24 Token = 3 - DW 416 * 2 ; Index = 24 Token = 4 - DW 448 * 2 ; Index = 24 Token = 5 - DW 480 * 2 ; Index = 24 Token = 6 - DW 512 * 2 ; Index = 24 Token = 7 - DW 368 * 2 ; Index = 24 Token = 8 - DW 368 * 2 ; Index = 24 Token = 9 - DW 368 * 2 ; Index = 24 Token = 10 - DW 368 * 2 ; Index = 24 Token = 11 - DW 416 * 2 ; Index = 24 Token = 12 - DW 448 * 2 ; Index = 24 Token = 13 - DW 480 * 2 ; Index = 24 Token = 14 - DW 512 * 2 ; Index = 24 Token = 15 - DW 384 * 2 ; Index = 25 Token = 0 - DW 384 * 2 ; Index = 25 Token = 1 - DW 384 * 2 ; Index = 25 Token = 2 - DW 384 * 2 ; Index = 25 Token = 3 - DW 432 * 2 ; Index = 25 Token = 4 - DW 464 * 2 ; Index = 25 Token = 5 - DW 496 * 2 ; Index = 25 Token = 6 - DW 528 * 2 ; Index = 25 Token = 7 - DW 384 * 2 ; Index = 25 Token = 8 - DW 384 * 2 ; Index = 25 Token = 9 - DW 384 * 2 ; Index = 25 Token = 10 - DW 384 * 2 ; Index = 25 Token = 11 - DW 432 * 2 ; Index = 25 Token = 12 - DW 464 * 2 ; Index = 25 Token = 13 - DW 496 * 2 ; Index = 25 Token = 14 - DW 528 * 2 ; Index = 25 Token = 15 - DW 400 * 2 ; Index = 26 Token = 0 - DW 400 * 2 ; Index = 26 Token = 1 - DW 400 * 2 ; Index = 26 Token = 2 - DW 400 * 2 ; Index = 26 Token = 3 - DW 448 * 2 ; Index = 26 Token = 4 - DW 480 * 2 ; Index = 26 Token = 5 - DW 512 * 2 ; Index = 26 Token = 6 - DW 544 * 2 ; Index = 26 Token = 7 - DW 400 * 2 ; Index = 26 Token = 8 - DW 400 * 2 ; Index = 26 Token = 9 - DW 400 * 2 ; Index = 26 Token = 10 - DW 400 * 2 ; Index = 26 Token = 11 - DW 448 * 2 ; Index = 26 Token = 12 - DW 480 * 2 ; Index = 26 Token = 13 - DW 512 * 2 ; Index = 26 Token = 14 - DW 544 * 2 ; Index = 26 Token = 15 - DW 416 * 2 ; Index = 27 Token = 0 - DW 416 * 2 ; Index = 27 Token = 1 - DW 416 * 2 ; Index = 27 Token = 2 - DW 416 * 2 ; Index = 27 Token = 3 - DW 464 * 2 ; Index = 27 Token = 4 - DW 496 * 2 ; Index = 27 Token = 5 - DW 528 * 2 ; Index = 27 Token = 6 - DW 560 * 2 ; Index = 27 Token = 7 - DW 416 * 2 ; Index = 27 Token = 8 - DW 416 * 2 ; Index = 27 Token = 9 - DW 416 * 2 ; Index = 27 Token = 10 - DW 416 * 2 ; Index = 27 Token = 11 - DW 464 * 2 ; Index = 27 Token = 12 - DW 496 * 2 ; Index = 27 Token = 13 - DW 528 * 2 ; Index = 27 Token = 14 - DW 560 * 2 ; Index = 27 Token = 15 - DW 432 * 2 ; Index = 28 Token = 0 - DW 432 * 2 ; Index = 28 Token = 1 - DW 432 * 2 ; Index = 28 Token = 2 - DW 432 * 2 ; Index = 28 Token = 3 - DW 480 * 2 ; Index = 28 Token = 4 - DW 512 * 2 ; Index = 28 Token = 5 - DW 544 * 2 ; Index = 28 Token = 6 - DW 576 * 2 ; Index = 28 Token = 7 - DW 432 * 2 ; Index = 28 Token = 8 - DW 432 * 2 ; Index = 28 Token = 9 - DW 432 * 2 ; Index = 28 Token = 10 - DW 432 * 2 ; Index = 28 Token = 11 - DW 480 * 2 ; Index = 28 Token = 12 - DW 512 * 2 ; Index = 28 Token = 13 - DW 544 * 2 ; Index = 28 Token = 14 - DW 576 * 2 ; Index = 28 Token = 15 - DW 448 * 2 ; Index = 29 Token = 0 - DW 448 * 2 ; Index = 29 Token = 1 - DW 448 * 2 ; Index = 29 Token = 2 - DW 448 * 2 ; Index = 29 Token = 3 - DW 496 * 2 ; Index = 29 Token = 4 - DW 528 * 2 ; Index = 29 Token = 5 - DW 560 * 2 ; Index = 29 Token = 6 - DW 592 * 2 ; Index = 29 Token = 7 - DW 448 * 2 ; Index = 29 Token = 8 - DW 448 * 2 ; Index = 29 Token = 9 - DW 448 * 2 ; Index = 29 Token = 10 - DW 448 * 2 ; Index = 29 Token = 11 - DW 496 * 2 ; Index = 29 Token = 12 - DW 528 * 2 ; Index = 29 Token = 13 - DW 560 * 2 ; Index = 29 Token = 14 - DW 592 * 2 ; Index = 29 Token = 15 - DW 464 * 2 ; Index = 30 Token = 0 - DW 464 * 2 ; Index = 30 Token = 1 - DW 464 * 2 ; Index = 30 Token = 2 - DW 464 * 2 ; Index = 30 Token = 3 - DW 512 * 2 ; Index = 30 Token = 4 - DW 544 * 2 ; Index = 30 Token = 5 - DW 576 * 2 ; Index = 30 Token = 6 - DW 608 * 2 ; Index = 30 Token = 7 - DW 464 * 2 ; Index = 30 Token = 8 - DW 464 * 2 ; Index = 30 Token = 9 - DW 464 * 2 ; Index = 30 Token = 10 - DW 464 * 2 ; Index = 30 Token = 11 - DW 512 * 2 ; Index = 30 Token = 12 - DW 544 * 2 ; Index = 30 Token = 13 - DW 576 * 2 ; Index = 30 Token = 14 - DW 608 * 2 ; Index = 30 Token = 15 - DW 480 * 2 ; Index = 31 Token = 0 - DW 480 * 2 ; Index = 31 Token = 1 - DW 480 * 2 ; Index = 31 Token = 2 - DW 480 * 2 ; Index = 31 Token = 3 - DW 528 * 2 ; Index = 31 Token = 4 - DW 560 * 2 ; Index = 31 Token = 5 - DW 592 * 2 ; Index = 31 Token = 6 - DW 624 * 2 ; Index = 31 Token = 7 - DW 480 * 2 ; Index = 31 Token = 8 - DW 480 * 2 ; Index = 31 Token = 9 - DW 480 * 2 ; Index = 31 Token = 10 - DW 480 * 2 ; Index = 31 Token = 11 - DW 528 * 2 ; Index = 31 Token = 12 - DW 560 * 2 ; Index = 31 Token = 13 - DW 592 * 2 ; Index = 31 Token = 14 - DW 624 * 2 ; Index = 31 Token = 15 - DW 496 * 2 ; Index = 32 Token = 0 - DW 496 * 2 ; Index = 32 Token = 1 - DW 496 * 2 ; Index = 32 Token = 2 - DW 496 * 2 ; Index = 32 Token = 3 - DW 544 * 2 ; Index = 32 Token = 4 - DW 576 * 2 ; Index = 32 Token = 5 - DW 608 * 2 ; Index = 32 Token = 6 - DW 640 * 2 ; Index = 32 Token = 7 - DW 496 * 2 ; Index = 32 Token = 8 - DW 496 * 2 ; Index = 32 Token = 9 - DW 496 * 2 ; Index = 32 Token = 10 - DW 496 * 2 ; Index = 32 Token = 11 - DW 544 * 2 ; Index = 32 Token = 12 - DW 576 * 2 ; Index = 32 Token = 13 - DW 608 * 2 ; Index = 32 Token = 14 - DW 640 * 2 ; Index = 32 Token = 15 - DW 512 * 2 ; Index = 33 Token = 0 - DW 512 * 2 ; Index = 33 Token = 1 - DW 512 * 2 ; Index = 33 Token = 2 - DW 512 * 2 ; Index = 33 Token = 3 - DW 560 * 2 ; Index = 33 Token = 4 - DW 592 * 2 ; Index = 33 Token = 5 - DW 624 * 2 ; Index = 33 Token = 6 - DW 656 * 2 ; Index = 33 Token = 7 - DW 512 * 2 ; Index = 33 Token = 8 - DW 512 * 2 ; Index = 33 Token = 9 - DW 512 * 2 ; Index = 33 Token = 10 - DW 512 * 2 ; Index = 33 Token = 11 - DW 560 * 2 ; Index = 33 Token = 12 - DW 592 * 2 ; Index = 33 Token = 13 - DW 624 * 2 ; Index = 33 Token = 14 - DW 656 * 2 ; Index = 33 Token = 15 - DW 528 * 2 ; Index = 34 Token = 0 - DW 528 * 2 ; Index = 34 Token = 1 - DW 528 * 2 ; Index = 34 Token = 2 - DW 528 * 2 ; Index = 34 Token = 3 - DW 576 * 2 ; Index = 34 Token = 4 - DW 608 * 2 ; Index = 34 Token = 5 - DW 640 * 2 ; Index = 34 Token = 6 - DW 672 * 2 ; Index = 34 Token = 7 - DW 528 * 2 ; Index = 34 Token = 8 - DW 528 * 2 ; Index = 34 Token = 9 - DW 528 * 2 ; Index = 34 Token = 10 - DW 528 * 2 ; Index = 34 Token = 11 - DW 576 * 2 ; Index = 34 Token = 12 - DW 608 * 2 ; Index = 34 Token = 13 - DW 640 * 2 ; Index = 34 Token = 14 - DW 672 * 2 ; Index = 34 Token = 15 - DW 544 * 2 ; Index = 35 Token = 0 - DW 544 * 2 ; Index = 35 Token = 1 - DW 544 * 2 ; Index = 35 Token = 2 - DW 544 * 2 ; Index = 35 Token = 3 - DW 592 * 2 ; Index = 35 Token = 4 - DW 624 * 2 ; Index = 35 Token = 5 - DW 656 * 2 ; Index = 35 Token = 6 - DW 688 * 2 ; Index = 35 Token = 7 - DW 544 * 2 ; Index = 35 Token = 8 - DW 544 * 2 ; Index = 35 Token = 9 - DW 544 * 2 ; Index = 35 Token = 10 - DW 544 * 2 ; Index = 35 Token = 11 - DW 592 * 2 ; Index = 35 Token = 12 - DW 624 * 2 ; Index = 35 Token = 13 - DW 656 * 2 ; Index = 35 Token = 14 - DW 688 * 2 ; Index = 35 Token = 15 - DW 560 * 2 ; Index = 36 Token = 0 - DW 560 * 2 ; Index = 36 Token = 1 - DW 560 * 2 ; Index = 36 Token = 2 - DW 560 * 2 ; Index = 36 Token = 3 - DW 608 * 2 ; Index = 36 Token = 4 - DW 640 * 2 ; Index = 36 Token = 5 - DW 672 * 2 ; Index = 36 Token = 6 - DW 704 * 2 ; Index = 36 Token = 7 - DW 560 * 2 ; Index = 36 Token = 8 - DW 560 * 2 ; Index = 36 Token = 9 - DW 560 * 2 ; Index = 36 Token = 10 - DW 560 * 2 ; Index = 36 Token = 11 - DW 608 * 2 ; Index = 36 Token = 12 - DW 640 * 2 ; Index = 36 Token = 13 - DW 672 * 2 ; Index = 36 Token = 14 - DW 704 * 2 ; Index = 36 Token = 15 - DW 576 * 2 ; Index = 37 Token = 0 - DW 576 * 2 ; Index = 37 Token = 1 - DW 576 * 2 ; Index = 37 Token = 2 - DW 576 * 2 ; Index = 37 Token = 3 - DW 624 * 2 ; Index = 37 Token = 4 - DW 656 * 2 ; Index = 37 Token = 5 - DW 688 * 2 ; Index = 37 Token = 6 - DW 720 * 2 ; Index = 37 Token = 7 - DW 576 * 2 ; Index = 37 Token = 8 - DW 576 * 2 ; Index = 37 Token = 9 - DW 576 * 2 ; Index = 37 Token = 10 - DW 576 * 2 ; Index = 37 Token = 11 - DW 624 * 2 ; Index = 37 Token = 12 - DW 656 * 2 ; Index = 37 Token = 13 - DW 688 * 2 ; Index = 37 Token = 14 - DW 720 * 2 ; Index = 37 Token = 15 - DW 592 * 2 ; Index = 38 Token = 0 - DW 592 * 2 ; Index = 38 Token = 1 - DW 592 * 2 ; Index = 38 Token = 2 - DW 592 * 2 ; Index = 38 Token = 3 - DW 640 * 2 ; Index = 38 Token = 4 - DW 672 * 2 ; Index = 38 Token = 5 - DW 704 * 2 ; Index = 38 Token = 6 - DW 736 * 2 ; Index = 38 Token = 7 - DW 592 * 2 ; Index = 38 Token = 8 - DW 592 * 2 ; Index = 38 Token = 9 - DW 592 * 2 ; Index = 38 Token = 10 - DW 592 * 2 ; Index = 38 Token = 11 - DW 640 * 2 ; Index = 38 Token = 12 - DW 672 * 2 ; Index = 38 Token = 13 - DW 704 * 2 ; Index = 38 Token = 14 - DW 736 * 2 ; Index = 38 Token = 15 - DW 608 * 2 ; Index = 39 Token = 0 - DW 608 * 2 ; Index = 39 Token = 1 - DW 608 * 2 ; Index = 39 Token = 2 - DW 608 * 2 ; Index = 39 Token = 3 - DW 656 * 2 ; Index = 39 Token = 4 - DW 688 * 2 ; Index = 39 Token = 5 - DW 720 * 2 ; Index = 39 Token = 6 - DW 752 * 2 ; Index = 39 Token = 7 - DW 608 * 2 ; Index = 39 Token = 8 - DW 608 * 2 ; Index = 39 Token = 9 - DW 608 * 2 ; Index = 39 Token = 10 - DW 608 * 2 ; Index = 39 Token = 11 - DW 656 * 2 ; Index = 39 Token = 12 - DW 688 * 2 ; Index = 39 Token = 13 - DW 720 * 2 ; Index = 39 Token = 14 - DW 752 * 2 ; Index = 39 Token = 15 - DW 624 * 2 ; Index = 40 Token = 0 - DW 624 * 2 ; Index = 40 Token = 1 - DW 624 * 2 ; Index = 40 Token = 2 - DW 624 * 2 ; Index = 40 Token = 3 - DW 672 * 2 ; Index = 40 Token = 4 - DW 704 * 2 ; Index = 40 Token = 5 - DW 736 * 2 ; Index = 40 Token = 6 - DW 768 * 2 ; Index = 40 Token = 7 - DW 624 * 2 ; Index = 40 Token = 8 - DW 624 * 2 ; Index = 40 Token = 9 - DW 624 * 2 ; Index = 40 Token = 10 - DW 624 * 2 ; Index = 40 Token = 11 - DW 672 * 2 ; Index = 40 Token = 12 - DW 704 * 2 ; Index = 40 Token = 13 - DW 736 * 2 ; Index = 40 Token = 14 - DW 768 * 2 ; Index = 40 Token = 15 - DW 640 * 2 ; Index = 41 Token = 0 - DW 640 * 2 ; Index = 41 Token = 1 - DW 640 * 2 ; Index = 41 Token = 2 - DW 640 * 2 ; Index = 41 Token = 3 - DW 688 * 2 ; Index = 41 Token = 4 - DW 720 * 2 ; Index = 41 Token = 5 - DW 752 * 2 ; Index = 41 Token = 6 - DW 784 * 2 ; Index = 41 Token = 7 - DW 640 * 2 ; Index = 41 Token = 8 - DW 640 * 2 ; Index = 41 Token = 9 - DW 640 * 2 ; Index = 41 Token = 10 - DW 640 * 2 ; Index = 41 Token = 11 - DW 688 * 2 ; Index = 41 Token = 12 - DW 720 * 2 ; Index = 41 Token = 13 - DW 752 * 2 ; Index = 41 Token = 14 - DW 784 * 2 ; Index = 41 Token = 15 - DW 656 * 2 ; Index = 42 Token = 0 - DW 656 * 2 ; Index = 42 Token = 1 - DW 656 * 2 ; Index = 42 Token = 2 - DW 656 * 2 ; Index = 42 Token = 3 - DW 704 * 2 ; Index = 42 Token = 4 - DW 736 * 2 ; Index = 42 Token = 5 - DW 768 * 2 ; Index = 42 Token = 6 - DW 800 * 2 ; Index = 42 Token = 7 - DW 656 * 2 ; Index = 42 Token = 8 - DW 656 * 2 ; Index = 42 Token = 9 - DW 656 * 2 ; Index = 42 Token = 10 - DW 656 * 2 ; Index = 42 Token = 11 - DW 704 * 2 ; Index = 42 Token = 12 - DW 736 * 2 ; Index = 42 Token = 13 - DW 768 * 2 ; Index = 42 Token = 14 - DW 800 * 2 ; Index = 42 Token = 15 - DW 672 * 2 ; Index = 43 Token = 0 - DW 672 * 2 ; Index = 43 Token = 1 - DW 672 * 2 ; Index = 43 Token = 2 - DW 672 * 2 ; Index = 43 Token = 3 - DW 720 * 2 ; Index = 43 Token = 4 - DW 752 * 2 ; Index = 43 Token = 5 - DW 784 * 2 ; Index = 43 Token = 6 - DW 816 * 2 ; Index = 43 Token = 7 - DW 672 * 2 ; Index = 43 Token = 8 - DW 672 * 2 ; Index = 43 Token = 9 - DW 672 * 2 ; Index = 43 Token = 10 - DW 672 * 2 ; Index = 43 Token = 11 - DW 720 * 2 ; Index = 43 Token = 12 - DW 752 * 2 ; Index = 43 Token = 13 - DW 784 * 2 ; Index = 43 Token = 14 - DW 816 * 2 ; Index = 43 Token = 15 - DW 688 * 2 ; Index = 44 Token = 0 - DW 688 * 2 ; Index = 44 Token = 1 - DW 688 * 2 ; Index = 44 Token = 2 - DW 688 * 2 ; Index = 44 Token = 3 - DW 736 * 2 ; Index = 44 Token = 4 - DW 768 * 2 ; Index = 44 Token = 5 - DW 800 * 2 ; Index = 44 Token = 6 - DW 832 * 2 ; Index = 44 Token = 7 - DW 688 * 2 ; Index = 44 Token = 8 - DW 688 * 2 ; Index = 44 Token = 9 - DW 688 * 2 ; Index = 44 Token = 10 - DW 688 * 2 ; Index = 44 Token = 11 - DW 736 * 2 ; Index = 44 Token = 12 - DW 768 * 2 ; Index = 44 Token = 13 - DW 800 * 2 ; Index = 44 Token = 14 - DW 832 * 2 ; Index = 44 Token = 15 - DW 704 * 2 ; Index = 45 Token = 0 - DW 704 * 2 ; Index = 45 Token = 1 - DW 704 * 2 ; Index = 45 Token = 2 - DW 704 * 2 ; Index = 45 Token = 3 - DW 752 * 2 ; Index = 45 Token = 4 - DW 784 * 2 ; Index = 45 Token = 5 - DW 816 * 2 ; Index = 45 Token = 6 - DW 848 * 2 ; Index = 45 Token = 7 - DW 704 * 2 ; Index = 45 Token = 8 - DW 704 * 2 ; Index = 45 Token = 9 - DW 704 * 2 ; Index = 45 Token = 10 - DW 704 * 2 ; Index = 45 Token = 11 - DW 752 * 2 ; Index = 45 Token = 12 - DW 784 * 2 ; Index = 45 Token = 13 - DW 816 * 2 ; Index = 45 Token = 14 - DW 848 * 2 ; Index = 45 Token = 15 - DW 720 * 2 ; Index = 46 Token = 0 - DW 720 * 2 ; Index = 46 Token = 1 - DW 720 * 2 ; Index = 46 Token = 2 - DW 720 * 2 ; Index = 46 Token = 3 - DW 768 * 2 ; Index = 46 Token = 4 - DW 800 * 2 ; Index = 46 Token = 5 - DW 832 * 2 ; Index = 46 Token = 6 - DW 864 * 2 ; Index = 46 Token = 7 - DW 720 * 2 ; Index = 46 Token = 8 - DW 720 * 2 ; Index = 46 Token = 9 - DW 720 * 2 ; Index = 46 Token = 10 - DW 720 * 2 ; Index = 46 Token = 11 - DW 768 * 2 ; Index = 46 Token = 12 - DW 800 * 2 ; Index = 46 Token = 13 - DW 832 * 2 ; Index = 46 Token = 14 - DW 864 * 2 ; Index = 46 Token = 15 - DW 736 * 2 ; Index = 47 Token = 0 - DW 736 * 2 ; Index = 47 Token = 1 - DW 736 * 2 ; Index = 47 Token = 2 - DW 736 * 2 ; Index = 47 Token = 3 - DW 784 * 2 ; Index = 47 Token = 4 - DW 816 * 2 ; Index = 47 Token = 5 - DW 848 * 2 ; Index = 47 Token = 6 - DW 880 * 2 ; Index = 47 Token = 7 - DW 736 * 2 ; Index = 47 Token = 8 - DW 736 * 2 ; Index = 47 Token = 9 - DW 736 * 2 ; Index = 47 Token = 10 - DW 736 * 2 ; Index = 47 Token = 11 - DW 784 * 2 ; Index = 47 Token = 12 - DW 816 * 2 ; Index = 47 Token = 13 - DW 848 * 2 ; Index = 47 Token = 14 - DW 880 * 2 ; Index = 47 Token = 15 - DW 752 * 2 ; Index = 48 Token = 0 - DW 752 * 2 ; Index = 48 Token = 1 - DW 752 * 2 ; Index = 48 Token = 2 - DW 752 * 2 ; Index = 48 Token = 3 - DW 800 * 2 ; Index = 48 Token = 4 - DW 832 * 2 ; Index = 48 Token = 5 - DW 864 * 2 ; Index = 48 Token = 6 - DW 896 * 2 ; Index = 48 Token = 7 - DW 752 * 2 ; Index = 48 Token = 8 - DW 752 * 2 ; Index = 48 Token = 9 - DW 752 * 2 ; Index = 48 Token = 10 - DW 752 * 2 ; Index = 48 Token = 11 - DW 800 * 2 ; Index = 48 Token = 12 - DW 832 * 2 ; Index = 48 Token = 13 - DW 864 * 2 ; Index = 48 Token = 14 - DW 896 * 2 ; Index = 48 Token = 15 - DW 768 * 2 ; Index = 49 Token = 0 - DW 768 * 2 ; Index = 49 Token = 1 - DW 768 * 2 ; Index = 49 Token = 2 - DW 768 * 2 ; Index = 49 Token = 3 - DW 816 * 2 ; Index = 49 Token = 4 - DW 848 * 2 ; Index = 49 Token = 5 - DW 880 * 2 ; Index = 49 Token = 6 - DW 912 * 2 ; Index = 49 Token = 7 - DW 768 * 2 ; Index = 49 Token = 8 - DW 768 * 2 ; Index = 49 Token = 9 - DW 768 * 2 ; Index = 49 Token = 10 - DW 768 * 2 ; Index = 49 Token = 11 - DW 816 * 2 ; Index = 49 Token = 12 - DW 848 * 2 ; Index = 49 Token = 13 - DW 880 * 2 ; Index = 49 Token = 14 - DW 912 * 2 ; Index = 49 Token = 15 - DW 784 * 2 ; Index = 50 Token = 0 - DW 784 * 2 ; Index = 50 Token = 1 - DW 784 * 2 ; Index = 50 Token = 2 - DW 784 * 2 ; Index = 50 Token = 3 - DW 832 * 2 ; Index = 50 Token = 4 - DW 864 * 2 ; Index = 50 Token = 5 - DW 896 * 2 ; Index = 50 Token = 6 - DW 928 * 2 ; Index = 50 Token = 7 - DW 784 * 2 ; Index = 50 Token = 8 - DW 784 * 2 ; Index = 50 Token = 9 - DW 784 * 2 ; Index = 50 Token = 10 - DW 784 * 2 ; Index = 50 Token = 11 - DW 832 * 2 ; Index = 50 Token = 12 - DW 864 * 2 ; Index = 50 Token = 13 - DW 896 * 2 ; Index = 50 Token = 14 - DW 928 * 2 ; Index = 50 Token = 15 - DW 800 * 2 ; Index = 51 Token = 0 - DW 800 * 2 ; Index = 51 Token = 1 - DW 800 * 2 ; Index = 51 Token = 2 - DW 800 * 2 ; Index = 51 Token = 3 - DW 848 * 2 ; Index = 51 Token = 4 - DW 880 * 2 ; Index = 51 Token = 5 - DW 912 * 2 ; Index = 51 Token = 6 - DW 944 * 2 ; Index = 51 Token = 7 - DW 800 * 2 ; Index = 51 Token = 8 - DW 800 * 2 ; Index = 51 Token = 9 - DW 800 * 2 ; Index = 51 Token = 10 - DW 800 * 2 ; Index = 51 Token = 11 - DW 848 * 2 ; Index = 51 Token = 12 - DW 880 * 2 ; Index = 51 Token = 13 - DW 912 * 2 ; Index = 51 Token = 14 - DW 944 * 2 ; Index = 51 Token = 15 - DW 816 * 2 ; Index = 52 Token = 0 - DW 816 * 2 ; Index = 52 Token = 1 - DW 816 * 2 ; Index = 52 Token = 2 - DW 816 * 2 ; Index = 52 Token = 3 - DW 864 * 2 ; Index = 52 Token = 4 - DW 896 * 2 ; Index = 52 Token = 5 - DW 928 * 2 ; Index = 52 Token = 6 - DW 960 * 2 ; Index = 52 Token = 7 - DW 816 * 2 ; Index = 52 Token = 8 - DW 816 * 2 ; Index = 52 Token = 9 - DW 816 * 2 ; Index = 52 Token = 10 - DW 816 * 2 ; Index = 52 Token = 11 - DW 864 * 2 ; Index = 52 Token = 12 - DW 896 * 2 ; Index = 52 Token = 13 - DW 928 * 2 ; Index = 52 Token = 14 - DW 960 * 2 ; Index = 52 Token = 15 - DW 832 * 2 ; Index = 53 Token = 0 - DW 832 * 2 ; Index = 53 Token = 1 - DW 832 * 2 ; Index = 53 Token = 2 - DW 832 * 2 ; Index = 53 Token = 3 - DW 880 * 2 ; Index = 53 Token = 4 - DW 912 * 2 ; Index = 53 Token = 5 - DW 944 * 2 ; Index = 53 Token = 6 - DW 976 * 2 ; Index = 53 Token = 7 - DW 832 * 2 ; Index = 53 Token = 8 - DW 832 * 2 ; Index = 53 Token = 9 - DW 832 * 2 ; Index = 53 Token = 10 - DW 832 * 2 ; Index = 53 Token = 11 - DW 880 * 2 ; Index = 53 Token = 12 - DW 912 * 2 ; Index = 53 Token = 13 - DW 944 * 2 ; Index = 53 Token = 14 - DW 976 * 2 ; Index = 53 Token = 15 - DW 848 * 2 ; Index = 54 Token = 0 - DW 848 * 2 ; Index = 54 Token = 1 - DW 848 * 2 ; Index = 54 Token = 2 - DW 848 * 2 ; Index = 54 Token = 3 - DW 896 * 2 ; Index = 54 Token = 4 - DW 928 * 2 ; Index = 54 Token = 5 - DW 960 * 2 ; Index = 54 Token = 6 - DW 992 * 2 ; Index = 54 Token = 7 - DW 848 * 2 ; Index = 54 Token = 8 - DW 848 * 2 ; Index = 54 Token = 9 - DW 848 * 2 ; Index = 54 Token = 10 - DW 848 * 2 ; Index = 54 Token = 11 - DW 896 * 2 ; Index = 54 Token = 12 - DW 928 * 2 ; Index = 54 Token = 13 - DW 960 * 2 ; Index = 54 Token = 14 - DW 992 * 2 ; Index = 54 Token = 15 - DW 864 * 2 ; Index = 55 Token = 0 - DW 864 * 2 ; Index = 55 Token = 1 - DW 864 * 2 ; Index = 55 Token = 2 - DW 864 * 2 ; Index = 55 Token = 3 - DW 912 * 2 ; Index = 55 Token = 4 - DW 944 * 2 ; Index = 55 Token = 5 - DW 976 * 2 ; Index = 55 Token = 6 - DW 1008 * 2 ; Index = 55 Token = 7 - DW 864 * 2 ; Index = 55 Token = 8 - DW 864 * 2 ; Index = 55 Token = 9 - DW 864 * 2 ; Index = 55 Token = 10 - DW 864 * 2 ; Index = 55 Token = 11 - DW 912 * 2 ; Index = 55 Token = 12 - DW 944 * 2 ; Index = 55 Token = 13 - DW 976 * 2 ; Index = 55 Token = 14 - DW 1008 * 2 ; Index = 55 Token = 15 - DW 880 * 2 ; Index = 56 Token = 0 - DW 880 * 2 ; Index = 56 Token = 1 - DW 880 * 2 ; Index = 56 Token = 2 - DW 880 * 2 ; Index = 56 Token = 3 - DW 928 * 2 ; Index = 56 Token = 4 - DW 960 * 2 ; Index = 56 Token = 5 - DW 992 * 2 ; Index = 56 Token = 6 - DW 1024 * 2 ; Index = 56 Token = 7 - DW 880 * 2 ; Index = 56 Token = 8 - DW 880 * 2 ; Index = 56 Token = 9 - DW 880 * 2 ; Index = 56 Token = 10 - DW 880 * 2 ; Index = 56 Token = 11 - DW 928 * 2 ; Index = 56 Token = 12 - DW 960 * 2 ; Index = 56 Token = 13 - DW 992 * 2 ; Index = 56 Token = 14 - DW 1024 * 2 ; Index = 56 Token = 15 - DW 896 * 2 ; Index = 57 Token = 0 - DW 896 * 2 ; Index = 57 Token = 1 - DW 896 * 2 ; Index = 57 Token = 2 - DW 896 * 2 ; Index = 57 Token = 3 - DW 944 * 2 ; Index = 57 Token = 4 - DW 976 * 2 ; Index = 57 Token = 5 - DW 1008 * 2 ; Index = 57 Token = 6 - DW 1040 * 2 ; Index = 57 Token = 7 - DW 896 * 2 ; Index = 57 Token = 8 - DW 896 * 2 ; Index = 57 Token = 9 - DW 896 * 2 ; Index = 57 Token = 10 - DW 896 * 2 ; Index = 57 Token = 11 - DW 944 * 2 ; Index = 57 Token = 12 - DW 976 * 2 ; Index = 57 Token = 13 - DW 1008 * 2 ; Index = 57 Token = 14 - DW 1040 * 2 ; Index = 57 Token = 15 - DW 912 * 2 ; Index = 58 Token = 0 - DW 912 * 2 ; Index = 58 Token = 1 - DW 912 * 2 ; Index = 58 Token = 2 - DW 912 * 2 ; Index = 58 Token = 3 - DW 960 * 2 ; Index = 58 Token = 4 - DW 992 * 2 ; Index = 58 Token = 5 - DW 1024 * 2 ; Index = 58 Token = 6 - DW 1056 * 2 ; Index = 58 Token = 7 - DW 912 * 2 ; Index = 58 Token = 8 - DW 912 * 2 ; Index = 58 Token = 9 - DW 912 * 2 ; Index = 58 Token = 10 - DW 912 * 2 ; Index = 58 Token = 11 - DW 960 * 2 ; Index = 58 Token = 12 - DW 992 * 2 ; Index = 58 Token = 13 - DW 1024 * 2 ; Index = 58 Token = 14 - DW 1056 * 2 ; Index = 58 Token = 15 - DW 928 * 2 ; Index = 59 Token = 0 - DW 928 * 2 ; Index = 59 Token = 1 - DW 928 * 2 ; Index = 59 Token = 2 - DW 928 * 2 ; Index = 59 Token = 3 - DW 976 * 2 ; Index = 59 Token = 4 - DW 1008 * 2 ; Index = 59 Token = 5 - DW 1040 * 2 ; Index = 59 Token = 6 - DW 1072 * 2 ; Index = 59 Token = 7 - DW 928 * 2 ; Index = 59 Token = 8 - DW 928 * 2 ; Index = 59 Token = 9 - DW 928 * 2 ; Index = 59 Token = 10 - DW 928 * 2 ; Index = 59 Token = 11 - DW 976 * 2 ; Index = 59 Token = 12 - DW 1008 * 2 ; Index = 59 Token = 13 - DW 1040 * 2 ; Index = 59 Token = 14 - DW 1072 * 2 ; Index = 59 Token = 15 - DW 944 * 2 ; Index = 60 Token = 0 - DW 944 * 2 ; Index = 60 Token = 1 - DW 944 * 2 ; Index = 60 Token = 2 - DW 944 * 2 ; Index = 60 Token = 3 - DW 992 * 2 ; Index = 60 Token = 4 - DW 1024 * 2 ; Index = 60 Token = 5 - DW 1056 * 2 ; Index = 60 Token = 6 - DW 1088 * 2 ; Index = 60 Token = 7 - DW 944 * 2 ; Index = 60 Token = 8 - DW 944 * 2 ; Index = 60 Token = 9 - DW 944 * 2 ; Index = 60 Token = 10 - DW 944 * 2 ; Index = 60 Token = 11 - DW 992 * 2 ; Index = 60 Token = 12 - DW 1024 * 2 ; Index = 60 Token = 13 - DW 1056 * 2 ; Index = 60 Token = 14 - DW 1088 * 2 ; Index = 60 Token = 15 - DW 960 * 2 ; Index = 61 Token = 0 - DW 960 * 2 ; Index = 61 Token = 1 - DW 960 * 2 ; Index = 61 Token = 2 - DW 960 * 2 ; Index = 61 Token = 3 - DW 1008 * 2 ; Index = 61 Token = 4 - DW 1040 * 2 ; Index = 61 Token = 5 - DW 1072 * 2 ; Index = 61 Token = 6 - DW 1104 * 2 ; Index = 61 Token = 7 - DW 960 * 2 ; Index = 61 Token = 8 - DW 960 * 2 ; Index = 61 Token = 9 - DW 960 * 2 ; Index = 61 Token = 10 - DW 960 * 2 ; Index = 61 Token = 11 - DW 1008 * 2 ; Index = 61 Token = 12 - DW 1040 * 2 ; Index = 61 Token = 13 - DW 1072 * 2 ; Index = 61 Token = 14 - DW 1104 * 2 ; Index = 61 Token = 15 - DW 976 * 2 ; Index = 62 Token = 0 - DW 976 * 2 ; Index = 62 Token = 1 - DW 976 * 2 ; Index = 62 Token = 2 - DW 976 * 2 ; Index = 62 Token = 3 - DW 1024 * 2 ; Index = 62 Token = 4 - DW 1056 * 2 ; Index = 62 Token = 5 - DW 1088 * 2 ; Index = 62 Token = 6 - DW 1120 * 2 ; Index = 62 Token = 7 - DW 976 * 2 ; Index = 62 Token = 8 - DW 976 * 2 ; Index = 62 Token = 9 - DW 976 * 2 ; Index = 62 Token = 10 - DW 976 * 2 ; Index = 62 Token = 11 - DW 1024 * 2 ; Index = 62 Token = 12 - DW 1056 * 2 ; Index = 62 Token = 13 - DW 1088 * 2 ; Index = 62 Token = 14 - DW 1120 * 2 ; Index = 62 Token = 15 - DW 992 * 2 ; Index = 63 Token = 0 - DW 992 * 2 ; Index = 63 Token = 1 - DW 992 * 2 ; Index = 63 Token = 2 - DW 992 * 2 ; Index = 63 Token = 3 - DW 1040 * 2 ; Index = 63 Token = 4 - DW 1072 * 2 ; Index = 63 Token = 5 - DW 1104 * 2 ; Index = 63 Token = 6 - DW 1136 * 2 ; Index = 63 Token = 7 - DW 992 * 2 ; Index = 63 Token = 8 - DW 992 * 2 ; Index = 63 Token = 9 - DW 992 * 2 ; Index = 63 Token = 10 - DW 992 * 2 ; Index = 63 Token = 11 - DW 1040 * 2 ; Index = 63 Token = 12 - DW 1072 * 2 ; Index = 63 Token = 13 - DW 1104 * 2 ; Index = 63 Token = 14 - DW 1136 * 2 ; Index = 63 Token = 15 - DW 1008 * 2 ; Index = 64 Token = 0 - DW 1008 * 2 ; Index = 64 Token = 1 - DW 1008 * 2 ; Index = 64 Token = 2 - DW 1008 * 2 ; Index = 64 Token = 3 - DW 1056 * 2 ; Index = 64 Token = 4 - DW 1088 * 2 ; Index = 64 Token = 5 - DW 1120 * 2 ; Index = 64 Token = 6 - DW 1152 * 2 ; Index = 64 Token = 7 - DW 1008 * 2 ; Index = 64 Token = 8 - DW 1008 * 2 ; Index = 64 Token = 9 - DW 1008 * 2 ; Index = 64 Token = 10 - DW 1008 * 2 ; Index = 64 Token = 11 - DW 1056 * 2 ; Index = 64 Token = 12 - DW 1088 * 2 ; Index = 64 Token = 13 - DW 1120 * 2 ; Index = 64 Token = 14 - DW 1152 * 2 ; Index = 64 Token = 15 - DW 1024 * 2 ; Index = 65 Token = 0 - DW 1024 * 2 ; Index = 65 Token = 1 - DW 1024 * 2 ; Index = 65 Token = 2 - DW 1024 * 2 ; Index = 65 Token = 3 - DW 1072 * 2 ; Index = 65 Token = 4 - DW 1104 * 2 ; Index = 65 Token = 5 - DW 1136 * 2 ; Index = 65 Token = 6 - DW 1168 * 2 ; Index = 65 Token = 7 - DW 1024 * 2 ; Index = 65 Token = 8 - DW 1024 * 2 ; Index = 65 Token = 9 - DW 1024 * 2 ; Index = 65 Token = 10 - DW 1024 * 2 ; Index = 65 Token = 11 - DW 1072 * 2 ; Index = 65 Token = 12 - DW 1104 * 2 ; Index = 65 Token = 13 - DW 1136 * 2 ; Index = 65 Token = 14 - DW 1168 * 2 ; Index = 65 Token = 15 - DW 1040 * 2 ; Index = 66 Token = 0 - DW 1040 * 2 ; Index = 66 Token = 1 - DW 1040 * 2 ; Index = 66 Token = 2 - DW 1040 * 2 ; Index = 66 Token = 3 - DW 1088 * 2 ; Index = 66 Token = 4 - DW 1120 * 2 ; Index = 66 Token = 5 - DW 1152 * 2 ; Index = 66 Token = 6 - DW 1184 * 2 ; Index = 66 Token = 7 - DW 1040 * 2 ; Index = 66 Token = 8 - DW 1040 * 2 ; Index = 66 Token = 9 - DW 1040 * 2 ; Index = 66 Token = 10 - DW 1040 * 2 ; Index = 66 Token = 11 - DW 1088 * 2 ; Index = 66 Token = 12 - DW 1120 * 2 ; Index = 66 Token = 13 - DW 1152 * 2 ; Index = 66 Token = 14 - DW 1184 * 2 ; Index = 66 Token = 15 - DW 1056 * 2 ; Index = 67 Token = 0 - DW 1056 * 2 ; Index = 67 Token = 1 - DW 1056 * 2 ; Index = 67 Token = 2 - DW 1056 * 2 ; Index = 67 Token = 3 - DW 1104 * 2 ; Index = 67 Token = 4 - DW 1136 * 2 ; Index = 67 Token = 5 - DW 1168 * 2 ; Index = 67 Token = 6 - DW 1200 * 2 ; Index = 67 Token = 7 - DW 1056 * 2 ; Index = 67 Token = 8 - DW 1056 * 2 ; Index = 67 Token = 9 - DW 1056 * 2 ; Index = 67 Token = 10 - DW 1056 * 2 ; Index = 67 Token = 11 - DW 1104 * 2 ; Index = 67 Token = 12 - DW 1136 * 2 ; Index = 67 Token = 13 - DW 1168 * 2 ; Index = 67 Token = 14 - DW 1200 * 2 ; Index = 67 Token = 15 - DW 1072 * 2 ; Index = 68 Token = 0 - DW 1072 * 2 ; Index = 68 Token = 1 - DW 1072 * 2 ; Index = 68 Token = 2 - DW 1072 * 2 ; Index = 68 Token = 3 - DW 1120 * 2 ; Index = 68 Token = 4 - DW 1152 * 2 ; Index = 68 Token = 5 - DW 1184 * 2 ; Index = 68 Token = 6 - DW 1216 * 2 ; Index = 68 Token = 7 - DW 1072 * 2 ; Index = 68 Token = 8 - DW 1072 * 2 ; Index = 68 Token = 9 - DW 1072 * 2 ; Index = 68 Token = 10 - DW 1072 * 2 ; Index = 68 Token = 11 - DW 1120 * 2 ; Index = 68 Token = 12 - DW 1152 * 2 ; Index = 68 Token = 13 - DW 1184 * 2 ; Index = 68 Token = 14 - DW 1216 * 2 ; Index = 68 Token = 15 - DW 1088 * 2 ; Index = 69 Token = 0 - DW 1088 * 2 ; Index = 69 Token = 1 - DW 1088 * 2 ; Index = 69 Token = 2 - DW 1088 * 2 ; Index = 69 Token = 3 - DW 1136 * 2 ; Index = 69 Token = 4 - DW 1168 * 2 ; Index = 69 Token = 5 - DW 1200 * 2 ; Index = 69 Token = 6 - DW 1232 * 2 ; Index = 69 Token = 7 - DW 1088 * 2 ; Index = 69 Token = 8 - DW 1088 * 2 ; Index = 69 Token = 9 - DW 1088 * 2 ; Index = 69 Token = 10 - DW 1088 * 2 ; Index = 69 Token = 11 - DW 1136 * 2 ; Index = 69 Token = 12 - DW 1168 * 2 ; Index = 69 Token = 13 - DW 1200 * 2 ; Index = 69 Token = 14 - DW 1232 * 2 ; Index = 69 Token = 15 - DW 1104 * 2 ; Index = 70 Token = 0 - DW 1104 * 2 ; Index = 70 Token = 1 - DW 1104 * 2 ; Index = 70 Token = 2 - DW 1104 * 2 ; Index = 70 Token = 3 - DW 1152 * 2 ; Index = 70 Token = 4 - DW 1184 * 2 ; Index = 70 Token = 5 - DW 1216 * 2 ; Index = 70 Token = 6 - DW 1248 * 2 ; Index = 70 Token = 7 - DW 1104 * 2 ; Index = 70 Token = 8 - DW 1104 * 2 ; Index = 70 Token = 9 - DW 1104 * 2 ; Index = 70 Token = 10 - DW 1104 * 2 ; Index = 70 Token = 11 - DW 1152 * 2 ; Index = 70 Token = 12 - DW 1184 * 2 ; Index = 70 Token = 13 - DW 1216 * 2 ; Index = 70 Token = 14 - DW 1248 * 2 ; Index = 70 Token = 15 - DW 1120 * 2 ; Index = 71 Token = 0 - DW 1120 * 2 ; Index = 71 Token = 1 - DW 1120 * 2 ; Index = 71 Token = 2 - DW 1120 * 2 ; Index = 71 Token = 3 - DW 1168 * 2 ; Index = 71 Token = 4 - DW 1200 * 2 ; Index = 71 Token = 5 - DW 1232 * 2 ; Index = 71 Token = 6 - DW 1264 * 2 ; Index = 71 Token = 7 - DW 1120 * 2 ; Index = 71 Token = 8 - DW 1120 * 2 ; Index = 71 Token = 9 - DW 1120 * 2 ; Index = 71 Token = 10 - DW 1120 * 2 ; Index = 71 Token = 11 - DW 1168 * 2 ; Index = 71 Token = 12 - DW 1200 * 2 ; Index = 71 Token = 13 - DW 1232 * 2 ; Index = 71 Token = 14 - DW 1264 * 2 ; Index = 71 Token = 15 - DW 1136 * 2 ; Index = 72 Token = 0 - DW 1136 * 2 ; Index = 72 Token = 1 - DW 1136 * 2 ; Index = 72 Token = 2 - DW 1136 * 2 ; Index = 72 Token = 3 - DW 1184 * 2 ; Index = 72 Token = 4 - DW 1216 * 2 ; Index = 72 Token = 5 - DW 1248 * 2 ; Index = 72 Token = 6 - DW 1280 * 2 ; Index = 72 Token = 7 - DW 1136 * 2 ; Index = 72 Token = 8 - DW 1136 * 2 ; Index = 72 Token = 9 - DW 1136 * 2 ; Index = 72 Token = 10 - DW 1136 * 2 ; Index = 72 Token = 11 - DW 1184 * 2 ; Index = 72 Token = 12 - DW 1216 * 2 ; Index = 72 Token = 13 - DW 1248 * 2 ; Index = 72 Token = 14 - DW 1280 * 2 ; Index = 72 Token = 15 - DW 1152 * 2 ; Index = 73 Token = 0 - DW 1152 * 2 ; Index = 73 Token = 1 - DW 1152 * 2 ; Index = 73 Token = 2 - DW 1152 * 2 ; Index = 73 Token = 3 - DW 1200 * 2 ; Index = 73 Token = 4 - DW 1232 * 2 ; Index = 73 Token = 5 - DW 1264 * 2 ; Index = 73 Token = 6 - DW 1296 * 2 ; Index = 73 Token = 7 - DW 1152 * 2 ; Index = 73 Token = 8 - DW 1152 * 2 ; Index = 73 Token = 9 - DW 1152 * 2 ; Index = 73 Token = 10 - DW 1152 * 2 ; Index = 73 Token = 11 - DW 1200 * 2 ; Index = 73 Token = 12 - DW 1232 * 2 ; Index = 73 Token = 13 - DW 1264 * 2 ; Index = 73 Token = 14 - DW 1296 * 2 ; Index = 73 Token = 15 - DW 1168 * 2 ; Index = 74 Token = 0 - DW 1168 * 2 ; Index = 74 Token = 1 - DW 1168 * 2 ; Index = 74 Token = 2 - DW 1168 * 2 ; Index = 74 Token = 3 - DW 1216 * 2 ; Index = 74 Token = 4 - DW 1248 * 2 ; Index = 74 Token = 5 - DW 1280 * 2 ; Index = 74 Token = 6 - DW 1312 * 2 ; Index = 74 Token = 7 - DW 1168 * 2 ; Index = 74 Token = 8 - DW 1168 * 2 ; Index = 74 Token = 9 - DW 1168 * 2 ; Index = 74 Token = 10 - DW 1168 * 2 ; Index = 74 Token = 11 - DW 1216 * 2 ; Index = 74 Token = 12 - DW 1248 * 2 ; Index = 74 Token = 13 - DW 1280 * 2 ; Index = 74 Token = 14 - DW 1312 * 2 ; Index = 74 Token = 15 - DW 1184 * 2 ; Index = 75 Token = 0 - DW 1184 * 2 ; Index = 75 Token = 1 - DW 1184 * 2 ; Index = 75 Token = 2 - DW 1184 * 2 ; Index = 75 Token = 3 - DW 1232 * 2 ; Index = 75 Token = 4 - DW 1264 * 2 ; Index = 75 Token = 5 - DW 1296 * 2 ; Index = 75 Token = 6 - DW 1328 * 2 ; Index = 75 Token = 7 - DW 1184 * 2 ; Index = 75 Token = 8 - DW 1184 * 2 ; Index = 75 Token = 9 - DW 1184 * 2 ; Index = 75 Token = 10 - DW 1184 * 2 ; Index = 75 Token = 11 - DW 1232 * 2 ; Index = 75 Token = 12 - DW 1264 * 2 ; Index = 75 Token = 13 - DW 1296 * 2 ; Index = 75 Token = 14 - DW 1328 * 2 ; Index = 75 Token = 15 - DW 1200 * 2 ; Index = 76 Token = 0 - DW 1200 * 2 ; Index = 76 Token = 1 - DW 1200 * 2 ; Index = 76 Token = 2 - DW 1200 * 2 ; Index = 76 Token = 3 - DW 1248 * 2 ; Index = 76 Token = 4 - DW 1280 * 2 ; Index = 76 Token = 5 - DW 1312 * 2 ; Index = 76 Token = 6 - DW 1344 * 2 ; Index = 76 Token = 7 - DW 1200 * 2 ; Index = 76 Token = 8 - DW 1200 * 2 ; Index = 76 Token = 9 - DW 1200 * 2 ; Index = 76 Token = 10 - DW 1200 * 2 ; Index = 76 Token = 11 - DW 1248 * 2 ; Index = 76 Token = 12 - DW 1280 * 2 ; Index = 76 Token = 13 - DW 1312 * 2 ; Index = 76 Token = 14 - DW 1344 * 2 ; Index = 76 Token = 15 - DW 1216 * 2 ; Index = 77 Token = 0 - DW 1216 * 2 ; Index = 77 Token = 1 - DW 1216 * 2 ; Index = 77 Token = 2 - DW 1216 * 2 ; Index = 77 Token = 3 - DW 1264 * 2 ; Index = 77 Token = 4 - DW 1296 * 2 ; Index = 77 Token = 5 - DW 1328 * 2 ; Index = 77 Token = 6 - DW 1360 * 2 ; Index = 77 Token = 7 - DW 1216 * 2 ; Index = 77 Token = 8 - DW 1216 * 2 ; Index = 77 Token = 9 - DW 1216 * 2 ; Index = 77 Token = 10 - DW 1216 * 2 ; Index = 77 Token = 11 - DW 1264 * 2 ; Index = 77 Token = 12 - DW 1296 * 2 ; Index = 77 Token = 13 - DW 1328 * 2 ; Index = 77 Token = 14 - DW 1360 * 2 ; Index = 77 Token = 15 - DW 1232 * 2 ; Index = 78 Token = 0 - DW 1232 * 2 ; Index = 78 Token = 1 - DW 1232 * 2 ; Index = 78 Token = 2 - DW 1232 * 2 ; Index = 78 Token = 3 - DW 1280 * 2 ; Index = 78 Token = 4 - DW 1312 * 2 ; Index = 78 Token = 5 - DW 1344 * 2 ; Index = 78 Token = 6 - DW 1376 * 2 ; Index = 78 Token = 7 - DW 1232 * 2 ; Index = 78 Token = 8 - DW 1232 * 2 ; Index = 78 Token = 9 - DW 1232 * 2 ; Index = 78 Token = 10 - DW 1232 * 2 ; Index = 78 Token = 11 - DW 1280 * 2 ; Index = 78 Token = 12 - DW 1312 * 2 ; Index = 78 Token = 13 - DW 1344 * 2 ; Index = 78 Token = 14 - DW 1376 * 2 ; Index = 78 Token = 15 - DW 1248 * 2 ; Index = 79 Token = 0 - DW 1248 * 2 ; Index = 79 Token = 1 - DW 1248 * 2 ; Index = 79 Token = 2 - DW 1248 * 2 ; Index = 79 Token = 3 - DW 1296 * 2 ; Index = 79 Token = 4 - DW 1328 * 2 ; Index = 79 Token = 5 - DW 1360 * 2 ; Index = 79 Token = 6 - DW 1392 * 2 ; Index = 79 Token = 7 - DW 1248 * 2 ; Index = 79 Token = 8 - DW 1248 * 2 ; Index = 79 Token = 9 - DW 1248 * 2 ; Index = 79 Token = 10 - DW 1248 * 2 ; Index = 79 Token = 11 - DW 1296 * 2 ; Index = 79 Token = 12 - DW 1328 * 2 ; Index = 79 Token = 13 - DW 1360 * 2 ; Index = 79 Token = 14 - DW 1392 * 2 ; Index = 79 Token = 15 - DW 1264 * 2 ; Index = 80 Token = 0 - DW 1264 * 2 ; Index = 80 Token = 1 - DW 1264 * 2 ; Index = 80 Token = 2 - DW 1264 * 2 ; Index = 80 Token = 3 - DW 1312 * 2 ; Index = 80 Token = 4 - DW 1344 * 2 ; Index = 80 Token = 5 - DW 1376 * 2 ; Index = 80 Token = 6 - DW 1408 * 2 ; Index = 80 Token = 7 - DW 1264 * 2 ; Index = 80 Token = 8 - DW 1264 * 2 ; Index = 80 Token = 9 - DW 1264 * 2 ; Index = 80 Token = 10 - DW 1264 * 2 ; Index = 80 Token = 11 - DW 1312 * 2 ; Index = 80 Token = 12 - DW 1344 * 2 ; Index = 80 Token = 13 - DW 1376 * 2 ; Index = 80 Token = 14 - DW 1408 * 2 ; Index = 80 Token = 15 - DW 1280 * 2 ; Index = 81 Token = 0 - DW 1280 * 2 ; Index = 81 Token = 1 - DW 1280 * 2 ; Index = 81 Token = 2 - DW 1280 * 2 ; Index = 81 Token = 3 - DW 1328 * 2 ; Index = 81 Token = 4 - DW 1360 * 2 ; Index = 81 Token = 5 - DW 1392 * 2 ; Index = 81 Token = 6 - DW 1408 * 2 ; Index = 81 Token = 7 - DW 1280 * 2 ; Index = 81 Token = 8 - DW 1280 * 2 ; Index = 81 Token = 9 - DW 1280 * 2 ; Index = 81 Token = 10 - DW 1280 * 2 ; Index = 81 Token = 11 - DW 1328 * 2 ; Index = 81 Token = 12 - DW 1360 * 2 ; Index = 81 Token = 13 - DW 1392 * 2 ; Index = 81 Token = 14 - DW 1408 * 2 ; Index = 81 Token = 15 - DW 1296 * 2 ; Index = 82 Token = 0 - DW 1296 * 2 ; Index = 82 Token = 1 - DW 1296 * 2 ; Index = 82 Token = 2 - DW 1296 * 2 ; Index = 82 Token = 3 - DW 1344 * 2 ; Index = 82 Token = 4 - DW 1376 * 2 ; Index = 82 Token = 5 - DW 1408 * 2 ; Index = 82 Token = 6 - DW 1408 * 2 ; Index = 82 Token = 7 - DW 1296 * 2 ; Index = 82 Token = 8 - DW 1296 * 2 ; Index = 82 Token = 9 - DW 1296 * 2 ; Index = 82 Token = 10 - DW 1296 * 2 ; Index = 82 Token = 11 - DW 1344 * 2 ; Index = 82 Token = 12 - DW 1376 * 2 ; Index = 82 Token = 13 - DW 1408 * 2 ; Index = 82 Token = 14 - DW 1408 * 2 ; Index = 82 Token = 15 - DW 1312 * 2 ; Index = 83 Token = 0 - DW 1312 * 2 ; Index = 83 Token = 1 - DW 1312 * 2 ; Index = 83 Token = 2 - DW 1312 * 2 ; Index = 83 Token = 3 - DW 1360 * 2 ; Index = 83 Token = 4 - DW 1392 * 2 ; Index = 83 Token = 5 - DW 1408 * 2 ; Index = 83 Token = 6 - DW 1408 * 2 ; Index = 83 Token = 7 - DW 1312 * 2 ; Index = 83 Token = 8 - DW 1312 * 2 ; Index = 83 Token = 9 - DW 1312 * 2 ; Index = 83 Token = 10 - DW 1312 * 2 ; Index = 83 Token = 11 - DW 1360 * 2 ; Index = 83 Token = 12 - DW 1392 * 2 ; Index = 83 Token = 13 - DW 1408 * 2 ; Index = 83 Token = 14 - DW 1408 * 2 ; Index = 83 Token = 15 - DW 1328 * 2 ; Index = 84 Token = 0 - DW 1328 * 2 ; Index = 84 Token = 1 - DW 1328 * 2 ; Index = 84 Token = 2 - DW 1328 * 2 ; Index = 84 Token = 3 - DW 1376 * 2 ; Index = 84 Token = 4 - DW 1408 * 2 ; Index = 84 Token = 5 - DW 1408 * 2 ; Index = 84 Token = 6 - DW 1408 * 2 ; Index = 84 Token = 7 - DW 1328 * 2 ; Index = 84 Token = 8 - DW 1328 * 2 ; Index = 84 Token = 9 - DW 1328 * 2 ; Index = 84 Token = 10 - DW 1328 * 2 ; Index = 84 Token = 11 - DW 1376 * 2 ; Index = 84 Token = 12 - DW 1408 * 2 ; Index = 84 Token = 13 - DW 1408 * 2 ; Index = 84 Token = 14 - DW 1408 * 2 ; Index = 84 Token = 15 - DW 1344 * 2 ; Index = 85 Token = 0 - DW 1344 * 2 ; Index = 85 Token = 1 - DW 1344 * 2 ; Index = 85 Token = 2 - DW 1344 * 2 ; Index = 85 Token = 3 - DW 1392 * 2 ; Index = 85 Token = 4 - DW 1408 * 2 ; Index = 85 Token = 5 - DW 1408 * 2 ; Index = 85 Token = 6 - DW 1408 * 2 ; Index = 85 Token = 7 - DW 1344 * 2 ; Index = 85 Token = 8 - DW 1344 * 2 ; Index = 85 Token = 9 - DW 1344 * 2 ; Index = 85 Token = 10 - DW 1344 * 2 ; Index = 85 Token = 11 - DW 1392 * 2 ; Index = 85 Token = 12 - DW 1408 * 2 ; Index = 85 Token = 13 - DW 1408 * 2 ; Index = 85 Token = 14 - DW 1408 * 2 ; Index = 85 Token = 15 - DW 1360 * 2 ; Index = 86 Token = 0 - DW 1360 * 2 ; Index = 86 Token = 1 - DW 1360 * 2 ; Index = 86 Token = 2 - DW 1360 * 2 ; Index = 86 Token = 3 - DW 1408 * 2 ; Index = 86 Token = 4 - DW 1408 * 2 ; Index = 86 Token = 5 - DW 1408 * 2 ; Index = 86 Token = 6 - DW 1408 * 2 ; Index = 86 Token = 7 - DW 1360 * 2 ; Index = 86 Token = 8 - DW 1360 * 2 ; Index = 86 Token = 9 - DW 1360 * 2 ; Index = 86 Token = 10 - DW 1360 * 2 ; Index = 86 Token = 11 - DW 1408 * 2 ; Index = 86 Token = 12 - DW 1408 * 2 ; Index = 86 Token = 13 - DW 1408 * 2 ; Index = 86 Token = 14 - DW 1408 * 2 ; Index = 86 Token = 15 - DW 1376 * 2 ; Index = 87 Token = 0 - DW 1376 * 2 ; Index = 87 Token = 1 - DW 1376 * 2 ; Index = 87 Token = 2 - DW 1376 * 2 ; Index = 87 Token = 3 - DW 1408 * 2 ; Index = 87 Token = 4 - DW 1408 * 2 ; Index = 87 Token = 5 - DW 1408 * 2 ; Index = 87 Token = 6 - DW 1408 * 2 ; Index = 87 Token = 7 - DW 1376 * 2 ; Index = 87 Token = 8 - DW 1376 * 2 ; Index = 87 Token = 9 - DW 1376 * 2 ; Index = 87 Token = 10 - DW 1376 * 2 ; Index = 87 Token = 11 - DW 1408 * 2 ; Index = 87 Token = 12 - DW 1408 * 2 ; Index = 87 Token = 13 - DW 1408 * 2 ; Index = 87 Token = 14 - DW 1408 * 2 ; Index = 87 Token = 15 - DW 1392 * 2 ; Index = 88 Token = 0 - DW 1392 * 2 ; Index = 88 Token = 1 - DW 1392 * 2 ; Index = 88 Token = 2 - DW 1392 * 2 ; Index = 88 Token = 3 - DW 1408 * 2 ; Index = 88 Token = 4 - DW 1408 * 2 ; Index = 88 Token = 5 - DW 1408 * 2 ; Index = 88 Token = 6 - DW 1408 * 2 ; Index = 88 Token = 7 - DW 1392 * 2 ; Index = 88 Token = 8 - DW 1392 * 2 ; Index = 88 Token = 9 - DW 1392 * 2 ; Index = 88 Token = 10 - DW 1392 * 2 ; Index = 88 Token = 11 - DW 1408 * 2 ; Index = 88 Token = 12 - DW 1408 * 2 ; Index = 88 Token = 13 - DW 1408 * 2 ; Index = 88 Token = 14 - DW 1408 * 2 ; Index = 88 Token = 15 diff --git a/code/nybbtb.inc b/code/nybbtb.inc deleted file mode 100644 index fbb111c8..00000000 --- a/code/nybbtb.inc +++ /dev/null @@ -1,54 +0,0 @@ -;****************************************************************************** -;* O P E N T S -;****************************************************************************** -;* SPDX-License-Identifier: GPL-3.0-or-later -;* Copyright 2025 Electronic Arts Inc. -;* Copyright 2026 OpenTS contributors -;* -;* Contains material derived from Electronic Arts source code. -;* Modified by OpenTS contributors, 2026. -;* EA's GPLv3 Section 7 additional terms and supplemental warranty -;* disclaimers apply; see LICENSE.md. -;****************************************************************************** - -;**************************************************************************** -;* bNybbleTablexxxx - ADPCM Lookup table for nybbles -;**************************************************************************** - - align 4 - -bNybbleTableLow DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - DB 00h*2,01h*2,02h*2,03h*2,04h*2,05h*2,06h*2,07h*2,08h*2,09h*2,0Ah*2,0Bh*2,0Ch*2,0Dh*2,0Eh*2,0Fh*2 - - align 4 - -bNybbleTableHigh DB 00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2,00h*2 - DB 01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2,01h*2 - DB 02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2,02h*2 - DB 03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2,03h*2 - DB 04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2,04h*2 - DB 05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2,05h*2 - DB 06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2,06h*2 - DB 07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2,07h*2 - DB 08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2,08h*2 - DB 09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2,09h*2 - DB 0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2,0Ah*2 - DB 0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2,0Bh*2 - DB 0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2,0Ch*2 - DB 0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2,0Dh*2 - DB 0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2,0Eh*2 - DB 0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2,0Fh*2 diff --git a/code/olsosdec.asm b/code/olsosdec.asm deleted file mode 100644 index f2f22860..00000000 --- a/code/olsosdec.asm +++ /dev/null @@ -1,652 +0,0 @@ -;****************************************************************************** -;* O P E N T S -;****************************************************************************** -;* SPDX-License-Identifier: GPL-3.0-or-later -;* Copyright 2025 Electronic Arts Inc. -;* Copyright 2026 OpenTS contributors -;* -;* Contains material derived from Electronic Arts source code. -;* Modified by OpenTS contributors, 2026. -;* EA's GPLv3 Section 7 additional terms and supplemental warranty -;* disclaimers apply; see LICENSE.md. -;****************************************************************************** - -;**************************************************************************** -;* -;* Copyright (c) 1994, HMI, INC. All Rights Reserved -;* -;*--------------------------------------------------------------------------- -;* -;* FILE -;* soscodec.asm -;* -;* DESCRIPTION -;* HMI SOS ADPCM compression/decompression. -;* -;* PROGRAMMER -;* Nick Skrepetos -;* Denzil E. Long, Jr. (Fixed bugs, rewrote for watcom) -;* Bill Petro (Added stereo support) -;* DATE -;* Febuary 15, 1995 -;* -;*--------------------------------------------------------------------------- -;* -;* PUBLIC -;* -;**************************************************************************** - - ; IDEAL - .386P ;P386 - .MODEL FLAT, C ;MODEL USE32 FLAT - ;LOCALS ?? - - -DPMI_INTR equ 31h -IF_LOCKED_PM_CODE equ 1h ; Locked PM code for DPMI. -IF_LOCKED_PM_DATA equ 2h ; Locked PM code for DPMI. - - sCompInfo STRUC -lpSource DD ? ;Compressed data pointer -lpDest DD ? ;Uncompressed data pointer -dwCompSize DD ? ;Compressed size -dwUnCompSize DD ? ;Uncompressed size - -dwSampleIndex DD ? ;Index into sample -dwPredicted DD ? ;Next predicted value -dwDifference DD ? ;Difference from last sample -wCodeBuf DW ? ;Holds 2 nibbles for decompression -wCode DW ? ;Current 4 bit code -wStep DW ? ;Step value in table -wIndex DW ? ;Index into step table - -dwSampleIndex2 DD ? ;Index into sample -dwPredicted2 DD ? ;Next predicted value -dwDifference2 DD ? ;Difference from last sample -wCodeBuf2 DW ? ;Holds 2 nibbles for decompression -wCode2 DW ? ;Current 4 bit code -wStep2 DW ? ;Step value in table -wIndex2 DW ? ;Index into step table - -wBitSize DW ? ;Bit size for decompression -wChannels DW ? ;number of channels - sCompInfo ENDS - - .DATA ;DATASEG - - -;InitFlags DD 0 ; Flags to indicate what has been initialized. - - -;LABEL LockedDataStart BYTE - -;* Index table for stepping into step table - -wCODECIndexTab DW -1,-1,-1,-1,2,4,6,8 - DW -1,-1,-1,-1,2,4,6,8 - - -;Lookup table of replacement values -;The actual sound value is replaced with an index to lookup in this table -;The index only takes up a nibble(4bits) and represents an int(16bits) -;Essentially: -;Get a value -;compare it with the value before it -;find closest value in table and store the index into the table -;if i'm going down then negitize it -;go to next byte. - -;Theory for stereo: -;1)handle stereo and mono in two seperate loops. cleaner... -;start at byte 0 and skip every other byte(or word) both write and read -;when we get done -; set start byte to 1 and do it again - - - - -;This table essentialy round off to closes values in 3 distinct bands -; precalculated and optimized(i guess) for human hearing. - -wCODECStepTab DW 7, 8, 9, 10, 11, 12, 13,14 - DW 16, 17, 19, 21, 23, 25, 28, 31 - DW 34, 37, 41, 45, 50, 55, 60, 66 - DW 73, 80, 88, 97, 107, 118, 130, 143 - DW 157, 173, 190, 209, 230, 253, 279, 307 - DW 337, 371, 408, 449, 494, 544, 598, 658 - DW 724, 796, 876, 963, 1060, 1166, 1282, 1411 - DW 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024 - DW 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484 - DW 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899 - DW 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794 - DW 32767 - -;dwCODECByteIndex DD 0 ; this is when to stop compressing -;dwCODECTempStep DD 0 ; tempory storage for step value -;wCODECMask DW 0 ; Current mask - -;LABEL LockedDataEnd BYTE - - - .CODE ;CODESEG - -;LABEL LockedCodeStart BYTE - -;**************************************************************************** -;* -;* NAME -;* sosCODECInitStream - Initialize compression stream. -;* -;* SYNOPSIS -;* sosCODECInitStream(CompInfo) -;* -;* void sosCODECInitStream(_SOS_COMPRESS_INFO *); -;* -;* FUNCTION -;* Initialize compression stream for compression and decompression. -;* -;* INPUTS -;* CompInfo - Compression information structure. -;* -;* RESULT -;* NONE -;* -;**************************************************************************** - - PUBLIC General_sosCODECInitStream - General_sosCODECInitStream PROC NEAR \ - \ - sSOSInfo:DWORD - - assume eax:ptr sCompInfo - - mov eax,[sSOSInfo] - mov [[eax].wIndex],0 ; starting index 0 - mov [[eax].wStep],7 ; start with a step of 7 - mov [[eax].dwPredicted],0 ; no predicted value - mov [[eax].dwSampleIndex],0 ;start at head of index - mov [[eax].wIndex2],0 ; starting index 0 - mov [[eax].wStep2],7 ; start with a step of 7 - mov [[eax].dwPredicted2],0 ; no predicted value - mov [[eax].dwSampleIndex2],0 ;start at head of index - ret - - General_sosCODECInitStream ENDP - - - -;**************************************************************************** -;* -;* NAME -;* sosCODECDecompressData - Decompress audio data. -;* -;* SYNOPSIS -;* Size = sosCODECDecompressData(CompInfo, NumBytes) -;* -;* long sosCODECDecompressData(_SOS_COMPRESS_INFO *, long); -;* -;* FUNCTION -;* Decompress data from a 4:1 ADPCM compressed stream. The number of -;* bytes decompressed is returned. -;* -;* INPUTS -;* CompInfo - Compress information structure. -;* NumBytes - Number of bytes to compress. -;* -;* RESULT -;* Size - Size of decompressed data. -;* -;**************************************************************************** - - PUBLIC General_sosCODECDecompressData - General_sosCODECDecompressData PROC NEAR \ - \ - sSOSInfo:DWORD, \ - wBytes:DWORD - - assume ebx:ptr sCompInfo - - local dwCODECBytesProcessed:dword ;bytes to decompress - local dwCODECByteIndex:dword ;this is when to stop compressing - ; these need to be local if the function is to be reenterant - push esi - push edi - push ebx - push ecx - push edx - -;*--------------------------------------------------------------------------- -;* Initialize -;*--------------------------------------------------------------------------- - - mov ebx,[sSOSInfo] - mov eax,[wBytes] - mov [dwCODECBytesProcessed],eax - mov [[ebx].dwSampleIndex],0 ;start at head of index - mov [[ebx].dwSampleIndex2],0 ;start at head of index - - ;Check for 16 bit decompression - - cmp [[ebx].wBitSize],16 - jne short ??skipByteDivide - - shr eax,1 ;Divide size by two - -??skipByteDivide: - mov [dwCODECByteIndex],eax - mov esi,[[ebx].lpSource] - mov edi,[[ebx].lpDest] - cmp [[ebx].wChannels],2 ;stereo check - je ??mainloopl ;do left side first - -; Determine if sample index is even or odd. This will determine -; if we need to get a new token or not. - -;--------------------------------------------------------------------------- -;Main Mono Loop -;--------------------------------------------------------------------------- - - - -??mainloop: - test [[ebx].dwSampleIndex],1 ;odd ?? - je short ??fetchToken ; if so get new token - xor eax,eax ;else shift int codebuf - mov ax,[[ebx].wCodeBuf] ;ored with Code - shr eax,4 - and eax,000Fh - mov [[ebx].wCode],ax - jmp short ??calcDifference - -??fetchToken: - xor eax,eax ;get a new token - mov al,[esi] ;put in codebuf - mov [[ebx].wCodeBuf],ax - inc esi - and eax,000Fh - mov [[ebx].wCode],ax ;and then code - -??calcDifference: - mov [[ebx].dwDifference],0 ;reset diff - xor ecx,ecx - mov cx,[[ebx].wStep] ;cx is step value - test eax,4 ;Check for wCode & 4 - je short ??no4 - add [[ebx].dwDifference],ecx ;Add wStep - -??no4: - test eax,2 ;Check for wCode & 2 - je short ??no2 - mov edx,ecx ;Add wStep >> 1 - shr edx,1 - add [[ebx].dwDifference],edx - -??no2: - test eax,1 ;Check for wCode & 1 - je short ??no1 - mov edx,ecx ;Add wStep >> 2 - shr edx,2 - add [[ebx].dwDifference],edx - -??no1: - mov edx,ecx ;Add in wStep >> 3 - shr edx,3 - add [[ebx].dwDifference],edx - test eax,8 ;Check for wCode & 8 - je short ??no8 - neg [[ebx].dwDifference] ;Negate diff - -??no8: - ; add difference to predicted value. - - mov eax,[[ebx].dwPredicted] - add eax,[[ebx].dwDifference] - - ; make sure there is no under or overflow. - - cmp eax,7FFFh - jl short ??noOverflow - mov eax,7FFFh - -??noOverflow: - cmp eax,0FFFF8000h - jg short ??noUnderflow - mov eax,0FFFF8000h - -??noUnderflow: - mov [[ebx].dwPredicted],eax - cmp [[ebx].wBitSize],16 - jne short ??output8Bit - mov [edi],ax ;Output 16bit sample - add edi,2 - jmp short ??adjustIndex - -??output8Bit: - ; output 8 bit sample - - xor ah,80h - mov [edi],ah - inc edi - -??adjustIndex: - xor ecx,ecx - mov cx,[[ebx].wCode] - xor eax,eax - shl ecx,1 - mov ax,[wCODECIndexTab + ecx] - add [[ebx].wIndex],ax ;check if wIndex < 0 - cmp [[ebx].wIndex],8000h - jb short ??checkOverflow - mov [[ebx].wIndex],0 ;reset index to zero - jmp short ??adjustStep - -??checkOverflow: - cmp [[ebx].wIndex],88 ;check if wIndex > 88 - jbe short ??adjustStep - mov [[ebx].wIndex],88 ;reset index to 88 - -??adjustStep: - ; fetch wIndex so we can fetch new step value - - xor ecx,ecx - mov cx,[[ebx].wIndex] - xor eax,eax - shl ecx,1 - mov ax,[wCODECStepTab + ecx] - - ; advance index and store step value - - add [[ebx].dwSampleIndex],1 - mov [[ebx].wStep],ax - - ; decrement bytes processed and loop back. - - dec [dwCODECByteIndex] - jne ??mainloop - jmp ??exitout - -;-------------------------------------------------------------------------- -;Left Channel Start -;-------------------------------------------------------------------------- - - -??mainloopl: - test [[ebx].dwSampleIndex],1 - je short ??fetchTokenl - - xor eax,eax - mov ax,[[ebx].wCodeBuf] - shr eax,4 - and eax,000Fh - mov [[ebx].wCode],ax - jmp short ??calcDifferencel - -??fetchTokenl: - xor eax,eax - mov al,[esi] - mov [[ebx].wCodeBuf],ax - add esi,2 ;2 for stereo - and eax,000Fh - mov [[ebx].wCode],ax - -??calcDifferencel: - ; reset difference - - mov [[ebx].dwDifference],0 - xor ecx,ecx - mov cx,[[ebx].wStep] - test eax,4 ;Check for wCode & 4 - je short ??no4l - add [[ebx].dwDifference],ecx ;Add wStep - -??no4l: - test eax,2 ;Check for wCode & 2 - je short ??no2l - mov edx,ecx ;Add wStep >> 1 - shr edx,1 - add [[ebx].dwDifference],edx - -??no2l: - test eax,1 ;Check for wCode & 1 - je short ??no1l - mov edx,ecx ;Add wStep >> 2 - shr edx,2 - add [[ebx].dwDifference],edx - -??no1l: - mov edx,ecx ;Add in wStep >> 3 - shr edx,3 - add [[ebx].dwDifference],edx - test eax,8 ;Check for wCode & 8 - je short ??no8l - neg [[ebx].dwDifference] ;Negate diff - -??no8l: - ; add difference to predicted value. - - mov eax,[[ebx].dwPredicted] - add eax,[[ebx].dwDifference] - - ; make sure there is no under or overflow. - - cmp eax,7FFFh - jl short ??noOverflowl - mov eax,7FFFh - -??noOverflowl: - cmp eax,0FFFF8000h - jg short ??noUnderflowl - mov eax,0FFFF8000h - -??noUnderflowl: - mov [[ebx].dwPredicted],eax - cmp [[ebx].wBitSize],16 - jne short ??output8Bitl - mov [edi],ax ;Output 16bit sample - add edi,4 ;4 for stereo - jmp short ??adjustIndexl - -??output8Bitl: - ; output 8 bit sample - - xor ah,80h - mov [edi],ah - add edi,2 ;2 for stereo - -??adjustIndexl: - xor ecx,ecx - mov cx,[[ebx].wCode] - xor eax,eax - shl ecx,1 - mov ax,[wCODECIndexTab + ecx] - add [[ebx].wIndex],ax - ; check if wIndex < 0 - cmp [[ebx].wIndex],8000h - jb short ??checkOverflowl - mov [[ebx].wIndex],0 - jmp short ??adjustStepl ;reset index to zero - - -??checkOverflowl: - - cmp [[ebx].wIndex],88 ; check if wIndex > 88 - jbe short ??adjustStepl - mov [[ebx].wIndex],88 ; reset index to 88 - -??adjustStepl: - ; fetch wIndex so we can fetch new step value - - xor ecx,ecx - mov cx,[[ebx].wIndex] - xor eax,eax - shl ecx,1 - mov ax,[wCODECStepTab + ecx] - - ; advance index and store step value - - add [[ebx].dwSampleIndex],1 - mov [[ebx].wStep],ax - - ; decrement bytes processed and loop back. - - sub [dwCODECByteIndex],2 - jne ??mainloopl -;---------------------------------------------------------------------------- -; Right Side Setup -;---------------------------------------------------------------------------- - mov eax,[wBytes] - mov [dwCODECBytesProcessed],eax - mov esi,[[ebx].lpSource] - mov edi,[[ebx].lpDest] - inc esi ; skip left channel - inc edi ; skip left channel - cmp [[ebx].wBitSize],16 ;16 bit ?? - je short ??doByteDivide - mov [dwCODECByteIndex],eax - jmp short ??mainloopr - -??doByteDivide: - shr eax,1 ;Divide size by two - inc edi ; 16 bit so skip 1 more - mov [dwCODECByteIndex],eax - - -;-------------------------------------------------------------------------- -;Right Channel Start -;-------------------------------------------------------------------------- - - -??mainloopr: - test [[ebx].dwSampleIndex2],1 - je short ??fetchTokenr - xor eax,eax - mov ax,[[ebx].wCodeBuf2] - shr eax,4 - and eax,000Fh - mov [[ebx].wCode2],ax - jmp short ??calcDifferencer - -??fetchTokenr: - xor eax,eax - mov al,[esi] - mov [[ebx].wCodeBuf2],ax - add esi,2 ;2 for stereo - and eax,000Fh - mov [[ebx].wCode2],ax - -??calcDifferencer: - ; reset difference - - mov [[ebx].dwDifference2],0 - xor ecx,ecx - mov cx,[[ebx].wStep2] - test eax,4 ;Check for wCode & 4 - je short ??no4r - add [[ebx].dwDifference2],ecx ;Add wStep - -??no4r: - test eax,2 ;Check for wCode & 2 - je short ??no2r - mov edx,ecx ;Add wStep >> 1 - shr edx,1 - add [[ebx].dwDifference2],edx - -??no2r: - test eax,1 ;Check for wCode & 1 - je short ??no1r - mov edx,ecx ;Add wStep >> 2 - shr edx,2 - add [[ebx].dwDifference2],edx - -??no1r: - mov edx,ecx ;Add in wStep >> 3 - shr edx,3 - add [[ebx].dwDifference2],edx - test eax,8 ;Check for wCode & 8 - je short ??no8r - neg [[ebx].dwDifference2] ;Negate diff - -??no8r: - ; add difference to predicted value. - mov eax,[[ebx].dwPredicted2] - add eax,[[ebx].dwDifference2] - cmp eax,7FFFh - jl short ??noOverflowr - mov eax,7FFFh - -??noOverflowr: - cmp eax,0FFFF8000h - jg short ??noUnderflowr - mov eax,0FFFF8000h - -??noUnderflowr: - mov [[ebx].dwPredicted2],eax - cmp [[ebx].wBitSize],16 - jne short ??output8Bitr - mov [edi],ax ;Output 16bit sample - add edi,4 ;4 for stereo *** - jmp short ??adjustIndexr - -??output8Bitr: - ; output 8 bit sample - xor ah,80h - mov [edi],ah - add edi,2 ;2 for stereo - -??adjustIndexr: - xor ecx,ecx - mov cx,[[ebx].wCode2] - xor eax,eax - shl ecx,1 - mov ax,[wCODECIndexTab + ecx] - add [[ebx].wIndex2],ax - ; check if wIndex < 0 - cmp [[ebx].wIndex2],8000h - jb short ??checkOverflowr - ; reset index to zero - mov [[ebx].wIndex2],0 - jmp short ??adjustStepr - -??checkOverflowr: - ; check if wIndex > 88 - cmp [[ebx].wIndex2],88 - jbe short ??adjustStepr - mov [[ebx].wIndex2],88 ; reset index to 88 - -??adjustStepr: - ; fetch wIndex so we can fetch new step value - - xor ecx,ecx - mov cx,[[ebx].wIndex2] - xor eax,eax - shl ecx,1 - mov ax,[wCODECStepTab + ecx] - - ; advance index and store step value - - add [[ebx].dwSampleIndex2],1 - mov [[ebx].wStep2],ax - - ; decrement bytes processed and loop back. - - sub [dwCODECByteIndex],2 - jne ??mainloopr - - -??exitout: -; don't think we need this but just in case i'll leave it here!! - -; mov [[ebx].lpSource],esi -; mov [[ebx].lpDest],edi - ; set up return value for number of bytes processed. - mov eax,[dwCODECBytesProcessed] - pop edx - pop ecx - pop ebx - pop edi - pop esi - ret - - General_sosCODECDecompressData ENDP - - END diff --git a/code/soscodec.asm b/code/soscodec.asm deleted file mode 100644 index 59c6e0d5..00000000 --- a/code/soscodec.asm +++ /dev/null @@ -1,622 +0,0 @@ -;****************************************************************************** -;* O P E N T S -;****************************************************************************** -;* SPDX-License-Identifier: GPL-3.0-or-later -;* Copyright 2025 Electronic Arts Inc. -;* Copyright 2026 OpenTS contributors -;* -;* Contains material derived from Electronic Arts source code. -;* Modified by OpenTS contributors, 2026. -;* EA's GPLv3 Section 7 additional terms and supplemental warranty -;* disclaimers apply; see LICENSE.md. -;****************************************************************************** - -;**************************************************************************** -;* -;* Copyright (c) 1994, HMI, INC. All Rights Reserved -;* -;*--------------------------------------------------------------------------- -;* -;* FILE -;* soscodec.asm -;* -;* DESCRIPTION -;* HMI SOS ADPCM compression/decompression. -;* -;* PROGRAMMER -;* Nick Skrepetos -;* Denzil E. Long, Jr. (Fixed bugs, rewrote for watcom) -;* Bill Petro (Added stereo support) -;* Jonathan Lanier -;* -;* DATE -;* Febuary 15, 1995 -;* -;* LAST MODIFIED -;* 08/07/95 [jdl] - Rewrote/optimized sosCODECDecompressData -;* -;*--------------------------------------------------------------------------- -;* -;* PUBLIC -;* -;**************************************************************************** - - ;IDEAL - .386P;P386 - .MODEL FLAT, C ;MODEL USE32 FLAT - ;LOCALS ?? - -DPMI_INTR equ 31h -IF_LOCKED_PM_CODE equ 1h ; Locked PM code for DPMI. -IF_LOCKED_PM_DATA equ 2h ; Locked PM code for DPMI. - - sCompInfo STRUC -lpSource DD ? ;Compressed data pointer -lpDest DD ? ;Uncompressed data pointer -dwCompSize DD ? ;Compressed size -dwUnCompSize DD ? ;Uncompressed size - -dwSampleIndex DD ? ;Index into sample -dwPredicted DD ? ;Next predicted value -dwDifference DD ? ;Difference from last sample -wCodeBuf DW ? ;Holds 2 nibbles for decompression -wCode DW ? ;Current 4 bit code -wStep DW ? ;Step value in table -wIndex DW ? ;Index into step table - -dwSampleIndex2 DD ? ;Index into sample -dwPredicted2 DD ? ;Next predicted value -dwDifference2 DD ? ;Difference from last sample -wCodeBuf2 DW ? ;Holds 2 nibbles for decompression -wCode2 DW ? ;Current 4 bit code -wStep2 DW ? ;Step value in table -wIndex2 DW ? ;Index into step table - -wBitSize DW ? ;Bit size for decompression -wChannels DW ? ;number of channels - sCompInfo ENDS - - - .DATA;DATASEG - - -InitFlags DD 0 ; Flags to indicate what has been initialized. - - -;LABEL LockedDataStart BYTE - -;* Index table for stepping into step table - -INCLUDE difftb.inc -INCLUDE indextb.inc -INCLUDE nybbtb.inc - -;LABEL LockedDataEnd BYTE - - .CODE;CODESEG - -;LABEL LockedCodeStart BYTE - -;**************************************************************************** -;* -;* NAME -;* sosCODECInitStream - Initialize compression stream. -;* -;* SYNOPSIS -;* sosCODECInitStream(CompInfo) -;* -;* void sosCODECInitStream(_SOS_COMPRESS_INFO *); -;* -;* FUNCTION -;* Initialize compression stream for compression and decompression. -;* -;* INPUTS -;* CompInfo - Compression information structure. -;* -;* RESULT -;* NONE -;* -;**************************************************************************** - - PUBLIC sosCODECInitStream - sosCODECInitStream PROC NEAR \ - \ - sSOSInfo:DWORD - - assume eax:ptr sCompInfo - - mov eax,[sSOSInfo] - mov [[eax].wIndex],0 ; starting index 0 - mov [[eax].dwPredicted],0 ; no predicted value - mov [[eax].wIndex2],0 ; starting index 0 - mov [[eax].dwPredicted2],0 ; no predicted value - ret - - sosCODECInitStream ENDP - - - -;**************************************************************************** -;* -;* NAME -;* sosCODECDecompressData - Decompress audio data. -;* -;* SYNOPSIS -;* Size = sosCODECDecompressData(CompInfo, NumBytes) -;* -;* long sosCODECDecompressData(_SOS_COMPRESS_INFO *, long); -;* -;* FUNCTION -;* Decompress data from a 4:1 ADPCM compressed stream. The number of -;* bytes decompressed is returned. -;* -;* INPUTS -;* CompInfo - Compress information structure. -;* NumBytes - Number of bytes to decompress. -;* -;* RESULT -;* Size - Size of decompressed data. -;* -;* -;* NOTES -;* This routine has been optimized for pipelining on both -;* 486 and Pentium processors. Changing, inserting, or moving any -;* instructions will most likely slow down the code, in some cases by -;* as much as 20%. It can burst-decompress 16384 samples in about -;* 1940?s on a Pentium 90Mhz, and about 3960?s on a 486 66Mhz. -;* Instruction reordering could bring this down to below 1870?s on -;* the Pentium, but this would cause a great degradation in 486 -;* performance. Since slow 486's are the reason this code was -;* written to be fast, it has been optimized for the Pentium only where -;* it would not degrade 486 performance. So, be careful when changing -;* ANY of this code, because it is very carefully balanced... -;**************************************************************************** - - PUBLIC sosCODECDecompressData - sosCODECDecompressData PROC NEAR \ - \ - sSOSInfo:DWORD, \ - wBytes:DWORD - - assume ebx:ptr sCompInfo - - push esi - push edi - push ebx - push ecx - push edx ;save all the regs - - mov ebx,[sSOSInfo] ;get base of sCompInfo struct - mov cx,[[ebx].wBitSize] ;check the bit size - mov dx,[[ebx].wChannels] ;check the number of channels -; -; -; Determine the correct routine to use for decoding -; (for now only ADPCM 4:1 Mono 16-bit is implemented) - cmp cx,8 - jne ??do16Bits - -??do8Bits: - cmp dx,2 - jne ??not8Stereo -; jmp ??decomp8Stereo - jmp ??byeBye - -??not8Stereo: - cmp dx,1 - jne ??byeBye -; jmp decomp8Mono - jmp ??byeBye - -??do16Bits: - cmp cx,16 - jne ??byeBye - - cmp dx,2 - jne ??not16Stereo -; jmp ??decomp16Stereo - jmp ??byeBye - -??not16Stereo: - cmp dx,1 - jne ??byeBye - - push ebp -; -; -; 16 bit ADPCM 4:1 Mono pre-loop initialization -??decomp16Mono: - push ebx ;save struct base - xor edx,edx ;clear index - mov eax,[[ebx].dwPredicted] ;get last sample - mov dx,[[ebx].wIndex] ;get last index value - mov esi,[[ebx].lpSource] ;get source address - mov edi,[[ebx].lpDest] ;get dest address - - mov ebp,[wBytes] ;get the number of dest. bytes - cmp ebp,16 ;less than 16? (less than 8 samples) - jl ??fixAlign16Mono0 ;if so, don't bother with alignment -; -; -; Check to see if we need to fix an alignment problem on the source buffer -; (non-aligned buffers are MUCH slower; if we're given a non-DWORD aligned -; source address, we do as many samples as needed to get to the nearest -; DWORD boundary, then finish the bulk as a DWORD-aligned decompress). - mov ebx,esi ;get source address - and ebx,03h ;check LSB - jnz ??fixalign16Mono ;if non-zero, need to align for - ;warp speed -??fixAlign16Mono0: - push ebp ;save for later - shr ebp,4 ;divide by 16 for 16-bit, - ;because we do 8 nybbles per loop, - ;and there are two samples per - ;byte, so there are n/16 iterations - ;required - xor ebx,ebx ;clear our nybble index - or ebp,ebp ;set flags for EBP - jmp ??start16Mono ;start with test... don't go if - ;we have zero bytes to do -??fixalign16Mono: - jmp [DWORD PTR dwMono16AlignJmpTable+ebx*4] ;do non-aligned first - - align 4 -??fixAlign16Mono1: - sub ebp,12 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Mono6 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Mono2: - sub ebp,8 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Mono4 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Mono3: - sub ebp,4 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Mono2 ;borrow exit code to go through a - ;piece of a loop -; "The Loop" -; -; Process 1st nybble - align 4 -??loop16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix1Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix1Smp16MonoU -??fixed1Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi],ax ;save the sample -; -; -; Process 2nd nybble -??finish7Smp16Mono: - mov bl,ch ;get next 2 nybbles in ebx - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix2Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix2Smp16MonoU -??fixed2Smp16Mono: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+02h],ax ;save the sample - shr ecx,16 ;move top four nybbles into bottom -; -; -; Process 3rd nybble -??finish6Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix3Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix3Smp16MonoU -??fixed3Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+04h],ax ;save the sample -; -; -; Process 4th nybble -??finish5Smp16Mono: - mov bl,cl - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix4Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix4Smp16MonoU -??fixed4Smp16Mono: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+06h],ax ;save the sample -; -; -; Process 5th nybble -??finish4Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix5Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix5Smp16MonoU -??fixed5Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+08h],ax ;save the sample -; -; -; Process 6th nybble -??finish3Smp16Mono: - mov bl,ch - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix6Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix6Smp16MonoU -??fixed6Smp16Mono: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+0Ah],ax ;save the sample -; -; -; Process 7th nybble -??finish2Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix7Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix7Smp16MonoU -??fixed7Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+0Ch],ax ;save the sample -; -; -; Process 8th nybble -??finish1Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix8Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix8Smp16MonoU -; -; -; Loop cleanup for next pass -??fixed8Smp16Mono: - mov [edi+0Eh],ax ;save the sample - add esi,04h ;bump esi to point to next longword - add edi,10h ;incr. the destination buffer ptr - dec ebp ;count down the number of samples/8 -??start16Mono: - jng ??cleanup16Mono ;if done, clean up - mov ecx,[esi] ;get 4 nybbles in one whack (whee!) - mov bl,cl ;get next 2 nybbles in ebx - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??loop16Mono ;loop until done - -??cleanup16Mono: - jnz ??done16Mono ;if ebp is non-zero, we're DONE - ;if exactly zero, finish the tail-end - ;of the conversion (may be a non- - ;multiple of 8 nybbles) -; -; -; Loop cleanup for last (incomplete) pass - pop ecx ;restore # of words - shr ecx,1 ;divide by two to get samples - and ecx,07h ;get # of samples we missed - jmp [DWORD PTR dwMono16JmpTable+ecx*4] ;go finish the job... -; -; -; Structure cleanup -??done16Mono: - pop ebx ;restore struct base - pop ebp ;restore stack frame pointer - mov [[ebx].dwPredicted],eax ;save last sample - mov [[ebx].wIndex],dx ;save last index value - mov eax,[wBytes] ;get # of bytes we did -??byeBye: - pop edx ;restore all the regs - pop ecx - pop ebx - pop edi - pop esi - ret -; -; -; Jumps for -32768/+32767 bounds check go to these vvvv - align 4 -??fix1Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed1Smp16Mono ;go back - - align 4 -??fix1Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed1Smp16Mono ;go back - - align 4 -??fix2Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed2Smp16Mono ;go back - - align 4 -??fix2Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed2Smp16Mono ;go back - - align 4 -??fix3Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed3Smp16Mono ;go back - - align 4 -??fix3Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed3Smp16Mono ;go back - - align 4 -??fix4Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed4Smp16Mono ;go back - - align 4 -??fix4Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed4Smp16Mono ;go back - - align 4 -??fix5Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed5Smp16Mono ;go back - - align 4 -??fix5Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed5Smp16Mono ;go back - - align 4 -??fix6Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed6Smp16Mono ;go back - - align 4 -??fix6Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed6Smp16Mono ;go back - - align 4 -??fix7Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed7Smp16Mono ;go back - - align 4 -??fix7Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed7Smp16Mono ;go back - - align 4 -??fix8Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed8Smp16Mono ;go back - - align 4 -??fix8Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed8Smp16Mono ;go back -; -; -; Jump tables for cleanup after loop unroll point to these vvvv - align 4 -??finish16Mono1: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 1 nybble (1 byte) - shl ch,4 ;move it over - mov bl,ch ;get nybble in ebx - sub edi,0Eh ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish1Smp16Mono ;go finish it - - align 4 -??finish16Mono2: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 2 nybbles (1 byte) - mov bl,ch ;get nybbles in ebx - sub edi,0Ch ;back edi up - sub esi,3 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish2Smp16Mono ;go finish it - - align 4 -??finish16Mono3: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 3 nybbles (2 bytes) - shl cx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,0Ah ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish3Smp16Mono ;go finish it - - align 4 -??finish16Mono4: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - sub edi,08h ;back edi up - sub esi,2 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish4Smp16Mono ;go finish it - - align 4 -??finish16Mono5: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 1 nybble (1 byte) - shl ecx,16 ;shift it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,4 ;move it over - shl bl,4 ;move it over - sub edi,06h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish5Smp16Mono ;go finish it - - align 4 -??finish16Mono6: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 2 nybbles (1 byte) - shl ecx,16 ;move it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,8 ;move it over - sub esi,1 ;adjust esi (used for dword aligning) - sub edi,04h ;back edi up - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish6Smp16Mono ;go finish it - - align 4 -??finish16Mono7: - xor ecx,ecx ;clear nybble bucket - mov ecx,[esi] ;get 7 nybbles (4 bytes) - shl ecx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,02h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish7Smp16Mono ;go finish it -; -; -; Jump Tables - align 4 - -dwMono16JmpTable DD ??done16Mono - DD ??finish16Mono1 - DD ??finish16Mono2 - DD ??finish16Mono3 - DD ??finish16Mono4 - DD ??finish16Mono5 - DD ??finish16Mono6 - DD ??finish16Mono7 - - align 4 -dwMono16AlignJmpTable DD ??fixAlign16Mono0 - DD ??fixAlign16Mono1 - DD ??fixAlign16Mono2 - DD ??fixAlign16Mono3 - - sosCODECDecompressData ENDP - - END - diff --git a/code/soscodec.cpp b/code/soscodec.cpp new file mode 100644 index 00000000..47b2eb60 --- /dev/null +++ b/code/soscodec.cpp @@ -0,0 +1,238 @@ +/******************************************************************************* + * O P E N T S + ******************************************************************************* + * SPDX-License-Identifier: GPL-3.0-or-later + * Copyright 2025 Electronic Arts Inc. + * Copyright 2026 Vanilla-Conquer contributors + * Copyright 2026 OpenTS contributors + * + * Contains material derived from Electronic Arts source code. + * Modified by OpenTS contributors, 2026. + * EA's GPLv3 Section 7 additional terms and supplemental warranty + * disclaimers apply; see LICENSE.md. + ******************************************************************************/ +#include "soscomp.h" +#include +#include + +// index table for stepping into step table. +static const short wCODECIndexTab[16] = {-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8}; + +static const short wCODECStepTab[89] = { + 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, + 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, + 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, + 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, + 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, + 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767}; + +#ifndef clamp +#define clamp(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) +#endif + +extern "C" +void sosCODECInitStream(_SOS_COMPRESS_INFO* stream) +{ + for (int i = 0; i < 2; i++) { + stream->Channels[i].wCode = 0; + stream->Channels[i].wCodeBuf = 0; + stream->Channels[i].wIndex = 0; + stream->Channels[i].wStep = wCODECStepTab[0]; + stream->Channels[i].dwPredicted = 0; + stream->Channels[i].dwSampleIndex = 0; + } +} + +/* Number of possible wIndex. Comes from the fact that: + * + * next_index = clamp(next_index, 0, 88); + * + * which means 0 <= index <= 88, hence 89 indexes. + */ +#define NUM_INDEXES 89 + +/* Number of possible nybbles. Comes from the fact that: + * + * next_nybble = wCodeBuf & 0xF + * + * which means 0 <= next_nybble <= 15, hence 16 possibilites. + */ +#define NUM_NYBBLES 16 + +/* Define a dynamic programming table mapping all possible indexes and nybbles + * into their next value. Pack things together into a struct so a cache miss + * will retrieve both next index and diff value. + * + * This table should consume ~12kb, which is quite small. + * + */ +static struct +{ + int diff; + short index; +} SosDecompTable[NUM_INDEXES][NUM_NYBBLES]; + +/* Flag if above table was initialized. */ +static bool SosDecompTableGenerated = false; + +/* Generate decompression table for samples. Precompute every possible value + * of dwDifference and Channels[0].wIndex based on every possible combination + * of index and nybble values. */ +void sosCODECGenerateDecompressTable(void) +{ + short index, nybble; + int diff; + + for (index = 0; index < NUM_INDEXES; index++) { + short step = wCODECStepTab[index]; + for (nybble = 0; nybble < NUM_NYBBLES; nybble++) { + diff = step >> 3; + + if ((nybble & 4) != 0) { + diff += step; + } + + if ((nybble & 2) != 0) { + diff += step >> 1; + } + + if ((nybble & 1) != 0) { + diff += step >> 2; + } + + if ((nybble & 8) != 0) { + diff = -diff; + } + + short next_index = index + wCODECIndexTab[nybble & 0x7]; + next_index = clamp(next_index, 0, 88); + + SosDecompTable[index][nybble].diff = diff; + SosDecompTable[index][nybble].index = next_index; + } + } +} + +/* Template version of sosCODECDecompressData which generates a single version + for 8-bits and 16-bits, and for the interleaved (AUD) and planar (VQA) source + layouts. This instructs the compiler to avoid generating a branch in the + deepest loop. */ +template static unsigned sosCODECDecompressDataTemplate(_SOS_COMPRESS_INFO* stream, unsigned bytes) +{ + unsigned full_length = bytes; + int num_channels = stream->wChannels; + + /* 'bytes' is the total decompressed size across every channel; each + channel decodes its own share, and each loop iteration below produces + two of its samples. */ + bytes = (BITS_8 ? (bytes / 2) : (bytes / 4)) / num_channels; + + /* Quickly return if we are not going to write anything. */ + if (bytes == 0) { + return full_length; + } + + int channel = 0; + + unsigned char* src = (unsigned char*)stream->lpSource; + short* dst = (short*)(stream->lpDest); + do { + short index = stream->Channels[channel].wIndex; + int sample = stream->Channels[channel].dwPredicted; + + int j = 0; + do { + unsigned char codebuf = *src; + src += PLANAR ? 1 : num_channels; + + /* First step: case dwSampleIndex is even (unrolled). */ + char current_nybble = codebuf & 0xF; + + sample += SosDecompTable[index][current_nybble].diff; + sample = clamp(sample, -32768, 32767); + + if (BITS_8) { + *dst = ((sample & 0xFF00) >> 8) ^ 0x80; + dst = (short*)((char*)(dst) + num_channels); + } else { + *dst = sample; + dst += num_channels; + } + + index = SosDecompTable[index][current_nybble].index; + + /* Second step: case dwSampleIndex is odd (unrolled). */ + current_nybble = codebuf >> 4; + sample += SosDecompTable[index][current_nybble].diff; + sample = clamp(sample, -32768, 32767); + + if (BITS_8) { + *dst = ((sample & 0xFF00) >> 8) ^ 0x80; + dst = (short*)((char*)(dst) + num_channels); + } else { + *dst = sample; + dst += num_channels; + } + + index = SosDecompTable[index][current_nybble].index; + } while (++j < bytes); + + /* Write back the important stuff from the loop back to the struct. */ + stream->Channels[channel].dwPredicted = sample; + stream->Channels[channel].wIndex = index; + + /* In case of stereo we also need to update the src and dst pointers + before proceeding to the next iteration.. */ + src = PLANAR ? ((unsigned char*)stream->lpSource + bytes) : ((unsigned char*)stream->lpSource + 1); + if (BITS_8) { + dst = (short*)(stream->lpDest + 1); + } else { + dst = (short*)(stream->lpDest) + 1; + } + } while (++channel < num_channels); + + return full_length; +} + +// +// decompress data from a 4:1 ADPCM compressed file. the number of +// bytes decompressed is returned. +// +// +extern "C" +unsigned int sosCODECDecompressData(_SOS_COMPRESS_INFO* stream, unsigned int bytes) +{ + if (SosDecompTableGenerated == false) { + sosCODECGenerateDecompressTable(); + SosDecompTableGenerated = true; + } + + if (stream->wBitSize == 16) { + return sosCODECDecompressDataTemplate(stream, bytes); + } +#if 0 // No video or audio sample with this option? + else { + return sosCODECDecompressDataTemplate(stream, bytes); + } +#endif + assert(0 && "Unreachable"); + return 0; +} + +/* VQA's SND2 chunks carry a stereo stream as two consecutive per-channel + blocks rather than interleaved nybbles, so it needs its own entry point + into the shared decoder. */ +extern "C" +unsigned int sosCODECDecompressDataPlanar(_SOS_COMPRESS_INFO* stream, unsigned int bytes) +{ + if (SosDecompTableGenerated == false) { + sosCODECGenerateDecompressTable(); + SosDecompTableGenerated = true; + } + + if (stream->wBitSize != 16) { + return 0; + } + + return sosCODECDecompressDataTemplate(stream, bytes); +} \ No newline at end of file diff --git a/code/soscomp.h b/code/soscomp.h index 5dc6fd5d..bae4313f 100644 --- a/code/soscomp.h +++ b/code/soscomp.h @@ -3,6 +3,7 @@ ******************************************************************************* * SPDX-License-Identifier: GPL-3.0-or-later * Copyright 2025 Electronic Arts Inc. + * Copyright 2026 Vanilla-Conquer contributors * Copyright 2026 OpenTS contributors * * Contains material derived from Electronic Arts source code. @@ -27,49 +28,47 @@ #pragma once /* compression types */ -enum { - _ADPCM_TYPE_1, - }; +enum +{ + _ADPCM_TYPE_1, +}; -/* define compression structure */ -struct _SOS_COMPRESS_INFO { - char *lpSource; - char *lpDest; - unsigned long dwCompSize; - unsigned long dwUnCompSize; - unsigned long dwSampleIndex; - long dwPredicted; - long dwDifference; - short wCodeBuf; - short wCode; - short wStep; - short wIndex; +typedef struct _tagCOMPRESS_CHANNEL_INFO +{ + unsigned int dwSampleIndex; + int dwPredicted; + int dwDifference; + short wCodeBuf; + short wCode; + short wStep; + short wIndex; +} _COMPRESS_CHANNEL_INFO; - unsigned long dwSampleIndex2; //added BP for channel 2 - long dwPredicted2; //added BP for channel 2 - long dwDifference2; //added BP for channel 2 - short wCodeBuf2; //added BP for channel 2 - short wCode2; //added BP for channel 2 - short wStep2; //added BP for channel 2 - short wIndex2; //added BP for channel 2 - short wBitSize; - short wChannels; //added BP for # of channels - }; +/* define compression structure */ +typedef struct _tagCOMPRESS_INFO +{ + char* lpSource; + char* lpDest; + unsigned int dwCompSize; + unsigned int dwUnCompSize; + _COMPRESS_CHANNEL_INFO Channels[2]; + short wBitSize; + short wChannels; // added BP for # of channels +} _SOS_COMPRESS_INFO; /* compressed file type header */ -struct _SOS_COMPRESS_HEADER { - unsigned long dwType; // type of compression - unsigned long dwCompressedSize; // compressed file size - unsigned long dwUnCompressedSize; // uncompressed file size - unsigned long dwSourceBitSize; // original bit size - char szName[16]; // file type, for error checking - }; +typedef struct _tagCOMPRESS_HEADER +{ + unsigned int dwType; // type of compression + unsigned int dwCompressedSize; // compressed file size + unsigned int dwUnCompressedSize; // uncompressed file size + unsigned int dwSourceBitSize; // original bit size + char szName[16]; // file type, for error checking +} _SOS_COMPRESS_HEADER; /* Prototypes */ extern "C" { - void __cdecl sosCODECInitStream(_SOS_COMPRESS_INFO *); - void __cdecl General_sosCODECInitStream(_SOS_COMPRESS_INFO *); - unsigned long __cdecl sosCODECCompressData(_SOS_COMPRESS_INFO *, unsigned long); - unsigned long __cdecl sosCODECDecompressData(_SOS_COMPRESS_INFO *, unsigned long); - unsigned long __cdecl General_sosCODECDecompressData(_SOS_COMPRESS_INFO *, unsigned long); + void sosCODECInitStream(_SOS_COMPRESS_INFO *); + unsigned int sosCODECDecompressData(_SOS_COMPRESS_INFO *, unsigned int); + unsigned int sosCODECDecompressDataPlanar(_SOS_COMPRESS_INFO *, unsigned int); } diff --git a/code/vqa_sos.asm b/code/vqa_sos.asm deleted file mode 100644 index 3ccc0fb1..00000000 --- a/code/vqa_sos.asm +++ /dev/null @@ -1,1406 +0,0 @@ -;****************************************************************************** -;* O P E N T S -;****************************************************************************** -;* SPDX-License-Identifier: GPL-3.0-or-later -;* Copyright 2025 Electronic Arts Inc. -;* Copyright 2026 OpenTS contributors -;* -;* Contains material derived from Electronic Arts source code. -;* Modified by OpenTS contributors, 2026. -;* EA's GPLv3 Section 7 additional terms and supplemental warranty -;* disclaimers apply; see LICENSE.md. -;****************************************************************************** - -;**************************************************************************** -;* -;* Copyright (c) 1994, HMI, INC. All Rights Reserved -;* -;*--------------------------------------------------------------------------- -;* -;* FILE -;* soscodec.asm -;* -;* DESCRIPTION -;* HMI SOS ADPCM compression/decompression. -;* -;* PROGRAMMER -;* Nick Skrepetos -;* Denzil E. Long, Jr. (Fixed bugs, rewrote for watcom) -;* Bill Petro (Added stereo support) -;* Jonathan Lanier -;* -;* DATE -;* Febuary 15, 1995 -;* -;* LAST MODIFIED -;* 08/07/95 [jdl] - Rewrote/optimized sosCODECDecompressData -;* -;*--------------------------------------------------------------------------- -;* -;* PUBLIC -;* -;**************************************************************************** - - ;IDEAL - .386P;P386 - .MODEL FLAT, C ;MODEL USE32 FLAT - ;LOCALS ?? - -; avoids symbol conflicts with regular SOS -dwDiffTable equ VQA_dwDiffTable -wIndexTable equ VQA_wIndexTable -bNybbleTableLow equ VQA_bNybbleTableLow -bNybbleTableHigh equ VQA_bNybbleTableHigh - - -DPMI_INTR equ 31h -IF_LOCKED_PM_CODE equ 1h ; Locked PM code for DPMI. -IF_LOCKED_PM_DATA equ 2h ; Locked PM code for DPMI. - - sCompInfo STRUC -dwPredicted DD ? ;Next predicted value -wIndex DW ? ;Index into step table - -dwPredicted2 DD ? ;Next predicted value -wIndex2 DW ? ;Index into step table - sCompInfo ENDS - - - .DATA;DATASEG - - -;InitFlags DD 0 ; Flags to indicate what has been initialized. - - -;LABEL LockedDataStart BYTE - -;* Index table for stepping into step table - -INCLUDE difftb.inc -INCLUDE indextb.inc -INCLUDE nybbtb.inc - -;LABEL LockedDataEnd BYTE - - .CODE;CODESEG - -;LABEL LockedCodeStart BYTE - -;**************************************************************************** -;* -;* NAME -;* sosCODECInitStream - Initialize compression stream. -;* -;* SYNOPSIS -;* sosCODECInitStream(CompInfo) -;* -;* void sosCODECInitStream(_SOS_COMPRESS_INFO *); -;* -;* FUNCTION -;* Initialize compression stream for compression and decompression. -;* -;* INPUTS -;* CompInfo - Compression information structure. -;* -;* RESULT -;* NONE -;* -;**************************************************************************** - - PUBLIC VQA_sosCODECInitStream - VQA_sosCODECInitStream PROC NEAR \ - \ - sSOSInfo:DWORD - - assume eax:ptr sCompInfo - - mov eax,[sSOSInfo] - mov [[eax].wIndex],0 ; starting index 0 - mov [[eax].dwPredicted],0 ; no predicted value - mov [[eax].wIndex2],0 ; starting index 0 - mov [[eax].dwPredicted2],0 ; no predicted value - ret - - VQA_sosCODECInitStream ENDP - - - -;**************************************************************************** -;* -;* NAME -;* sosCODECDecompressData - Decompress audio data. -;* -;* SYNOPSIS -;* Size = sosCODECDecompressData(CompInfo, NumBytes) -;* -;* long sosCODECDecompressData(_SOS_COMPRESS_INFO *, long); -;* -;* FUNCTION -;* Decompress data from a 4:1 ADPCM compressed stream. The number of -;* bytes decompressed is returned. -;* -;* INPUTS -;* CompInfo - Compress information structure. -;* NumBytes - Number of bytes to decompress. -;* -;* RESULT -;* Size - Size of decompressed data. -;* -;* -;* NOTES -;* This routine has been optimized for pipelining on both -;* 486 and Pentium processors. Changing, inserting, or moving any -;* instructions will most likely slow down the code, in some cases by -;* as much as 20%. It can burst-decompress 16384 samples in about -;* 1940?s on a Pentium 90Mhz, and about 3960?s on a 486 66Mhz. -;* Instruction reordering could bring this down to below 1870?s on -;* the Pentium, but this would cause a great degradation in 486 -;* performance. Since slow 486's are the reason this code was -;* written to be fast, it has been optimized for the Pentium only where -;* it would not degrade 486 performance. So, be careful when changing -;* ANY of this code, because it is very carefully balanced... -;**************************************************************************** - - PUBLIC VQA_sosCODECDecompressData - VQA_sosCODECDecompressData PROC NEAR \ - \ - lpSource:DWORD, \ - lpDest:DWORD, \ - wBitSize:WORD, \ - wChannels:WORD, \ - wBytes:DWORD, \ - sSOSInfo:DWORD - - assume ebx:ptr sCompInfo - - push esi - push edi - push ebx - push ecx - push edx ;save all the regs - - mov ebx,[sSOSInfo] ;get base of sCompInfo struct - mov cx,[wBitSize] ;check the bit size - mov dx,[wChannels] ;check the number of channels -; -; -; Determine the correct routine to use for decoding -; (for now only ADPCM 4:1 Mono 16-bit is implemented) - cmp cx,8 - jne ??do16Bits - -??do8Bits: - cmp dx,2 - jne ??not8Stereo -; jmp ??decomp8Stereo - jmp ??byeBye - -??not8Stereo: - cmp dx,1 - jne ??byeBye -; jmp decomp8Mono - jmp ??byeBye - -??do16Bits: - cmp cx,16 - jne ??byeBye - - cmp dx,2 - jne ??not16Stereo - jmp ??decomp16Stereo -; jmp ??byeBye - -??not16Stereo: - cmp dx,1 - jne ??byeBye - - push ebp -; -; -; 16 bit ADPCM 4:1 Mono pre-loop initialization -??decomp16Mono: - push ebx ;save struct base - xor edx,edx ;clear index - mov eax,[[ebx].dwPredicted] ;get last sample - mov dx,[[ebx].wIndex] ;get last index value - mov esi,[lpSource] ;get source address - mov edi,[lpDest] ;get dest address - - mov ebp,[wBytes] ;get the number of dest. bytes - cmp ebp,16 ;less than 16? (less than 8 samples) - jl ??fixAlign16Mono0 ;if so, don't bother with alignment -; -; -; Check to see if we need to fix an alignment problem on the source buffer -; (non-aligned buffers are MUCH slower; if we're given a non-DWORD aligned -; source address, we do as many samples as needed to get to the nearest -; DWORD boundary, then finish the bulk as a DWORD-aligned decompress). - mov ebx,esi ;get source address - and ebx,03h ;check LSB - jnz ??fixalign16Mono ;if non-zero, need to align for - ;warp speed -??fixAlign16Mono0: - push ebp ;save for later - shr ebp,4 ;divide by 16 for 16-bit, - ;because we do 8 nybbles per loop, - ;and there are two samples per - ;byte, so there are n/16 iterations - ;required - xor ebx,ebx ;clear our nybble index - or ebp,ebp ;set flags for EBP - jmp ??start16Mono ;start with test... don't go if - ;we have zero bytes to do -??fixalign16Mono: - jmp [DWORD PTR dwMono16AlignJmpTable+ebx*4] ;do non-aligned first - - align 4 -??fixAlign16Mono1: - sub ebp,12 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Mono6 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Mono2: - sub ebp,8 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Mono4 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Mono3: - sub ebp,4 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Mono2 ;borrow exit code to go through a - ;piece of a loop -; "The Loop" -; -; Process 1st nybble - align 4 -??loop16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix1Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix1Smp16MonoU -??fixed1Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi],ax ;save the sample -; -; -; Process 2nd nybble -??finish7Smp16Mono: - mov bl,ch ;get next 2 nybbles in ebx - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix2Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix2Smp16MonoU -??fixed2Smp16Mono: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+02h],ax ;save the sample - shr ecx,16 ;move top four nybbles into bottom -; -; -; Process 3rd nybble -??finish6Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix3Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix3Smp16MonoU -??fixed3Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+04h],ax ;save the sample -; -; -; Process 4th nybble -??finish5Smp16Mono: - mov bl,cl - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix4Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix4Smp16MonoU -??fixed4Smp16Mono: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+06h],ax ;save the sample -; -; -; Process 5th nybble -??finish4Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix5Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix5Smp16MonoU -??fixed5Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+08h],ax ;save the sample -; -; -; Process 6th nybble -??finish3Smp16Mono: - mov bl,ch - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix6Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix6Smp16MonoU -??fixed6Smp16Mono: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+0Ah],ax ;save the sample -; -; -; Process 7th nybble -??finish2Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix7Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix7Smp16MonoU -??fixed7Smp16Mono: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+0Ch],ax ;save the sample -; -; -; Process 8th nybble -??finish1Smp16Mono: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix8Smp16MonoO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix8Smp16MonoU -; -; -; Loop cleanup for next pass -??fixed8Smp16Mono: - mov [edi+0Eh],ax ;save the sample - add esi,04h ;bump esi to point to next longword - add edi,10h ;incr. the destination buffer ptr - dec ebp ;count down the number of samples/8 -??start16Mono: - jng ??cleanup16Mono ;if done, clean up - mov ecx,[esi] ;get 4 nybbles in one whack (whee!) - mov bl,cl ;get next 2 nybbles in ebx - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??loop16Mono ;loop until done - -??cleanup16Mono: - jnz ??done16Mono ;if ebp is non-zero, we're DONE - ;if exactly zero, finish the tail-end - ;of the conversion (may be a non- - ;multiple of 8 nybbles) -; -; -; Loop cleanup for last (incomplete) pass - pop ecx ;restore # of words - shr ecx,1 ;divide by two to get samples - and ecx,07h ;get # of samples we missed - jmp [DWORD PTR dwMono16JmpTable+ecx*4] ;go finish the job... -; -; -; Structure cleanup -??done16Mono: - pop ebx ;restore struct base - pop ebp ;restore stack frame pointer - mov [[ebx].dwPredicted],eax ;save last sample - mov [[ebx].wIndex],dx ;save last index value - mov eax,[wBytes] ;get # of bytes we did -??byeBye: - pop edx ;restore all the regs - pop ecx - pop ebx - pop edi - pop esi - ret -; -; -; Jumps for -32768/+32767 bounds check go to these vvvv - align 4 -??fix1Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed1Smp16Mono ;go back - - align 4 -??fix1Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed1Smp16Mono ;go back - - align 4 -??fix2Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed2Smp16Mono ;go back - - align 4 -??fix2Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed2Smp16Mono ;go back - - align 4 -??fix3Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed3Smp16Mono ;go back - - align 4 -??fix3Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed3Smp16Mono ;go back - - align 4 -??fix4Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed4Smp16Mono ;go back - - align 4 -??fix4Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed4Smp16Mono ;go back - - align 4 -??fix5Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed5Smp16Mono ;go back - - align 4 -??fix5Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed5Smp16Mono ;go back - - align 4 -??fix6Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed6Smp16Mono ;go back - - align 4 -??fix6Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed6Smp16Mono ;go back - - align 4 -??fix7Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed7Smp16Mono ;go back - - align 4 -??fix7Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed7Smp16Mono ;go back - - align 4 -??fix8Smp16MonoO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed8Smp16Mono ;go back - - align 4 -??fix8Smp16MonoU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed8Smp16Mono ;go back -; -; -; Jump tables for cleanup after loop unroll point to these vvvv - align 4 -??finish16Mono1: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 1 nybble (1 byte) - shl ch,4 ;move it over - mov bl,ch ;get nybble in ebx - sub edi,0Eh ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish1Smp16Mono ;go finish it - - align 4 -??finish16Mono2: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 2 nybbles (1 byte) - mov bl,ch ;get nybbles in ebx - sub edi,0Ch ;back edi up - sub esi,3 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish2Smp16Mono ;go finish it - - align 4 -??finish16Mono3: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 3 nybbles (2 bytes) - shl cx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,0Ah ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish3Smp16Mono ;go finish it - - align 4 -??finish16Mono4: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - sub edi,08h ;back edi up - sub esi,2 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish4Smp16Mono ;go finish it - - align 4 -??finish16Mono5: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 1 nybble (1 byte) - shl ecx,16 ;shift it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,4 ;move it over - shl bl,4 ;move it over - sub edi,06h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish5Smp16Mono ;go finish it - - align 4 -??finish16Mono6: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 2 nybbles (1 byte) - shl ecx,16 ;move it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,8 ;move it over - sub esi,1 ;adjust esi (used for dword aligning) - sub edi,04h ;back edi up - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish6Smp16Mono ;go finish it - - align 4 -??finish16Mono7: - xor ecx,ecx ;clear nybble bucket - mov ecx,[esi] ;get 7 nybbles (4 bytes) - shl ecx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,02h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish7Smp16Mono ;go finish it -; -; -; Jump Tables - align 4 - -dwMono16JmpTable DD ??done16Mono - DD ??finish16Mono1 - DD ??finish16Mono2 - DD ??finish16Mono3 - DD ??finish16Mono4 - DD ??finish16Mono5 - DD ??finish16Mono6 - DD ??finish16Mono7 - - align 4 -dwMono16AlignJmpTable DD ??fixAlign16Mono0 - DD ??fixAlign16Mono1 - DD ??fixAlign16Mono2 - DD ??fixAlign16Mono3 - -??decomp16Stereo: - -??decomp16StereoLeft: - push ebp -; -; -; 16 bit ADPCM 4:1 Left pre-loop initialization -??decomp16Left: - push ebx ;save struct base - xor edx,edx ;clear index - mov eax,[[ebx].dwPredicted] ;get last sample - mov dx,[[ebx].wIndex] ;get last index value - mov esi,[lpSource] ;get source address - mov edi,[lpDest] ;get dest address - - mov ebp,[wBytes] ;get the number of dest. bytes - shr ebp,1 - cmp ebp,16 ;less than 16? (less than 8 samples) - jl ??fixAlign16Left0 ;if so, don't bother with alignment -; -; -; Check to see if we need to fix an alignment problem on the source buffer -; (non-aligned buffers are MUCH slower; if we're given a non-DWORD aligned -; source address, we do as many samples as needed to get to the nearest -; DWORD boundary, then finish the bulk as a DWORD-aligned decompress). - mov ebx,esi ;get source address - and ebx,03h ;check LSB - jnz ??fixalign16Left ;if non-zero, need to align for - ;warp speed -??fixAlign16Left0: - push ebp ;save for later - shr ebp,4 ;divide by 16 for 16-bit, - ;because we do 8 nybbles per loop, - ;and there are two samples per - ;byte, so there are n/16 iterations - ;required - xor ebx,ebx ;clear our nybble index - or ebp,ebp ;set flags for EBP - jmp ??start16Left ;start with test... don't go if - ;we have zero bytes to do -??fixalign16Left: - jmp [DWORD PTR dwLeft16AlignJmpTable+ebx*4] ;do non-aligned first - - align 4 -??fixAlign16Left1: - sub ebp,12 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Left6 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Left2: - sub ebp,8 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Left4 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Left3: - sub ebp,4 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Left2 ;borrow exit code to go through a - ;piece of a loop -; "The Loop" -; -; Process 1st nybble - align 4 -??loop16Left: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix1Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix1Smp16LeftU -??fixed1Smp16Left: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi],ax ;save the sample -; -; -; Process 2nd nybble -??finish7Smp16Left: - mov bl,ch ;get next 2 nybbles in ebx - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix2Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix2Smp16LeftU -??fixed2Smp16Left: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+2*02h],ax ;save the sample - shr ecx,16 ;move top four nybbles into bottom -; -; -; Process 3rd nybble -??finish6Smp16Left: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix3Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix3Smp16LeftU -??fixed3Smp16Left: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+2*04h],ax ;save the sample -; -; -; Process 4th nybble -??finish5Smp16Left: - mov bl,cl - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix4Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix4Smp16LeftU -??fixed4Smp16Left: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+2*06h],ax ;save the sample -; -; -; Process 5th nybble -??finish4Smp16Left: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix5Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix5Smp16LeftU -??fixed5Smp16Left: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+2*08h],ax ;save the sample -; -; -; Process 6th nybble -??finish3Smp16Left: - mov bl,ch - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix6Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix6Smp16LeftU -??fixed6Smp16Left: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+2*0Ah],ax ;save the sample -; -; -; Process 7th nybble -??finish2Smp16Left: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix7Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix7Smp16LeftU -??fixed7Smp16Left: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+2*0Ch],ax ;save the sample -; -; -; Process 8th nybble -??finish1Smp16Left: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix8Smp16LeftO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix8Smp16LeftU -; -; -; Loop cleanup for next pass -??fixed8Smp16Left: - mov [edi+2*0Eh],ax ;save the sample - add esi,04h ;bump esi to point to next longword - add edi,2*10h ;incr. the destination buffer ptr - dec ebp ;count down the number of samples/8 -??start16Left: - jng ??cleanup16Left ;if done, clean up - mov ecx,[esi] ;get 4 nybbles in one whack (whee!) - mov bl,cl ;get next 2 nybbles in ebx - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??loop16Left ;loop until done - -??cleanup16Left: - jnz ??done16Left ;if ebp is non-zero, we're DONE - ;if exactly zero, finish the tail-end - ;of the conversion (may be a non- - ;multiple of 8 nybbles) -; -; -; Loop cleanup for last (incomplete) pass - pop ecx ;restore # of words - shr ecx,1 ;divide by two to get samples - and ecx,07h ;get # of samples we missed - jmp [DWORD PTR dwLeft16JmpTable+ecx*4] ;go finish the job... -; -; -; Structure cleanup -??done16Left: - pop ebx ;restore struct base - pop ebp ;restore stack frame pointer - mov [[ebx].dwPredicted],eax ;save last sample - mov [[ebx].wIndex],dx ;save last index value -; mov eax,[wBytes] ;get # of bytes we did - jmp ??decomp16StereoRight -; -; -; Jumps for -32768/+32767 bounds check go to these vvvv - align 4 -??fix1Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed1Smp16Left ;go back - - align 4 -??fix1Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed1Smp16Left ;go back - - align 4 -??fix2Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed2Smp16Left ;go back - - align 4 -??fix2Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed2Smp16Left ;go back - - align 4 -??fix3Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed3Smp16Left ;go back - - align 4 -??fix3Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed3Smp16Left ;go back - - align 4 -??fix4Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed4Smp16Left ;go back - - align 4 -??fix4Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed4Smp16Left ;go back - - align 4 -??fix5Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed5Smp16Left ;go back - - align 4 -??fix5Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed5Smp16Left ;go back - - align 4 -??fix6Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed6Smp16Left ;go back - - align 4 -??fix6Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed6Smp16Left ;go back - - align 4 -??fix7Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed7Smp16Left ;go back - - align 4 -??fix7Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed7Smp16Left ;go back - - align 4 -??fix8Smp16LeftO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed8Smp16Left ;go back - - align 4 -??fix8Smp16LeftU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed8Smp16Left ;go back -; -; -; Jump tables for cleanup after loop unroll point to these vvvv - align 4 -??finish16Left1: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 1 nybble (1 byte) - shl ch,4 ;move it over - mov bl,ch ;get nybble in ebx - sub edi,2*0Eh ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish1Smp16Left ;go finish it - - align 4 -??finish16Left2: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 2 nybbles (1 byte) - mov bl,ch ;get nybbles in ebx - sub edi,2*0Ch ;back edi up - sub esi,3 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish2Smp16Left ;go finish it - - align 4 -??finish16Left3: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 3 nybbles (2 bytes) - shl cx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,2*0Ah ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish3Smp16Left ;go finish it - - align 4 -??finish16Left4: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - sub edi,2*08h ;back edi up - sub esi,2 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish4Smp16Left ;go finish it - - align 4 -??finish16Left5: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 1 nybble (1 byte) - shl ecx,16 ;shift it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,4 ;move it over - shl bl,4 ;move it over - sub edi,2*06h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish5Smp16Left ;go finish it - - align 4 -??finish16Left6: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 2 nybbles (1 byte) - shl ecx,16 ;move it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,8 ;move it over - sub esi,1 ;adjust esi (used for dword aligning) - sub edi,2*04h ;back edi up - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish6Smp16Left ;go finish it - - align 4 -??finish16Left7: - xor ecx,ecx ;clear nybble bucket - mov ecx,[esi] ;get 7 nybbles (4 bytes) - shl ecx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,2*02h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish7Smp16Left ;go finish it -; -; -; Jump Tables - align 4 - -dwLeft16JmpTable DD ??done16Left - DD ??finish16Left1 - DD ??finish16Left2 - DD ??finish16Left3 - DD ??finish16Left4 - DD ??finish16Left5 - DD ??finish16Left6 - DD ??finish16Left7 - - align 4 -dwLeft16AlignJmpTable DD ??fixAlign16Left0 - DD ??fixAlign16Left1 - DD ??fixAlign16Left2 - DD ??fixAlign16Left3 - -??decomp16StereoRight: - push ebp -; -; -; 16 bit ADPCM 4:1 Right pre-loop initialization -??decomp16Right: - push ebx ;save struct base - mov esi,[lpSource] ;get source address - mov edi,[lpDest] ;get dest address - - add edi,2 - mov edx,[wBytes] - shr edx,3 - add esi,edx - - xor edx,edx ;clear index - mov eax,[[ebx].dwPredicted2] ;get last sample - mov dx,[[ebx].wIndex2] ;get last index value - - mov ebp,[wBytes] ;get the number of dest. bytes - shr ebp,1 - cmp ebp,16 ;less than 16? (less than 8 samples) - jl ??fixAlign16Right0 ;if so, don't bother with alignment -; -; -; Check to see if we need to fix an alignment problem on the source buffer -; (non-aligned buffers are MUCH slower; if we're given a non-DWORD aligned -; source address, we do as many samples as needed to get to the nearest -; DWORD boundary, then finish the bulk as a DWORD-aligned decompress). - mov ebx,esi ;get source address - and ebx,03h ;check LSB - jnz ??fixalign16Right ;if non-zero, need to align for - ;warp speed -??fixAlign16Right0: - push ebp ;save for later - shr ebp,4 ;divide by 16 for 16-bit, - ;because we do 8 nybbles per loop, - ;and there are two samples per - ;byte, so there are n/16 iterations - ;required - xor ebx,ebx ;clear our nybble index - or ebp,ebp ;set flags for EBP - jmp ??start16Right ;start with test... don't go if - ;we have zero bytes to do -??fixalign16Right: - jmp [DWORD PTR dwRight16AlignJmpTable+ebx*4] ;do non-aligned first - - align 4 -??fixAlign16Right1: - sub ebp,12 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Right6 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Right2: - sub ebp,8 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Right4 ;borrow exit code to go through a - ;piece of a loop - align 4 -??fixAlign16Right3: - sub ebp,4 ;adjust # of dest. bytes - push ebp ;save it - shr ebp,4 ;divide by 16 to get samples/8 - xor ebx,ebx ;clear our nybble index - inc ebp ;adjust ebp for loop - jmp ??finish16Right2 ;borrow exit code to go through a - ;piece of a loop -; "The Loop" -; -; Process 1st nybble - align 4 -??loop16Right: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix1Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix1Smp16RightU -??fixed1Smp16Right: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi],ax ;save the sample -; -; -; Process 2nd nybble -??finish7Smp16Right: - mov bl,ch ;get next 2 nybbles in ebx - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix2Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix2Smp16RightU -??fixed2Smp16Right: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+2*02h],ax ;save the sample - shr ecx,16 ;move top four nybbles into bottom -; -; -; Process 3rd nybble -??finish6Smp16Right: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix3Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix3Smp16RightU -??fixed3Smp16Right: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+2*04h],ax ;save the sample -; -; -; Process 4th nybble -??finish5Smp16Right: - mov bl,cl - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix4Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix4Smp16RightU -??fixed4Smp16Right: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+2*06h],ax ;save the sample -; -; -; Process 5th nybble -??finish4Smp16Right: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix5Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix5Smp16RightU -??fixed5Smp16Right: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+2*08h],ax ;save the sample -; -; -; Process 6th nybble -??finish3Smp16Right: - mov bl,ch - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix6Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix6Smp16RightU -??fixed6Smp16Right: - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - mov [edi+2*0Ah],ax ;save the sample -; -; -; Process 7th nybble -??finish2Smp16Right: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix7Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix7Smp16RightU -??fixed7Smp16Right: - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - mov [edi+2*0Ch],ax ;save the sample -; -; -; Process 8th nybble -??finish1Smp16Right: - add eax,[dwDiffTable+edx*2] ;add difference to prev. sample - mov dx,[wIndexTable+edx] ;adjust dx to next index base - cmp eax,00007FFFh ;check for overflow - jg ??fix8Smp16RightO - cmp eax,0FFFF8000h ;check for underflow - jl ??fix8Smp16RightU -; -; -; Loop cleanup for next pass -??fixed8Smp16Right: - mov [edi+2*0Eh],ax ;save the sample - add esi,04h ;bump esi to point to next longword - add edi,2*10h ;incr. the destination buffer ptr - dec ebp ;count down the number of samples/8 -??start16Right: - jng ??cleanup16Right ;if done, clean up - mov ecx,[esi] ;get 4 nybbles in one whack (whee!) - mov bl,cl ;get next 2 nybbles in ebx - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??loop16Right ;loop until done - -??cleanup16Right: - jnz ??done16Right ;if ebp is non-zero, we're DONE - ;if exactly zero, finish the tail-end - ;of the conversion (may be a non- - ;multiple of 8 nybbles) -; -; -; Loop cleanup for last (incomplete) pass - pop ecx ;restore # of words - shr ecx,1 ;divide by two to get samples - and ecx,07h ;get # of samples we missed - jmp [DWORD PTR dwRight16JmpTable+ecx*4] ;go finish the job... -; -; -; Structure cleanup -??done16Right: - pop ebx ;restore struct base - pop ebp ;restore stack frame pointer - mov [[ebx].dwPredicted2],eax ;save last sample - mov [[ebx].wIndex2],dx ;save last index value - mov eax,[wBytes] ;get # of bytes we did - jmp ??byeBye -; -; -; Jumps for -32768/+32767 bounds check go to these vvvv - align 4 -??fix1Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed1Smp16Right ;go back - - align 4 -??fix1Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed1Smp16Right ;go back - - align 4 -??fix2Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed2Smp16Right ;go back - - align 4 -??fix2Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed2Smp16Right ;go back - - align 4 -??fix3Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed3Smp16Right ;go back - - align 4 -??fix3Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed3Smp16Right ;go back - - align 4 -??fix4Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed4Smp16Right ;go back - - align 4 -??fix4Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed4Smp16Right ;go back - - align 4 -??fix5Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed5Smp16Right ;go back - - align 4 -??fix5Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed5Smp16Right ;go back - - align 4 -??fix6Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed6Smp16Right ;go back - - align 4 -??fix6Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed6Smp16Right ;go back - - align 4 -??fix7Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed7Smp16Right ;go back - - align 4 -??fix7Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed7Smp16Right ;go back - - align 4 -??fix8Smp16RightO: - mov eax,00007FFFh ;Overflow - truncate to +32767 - jmp ??fixed8Smp16Right ;go back - - align 4 -??fix8Smp16RightU: - mov eax,0FFFF8000h ;Underflow - truncate to -32768 - jmp ??fixed8Smp16Right ;go back -; -; -; Jump tables for cleanup after loop unroll point to these vvvv - align 4 -??finish16Right1: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 1 nybble (1 byte) - shl ch,4 ;move it over - mov bl,ch ;get nybble in ebx - sub edi,2*0Eh ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish1Smp16Right ;go finish it - - align 4 -??finish16Right2: - xor ecx,ecx ;clear nybble bucket - mov ch,[esi] ;get 2 nybbles (1 byte) - mov bl,ch ;get nybbles in ebx - sub edi,2*0Ch ;back edi up - sub esi,3 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish2Smp16Right ;go finish it - - align 4 -??finish16Right3: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 3 nybbles (2 bytes) - shl cx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,2*0Ah ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish3Smp16Right ;go finish it - - align 4 -??finish16Right4: - xor ecx,ecx ;clear nybble bucket - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - sub edi,2*08h ;back edi up - sub esi,2 ;adjust esi (used for dword aligning) - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish4Smp16Right ;go finish it - - align 4 -??finish16Right5: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 1 nybble (1 byte) - shl ecx,16 ;shift it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,4 ;move it over - shl bl,4 ;move it over - sub edi,2*06h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish5Smp16Right ;go finish it - - align 4 -??finish16Right6: - xor ecx,ecx ;clear nybble bucket - mov cl,[esi+2] ;get 2 nybbles (1 byte) - shl ecx,16 ;move it over - mov cx,[esi] ;get 4 nybbles (2 bytes) - mov bl,cl ;get nybbles in ebx - shr ecx,8 ;move it over - sub esi,1 ;adjust esi (used for dword aligning) - sub edi,2*04h ;back edi up - or dl,[BYTE PTR bNybbleTableLow+ebx] ;adjust index for nybble - jmp ??finish6Smp16Right ;go finish it - - align 4 -??finish16Right7: - xor ecx,ecx ;clear nybble bucket - mov ecx,[esi] ;get 7 nybbles (4 bytes) - shl ecx,4 ;move it over - mov bl,cl ;get nybbles in ebx - sub edi,2*02h ;back edi up - or dl,[BYTE PTR bNybbleTableHigh+ebx] ;adjust index for nybble - jmp ??finish7Smp16Right ;go finish it -; -; -; Jump Tables - align 4 - -dwRight16JmpTable DD ??done16Right - DD ??finish16Right1 - DD ??finish16Right2 - DD ??finish16Right3 - DD ??finish16Right4 - DD ??finish16Right5 - DD ??finish16Right6 - DD ??finish16Right7 - - align 4 -dwRight16AlignJmpTable DD ??fixAlign16Right0 - DD ??fixAlign16Right1 - DD ??fixAlign16Right2 - DD ??fixAlign16Right3 - - VQA_sosCODECDecompressData ENDP - - END - - diff --git a/code/vqalib/cmp.h b/code/vqalib/cmp.h index 69838687..ab492b92 100644 --- a/code/vqalib/cmp.h +++ b/code/vqalib/cmp.h @@ -16,22 +16,12 @@ #pragma once +#include "../soscomp.h" + #if defined(__WATCOMC__) || defined(_MSC_VER) #pragma pack(push,1) #endif -struct _VQA_SOS_COMPRESS_INFO - -{ - long dwPredicted; - short wIndex; - long dwPredicted2; - short wIndex2; -}; - -typedef _VQA_SOS_COMPRESS_INFO VQASOS; - - extern "C" { unsigned long __cdecl VQA_LCW_Uncompress(char const *source, char *dest, unsigned long length); } @@ -42,13 +32,6 @@ extern "C" { long __cdecl AudioUnzap(void *source, void *dest, long); } -extern "C" { -void __cdecl VQA_sosCODECInitStream(_VQA_SOS_COMPRESS_INFO *); -void __cdecl VQA_sosCODECDecompressData(void *src, void *dst, unsigned short wBitSize, unsigned short wChannels, unsigned long dwUnCompSize, _VQA_SOS_COMPRESS_INFO *sosinfo); -} - -//#define VQA_sosCODECDecompressData sosCODECDecompressData - #if defined(__WATCOMC__) || defined(_MSC_VER) #pragma pack(pop) #endif diff --git a/code/vqalib/loader.cpp b/code/vqalib/loader.cpp index 87fa18fb..b2400bfe 100644 --- a/code/vqalib/loader.cpp +++ b/code/vqalib/loader.cpp @@ -3475,7 +3475,9 @@ long Load_SND2(VQAHandleP *vqap, unsigned long iffsize) } /* Uncompress the audio frame. */ - VQA_sosCODECDecompressData(loadbuf, (char *)audio->Buffer, vqap->BitsPerSample, vqap->Channels, uncomp_size, &audio->ADPCM_Info); + audio->ADPCM_Info.lpSource = (char *)loadbuf; + audio->ADPCM_Info.lpDest = (char *)audio->Buffer; + sosCODECDecompressDataPlanar(&audio->ADPCM_Info, uncomp_size); if (audio->BufferOffset) { uncomp_size -= audio->BufferOffset; @@ -3501,7 +3503,9 @@ long Load_SND2(VQAHandleP *vqap, unsigned long iffsize) } /* Uncompress the audio frame. */ - VQA_sosCODECDecompressData(loadbuf, (char *)audio->TempBuf, vqap->BitsPerSample, vqap->Channels, uncomp_size, &audio->ADPCM_Info); + audio->ADPCM_Info.lpSource = (char *)loadbuf; + audio->ADPCM_Info.lpDest = (char *)audio->TempBuf; + sosCODECDecompressDataPlanar(&audio->ADPCM_Info, uncomp_size); /* Set the TempBufLen */ audio->TempBufLen = uncomp_size; @@ -3555,11 +3559,13 @@ long Load_SN2J(VQAHandleP *vqap, unsigned long iffsize) return(VQAERR_READ); } - audio->ADPCM_Info.dwPredicted = data.dwPredicted; - audio->ADPCM_Info.wIndex = data.wIndex; + /* The chunk stores the step index scaled by 32, the form the retired table-driven + VQA decoder persisted between calls; the current decoder wants a plain 0-88 index. */ + audio->ADPCM_Info.Channels[0].dwPredicted = data.dwPredicted; + audio->ADPCM_Info.Channels[0].wIndex = data.wIndex / 32; if (vqap->Channels == 2) { - audio->ADPCM_Info.dwPredicted2 = data.dwPredicted2; - audio->ADPCM_Info.wIndex2 = data.wIndex2; + audio->ADPCM_Info.Channels[1].dwPredicted = data.dwPredicted2; + audio->ADPCM_Info.Channels[1].wIndex = data.wIndex2 / 32; } return(VQAERR_NONE); diff --git a/code/vqalib/task.cpp b/code/vqalib/task.cpp index 41bbf53b..56836b2b 100644 --- a/code/vqalib/task.cpp +++ b/code/vqalib/task.cpp @@ -556,7 +556,9 @@ long VQA_Open(char const *filename, VQAConfig *_config, VQAHandle **handle) audio->Flags |= VQAAUDF_MEMLOCKED; /* Initialize ADPCM information structure for audio stream. */ - VQA_sosCODECInitStream(&audio->ADPCM_Info); + audio->ADPCM_Info.wBitSize = vqap->BitsPerSample; + audio->ADPCM_Info.wChannels = vqap->Channels; + sosCODECInitStream(&audio->ADPCM_Info); } else { diff --git a/code/vqalib/vqaplayp.h b/code/vqalib/vqaplayp.h index cc66e5a9..22645fce 100644 --- a/code/vqalib/vqaplayp.h +++ b/code/vqalib/vqaplayp.h @@ -400,7 +400,7 @@ typedef struct _VQAAudio { int field_3C; unsigned long BytesPerSec; - VQASOS ADPCM_Info; + _SOS_COMPRESS_INFO ADPCM_Info; } VQAAudio; /* Audio flags. */