;Copyright (C) 1997-2007 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach ) ; ;http://www.zsnes.com ;http://sourceforge.net/projects/zsnes ;https://zsnes.bountysource.com ; ;This program is free software; you can redistribute it and/or ;modify it under the terms of the GNU General Public License ;version 2 as published by the Free Software Foundation. ; ;This program is distributed in the hope that it will be useful, ;but WITHOUT ANY WARRANTY; without even the implied warranty of ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;GNU General Public License for more details. ; ;You should have received a copy of the GNU General Public License ;along with this program; if not, write to the Free Software ;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. %include "macros.mac" EXTSYM SPCRAM,spcPCRam,spcRamDP,spcS,spcX,RevStereo EXTSYM Invalidopcode,RSPCRegF0,RSPCRegF1,RSPCRegF2,RSPCRegF3 EXTSYM RSPCRegF4,RSPCRegF5,RSPCRegF6,RSPCRegF7,RSPCRegF8,RSPCRegF9 EXTSYM RSPCRegFA,RSPCRegFB,RSPCRegFC,RSPCRegFD,RSPCRegFE,RSPCRegFF EXTSYM SPCRegF0,SPCRegF1,SPCRegF2,SPCRegF3,SPCRegF4,SPCRegF5,SPCRegF6 EXTSYM SPCRegF7,SPCRegF8,SPCRegF9,SPCRegFA,SPCRegFB,SPCRegFC,SPCRegFD EXTSYM SPCRegFE,SPCRegFF,VolumeConvTable,dspRptr,dspWptr,opcjmptab EXTSYM Op00,Op01,Op02,Op03,Op04,Op05,Op06,Op07,Op08,Op09,Op0A,Op0B,Op0C,Op0D EXTSYM Op0E,Op0F,Op10,Op11,Op12,Op13,Op14,Op15,Op16,Op17,Op18,Op19,Op1A,Op1B EXTSYM Op1C,Op1D,Op1E,Op1F,Op20,Op21,Op22,Op23,Op24,Op25,Op26,Op27,Op28,Op29 EXTSYM Op2A,Op2B,Op2C,Op2D,Op2E,Op2F,Op30,Op31,Op32,Op33,Op34,Op35,Op36,Op37 EXTSYM Op38,Op39,Op3A,Op3B,Op3C,Op3D,Op3E,Op3F,Op40,Op41,Op42,Op43,Op44,Op45 EXTSYM Op46,Op47,Op48,Op49,Op4A,Op4B,Op4C,Op4D,Op4E,Op4F,Op50,Op51,Op52,Op53 EXTSYM Op54,Op55,Op56,Op57,Op58,Op59,Op5A,Op5B,Op5C,Op5D,Op5E,Op5F,Op60,Op61 EXTSYM Op62,Op63,Op64,Op65,Op66,Op67,Op68,Op69,Op6A,Op6B,Op6C,Op6D,Op6E,Op6F EXTSYM Op70,Op71,Op72,Op73,Op74,Op75,Op76,Op77,Op78,Op79,Op7A,Op7B,Op7C,Op7D EXTSYM Op7E,Op7F,Op80,Op81,Op82,Op83,Op84,Op85,Op86,Op87,Op88,Op89,Op8A,Op8B EXTSYM Op8C,Op8D,Op8E,Op8F,Op90,Op91,Op92,Op93,Op94,Op95,Op96,Op97,Op98,Op99 EXTSYM Op9A,Op9B,Op9C,Op9D,Op9E,Op9F,OpA0,OpA1,OpA2,OpA3,OpA4,OpA5,OpA6,OpA7 EXTSYM OpA8,OpA9,OpAA,OpAB,OpAC,OpAD,OpAE,OpAF,OpB0,OpB1,OpB2,OpB3,OpB4,OpB5 EXTSYM OpB6,OpB7,OpB8,OpB9,OpBA,OpBB,OpBC,OpBD,OpBE,OpBF,OpC0,OpC1,OpC2,OpC3 EXTSYM OpC4,OpC5,OpC6,OpC7,OpC8,OpC9,OpCA,OpCB,OpCC,OpCD,OpCE,OpCF,OpD0,OpD1 EXTSYM OpD2,OpD3,OpD4,OpD5,OpD6,OpD7,OpD8,OpD9,OpDA,OpDB,OpDC,OpDD,OpDE,OpDF EXTSYM OpE0,OpE1,OpE2,OpE3,OpE4,OpE5,OpE6,OpE7,OpE8,OpE9,OpEA,OpEB,OpEC,OpED EXTSYM OpEE,OpEF,OpF0,OpF1,OpF2,OpF3,OpF4,OpF5,OpF6,OpF7,OpF8,OpF9,OpFA,OpFB EXTSYM OpFC,OpFD,OpFE,OpFF EXTSYM RDSPReg00,RDSPReg01,RDSPReg02,RDSPReg03,RDSPReg04,RDSPReg05,RDSPReg06 EXTSYM RDSPReg07,RDSPReg08,RDSPReg09,RDSPReg0A,RDSPReg0B,RDSPReg0C,RDSPReg0D EXTSYM RDSPReg0E,RDSPReg0F,RDSPReg10,RDSPReg11,RDSPReg12,RDSPReg13,RDSPReg14 EXTSYM RDSPReg15,RDSPReg16,RDSPReg17,RDSPReg18,RDSPReg19,RDSPReg1A,RDSPReg1B EXTSYM RDSPReg1C,RDSPReg1D,RDSPReg1E,RDSPReg1F,RDSPReg20,RDSPReg21,RDSPReg22 EXTSYM RDSPReg23,RDSPReg24,RDSPReg25,RDSPReg26,RDSPReg27,RDSPReg28,RDSPReg29 EXTSYM RDSPReg2A,RDSPReg2B,RDSPReg2C,RDSPReg2D,RDSPReg2E,RDSPReg2F,RDSPReg30 EXTSYM RDSPReg31,RDSPReg32,RDSPReg33,RDSPReg34,RDSPReg35,RDSPReg36,RDSPReg37 EXTSYM RDSPReg38,RDSPReg39,RDSPReg3A,RDSPReg3B,RDSPReg3C,RDSPReg3D,RDSPReg3E EXTSYM RDSPReg3F,RDSPReg40,RDSPReg41,RDSPReg42,RDSPReg43,RDSPReg44,RDSPReg45 EXTSYM RDSPReg46,RDSPReg47,RDSPReg48,RDSPReg49,RDSPReg4A,RDSPReg4B,RDSPReg4C EXTSYM RDSPReg4D,RDSPReg4E,RDSPReg4F,RDSPReg50,RDSPReg51,RDSPReg52,RDSPReg53 EXTSYM RDSPReg54,RDSPReg55,RDSPReg56,RDSPReg57,RDSPReg58,RDSPReg59,RDSPReg5A EXTSYM RDSPReg5B,RDSPReg5C,RDSPReg5D,RDSPReg5E,RDSPReg5F,RDSPReg60,RDSPReg61 EXTSYM RDSPReg62,RDSPReg63,RDSPReg64,RDSPReg65,RDSPReg66,RDSPReg67,RDSPReg68 EXTSYM RDSPReg69,RDSPReg6A,RDSPReg6B,RDSPReg6C,RDSPReg6D,RDSPReg6E,RDSPReg6F EXTSYM RDSPReg70,RDSPReg71,RDSPReg72,RDSPReg73,RDSPReg74,RDSPReg75,RDSPReg76 EXTSYM RDSPReg77,RDSPReg78,RDSPReg79,RDSPReg7A,RDSPReg7B,RDSPReg7C,RDSPReg7D EXTSYM RDSPReg7E,RDSPReg7F,RDSPReg80,RDSPReg81,RDSPReg82,RDSPReg83,RDSPReg84 EXTSYM RDSPReg85,RDSPReg86,RDSPReg87,RDSPReg88,RDSPReg89,RDSPReg8A,RDSPReg8B EXTSYM RDSPReg8C,RDSPReg8D,RDSPReg8E,RDSPReg8F,RDSPReg90,RDSPReg91,RDSPReg92 EXTSYM RDSPReg93,RDSPReg94,RDSPReg95,RDSPReg96,RDSPReg97,RDSPReg98,RDSPReg99 EXTSYM RDSPReg9A,RDSPReg9B,RDSPReg9C,RDSPReg9D,RDSPReg9E,RDSPReg9F,RDSPRegA0 EXTSYM RDSPRegA1,RDSPRegA2,RDSPRegA3,RDSPRegA4,RDSPRegA5,RDSPRegA6,RDSPRegA7 EXTSYM RDSPRegA8,RDSPRegA9,RDSPRegAA,RDSPRegAB,RDSPRegAC,RDSPRegAD,RDSPRegAE EXTSYM RDSPRegAF,RDSPRegB0,RDSPRegB1,RDSPRegB2,RDSPRegB3,RDSPRegB4,RDSPRegB5 EXTSYM RDSPRegB6,RDSPRegB7,RDSPRegB8,RDSPRegB9,RDSPRegBA,RDSPRegBB,RDSPRegBC EXTSYM RDSPRegBD,RDSPRegBE,RDSPRegBF,RDSPRegC0,RDSPRegC1,RDSPRegC2,RDSPRegC3 EXTSYM RDSPRegC4,RDSPRegC5,RDSPRegC6,RDSPRegC7,RDSPRegC8,RDSPRegC9,RDSPRegCA EXTSYM RDSPRegCB,RDSPRegCC,RDSPRegCD,RDSPRegCE,RDSPRegCF,RDSPRegD0,RDSPRegD1 EXTSYM RDSPRegD2,RDSPRegD3,RDSPRegD4,RDSPRegD5,RDSPRegD6,RDSPRegD7,RDSPRegD8 EXTSYM RDSPRegD9,RDSPRegDA,RDSPRegDB,RDSPRegDC,RDSPRegDD,RDSPRegDE,RDSPRegDF EXTSYM RDSPRegE0,RDSPRegE1,RDSPRegE2,RDSPRegE3,RDSPRegE4,RDSPRegE5,RDSPRegE6 EXTSYM RDSPRegE7,RDSPRegE8,RDSPRegE9,RDSPRegEA,RDSPRegEB,RDSPRegEC,RDSPRegED EXTSYM RDSPRegEE,RDSPRegEF,RDSPRegF0,RDSPRegF1,RDSPRegF2,RDSPRegF3,RDSPRegF4 EXTSYM RDSPRegF5,RDSPRegF6,RDSPRegF7,RDSPRegF8,RDSPRegF9,RDSPRegFA,RDSPRegFB EXTSYM RDSPRegFC,RDSPRegFD,RDSPRegFE,RDSPRegFF EXTSYM WDSPReg00,WDSPReg01,WDSPReg02,WDSPReg03,WDSPReg04,WDSPReg05,WDSPReg06 EXTSYM WDSPReg07,WDSPReg08,WDSPReg09,WDSPReg0A,WDSPReg0B,WDSPReg0C,WDSPReg0D EXTSYM WDSPReg0E,WDSPReg0F,WDSPReg10,WDSPReg11,WDSPReg12,WDSPReg13,WDSPReg14 EXTSYM WDSPReg15,WDSPReg16,WDSPReg17,WDSPReg18,WDSPReg19,WDSPReg1A,WDSPReg1B EXTSYM WDSPReg1C,WDSPReg1D,WDSPReg1E,WDSPReg1F,WDSPReg20,WDSPReg21,WDSPReg22 EXTSYM WDSPReg23,WDSPReg24,WDSPReg25,WDSPReg26,WDSPReg27,WDSPReg28,WDSPReg29 EXTSYM WDSPReg2A,WDSPReg2B,WDSPReg2C,WDSPReg2D,WDSPReg2E,WDSPReg2F,WDSPReg30 EXTSYM WDSPReg31,WDSPReg32,WDSPReg33,WDSPReg34,WDSPReg35,WDSPReg36,WDSPReg37 EXTSYM WDSPReg38,WDSPReg39,WDSPReg3A,WDSPReg3B,WDSPReg3C,WDSPReg3D,WDSPReg3E EXTSYM WDSPReg3F,WDSPReg40,WDSPReg41,WDSPReg42,WDSPReg43,WDSPReg44,WDSPReg45 EXTSYM WDSPReg46,WDSPReg47,WDSPReg48,WDSPReg49,WDSPReg4A,WDSPReg4B,WDSPReg4C EXTSYM WDSPReg4D,WDSPReg4E,WDSPReg4F,WDSPReg50,WDSPReg51,WDSPReg52,WDSPReg53 EXTSYM WDSPReg54,WDSPReg55,WDSPReg56,WDSPReg57,WDSPReg58,WDSPReg59,WDSPReg5A EXTSYM WDSPReg5B,WDSPReg5C,WDSPReg5D,WDSPReg5E,WDSPReg5F,WDSPReg60,WDSPReg61 EXTSYM WDSPReg62,WDSPReg63,WDSPReg64,WDSPReg65,WDSPReg66,WDSPReg67,WDSPReg68 EXTSYM WDSPReg69,WDSPReg6A,WDSPReg6B,WDSPReg6C,WDSPReg6D,WDSPReg6E,WDSPReg6F EXTSYM WDSPReg70,WDSPReg71,WDSPReg72,WDSPReg73,WDSPReg74,WDSPReg75,WDSPReg76 EXTSYM WDSPReg77,WDSPReg78,WDSPReg79,WDSPReg7A,WDSPReg7B,WDSPReg7C,WDSPReg7D EXTSYM WDSPReg7E,WDSPReg7F,WDSPReg80,WDSPReg81,WDSPReg82,WDSPReg83,WDSPReg84 EXTSYM WDSPReg85,WDSPReg86,WDSPReg87,WDSPReg88,WDSPReg89,WDSPReg8A,WDSPReg8B EXTSYM WDSPReg8C,WDSPReg8D,WDSPReg8E,WDSPReg8F,WDSPReg90,WDSPReg91,WDSPReg92 EXTSYM WDSPReg93,WDSPReg94,WDSPReg95,WDSPReg96,WDSPReg97,WDSPReg98,WDSPReg99 EXTSYM WDSPReg9A,WDSPReg9B,WDSPReg9C,WDSPReg9D,WDSPReg9E,WDSPReg9F,WDSPRegA0 EXTSYM WDSPRegA1,WDSPRegA2,WDSPRegA3,WDSPRegA4,WDSPRegA5,WDSPRegA6,WDSPRegA7 EXTSYM WDSPRegA8,WDSPRegA9,WDSPRegAA,WDSPRegAB,WDSPRegAC,WDSPRegAD,WDSPRegAE EXTSYM WDSPRegAF,WDSPRegB0,WDSPRegB1,WDSPRegB2,WDSPRegB3,WDSPRegB4,WDSPRegB5 EXTSYM WDSPRegB6,WDSPRegB7,WDSPRegB8,WDSPRegB9,WDSPRegBA,WDSPRegBB,WDSPRegBC EXTSYM WDSPRegBD,WDSPRegBE,WDSPRegBF,WDSPRegC0,WDSPRegC1,WDSPRegC2,WDSPRegC3 EXTSYM WDSPRegC4,WDSPRegC5,WDSPRegC6,WDSPRegC7,WDSPRegC8,WDSPRegC9,WDSPRegCA EXTSYM WDSPRegCB,WDSPRegCC,WDSPRegCD,WDSPRegCE,WDSPRegCF,WDSPRegD0,WDSPRegD1 EXTSYM WDSPRegD2,WDSPRegD3,WDSPRegD4,WDSPRegD5,WDSPRegD6,WDSPRegD7,WDSPRegD8 EXTSYM WDSPRegD9,WDSPRegDA,WDSPRegDB,WDSPRegDC,WDSPRegDD,WDSPRegDE,WDSPRegDF EXTSYM WDSPRegE0,WDSPRegE1,WDSPRegE2,WDSPRegE3,WDSPRegE4,WDSPRegE5,WDSPRegE6 EXTSYM WDSPRegE7,WDSPRegE8,WDSPRegE9,WDSPRegEA,WDSPRegEB,WDSPRegEC,WDSPRegED EXTSYM WDSPRegEE,WDSPRegEF,WDSPRegF0,WDSPRegF1,WDSPRegF2,WDSPRegF3,WDSPRegF4 EXTSYM WDSPRegF5,WDSPRegF6,WDSPRegF7,WDSPRegF8,WDSPRegF9,WDSPRegFA,WDSPRegFB EXTSYM WDSPRegFC,WDSPRegFD,WDSPRegFE,WDSPRegFF EXTSYM spcBuffera,DSPMem,SoundInterpType,NoiseData,Voice0Disable,EchoDis EXTSYM Surround,echobuf,ENVDisable,LowPassFilterType,EMUPause,AudioLogging EXTSYM MMXSupport,StereoSound,SoundQuality %ifdef __MSDOS__ EXTSYM SB_alloc_dma,SB_quality_limiter,vibracard %endif SECTION .data NEWSYM SBHDMA, db 0 ; stupid legacy code ... SECTION .bss ; How the sound code works : ; Clear memory at $01 to $EF ; Store $BBAA into $2140 ; Wait for $CC in $2142 ; Goto FFEF: ;FFD6: ; Move $2140 into Y ; Repeat until Y = 0 ;FFDA: ; If $2140 <> 0, then jump to FFE9 ; Move $2141 into A ; Move Y into $2140 ; Move A into [$00]+Y ; Increment Y ; Jump to FFDA if Y <> 0 ; Increment value at $01 ;FFE9: ; If plus flag set, goto FFDA ; If (Y-$2140) <> 0, goto FFE9 ;FFEF: ; Move 2142 into YA ; Move YA into Address $00 ; Move A into 2140 ; Move Y into A ; Move A into X ; If A is not zero, goto FFD6 ; Jump to Address [0000] DSPInterP resw 1024 section .data ALIGN32 Gaussian: dw 1305,1305,1304,1304,1304,1304,1304,1303 dw 1303,1303,1302,1302,1301,1300,1300,1299 dw 1298,1297,1297,1296,1295,1294,1293,1292 dw 1291,1290,1288,1287,1286,1284,1283,1282 dw 1280,1279,1277,1275,1274,1272,1270,1269 dw 1267,1265,1263,1261,1259,1257,1255,1253 dw 1251,1248,1246,1244,1241,1239,1237,1234 dw 1232,1229,1227,1224,1221,1219,1216,1213 dw 1210,1207,1205,1202,1199,1196,1193,1190 dw 1186,1183,1180,1177,1174,1170,1167,1164 dw 1160,1157,1153,1150,1146,1143,1139,1136 dw 1132,1128,1125,1121,1117,1113,1109,1106 dw 1102,1098,1094,1090,1086,1082,1078,1074 dw 1070,1066,1061,1057,1053,1049,1045,1040 dw 1036,1032,1027,1023,1019,1014,1010,1005 dw 1001, 997, 992, 988, 983, 978, 974, 969 dw 965, 960, 955, 951, 946, 941, 937, 932 dw 927, 923, 918, 913, 908, 904, 899, 894 dw 889, 884, 880, 875, 870, 865, 860, 855 dw 851, 846, 841, 836, 831, 826, 821, 816 dw 811, 806, 802, 797, 792, 787, 782, 777 dw 772, 767, 762, 757, 752, 747, 742, 737 dw 732, 728, 723, 718, 713, 708, 703, 698 dw 693, 688, 683, 678, 674, 669, 664, 659 dw 654, 649, 644, 640, 635, 630, 625, 620 dw 615, 611, 606, 601, 596, 592, 587, 582 dw 577, 573, 568, 563, 559, 554, 550, 545 dw 540, 536, 531, 527, 522, 517, 513, 508 dw 504, 499, 495, 491, 486, 482, 477, 473 dw 469, 464, 460, 456, 451, 447, 443, 439 dw 434, 430, 426, 422, 418, 414, 410, 405 dw 401, 397, 393, 389, 385, 381, 378, 374 dw 370, 366, 362, 358, 354, 351, 347, 343 dw 339, 336, 332, 328, 325, 321, 318, 314 dw 311, 307, 304, 300, 297, 293, 290, 286 dw 283, 280, 276, 273, 270, 267, 263, 260 dw 257, 254, 251, 248, 245, 242, 239, 236 dw 233, 230, 227, 224, 221, 218, 215, 212 dw 210, 207, 204, 201, 199, 196, 193, 191 dw 188, 186, 183, 180, 178, 175, 173, 171 dw 168, 166, 163, 161, 159, 156, 154, 152 dw 150, 147, 145, 143, 141, 139, 137, 134 dw 132, 130, 128, 126, 124, 122, 120, 118 dw 117, 115, 113, 111, 109, 107, 106, 104 dw 102, 100, 99, 97, 95, 94, 92, 90 dw 89, 87, 86, 84, 83, 81, 80, 78 dw 77, 76, 74, 73, 71, 70, 69, 67 dw 66, 65, 64, 62, 61, 60, 59, 58 dw 56, 55, 54, 53, 52, 51, 50, 49 dw 48, 47, 46, 45, 44, 43, 42, 41 dw 40, 39, 38, 37, 36, 36, 35, 34 dw 33, 32, 32, 31, 30, 29, 29, 28 dw 27, 27, 26, 25, 24, 24, 23, 23 dw 22, 21, 21, 20, 20, 19, 19, 18 dw 17, 17, 16, 16, 15, 15, 15, 14 dw 14, 13, 13, 12, 12, 11, 11, 11 dw 10, 10, 10, 9, 9, 9, 8, 8 dw 8, 7, 7, 7, 6, 6, 6, 6 dw 5, 5, 5, 5, 4, 4, 4, 4 dw 4, 3, 3, 3, 3, 3, 2, 2 dw 2, 2, 2, 2, 2, 1, 1, 1 dw 1, 1, 1, 1, 1, 1, 1, 1 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, 0, 0, 0, 0, 0, 0, 0 CubicSpline: dw 0, 0, 0, 0, 0, 0, 0, 0 dw 0, -1, -1, -1, -2, -2, -2, -3 dw -3, -4, -4, -5, -5, -6, -6, -7 dw -8, -8, -9, -10, -10, -11, -12, -13 dw -14, -14, -15, -16, -17, -18, -19, -20 dw -21, -22, -23, -24, -25, -26, -27, -28 dw -29, -30, -31, -32, -33, -34, -35, -37 dw -38, -39, -40, -41, -43, -44, -45, -46 dw -48, -49, -50, -51, -53, -54, -55, -56 dw -58, -59, -60, -62, -63, -64, -66, -67 dw -68, -70, -71, -72, -74, -75, -76, -78 dw -79, -80, -82, -83, -84, -86, -87, -88 dw -90, -91, -92, -93, -95, -96, -97, -99 dw -100,-101,-102,-104,-105,-106,-107,-109 dw -110,-111,-112,-113,-114,-116,-117,-118 dw -119,-120,-121,-122,-123,-124,-125,-126 dw -128,-128,-129,-130,-131,-132,-133,-134 dw -135,-136,-137,-137,-138,-139,-140,-141 dw -141,-142,-143,-143,-144,-144,-145,-146 dw -146,-147,-147,-148,-148,-148,-149,-149 dw -150,-150,-150,-150,-151,-151,-151,-151 dw -151,-151,-151,-151,-151,-151,-151,-151 dw -151,-151,-150,-150,-150,-149,-149,-149 dw -148,-148,-147,-147,-146,-146,-145,-144 dw -144,-143,-142,-141,-140,-139,-138,-137 dw -136,-135,-134,-133,-132,-130,-129,-128 dw -126,-125,-123,-122,-120,-119,-117,-115 dw -113,-112,-110,-108,-106,-104,-102,-100 dw -98, -95, -93, -91, -88, -86, -83, -81 dw -78, -76, -73, -70, -67, -65, -62, -59 dw -56, -53, -50, -46, -43, -40, -36, -33 dw -30, -26, -22, -19, -15, -11, -7, -3 dw 0, 4, 8, 12, 16, 21, 26, 30 dw 35, 40, 46, 51, 56, 62, 67, 73 dw 79, 85, 91, 97, 103, 109, 116, 122 dw 129, 136, 143, 149, 156, 164, 171, 178 dw 186, 193, 201, 208, 216, 224, 232, 240 dw 248, 256, 264, 273, 281, 289, 298, 307 dw 315, 324, 333, 342, 351, 360, 369, 378 dw 387, 397, 406, 415, 425, 435, 444, 454 dw 464, 473, 483, 493, 503, 513, 523, 533 dw 543, 553, 564, 574, 584, 594, 605, 615 dw 626, 636, 647, 657, 668, 679, 689, 700 dw 711, 721, 732, 743, 754, 765, 776, 787 dw 798, 808, 819, 830, 841, 852, 863, 874 dw 886, 897, 908, 919, 930, 941, 952, 963 dw 974, 985, 996,1008,1019,1030,1041,1052 dw 1063,1074,1085,1096,1107,1118,1129,1140 dw 1152,1162,1173,1184,1195,1206,1217,1228 dw 1239,1250,1261,1271,1282,1293,1303,1314 dw 1325,1335,1346,1356,1367,1377,1388,1398 dw 1408,1419,1429,1439,1449,1459,1470,1480 dw 1490,1499,1509,1519,1529,1539,1548,1558 dw 1567,1577,1586,1595,1605,1614,1623,1632 dw 1641,1650,1659,1668,1677,1685,1694,1702 dw 1711,1719,1727,1736,1744,1752,1760,1768 dw 1776,1783,1791,1798,1806,1813,1820,1828 dw 1835,1842,1849,1855,1862,1869,1875,1881 dw 1888,1894,1900,1906,1912,1918,1923,1929 dw 1934,1940,1945,1950,1955,1960,1964,1969 dw 1974,1978,1982,1986,1990,1994,1998,2002 dw 2005,2008,2012,2015,2018,2021,2023,2026 dw 2028,2031,2033,2035,2037,2038,2040,2041 dw 2043,2044,2045,2046,2046,2047,2047,2047 dw 2048,2047,2047,2047,2046,2046,2045,2044 dw 2043,2041,2040,2038,2037,2035,2033,2031 dw 2028,2026,2023,2021,2018,2015,2012,2008 dw 2005,2002,1998,1994,1990,1986,1982,1978 dw 1974,1969,1964,1960,1955,1950,1945,1940 dw 1934,1929,1923,1918,1912,1906,1900,1894 dw 1888,1881,1875,1869,1862,1855,1849,1842 dw 1835,1828,1820,1813,1806,1798,1791,1783 dw 1776,1768,1760,1752,1744,1736,1727,1719 dw 1711,1702,1694,1685,1677,1668,1659,1650 dw 1641,1632,1623,1614,1605,1595,1586,1577 dw 1567,1558,1548,1539,1529,1519,1509,1499 dw 1490,1480,1470,1459,1449,1439,1429,1419 dw 1408,1398,1388,1377,1367,1356,1346,1335 dw 1325,1314,1303,1293,1282,1271,1261,1250 dw 1239,1228,1217,1206,1195,1184,1173,1162 dw 1152,1140,1129,1118,1107,1096,1085,1074 dw 1063,1052,1041,1030,1019,1008, 996, 985 dw 974, 963, 952, 941, 930, 919, 908, 897 dw 886, 874, 863, 852, 841, 830, 819, 808 dw 798, 787, 776, 765, 754, 743, 732, 721 dw 711, 700, 689, 679, 668, 657, 647, 636 dw 626, 615, 605, 594, 584, 574, 564, 553 dw 543, 533, 523, 513, 503, 493, 483, 473 dw 464, 454, 444, 435, 425, 415, 406, 397 dw 387, 378, 369, 360, 351, 342, 333, 324 dw 315, 307, 298, 289, 281, 273, 264, 256 dw 248, 240, 232, 224, 216, 208, 201, 193 dw 186, 178, 171, 164, 156, 149, 143, 136 dw 129, 122, 116, 109, 103, 97, 91, 85 dw 79, 73, 67, 62, 56, 51, 46, 40 dw 35, 30, 26, 21, 16, 12, 8, 4 dw 0, -3, -7, -11, -15, -19, -22, -26 dw -30, -33, -36, -40, -43, -46, -50, -53 dw -56, -59, -62, -65, -67, -70, -73, -76 dw -78, -81, -83, -86, -88, -91, -93, -95 dw -98,-100,-102,-104,-106,-108,-110,-112 dw -113,-115,-117,-119,-120,-122,-123,-125 dw -126,-128,-129,-130,-132,-133,-134,-135 dw -136,-137,-138,-139,-140,-141,-142,-143 dw -144,-144,-145,-146,-146,-147,-147,-148 dw -148,-149,-149,-149,-150,-150,-150,-151 dw -151,-151,-151,-151,-151,-151,-151,-151 dw -151,-151,-151,-151,-151,-150,-150,-150 dw -150,-149,-149,-148,-148,-148,-147,-147 dw -146,-146,-145,-144,-144,-143,-143,-142 dw -141,-141,-140,-139,-138,-137,-137,-136 dw -135,-134,-133,-132,-131,-130,-129,-128 dw -128,-126,-125,-124,-123,-122,-121,-120 dw -119,-118,-117,-116,-114,-113,-112,-111 dw -110,-109,-107,-106,-105,-104,-102,-101 dw -100, -99, -97, -96, -95, -93, -92, -91 dw -90, -88, -87, -86, -84, -83, -82, -80 dw -79, -78, -76, -75, -74, -72, -71, -70 dw -68, -67, -66, -64, -63, -62, -60, -59 dw -58, -56, -55, -54, -53, -51, -50, -49 dw -48, -46, -45, -44, -43, -41, -40, -39 dw -38, -37, -35, -34, -33, -32, -31, -30 dw -29, -28, -27, -26, -25, -24, -23, -22 dw -21, -20, -19, -18, -17, -16, -15, -14 dw -14, -13, -12, -11, -10, -10, -9, -8 dw -8, -7, -6, -6, -5, -5, -4, -4 dw -3, -3, -2, -2, -2, -1, -1, -1 dw 0, 0, 0, 0, 0, 0, 0, 0 %include "cpu/firtable.inc" SECTION .bss NEWSYM spcWptr, resd 16 ; SPC Write pointers (point to their own functions) NEWSYM spcRptr, resd 16 ; SPC Read pointers (point to their own functions) SECTION .data NEWSYM SBToSPC, dd 22050 NEWSYM dspPAdj, dd 0 NEWSYM NumBRRconv, dd 0 NEWSYM BufferSizeB, dd 320 NEWSYM BufferSizeW, dd 640 ;TIME_CONSTANT = 256 - 1000000 / frequency NEWSYM BufferSize, dw 320, 320, 320, 500, 320, 400, 400 NEWSYM BufferSizes, dw 320, 320, 500, 900, 400, 750, 750 NEWSYM SoundSpeeds, db 131, 165, 211, 233, 193, 225, 235 ; 8khz,11khz,22khz,44khz NEWSYM SoundSpeedt, db 193, 210, 233 ; 8khz,11khz,22khz %ifdef __MSDOS__ NEWSYM SBToSPCSpeeds, dd 8000,10989,22222,43478,15874,32258,48000 NEWSYM SBToSPCSpeeds2, dd 8192,11289,22579,45158,16384,32768,48000 %else NEWSYM SBToSPCSpeeds, dd 8000,11025,22050,44100,16000,32000,48000 %endif NEWSYM NumofSPCBlock, dd 626,456,228,114,314,156,104 NEWSYM SPCBlockNum, dd 0 NEWSYM NoiseSpeeds, dd 1,16,21,25,31,42,50,63,83,100,125,167,200,250,333,400,500 dd 667,800,1000,1333,1600,2000,2667,3200,4000,5333,6400,8000,10667,16000,32000 SECTION .text NEWSYM conv2speed .next mov eax,[edi] mov ebx,[SBToSPC] mul ebx mov ebx,11025 div ebx mov [esi],eax add esi,4 add edi,4 dec ecx jnz .next ret NEWSYM AdjustFrequency xor ebx,ebx mov ah,[MMXSupport] mov al,[SoundInterpType] or ah,ah jnz .mmx cmp byte[LowPassFilterType],3 jb .nothq mov byte[LowPassFilterType],0 .nothq cmp al,3 jb .mmx mov al,1 mov [SoundInterpType],al .mmx or al,al jz near .notgaussian cmp al,2 je near .cubicspline ja near .fir_mmx ; Copy from Gaussian to DSPInterP %ifndef __MSDOS__ ; this ifndef is needed the workaround the "snow" in the DOS port ; used only for Gaussian though test ah,ah jne .gaussian_mmx %endif mov ebx,DSPInterP+1024 mov edx,DSPInterP+1022 mov esi,Gaussian mov ecx,512 .intrploop movzx eax,word[esi] mov [edx],ax mov [ebx],ax add ebx,2 sub edx,2 add esi,2 dec ecx jnz .intrploop mov ebx, DSPInterpolate_4 jmp .notgaussian .gaussian_mmx mov ebx,Gaussian mov edx,Gaussian+510 mov esi,DSPInterP mov ecx,256 .intrploopm mov ax,[ebx+512] mov [esi],ax mov ax,[ebx] mov [esi+2],ax mov ax,[edx] mov [esi+4],ax mov ax,[edx+512] mov [esi+6],ax add ebx,2 sub edx,2 add esi,8 dec ecx jnz .intrploopm mov ebx, DSPInterpolate_4_mmx jmp .notgaussian .cubicspline ; Copy from CubicSpline to DSPInterP test ah,ah jne .cubic_mmx mov ebx,CubicSpline mov edx,DSPInterP mov ecx,1024 .intrploopb movzx eax,word[ebx] push ebx mov bx,ax sar bx,3 sub ax,bx pop ebx mov [edx],ax add ebx,2 add edx,2 dec ecx jnz .intrploopb mov ebx, DSPInterpolate_4 jmp .notgaussian .cubic_mmx mov ebx,CubicSpline mov esi,DSPInterP mov ecx,256 .intrploopmb mov ax,[ebx+256*6] mov dx,ax sar dx,3 sub ax,dx mov [esi],ax mov ax,[ebx+256*4] mov dx,ax sar dx,3 sub ax,dx mov [esi+2],ax mov ax,[ebx+256*2] mov dx,ax sar dx,3 sub ax,dx mov [esi+4],ax mov ax,[ebx] mov dx,ax sar dx,3 sub ax,dx mov [esi+6],ax add ebx,2 add esi,8 dec ecx jnz .intrploopmb mov ebx, DSPInterpolate_4_mmx jmp .notgaussian .fir_mmx mov ebx, DSPInterpolate_8 .notgaussian mov [DSPInterpolate],ebx %ifdef __MSDOS__ call SB_quality_limiter %endif mov eax,[SoundQuality] mov ebx,[NumofSPCBlock+eax*4] cmp byte[StereoSound],1 jne .nostereo shr ebx,1 .nostereo mov [SPCBlockNum],ebx .next mov ecx,[SoundQuality] mov eax,[SBToSPCSpeeds+ecx*4] %ifdef __MSDOS__ ; code for supporting vibra cards (coded by Peter Santing) cmp byte[vibracard],1 je .vibrafix cmp byte[SBHDMA],0 je .not16bit .vibrafix mov eax,[SBToSPCSpeeds2+ecx*4] .not16bit %endif mov [SBToSPC],eax mov [SBRateb],eax xor edx,edx mov ebx,eax mov eax,32000 shld edx,eax,20 shl eax,20 div ebx mov [dspPAdj],eax ; Init all rates mov esi,EchoRate mov edi,EchoRateO mov ecx,16 call conv2speed mov esi,AttackRate mov edi,AttackRateO mov ecx,16 call conv2speed mov esi,DecayRate mov edi,DecayRateO mov ecx,8 call conv2speed mov esi,SustainRate+4 mov edi,SustainRateO+4 mov ecx,31 call conv2speed mov esi,Increase+4 mov edi,IncreaseO+4 mov ecx,31 call conv2speed mov esi,IncreaseBent+4 mov edi,IncreaseBentO+4 mov ecx,31 call conv2speed mov esi,Decrease+4 mov edi,DecreaseO+4 mov ecx,31 call conv2speed mov esi,DecreaseRateExp+4 mov edi,DecreaseRateExpO+4 mov ecx,31 call conv2speed mov dword[Voice0Pitch],0xFFFEFFFE mov dword[Voice0Pitch+4],0xFFFEFFFE mov dword[Voice0Pitch+8],0xFFFEFFFE mov dword[Voice0Pitch+12],0xFFFEFFFE ret NEWSYM InitSPC push eax push ebx push ecx push edx call AdjustFrequency mov ecx,32768 mov edx,32767 .nextvol mov al,dh imul dl shr ax,7 movsx bx,al mov [VolumeConvTable+edx*2],bx dec edx dec ecx jnz .nextvol mov eax,SPCRAM mov ebx,0EFh .loop2 mov byte[eax],0 inc eax dec ebx jnz .loop2 mov byte[spcX],0 xor eax,eax xor ebx,ebx mov ebp,SPCRAM mov ax,0FFC0h add ebp,eax mov [spcPCRam],ebp mov dword[spcS],1EFh mov dword[spcRamDP],SPCRAM ; initialize all the SPC write registers mov dword[spcWptr+0],SPCRegF0 mov dword[spcWptr+4],SPCRegF1 mov dword[spcWptr+8],SPCRegF2 mov dword[spcWptr+12],SPCRegF3 mov dword[spcWptr+16],SPCRegF4 mov dword[spcWptr+20],SPCRegF5 mov dword[spcWptr+24],SPCRegF6 mov dword[spcWptr+28],SPCRegF7 mov dword[spcWptr+32],SPCRegF8 mov dword[spcWptr+36],SPCRegF9 mov dword[spcWptr+40],SPCRegFA mov dword[spcWptr+44],SPCRegFB mov dword[spcWptr+48],SPCRegFC mov dword[spcWptr+52],SPCRegFD mov dword[spcWptr+56],SPCRegFE mov dword[spcWptr+60],SPCRegFF mov dword[spcRptr+0],RSPCRegF0 mov dword[spcRptr+4],RSPCRegF1 mov dword[spcRptr+8],RSPCRegF2 mov dword[spcRptr+12],RSPCRegF3 mov dword[spcRptr+16],RSPCRegF4 mov dword[spcRptr+20],RSPCRegF5 mov dword[spcRptr+24],RSPCRegF6 mov dword[spcRptr+28],RSPCRegF7 mov dword[spcRptr+32],RSPCRegF8 mov dword[spcRptr+36],RSPCRegF9 mov dword[spcRptr+40],RSPCRegFA mov dword[spcRptr+44],RSPCRegFB mov dword[spcRptr+48],RSPCRegFC mov dword[spcRptr+52],RSPCRegFD mov dword[spcRptr+56],RSPCRegFE mov dword[spcRptr+60],RSPCRegFF mov dword[dspRptr+00h],RDSPReg00 mov dword[dspRptr+04h],RDSPReg01 mov dword[dspRptr+08h],RDSPReg02 mov dword[dspRptr+0Ch],RDSPReg03 mov dword[dspRptr+010h],RDSPReg04 mov dword[dspRptr+014h],RDSPReg05 mov dword[dspRptr+018h],RDSPReg06 mov dword[dspRptr+01Ch],RDSPReg07 mov dword[dspRptr+020h],RDSPReg08 mov dword[dspRptr+024h],RDSPReg09 mov dword[dspRptr+028h],RDSPReg0A mov dword[dspRptr+02Ch],RDSPReg0B mov dword[dspRptr+030h],RDSPReg0C mov dword[dspRptr+034h],RDSPReg0D mov dword[dspRptr+038h],RDSPReg0E mov dword[dspRptr+03Ch],RDSPReg0F mov dword[dspRptr+040h],RDSPReg10 mov dword[dspRptr+044h],RDSPReg11 mov dword[dspRptr+048h],RDSPReg12 mov dword[dspRptr+04Ch],RDSPReg13 mov dword[dspRptr+050h],RDSPReg14 mov dword[dspRptr+054h],RDSPReg15 mov dword[dspRptr+058h],RDSPReg16 mov dword[dspRptr+05Ch],RDSPReg17 mov dword[dspRptr+060h],RDSPReg18 mov dword[dspRptr+064h],RDSPReg19 mov dword[dspRptr+068h],RDSPReg1A mov dword[dspRptr+06Ch],RDSPReg1B mov dword[dspRptr+070h],RDSPReg1C mov dword[dspRptr+074h],RDSPReg1D mov dword[dspRptr+078h],RDSPReg1E mov dword[dspRptr+07Ch],RDSPReg1F mov dword[dspRptr+080h],RDSPReg20 mov dword[dspRptr+084h],RDSPReg21 mov dword[dspRptr+088h],RDSPReg22 mov dword[dspRptr+08Ch],RDSPReg23 mov dword[dspRptr+090h],RDSPReg24 mov dword[dspRptr+094h],RDSPReg25 mov dword[dspRptr+098h],RDSPReg26 mov dword[dspRptr+09Ch],RDSPReg27 mov dword[dspRptr+0A0h],RDSPReg28 mov dword[dspRptr+0A4h],RDSPReg29 mov dword[dspRptr+0A8h],RDSPReg2A mov dword[dspRptr+0ACh],RDSPReg2B mov dword[dspRptr+0B0h],RDSPReg2C mov dword[dspRptr+0B4h],RDSPReg2D mov dword[dspRptr+0B8h],RDSPReg2E mov dword[dspRptr+0BCh],RDSPReg2F mov dword[dspRptr+0C0h],RDSPReg30 mov dword[dspRptr+0C4h],RDSPReg31 mov dword[dspRptr+0C8h],RDSPReg32 mov dword[dspRptr+0CCh],RDSPReg33 mov dword[dspRptr+0D0h],RDSPReg34 mov dword[dspRptr+0D4h],RDSPReg35 mov dword[dspRptr+0D8h],RDSPReg36 mov dword[dspRptr+0DCh],RDSPReg37 mov dword[dspRptr+0E0h],RDSPReg38 mov dword[dspRptr+0E4h],RDSPReg39 mov dword[dspRptr+0E8h],RDSPReg3A mov dword[dspRptr+0ECh],RDSPReg3B mov dword[dspRptr+0F0h],RDSPReg3C mov dword[dspRptr+0F4h],RDSPReg3D mov dword[dspRptr+0F8h],RDSPReg3E mov dword[dspRptr+0FCh],RDSPReg3F mov dword[dspRptr+0100h],RDSPReg40 mov dword[dspRptr+0104h],RDSPReg41 mov dword[dspRptr+0108h],RDSPReg42 mov dword[dspRptr+010Ch],RDSPReg43 mov dword[dspRptr+0110h],RDSPReg44 mov dword[dspRptr+0114h],RDSPReg45 mov dword[dspRptr+0118h],RDSPReg46 mov dword[dspRptr+011Ch],RDSPReg47 mov dword[dspRptr+0120h],RDSPReg48 mov dword[dspRptr+0124h],RDSPReg49 mov dword[dspRptr+0128h],RDSPReg4A mov dword[dspRptr+012Ch],RDSPReg4B mov dword[dspRptr+0130h],RDSPReg4C mov dword[dspRptr+0134h],RDSPReg4D mov dword[dspRptr+0138h],RDSPReg4E mov dword[dspRptr+013Ch],RDSPReg4F mov dword[dspRptr+0140h],RDSPReg50 mov dword[dspRptr+0144h],RDSPReg51 mov dword[dspRptr+0148h],RDSPReg52 mov dword[dspRptr+014Ch],RDSPReg53 mov dword[dspRptr+0150h],RDSPReg54 mov dword[dspRptr+0154h],RDSPReg55 mov dword[dspRptr+0158h],RDSPReg56 mov dword[dspRptr+015Ch],RDSPReg57 mov dword[dspRptr+0160h],RDSPReg58 mov dword[dspRptr+0164h],RDSPReg59 mov dword[dspRptr+0168h],RDSPReg5A mov dword[dspRptr+016Ch],RDSPReg5B mov dword[dspRptr+0170h],RDSPReg5C mov dword[dspRptr+0174h],RDSPReg5D mov dword[dspRptr+0178h],RDSPReg5E mov dword[dspRptr+017Ch],RDSPReg5F mov dword[dspRptr+0180h],RDSPReg60 mov dword[dspRptr+0184h],RDSPReg61 mov dword[dspRptr+0188h],RDSPReg62 mov dword[dspRptr+018Ch],RDSPReg63 mov dword[dspRptr+0190h],RDSPReg64 mov dword[dspRptr+0194h],RDSPReg65 mov dword[dspRptr+0198h],RDSPReg66 mov dword[dspRptr+019Ch],RDSPReg67 mov dword[dspRptr+01A0h],RDSPReg68 mov dword[dspRptr+01A4h],RDSPReg69 mov dword[dspRptr+01A8h],RDSPReg6A mov dword[dspRptr+01ACh],RDSPReg6B mov dword[dspRptr+01B0h],RDSPReg6C mov dword[dspRptr+01B4h],RDSPReg6D mov dword[dspRptr+01B8h],RDSPReg6E mov dword[dspRptr+01BCh],RDSPReg6F mov dword[dspRptr+01C0h],RDSPReg70 mov dword[dspRptr+01C4h],RDSPReg71 mov dword[dspRptr+01C8h],RDSPReg72 mov dword[dspRptr+01CCh],RDSPReg73 mov dword[dspRptr+01D0h],RDSPReg74 mov dword[dspRptr+01D4h],RDSPReg75 mov dword[dspRptr+01D8h],RDSPReg76 mov dword[dspRptr+01DCh],RDSPReg77 mov dword[dspRptr+01E0h],RDSPReg78 mov dword[dspRptr+01E4h],RDSPReg79 mov dword[dspRptr+01E8h],RDSPReg7A mov dword[dspRptr+01ECh],RDSPReg7B mov dword[dspRptr+01F0h],RDSPReg7C mov dword[dspRptr+01F4h],RDSPReg7D mov dword[dspRptr+01F8h],RDSPReg7E mov dword[dspRptr+01FCh],RDSPReg7F mov dword[dspRptr+0200h],RDSPReg80 mov dword[dspRptr+0204h],RDSPReg81 mov dword[dspRptr+0208h],RDSPReg82 mov dword[dspRptr+020Ch],RDSPReg83 mov dword[dspRptr+0210h],RDSPReg84 mov dword[dspRptr+0214h],RDSPReg85 mov dword[dspRptr+0218h],RDSPReg86 mov dword[dspRptr+021Ch],RDSPReg87 mov dword[dspRptr+0220h],RDSPReg88 mov dword[dspRptr+0224h],RDSPReg89 mov dword[dspRptr+0228h],RDSPReg8A mov dword[dspRptr+022Ch],RDSPReg8B mov dword[dspRptr+0230h],RDSPReg8C mov dword[dspRptr+0234h],RDSPReg8D mov dword[dspRptr+0238h],RDSPReg8E mov dword[dspRptr+023Ch],RDSPReg8F mov dword[dspRptr+0240h],RDSPReg90 mov dword[dspRptr+0244h],RDSPReg91 mov dword[dspRptr+0248h],RDSPReg92 mov dword[dspRptr+024Ch],RDSPReg93 mov dword[dspRptr+0250h],RDSPReg94 mov dword[dspRptr+0254h],RDSPReg95 mov dword[dspRptr+0258h],RDSPReg96 mov dword[dspRptr+025Ch],RDSPReg97 mov dword[dspRptr+0260h],RDSPReg98 mov dword[dspRptr+0264h],RDSPReg99 mov dword[dspRptr+0268h],RDSPReg9A mov dword[dspRptr+026Ch],RDSPReg9B mov dword[dspRptr+0270h],RDSPReg9C mov dword[dspRptr+0274h],RDSPReg9D mov dword[dspRptr+0278h],RDSPReg9E mov dword[dspRptr+027Ch],RDSPReg9F mov dword[dspRptr+0280h],RDSPRegA0 mov dword[dspRptr+0284h],RDSPRegA1 mov dword[dspRptr+0288h],RDSPRegA2 mov dword[dspRptr+028Ch],RDSPRegA3 mov dword[dspRptr+0290h],RDSPRegA4 mov dword[dspRptr+0294h],RDSPRegA5 mov dword[dspRptr+0298h],RDSPRegA6 mov dword[dspRptr+029Ch],RDSPRegA7 mov dword[dspRptr+02A0h],RDSPRegA8 mov dword[dspRptr+02A4h],RDSPRegA9 mov dword[dspRptr+02A8h],RDSPRegAA mov dword[dspRptr+02ACh],RDSPRegAB mov dword[dspRptr+02B0h],RDSPRegAC mov dword[dspRptr+02B4h],RDSPRegAD mov dword[dspRptr+02B8h],RDSPRegAE mov dword[dspRptr+02BCh],RDSPRegAF mov dword[dspRptr+02C0h],RDSPRegB0 mov dword[dspRptr+02C4h],RDSPRegB1 mov dword[dspRptr+02C8h],RDSPRegB2 mov dword[dspRptr+02CCh],RDSPRegB3 mov dword[dspRptr+02D0h],RDSPRegB4 mov dword[dspRptr+02D4h],RDSPRegB5 mov dword[dspRptr+02D8h],RDSPRegB6 mov dword[dspRptr+02DCh],RDSPRegB7 mov dword[dspRptr+02E0h],RDSPRegB8 mov dword[dspRptr+02E4h],RDSPRegB9 mov dword[dspRptr+02E8h],RDSPRegBA mov dword[dspRptr+02ECh],RDSPRegBB mov dword[dspRptr+02F0h],RDSPRegBC mov dword[dspRptr+02F4h],RDSPRegBD mov dword[dspRptr+02F8h],RDSPRegBE mov dword[dspRptr+02FCh],RDSPRegBF mov dword[dspRptr+0300h],RDSPRegC0 mov dword[dspRptr+0304h],RDSPRegC1 mov dword[dspRptr+0308h],RDSPRegC2 mov dword[dspRptr+030Ch],RDSPRegC3 mov dword[dspRptr+0310h],RDSPRegC4 mov dword[dspRptr+0314h],RDSPRegC5 mov dword[dspRptr+0318h],RDSPRegC6 mov dword[dspRptr+031Ch],RDSPRegC7 mov dword[dspRptr+0320h],RDSPRegC8 mov dword[dspRptr+0324h],RDSPRegC9 mov dword[dspRptr+0328h],RDSPRegCA mov dword[dspRptr+032Ch],RDSPRegCB mov dword[dspRptr+0330h],RDSPRegCC mov dword[dspRptr+0334h],RDSPRegCD mov dword[dspRptr+0338h],RDSPRegCE mov dword[dspRptr+033Ch],RDSPRegCF mov dword[dspRptr+0340h],RDSPRegD0 mov dword[dspRptr+0344h],RDSPRegD1 mov dword[dspRptr+0348h],RDSPRegD2 mov dword[dspRptr+034Ch],RDSPRegD3 mov dword[dspRptr+0350h],RDSPRegD4 mov dword[dspRptr+0354h],RDSPRegD5 mov dword[dspRptr+0358h],RDSPRegD6 mov dword[dspRptr+035Ch],RDSPRegD7 mov dword[dspRptr+0360h],RDSPRegD8 mov dword[dspRptr+0364h],RDSPRegD9 mov dword[dspRptr+0368h],RDSPRegDA mov dword[dspRptr+036Ch],RDSPRegDB mov dword[dspRptr+0370h],RDSPRegDC mov dword[dspRptr+0374h],RDSPRegDD mov dword[dspRptr+0378h],RDSPRegDE mov dword[dspRptr+037Ch],RDSPRegDF mov dword[dspRptr+0380h],RDSPRegE0 mov dword[dspRptr+0384h],RDSPRegE1 mov dword[dspRptr+0388h],RDSPRegE2 mov dword[dspRptr+038Ch],RDSPRegE3 mov dword[dspRptr+0390h],RDSPRegE4 mov dword[dspRptr+0394h],RDSPRegE5 mov dword[dspRptr+0398h],RDSPRegE6 mov dword[dspRptr+039Ch],RDSPRegE7 mov dword[dspRptr+03A0h],RDSPRegE8 mov dword[dspRptr+03A4h],RDSPRegE9 mov dword[dspRptr+03A8h],RDSPRegEA mov dword[dspRptr+03ACh],RDSPRegEB mov dword[dspRptr+03B0h],RDSPRegEC mov dword[dspRptr+03B4h],RDSPRegED mov dword[dspRptr+03B8h],RDSPRegEE mov dword[dspRptr+03BCh],RDSPRegEF mov dword[dspRptr+03C0h],RDSPRegF0 mov dword[dspRptr+03C4h],RDSPRegF1 mov dword[dspRptr+03C8h],RDSPRegF2 mov dword[dspRptr+03CCh],RDSPRegF3 mov dword[dspRptr+03D0h],RDSPRegF4 mov dword[dspRptr+03D4h],RDSPRegF5 mov dword[dspRptr+03D8h],RDSPRegF6 mov dword[dspRptr+03DCh],RDSPRegF7 mov dword[dspRptr+03E0h],RDSPRegF8 mov dword[dspRptr+03E4h],RDSPRegF9 mov dword[dspRptr+03E8h],RDSPRegFA mov dword[dspRptr+03ECh],RDSPRegFB mov dword[dspRptr+03F0h],RDSPRegFC mov dword[dspRptr+03F4h],RDSPRegFD mov dword[dspRptr+03F8h],RDSPRegFE mov dword[dspRptr+03FCh],RDSPRegFF mov dword[dspWptr+00h],WDSPReg00 mov dword[dspWptr+04h],WDSPReg01 mov dword[dspWptr+08h],WDSPReg02 mov dword[dspWptr+0Ch],WDSPReg03 mov dword[dspWptr+010h],WDSPReg04 mov dword[dspWptr+014h],WDSPReg05 mov dword[dspWptr+018h],WDSPReg06 mov dword[dspWptr+01Ch],WDSPReg07 mov dword[dspWptr+020h],WDSPReg08 mov dword[dspWptr+024h],WDSPReg09 mov dword[dspWptr+028h],WDSPReg0A mov dword[dspWptr+02Ch],WDSPReg0B mov dword[dspWptr+030h],WDSPReg0C mov dword[dspWptr+034h],WDSPReg0D mov dword[dspWptr+038h],WDSPReg0E mov dword[dspWptr+03Ch],WDSPReg0F mov dword[dspWptr+040h],WDSPReg10 mov dword[dspWptr+044h],WDSPReg11 mov dword[dspWptr+048h],WDSPReg12 mov dword[dspWptr+04Ch],WDSPReg13 mov dword[dspWptr+050h],WDSPReg14 mov dword[dspWptr+054h],WDSPReg15 mov dword[dspWptr+058h],WDSPReg16 mov dword[dspWptr+05Ch],WDSPReg17 mov dword[dspWptr+060h],WDSPReg18 mov dword[dspWptr+064h],WDSPReg19 mov dword[dspWptr+068h],WDSPReg1A mov dword[dspWptr+06Ch],WDSPReg1B mov dword[dspWptr+070h],WDSPReg1C mov dword[dspWptr+074h],WDSPReg1D mov dword[dspWptr+078h],WDSPReg1E mov dword[dspWptr+07Ch],WDSPReg1F mov dword[dspWptr+080h],WDSPReg20 mov dword[dspWptr+084h],WDSPReg21 mov dword[dspWptr+088h],WDSPReg22 mov dword[dspWptr+08Ch],WDSPReg23 mov dword[dspWptr+090h],WDSPReg24 mov dword[dspWptr+094h],WDSPReg25 mov dword[dspWptr+098h],WDSPReg26 mov dword[dspWptr+09Ch],WDSPReg27 mov dword[dspWptr+0A0h],WDSPReg28 mov dword[dspWptr+0A4h],WDSPReg29 mov dword[dspWptr+0A8h],WDSPReg2A mov dword[dspWptr+0ACh],WDSPReg2B mov dword[dspWptr+0B0h],WDSPReg2C mov dword[dspWptr+0B4h],WDSPReg2D mov dword[dspWptr+0B8h],WDSPReg2E mov dword[dspWptr+0BCh],WDSPReg2F mov dword[dspWptr+0C0h],WDSPReg30 mov dword[dspWptr+0C4h],WDSPReg31 mov dword[dspWptr+0C8h],WDSPReg32 mov dword[dspWptr+0CCh],WDSPReg33 mov dword[dspWptr+0D0h],WDSPReg34 mov dword[dspWptr+0D4h],WDSPReg35 mov dword[dspWptr+0D8h],WDSPReg36 mov dword[dspWptr+0DCh],WDSPReg37 mov dword[dspWptr+0E0h],WDSPReg38 mov dword[dspWptr+0E4h],WDSPReg39 mov dword[dspWptr+0E8h],WDSPReg3A mov dword[dspWptr+0ECh],WDSPReg3B mov dword[dspWptr+0F0h],WDSPReg3C mov dword[dspWptr+0F4h],WDSPReg3D mov dword[dspWptr+0F8h],WDSPReg3E mov dword[dspWptr+0FCh],WDSPReg3F mov dword[dspWptr+0100h],WDSPReg40 mov dword[dspWptr+0104h],WDSPReg41 mov dword[dspWptr+0108h],WDSPReg42 mov dword[dspWptr+010Ch],WDSPReg43 mov dword[dspWptr+0110h],WDSPReg44 mov dword[dspWptr+0114h],WDSPReg45 mov dword[dspWptr+0118h],WDSPReg46 mov dword[dspWptr+011Ch],WDSPReg47 mov dword[dspWptr+0120h],WDSPReg48 mov dword[dspWptr+0124h],WDSPReg49 mov dword[dspWptr+0128h],WDSPReg4A mov dword[dspWptr+012Ch],WDSPReg4B mov dword[dspWptr+0130h],WDSPReg4C mov dword[dspWptr+0134h],WDSPReg4D mov dword[dspWptr+0138h],WDSPReg4E mov dword[dspWptr+013Ch],WDSPReg4F mov dword[dspWptr+0140h],WDSPReg50 mov dword[dspWptr+0144h],WDSPReg51 mov dword[dspWptr+0148h],WDSPReg52 mov dword[dspWptr+014Ch],WDSPReg53 mov dword[dspWptr+0150h],WDSPReg54 mov dword[dspWptr+0154h],WDSPReg55 mov dword[dspWptr+0158h],WDSPReg56 mov dword[dspWptr+015Ch],WDSPReg57 mov dword[dspWptr+0160h],WDSPReg58 mov dword[dspWptr+0164h],WDSPReg59 mov dword[dspWptr+0168h],WDSPReg5A mov dword[dspWptr+016Ch],WDSPReg5B mov dword[dspWptr+0170h],WDSPReg5C mov dword[dspWptr+0174h],WDSPReg5D mov dword[dspWptr+0178h],WDSPReg5E mov dword[dspWptr+017Ch],WDSPReg5F mov dword[dspWptr+0180h],WDSPReg60 mov dword[dspWptr+0184h],WDSPReg61 mov dword[dspWptr+0188h],WDSPReg62 mov dword[dspWptr+018Ch],WDSPReg63 mov dword[dspWptr+0190h],WDSPReg64 mov dword[dspWptr+0194h],WDSPReg65 mov dword[dspWptr+0198h],WDSPReg66 mov dword[dspWptr+019Ch],WDSPReg67 mov dword[dspWptr+01A0h],WDSPReg68 mov dword[dspWptr+01A4h],WDSPReg69 mov dword[dspWptr+01A8h],WDSPReg6A mov dword[dspWptr+01ACh],WDSPReg6B mov dword[dspWptr+01B0h],WDSPReg6C mov dword[dspWptr+01B4h],WDSPReg6D mov dword[dspWptr+01B8h],WDSPReg6E mov dword[dspWptr+01BCh],WDSPReg6F mov dword[dspWptr+01C0h],WDSPReg70 mov dword[dspWptr+01C4h],WDSPReg71 mov dword[dspWptr+01C8h],WDSPReg72 mov dword[dspWptr+01CCh],WDSPReg73 mov dword[dspWptr+01D0h],WDSPReg74 mov dword[dspWptr+01D4h],WDSPReg75 mov dword[dspWptr+01D8h],WDSPReg76 mov dword[dspWptr+01DCh],WDSPReg77 mov dword[dspWptr+01E0h],WDSPReg78 mov dword[dspWptr+01E4h],WDSPReg79 mov dword[dspWptr+01E8h],WDSPReg7A mov dword[dspWptr+01ECh],WDSPReg7B mov dword[dspWptr+01F0h],WDSPReg7C mov dword[dspWptr+01F4h],WDSPReg7D mov dword[dspWptr+01F8h],WDSPReg7E mov dword[dspWptr+01FCh],WDSPReg7F mov dword[dspWptr+0200h],WDSPReg80 mov dword[dspWptr+0204h],WDSPReg81 mov dword[dspWptr+0208h],WDSPReg82 mov dword[dspWptr+020Ch],WDSPReg83 mov dword[dspWptr+0210h],WDSPReg84 mov dword[dspWptr+0214h],WDSPReg85 mov dword[dspWptr+0218h],WDSPReg86 mov dword[dspWptr+021Ch],WDSPReg87 mov dword[dspWptr+0220h],WDSPReg88 mov dword[dspWptr+0224h],WDSPReg89 mov dword[dspWptr+0228h],WDSPReg8A mov dword[dspWptr+022Ch],WDSPReg8B mov dword[dspWptr+0230h],WDSPReg8C mov dword[dspWptr+0234h],WDSPReg8D mov dword[dspWptr+0238h],WDSPReg8E mov dword[dspWptr+023Ch],WDSPReg8F mov dword[dspWptr+0240h],WDSPReg90 mov dword[dspWptr+0244h],WDSPReg91 mov dword[dspWptr+0248h],WDSPReg92 mov dword[dspWptr+024Ch],WDSPReg93 mov dword[dspWptr+0250h],WDSPReg94 mov dword[dspWptr+0254h],WDSPReg95 mov dword[dspWptr+0258h],WDSPReg96 mov dword[dspWptr+025Ch],WDSPReg97 mov dword[dspWptr+0260h],WDSPReg98 mov dword[dspWptr+0264h],WDSPReg99 mov dword[dspWptr+0268h],WDSPReg9A mov dword[dspWptr+026Ch],WDSPReg9B mov dword[dspWptr+0270h],WDSPReg9C mov dword[dspWptr+0274h],WDSPReg9D mov dword[dspWptr+0278h],WDSPReg9E mov dword[dspWptr+027Ch],WDSPReg9F mov dword[dspWptr+0280h],WDSPRegA0 mov dword[dspWptr+0284h],WDSPRegA1 mov dword[dspWptr+0288h],WDSPRegA2 mov dword[dspWptr+028Ch],WDSPRegA3 mov dword[dspWptr+0290h],WDSPRegA4 mov dword[dspWptr+0294h],WDSPRegA5 mov dword[dspWptr+0298h],WDSPRegA6 mov dword[dspWptr+029Ch],WDSPRegA7 mov dword[dspWptr+02A0h],WDSPRegA8 mov dword[dspWptr+02A4h],WDSPRegA9 mov dword[dspWptr+02A8h],WDSPRegAA mov dword[dspWptr+02ACh],WDSPRegAB mov dword[dspWptr+02B0h],WDSPRegAC mov dword[dspWptr+02B4h],WDSPRegAD mov dword[dspWptr+02B8h],WDSPRegAE mov dword[dspWptr+02BCh],WDSPRegAF mov dword[dspWptr+02C0h],WDSPRegB0 mov dword[dspWptr+02C4h],WDSPRegB1 mov dword[dspWptr+02C8h],WDSPRegB2 mov dword[dspWptr+02CCh],WDSPRegB3 mov dword[dspWptr+02D0h],WDSPRegB4 mov dword[dspWptr+02D4h],WDSPRegB5 mov dword[dspWptr+02D8h],WDSPRegB6 mov dword[dspWptr+02DCh],WDSPRegB7 mov dword[dspWptr+02E0h],WDSPRegB8 mov dword[dspWptr+02E4h],WDSPRegB9 mov dword[dspWptr+02E8h],WDSPRegBA mov dword[dspWptr+02ECh],WDSPRegBB mov dword[dspWptr+02F0h],WDSPRegBC mov dword[dspWptr+02F4h],WDSPRegBD mov dword[dspWptr+02F8h],WDSPRegBE mov dword[dspWptr+02FCh],WDSPRegBF mov dword[dspWptr+0300h],WDSPRegC0 mov dword[dspWptr+0304h],WDSPRegC1 mov dword[dspWptr+0308h],WDSPRegC2 mov dword[dspWptr+030Ch],WDSPRegC3 mov dword[dspWptr+0310h],WDSPRegC4 mov dword[dspWptr+0314h],WDSPRegC5 mov dword[dspWptr+0318h],WDSPRegC6 mov dword[dspWptr+031Ch],WDSPRegC7 mov dword[dspWptr+0320h],WDSPRegC8 mov dword[dspWptr+0324h],WDSPRegC9 mov dword[dspWptr+0328h],WDSPRegCA mov dword[dspWptr+032Ch],WDSPRegCB mov dword[dspWptr+0330h],WDSPRegCC mov dword[dspWptr+0334h],WDSPRegCD mov dword[dspWptr+0338h],WDSPRegCE mov dword[dspWptr+033Ch],WDSPRegCF mov dword[dspWptr+0340h],WDSPRegD0 mov dword[dspWptr+0344h],WDSPRegD1 mov dword[dspWptr+0348h],WDSPRegD2 mov dword[dspWptr+034Ch],WDSPRegD3 mov dword[dspWptr+0350h],WDSPRegD4 mov dword[dspWptr+0354h],WDSPRegD5 mov dword[dspWptr+0358h],WDSPRegD6 mov dword[dspWptr+035Ch],WDSPRegD7 mov dword[dspWptr+0360h],WDSPRegD8 mov dword[dspWptr+0364h],WDSPRegD9 mov dword[dspWptr+0368h],WDSPRegDA mov dword[dspWptr+036Ch],WDSPRegDB mov dword[dspWptr+0370h],WDSPRegDC mov dword[dspWptr+0374h],WDSPRegDD mov dword[dspWptr+0378h],WDSPRegDE mov dword[dspWptr+037Ch],WDSPRegDF mov dword[dspWptr+0380h],WDSPRegE0 mov dword[dspWptr+0384h],WDSPRegE1 mov dword[dspWptr+0388h],WDSPRegE2 mov dword[dspWptr+038Ch],WDSPRegE3 mov dword[dspWptr+0390h],WDSPRegE4 mov dword[dspWptr+0394h],WDSPRegE5 mov dword[dspWptr+0398h],WDSPRegE6 mov dword[dspWptr+039Ch],WDSPRegE7 mov dword[dspWptr+03A0h],WDSPRegE8 mov dword[dspWptr+03A4h],WDSPRegE9 mov dword[dspWptr+03A8h],WDSPRegEA mov dword[dspWptr+03ACh],WDSPRegEB mov dword[dspWptr+03B0h],WDSPRegEC mov dword[dspWptr+03B4h],WDSPRegED mov dword[dspWptr+03B8h],WDSPRegEE mov dword[dspWptr+03BCh],WDSPRegEF mov dword[dspWptr+03C0h],WDSPRegF0 mov dword[dspWptr+03C4h],WDSPRegF1 mov dword[dspWptr+03C8h],WDSPRegF2 mov dword[dspWptr+03CCh],WDSPRegF3 mov dword[dspWptr+03D0h],WDSPRegF4 mov dword[dspWptr+03D4h],WDSPRegF5 mov dword[dspWptr+03D8h],WDSPRegF6 mov dword[dspWptr+03DCh],WDSPRegF7 mov dword[dspWptr+03E0h],WDSPRegF8 mov dword[dspWptr+03E4h],WDSPRegF9 mov dword[dspWptr+03E8h],WDSPRegFA mov dword[dspWptr+03ECh],WDSPRegFB mov dword[dspWptr+03F0h],WDSPRegFC mov dword[dspWptr+03F4h],WDSPRegFD mov dword[dspWptr+03F8h],WDSPRegFE mov dword[dspWptr+03FCh],WDSPRegFF ; first fill all pointer to an invalid access function mov ecx,256 mov eax,Invalidopcode mov ebp,0 .loop %ifdef __MSDOS__ mov [ds:opcjmptab+ebp],eax %else mov [opcjmptab+ebp],eax %endif add ebp,4 dec ecx jnz .loop ; now fill the table mov dword[opcjmptab+00h],Op00 mov dword[opcjmptab+04h],Op01 mov dword[opcjmptab+08h],Op02 mov dword[opcjmptab+0Ch],Op03 mov dword[opcjmptab+010h],Op04 mov dword[opcjmptab+014h],Op05 mov dword[opcjmptab+018h],Op06 mov dword[opcjmptab+01Ch],Op07 mov dword[opcjmptab+020h],Op08 mov dword[opcjmptab+024h],Op09 mov dword[opcjmptab+028h],Op0A mov dword[opcjmptab+02Ch],Op0B mov dword[opcjmptab+030h],Op0C mov dword[opcjmptab+034h],Op0D mov dword[opcjmptab+038h],Op0E mov dword[opcjmptab+03Ch],Op0F mov dword[opcjmptab+040h],Op10 mov dword[opcjmptab+044h],Op11 mov dword[opcjmptab+048h],Op12 mov dword[opcjmptab+04Ch],Op13 mov dword[opcjmptab+050h],Op14 mov dword[opcjmptab+054h],Op15 mov dword[opcjmptab+058h],Op16 mov dword[opcjmptab+05Ch],Op17 mov dword[opcjmptab+060h],Op18 mov dword[opcjmptab+064h],Op19 mov dword[opcjmptab+068h],Op1A mov dword[opcjmptab+06Ch],Op1B mov dword[opcjmptab+070h],Op1C mov dword[opcjmptab+074h],Op1D mov dword[opcjmptab+078h],Op1E mov dword[opcjmptab+07Ch],Op1F mov dword[opcjmptab+080h],Op20 mov dword[opcjmptab+084h],Op21 mov dword[opcjmptab+088h],Op22 mov dword[opcjmptab+08Ch],Op23 mov dword[opcjmptab+090h],Op24 mov dword[opcjmptab+094h],Op25 mov dword[opcjmptab+098h],Op26 mov dword[opcjmptab+09Ch],Op27 mov dword[opcjmptab+0A0h],Op28 mov dword[opcjmptab+0A4h],Op29 mov dword[opcjmptab+0A8h],Op2A mov dword[opcjmptab+0ACh],Op2B mov dword[opcjmptab+0B0h],Op2C mov dword[opcjmptab+0B4h],Op2D mov dword[opcjmptab+0B8h],Op2E mov dword[opcjmptab+0BCh],Op2F mov dword[opcjmptab+0C0h],Op30 mov dword[opcjmptab+0C4h],Op31 mov dword[opcjmptab+0C8h],Op32 mov dword[opcjmptab+0CCh],Op33 mov dword[opcjmptab+0D0h],Op34 mov dword[opcjmptab+0D4h],Op35 mov dword[opcjmptab+0D8h],Op36 mov dword[opcjmptab+0DCh],Op37 mov dword[opcjmptab+0E0h],Op38 mov dword[opcjmptab+0E4h],Op39 mov dword[opcjmptab+0E8h],Op3A mov dword[opcjmptab+0ECh],Op3B mov dword[opcjmptab+0F0h],Op3C mov dword[opcjmptab+0F4h],Op3D mov dword[opcjmptab+0F8h],Op3E mov dword[opcjmptab+0FCh],Op3F mov dword[opcjmptab+0100h],Op40 mov dword[opcjmptab+0104h],Op41 mov dword[opcjmptab+0108h],Op42 mov dword[opcjmptab+010Ch],Op43 mov dword[opcjmptab+0110h],Op44 mov dword[opcjmptab+0114h],Op45 mov dword[opcjmptab+0118h],Op46 mov dword[opcjmptab+011Ch],Op47 mov dword[opcjmptab+0120h],Op48 mov dword[opcjmptab+0124h],Op49 mov dword[opcjmptab+0128h],Op4A mov dword[opcjmptab+012Ch],Op4B mov dword[opcjmptab+0130h],Op4C mov dword[opcjmptab+0134h],Op4D mov dword[opcjmptab+0138h],Op4E mov dword[opcjmptab+013Ch],Op4F mov dword[opcjmptab+0140h],Op50 mov dword[opcjmptab+0144h],Op51 mov dword[opcjmptab+0148h],Op52 mov dword[opcjmptab+014Ch],Op53 mov dword[opcjmptab+0150h],Op54 mov dword[opcjmptab+0154h],Op55 mov dword[opcjmptab+0158h],Op56 mov dword[opcjmptab+015Ch],Op57 mov dword[opcjmptab+0160h],Op58 mov dword[opcjmptab+0164h],Op59 mov dword[opcjmptab+0168h],Op5A mov dword[opcjmptab+016Ch],Op5B mov dword[opcjmptab+0170h],Op5C mov dword[opcjmptab+0174h],Op5D mov dword[opcjmptab+0178h],Op5E mov dword[opcjmptab+017Ch],Op5F mov dword[opcjmptab+0180h],Op60 mov dword[opcjmptab+0184h],Op61 mov dword[opcjmptab+0188h],Op62 mov dword[opcjmptab+018Ch],Op63 mov dword[opcjmptab+0190h],Op64 mov dword[opcjmptab+0194h],Op65 mov dword[opcjmptab+0198h],Op66 mov dword[opcjmptab+019Ch],Op67 mov dword[opcjmptab+01A0h],Op68 mov dword[opcjmptab+01A4h],Op69 mov dword[opcjmptab+01A8h],Op6A mov dword[opcjmptab+01ACh],Op6B mov dword[opcjmptab+01B0h],Op6C mov dword[opcjmptab+01B4h],Op6D mov dword[opcjmptab+01B8h],Op6E mov dword[opcjmptab+01BCh],Op6F mov dword[opcjmptab+01C0h],Op70 mov dword[opcjmptab+01C4h],Op71 mov dword[opcjmptab+01C8h],Op72 mov dword[opcjmptab+01CCh],Op73 mov dword[opcjmptab+01D0h],Op74 mov dword[opcjmptab+01D4h],Op75 mov dword[opcjmptab+01D8h],Op76 mov dword[opcjmptab+01DCh],Op77 mov dword[opcjmptab+01E0h],Op78 mov dword[opcjmptab+01E4h],Op79 mov dword[opcjmptab+01E8h],Op7A mov dword[opcjmptab+01ECh],Op7B mov dword[opcjmptab+01F0h],Op7C mov dword[opcjmptab+01F4h],Op7D mov dword[opcjmptab+01F8h],Op7E mov dword[opcjmptab+01FCh],Op7F mov dword[opcjmptab+0200h],Op80 mov dword[opcjmptab+0204h],Op81 mov dword[opcjmptab+0208h],Op82 mov dword[opcjmptab+020Ch],Op83 mov dword[opcjmptab+0210h],Op84 mov dword[opcjmptab+0214h],Op85 mov dword[opcjmptab+0218h],Op86 mov dword[opcjmptab+021Ch],Op87 mov dword[opcjmptab+0220h],Op88 mov dword[opcjmptab+0224h],Op89 mov dword[opcjmptab+0228h],Op8A mov dword[opcjmptab+022Ch],Op8B mov dword[opcjmptab+0230h],Op8C mov dword[opcjmptab+0234h],Op8D mov dword[opcjmptab+0238h],Op8E mov dword[opcjmptab+023Ch],Op8F mov dword[opcjmptab+0240h],Op90 mov dword[opcjmptab+0244h],Op91 mov dword[opcjmptab+0248h],Op92 mov dword[opcjmptab+024Ch],Op93 mov dword[opcjmptab+0250h],Op94 mov dword[opcjmptab+0254h],Op95 mov dword[opcjmptab+0258h],Op96 mov dword[opcjmptab+025Ch],Op97 mov dword[opcjmptab+0260h],Op98 mov dword[opcjmptab+0264h],Op99 mov dword[opcjmptab+0268h],Op9A mov dword[opcjmptab+026Ch],Op9B mov dword[opcjmptab+0270h],Op9C mov dword[opcjmptab+0274h],Op9D mov dword[opcjmptab+0278h],Op9E mov dword[opcjmptab+027Ch],Op9F mov dword[opcjmptab+0280h],OpA0 mov dword[opcjmptab+0284h],OpA1 mov dword[opcjmptab+0288h],OpA2 mov dword[opcjmptab+028Ch],OpA3 mov dword[opcjmptab+0290h],OpA4 mov dword[opcjmptab+0294h],OpA5 mov dword[opcjmptab+0298h],OpA6 mov dword[opcjmptab+029Ch],OpA7 mov dword[opcjmptab+02A0h],OpA8 mov dword[opcjmptab+02A4h],OpA9 mov dword[opcjmptab+02A8h],OpAA mov dword[opcjmptab+02ACh],OpAB mov dword[opcjmptab+02B0h],OpAC mov dword[opcjmptab+02B4h],OpAD mov dword[opcjmptab+02B8h],OpAE mov dword[opcjmptab+02BCh],OpAF mov dword[opcjmptab+02C0h],OpB0 mov dword[opcjmptab+02C4h],OpB1 mov dword[opcjmptab+02C8h],OpB2 mov dword[opcjmptab+02CCh],OpB3 mov dword[opcjmptab+02D0h],OpB4 mov dword[opcjmptab+02D4h],OpB5 mov dword[opcjmptab+02D8h],OpB6 mov dword[opcjmptab+02DCh],OpB7 mov dword[opcjmptab+02E0h],OpB8 mov dword[opcjmptab+02E4h],OpB9 mov dword[opcjmptab+02E8h],OpBA mov dword[opcjmptab+02ECh],OpBB mov dword[opcjmptab+02F0h],OpBC mov dword[opcjmptab+02F4h],OpBD mov dword[opcjmptab+02F8h],OpBE mov dword[opcjmptab+02FCh],OpBF mov dword[opcjmptab+0300h],OpC0 mov dword[opcjmptab+0304h],OpC1 mov dword[opcjmptab+0308h],OpC2 mov dword[opcjmptab+030Ch],OpC3 mov dword[opcjmptab+0310h],OpC4 mov dword[opcjmptab+0314h],OpC5 mov dword[opcjmptab+0318h],OpC6 mov dword[opcjmptab+031Ch],OpC7 mov dword[opcjmptab+0320h],OpC8 mov dword[opcjmptab+0324h],OpC9 mov dword[opcjmptab+0328h],OpCA mov dword[opcjmptab+032Ch],OpCB mov dword[opcjmptab+0330h],OpCC mov dword[opcjmptab+0334h],OpCD mov dword[opcjmptab+0338h],OpCE mov dword[opcjmptab+033Ch],OpCF mov dword[opcjmptab+0340h],OpD0 mov dword[opcjmptab+0344h],OpD1 mov dword[opcjmptab+0348h],OpD2 mov dword[opcjmptab+034Ch],OpD3 mov dword[opcjmptab+0350h],OpD4 mov dword[opcjmptab+0354h],OpD5 mov dword[opcjmptab+0358h],OpD6 mov dword[opcjmptab+035Ch],OpD7 mov dword[opcjmptab+0360h],OpD8 mov dword[opcjmptab+0364h],OpD9 mov dword[opcjmptab+0368h],OpDA mov dword[opcjmptab+036Ch],OpDB mov dword[opcjmptab+0370h],OpDC mov dword[opcjmptab+0374h],OpDD mov dword[opcjmptab+0378h],OpDE mov dword[opcjmptab+037Ch],OpDF mov dword[opcjmptab+0380h],OpE0 mov dword[opcjmptab+0384h],OpE1 mov dword[opcjmptab+0388h],OpE2 mov dword[opcjmptab+038Ch],OpE3 mov dword[opcjmptab+0390h],OpE4 mov dword[opcjmptab+0394h],OpE5 mov dword[opcjmptab+0398h],OpE6 mov dword[opcjmptab+039Ch],OpE7 mov dword[opcjmptab+03A0h],OpE8 mov dword[opcjmptab+03A4h],OpE9 mov dword[opcjmptab+03A8h],OpEA mov dword[opcjmptab+03ACh],OpEB mov dword[opcjmptab+03B0h],OpEC mov dword[opcjmptab+03B4h],OpED mov dword[opcjmptab+03B8h],OpEE mov dword[opcjmptab+03BCh],OpEF mov dword[opcjmptab+03C0h],OpF0 mov dword[opcjmptab+03C4h],OpF1 mov dword[opcjmptab+03C8h],OpF2 mov dword[opcjmptab+03CCh],OpF3 mov dword[opcjmptab+03D0h],OpF4 mov dword[opcjmptab+03D4h],OpF5 mov dword[opcjmptab+03D8h],OpF6 mov dword[opcjmptab+03DCh],OpF7 mov dword[opcjmptab+03E0h],OpF8 mov dword[opcjmptab+03E4h],OpF9 mov dword[opcjmptab+03E8h],OpFA mov dword[opcjmptab+03ECh],OpFB mov dword[opcjmptab+03F0h],OpFC mov dword[opcjmptab+03F4h],OpFD mov dword[opcjmptab+03F8h],OpFE mov dword[opcjmptab+03FCh],OpFF %ifdef __MSDOS__ call SB_alloc_dma %endif .nosound pop edx pop ecx pop ebx pop eax ret SECTION .bss PSampleBuf resd 24*8 NEWSYM LPFsample1, resd 1 NEWSYM LPFsample2, resd 1 NEWSYM BRRreadahead, resw 4 NEWSYM DLPFsamples, resd 8*24 section .text %macro ProcessA 0 shr al,4 %endmacro %macro ProcessB 0 and al,0Fh %endmacro %macro ProcessSample 1 mov cl,[bshift] movzx eax,byte[esi] %1 ;sign extend xor eax,8 sub eax,8 cmp cl,12 ja %%invalid_range shl eax,cl sar eax,1 jmp %%got_delta %%invalid_range and eax,~0x7FF %%got_delta mov edx,eax cmp dword[filter0],240 jne %%notfilter1 mov eax,[prev0] sar eax,1 add edx,eax mov eax,[prev0] neg eax sar eax,5 add edx,eax %%notfilter1 cmp dword[filter0],488 jne %%notfilter2 mov eax,[prev0] add edx,eax mov eax,[prev0] sar eax,1 add eax,[prev0] neg eax sar eax,5 add edx,eax mov eax,[prev1] sar eax,1 sub edx,eax mov eax,[prev1] sar eax,5 add edx,eax %%notfilter2 cmp dword[filter0],460 jne %%notfilter3 mov eax,[prev0] add edx,eax mov eax,[prev0] shl eax,1 add eax,[prev0] shl eax,2 add eax,[prev0] neg eax sar eax,7 add edx,eax mov eax,[prev1] sar eax,1 sub edx,eax mov eax,[prev1] sar eax,1 add eax,[prev1] sar eax,4 add edx,eax %%notfilter3 cmp edx,-32768 jnl %%notless mov edx,-32768 %%notless cmp edx,32767 jng %%notgreater mov edx,32767 %%notgreater mov eax,[prev0] mov [prev1],eax shl edx,1 movsx edx,dx mov [prev0],edx %endmacro %macro ProcessDynamicLowPass 0 mov ecx,[curvoice] mov edx, [Voice0Freq+ecx*4] cmp edx, dword 800000h ja %%DLPF ret %%DLPF lea ebx,[ecx*4] lea ebx,[ebx*4] lea ecx,[ecx*4] lea ebx,[ecx*2+ebx] lea ebx,[DLPFsamples+ebx*4] cmp byte[LowPassFilterType],3 je near %%DLPF_fir ;dynamic mov eax,[ebx+16*4] mov [ebx],eax mov eax,[ebx+17*4] mov [ebx+1*4],eax mov eax,[ebx+18*4] mov [ebx+2*4],eax mov eax,[ebx+19*4] mov [ebx+3*4],eax sub edi,32 movsx eax,word[edi+24] mov [ebx+16*4],eax movsx eax,word[edi+26] mov [ebx+17*4],eax movsx eax,word[edi+28] mov [ebx+18*4],eax movsx eax,word[edi+30] mov [ebx+19*4],eax mov ecx,16 shr edx,24 cmp dl,2 jle %%dlpf_by_2 cmp dl,3 jle %%dlpf_by_3 cmp dl,4 jle near %%dlpf_by_4 jmp %%dlpf_by_5 %%dlpf_by_2 mov eax,[ebx+4*4] jmp %%dlpf_by_2_loop ALIGN16 %%dlpf_by_2_loop movsx edx,word[edi] add eax,edx sar eax,1 mov [edi],ax mov eax,edx add edi,2 dec ecx jnz %%dlpf_by_2_loop ret %%dlpf_by_3 mov eax,[ebx+3*4] mov ebp,[ebx+4*4] jmp %%dlpf_by_3_loop ALIGN16 %%dlpf_by_3_loop movsx ebx,word[edi] add eax,ebx add eax,ebp mov edx,55555555h ; (1/3) imul edx mov [edi],dx add edi,2 mov eax,ebp mov ebp,ebx dec ecx jnz %%dlpf_by_3_loop ret %%dlpf_by_4 mov eax,[ebx+2*4] mov edx,[ebx+3*4] mov ebp,[ebx+4*4] jmp %%dlpf_by_4_loop ALIGN16 %%dlpf_by_4_loop movsx ebx,word[edi] add eax,ebx add eax,edx add eax,ebp sar eax,2 mov [edi],ax add edi,2 mov eax,edx mov edx,ebp mov ebp,ebx dec ecx jnz %%dlpf_by_4_loop ret %%dlpf_by_5 push ecx mov eax,[ebx+1*4] mov esi,[ebx+2*4] mov ebp,[ebx+3*4] mov ecx,[ebx+4*4] jmp %%dlpf_by_5_loop ALIGN16 %%dlpf_by_5_loop movsx ebx,word[edi] add eax,ebx add eax,esi add eax,ebp add eax,ecx mov edx,33333333h ; 1/5 imul edx mov [edi],dx add edi,2 mov eax,esi mov esi,ebp mov ebp,ecx mov ecx,ebx dec dword[esp] jnz %%dlpf_by_5_loop pop ecx ret %%DLPF_fir sub edi,byte 32 sub edx,0780000h ;ac - address calculation (see below) mov eax,[ebx+16*4] mov ecx,[ebx+17*4] mov [ebx],eax mov [ebx+1*4],ecx shr edx,18 ;ac mov eax,[ebx+18*4] and edx,3FF0h ;ac mov ecx,[ebx+19*4] mov [ebx+2*4],eax mov [ebx+3*4],ecx movq mm1,[edi] ;u1 (U-pipe marker) movq mm3,[edi+8] ;u2 punpcklwd mm0,mm1 movq mm5,[edi+16] ;u3 psrad mm0, 16 movq mm7,[edi+24] ;u4 punpckhwd mm1,mm1 movq [ebx+4*4],mm0 ;u5 psrad mm1, 16 movq mm4,[BRRreadahead] ;u6 punpcklwd mm0,mm3 movq [ebx+6*4],mm1 ;u7 psrad mm0, 16 punpckhwd mm3,mm3 ;u8 movq [ebx+8*4],mm0 ;u9 psrad mm3, 16 punpcklwd mm0,mm5 ;u10 movq [ebx+10*4],mm3 ;u11 psrad mm0, 16 punpckhwd mm5,mm5 ;u12 movq [ebx+12*4],mm0 ;u13 psrad mm5, 16 punpcklwd mm0,mm7 ;u14 movq [ebx+14*4],mm5 ;u15 psrad mm0, 16 punpckhwd mm7,mm7 ;u16 movq mm2,[fir_lut_co+edx] ;u17 psrad mm7, 16 punpcklwd mm6,mm4 ;u18 movq [ebx+16*4],mm0 ;u19 psrad mm6, 16 movq [ebx+18*4],mm7 ;u20 punpckhwd mm4,mm4 movq mm3,[fir_lut_co+edx+8] ;u21 psrad mm4, 16 movq [ebx+20*4],mm6 ;u22 movq [ebx+22*4],mm4 ;u23 mov ecx,16 jmp %%DLPF_fir_loop ALIGN16 ; output 2 samples per iteration %%DLPF_fir_loop movq mm0,[ebx] packssdw mm0,[ebx+8] movq mm4,[ebx+4] pmaddwd mm0,mm2 packssdw mm4,[ebx+12] movq mm1,[ebx+16] pmaddwd mm4,mm2 packssdw mm1,[ebx+24] movq mm5,[ebx+20] pmaddwd mm1,mm3 packssdw mm5,[ebx+28] pmaddwd mm5,mm3 paddd mm0,mm1 add ebx,byte 8 paddd mm4,mm5 movq mm1,mm0 movq mm5,mm4 psrlq mm0,32 psrlq mm4,32 paddd mm0,mm1 paddd mm4,mm5 punpckldq mm0,mm4 psrad mm0,14 packssdw mm0,mm0 sub ecx,byte 2 movd [edi],mm0 lea edi,[edi+4] jnz %%DLPF_fir_loop emms ret %endmacro section .bss NEWSYM curvoice, resd 1 section .text BRRDecode: mov [curvoice],ecx mov byte[lastbl],0 mov byte[loopbl],0 push ecx movzx eax,byte[esi] test al,01h jz .nolast mov byte[lastbl],1 test al,02h jz .nolast mov byte[loopbl],1 .nolast mov cl,al and al,0Ch inc esi mov ebx,[Filter+eax*2] shr cl,4 mov [filter0],ebx mov ebx,[Filter+eax*2+4] mov [bshift],cl mov [filter1],ebx mov byte[sampleleft],8 jmp .nextsample ALIGN16 .nextsample ProcessSample ProcessA mov [edi],dx ProcessSample ProcessB mov [edi+2],dx add edi,4 inc esi dec byte[sampleleft] jnz .nextsample cmp dword[DSPInterpolate],0 jnz .BRR_decode_ahead cmp byte[LowPassFilterType],2 jle near .no_dlpf mov eax,[curvoice] mov eax,[Voice0Freq+eax*4] cmp eax,800000h jb near .no_dlpf .BRR_decode_ahead push esi cmp byte[lastbl],1 jne .dlpf_fill cmp byte[loopbl],1 jne near .dlpf_clear mov eax,[curvoice] mov esi,[Voice0LoopPtr+eax*4] add esi,SPCRAM .dlpf_fill push dword[prev0] push dword[prev1] movzx eax,byte[esi] mov cl,al and al,0Ch inc esi mov ebx,[Filter+eax*2] shr cl,4 mov [filter0],ebx mov ebx,[Filter+eax*2+4] mov [bshift],cl mov [filter1],ebx ProcessSample ProcessA mov [BRRreadahead],dx ProcessSample ProcessB mov [BRRreadahead+2],dx inc esi ProcessSample ProcessA mov [BRRreadahead+4],dx ProcessSample ProcessB mov [BRRreadahead+6],dx pop dword[prev1] pop dword[prev0] pop esi jmp .no_dlpf .dlpf_clear xor eax,eax mov [BRRreadahead],eax mov [BRRreadahead+4],eax pop esi .no_dlpf pop ecx cmp byte[LowPassFilterType],1 ja .dlpf ret .dlpf ProcessDynamicLowPass section .data ALIGN32 ; Original Values NEWSYM EchoRateO dd 2,172,344,517,689,861,1033,1205,1378,1550,1722,1895,2067,2239,2412,2584 NEWSYM AttackRateO dd 45202,28665,16537,11025,7056,4189,2866,1764,1058,705,441,264,176,110,66,4 NEWSYM DecayRateO dd 13230,8158,4851,2697,2284,1212,815,407 NEWSYM SustainRateO dd 0FFFFFFFFh,418950,308700,265600,209475,154350,132300,103635,78277,65047 dd 51817,38587,31972,26460,19845,16537,13230,9702,8158,6504,4851,3879,2697 dd 2050,1572,1212,1014,815,606,407,202,125 NEWSYM SustainValueO db 15,31,47,63,79,95,111,127 NEWSYM IncreaseO dd 0FFFFFFFFh,45202,34177,28665,22050,16537,14332,11025,8489,7056,5622,4189 dd 3528,2866,2094,1764,1433,1058,882,705,529,441,352,264,220,176,132,110,88 dd 66,44,22 NEWSYM IncreaseBentO dd 0FFFFFFFFh,79100,59535,50160,38580,28665,25000,19250,14332,12127,9800,7320 dd 6160,4961,3650,3060,2425,1845,1540,1212,920,770,614,460,383,306,229,190,152 dd 113,75,36 NEWSYM DecreaseO dd 0FFFFFFFFh,45202,34177,28665,22050,16537,14332,11025,8489,7056,5622,4189 dd 3528,2866,2094,1764,1433,1058,882,705,529,441,352,264,220,176,132,110,88,66 dd 44,22 NEWSYM DecreaseRateExpO dd 0FFFFFFFFh,418950,308700,264600,209470,154350,132300,103635,78277,65047 dd 51817,38587,31972,26460,19845,16537,13230,9702,8158,6504,4851,4079,3197 dd 2425,1984,1653,1212,1014,815,606,407,198 SECTION .bss NoisePtr resd 1 ; used only in dspproc.asm SECTION .data ALIGN32 Filter dd 0,0,240,0,488,-240,460,-208 prev0 dd 0 ; previous value 1 prev1 dd 0 ; previous value 2 nextsamp dd 0 ; next sample filter0 dd 0 ; filter 0 filter1 dd 0 ; filter 1 bshift dd 0 sampleleft dd 0 ; 8 bytes/sample lastbl dd 0 ; Last block if = 1 loopbl dd 0 ; Loop if = 1 usenoisedata dd 0 VolumeTableD: db 0,3,6,9,12,15,17,18,19,21,22,23,24,24,26,28,30,31,33,35,36,38,40,41,43,45,46,48,49 db 51,52,54,56,57,58,60,61,63,64,66,67,68,70,71,72,74,75,76,78,79,80,81,82,84,85,86 db 87,88,89,90,91,92,93,94,96,96,97,98,99,100,101,102,103,104,105,106,106,107,108 db 109,110,110,111,112,112,113,114,114,115,116,116,117,117,118,118,119,120,120,120 db 121,121,122,122,123,123,123,124,124,124,125,125,125,126,126,126,126,126,127,127 db 127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,128,128 db 128,129,129,129,129,129,130,130,130,131,131,131,132,132,132,133,133,134,134,135 db 135,135,136,137,137,138,138,139,139,140,141,141,142,143,143,144,145,145,146,147 db 148,149,149,150,151,152,153,154,155,156,157,158,159,159,161,162,163,164,165,166 db 167,168,169,170,171,173,174,175,176,177,179,180,181,183,184,185,187,188,189,191 db 192,194,195,197,198,199,201,203,204,206,207,209,210,212,214,215,217,219,220,222 db 224,225,227,229,231,231,232,233,234,236,237,238,240,243,246,249,252,255 db 0,1,3,5,7,9,11,13,15,17,19,21,22,24,26,28,30,31,33,35,36,38,40,41,43,45,46,48,49 db 51,52,54,56,57,58,60,61,63,64,66,67,68,70,71,72,74,75,76,78,79,80,81,82,84,85,86 db 87,88,89,90,91,92,93,94,96,96,97,98,99,100,101,102,103,104,105,106,106,107,108 db 109,110,110,111,112,112,113,114,114,115,116,116,117,117,118,118,119,120,120,120 db 121,121,122,122,123,123,123,124,124,124,125,125,125,126,126,126,126,126,127,127 db 127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,128,128 db 128,129,129,129,129,129,130,130,130,131,131,131,132,132,132,133,133,134,134,135 db 135,135,136,137,137,138,138,139,139,140,141,141,142,143,143,144,145,145,146,147 db 148,149,149,150,151,152,153,154,155,156,157,158,159,159,161,162,163,164,165,166 db 167,168,169,170,171,173,174,175,176,177,179,180,181,183,184,185,187,188,189,191 db 192,194,195,197,198,199,201,203,204,206,207,209,210,212,214,215,217,219,220,222 db 224,225,227,229,231,233,234,236,238,240,242,244,246,248,250,252,254,255 NEWSYM VolumeTableb db 00h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh db 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h,2Ah,2Bh,2Ch,2Dh,2Eh,2Fh db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh db 40h,41h,42h,43h,44h,45h,46h,47h,48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh,4Fh db 50h,51h,52h,53h,54h,55h,56h,57h,58h,59h,5Ah,5Bh,5Ch,5Dh,5Eh,5Fh db 60h,61h,62h,63h,64h,65h,66h,67h,68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh,6Fh db 70h,71h,72h,73h,74h,75h,76h,77h,78h,79h,7Ah,7Bh,7Ch,7Dh,7Eh,7Fh db 7Fh,7Eh,7Dh,7Ch,7Bh,7Ah,79h,78h,77h,76h,75h,74h,73h,72h,71h,70h db 6Fh,6Eh,6Dh,6Ch,6Bh,6Ah,69h,68h,67h,66h,65h,64h,63h,62h,61h,60h db 5Fh,5Eh,5Dh,5Ch,5Bh,5Ah,59h,58h,57h,56h,55h,54h,53h,52h,51h,50h db 4Fh,4Eh,4Dh,4Ch,4Bh,4Ah,49h,48h,47h,46h,45h,44h,43h,42h,41h,40h db 3Fh,3Eh,3Dh,3Ch,3Bh,3Ah,39h,38h,37h,36h,35h,34h,33h,32h,31h,30h db 2Fh,2Eh,2Dh,2Ch,2Bh,2Ah,29h,28h,27h,26h,25h,24h,23h,22h,21h,20h db 1Fh,1Eh,1Dh,1Ch,1Bh,1Ah,19h,18h,17h,16h,15h,14h,13h,12h,11h,10h db 0Fh,0Eh,0Dh,0Ch,0Bh,0Ah,09h,08h,07h,06h,05h,04h,03h,02h,01h,00h ; appears to only be used in dspproc.asm ;VolumeTable: db 0,2,4,6,8,10,12,14,16,18 ; db 20,22,24,26,28,30,32,34,36,38 ; db 40,42,44,46,48,50,52,54,56,58 ; db 60,62,64,66,68,70,72,74,76,78 ; db 80,82,84,86,88,90,92,94,96,98 ; db 100,102,104,106,108,110,112,114,116,118 ; db 120,122,124,126,127,127,127,127,127,127 ;VolumeTable: db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127,127,127 ; db 127,127,127,127,127,127,127,127 ;VolumeTable db 1,1,2,3,4,5,6,7,8,9 ; db 10,11,12,13,14,15,16,17,18,19 ; db 20,21,22,23,24,25,26,27,28,29 ; db 30,31,32,33,34,35,36,37,38,39 ; db 40,41,42,43,44,45,46,47,48,49 ; db 50,51,52,53,54,55,46,57,58,59 ; db 60,61,62,63,64,65,56,67,68,69 ; db 70,71,72,73,74,75,66,77,78,79 ; db 80,81,82,83,84,85,76,87,88,89 ; db 90,91,92,93,94,95,86,97,98,99 ; db 100,101,102,103,104,105,106,107,108,109 ; db 110,111,112,113,114,115,116,117,118,119 ; db 120,121,122,123,124,125,126,127 ;VolumeTable db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1,1,1 ; db 1,1,1,1,1,1,1,1 SECTION .bss NEWSYM DSPBuffer, resd 320*4 ; The play buffer... NEWSYM EchoBuffer, resd 320*4 ; The play buffer... NEWSYM PModBuffer, resd 320*4 ; The play buffer... NEWSYM BRRBuffer, resb 32 ; The BRR Decode Buffer NEWSYM BRRPlace0, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp0, resd 1 ; Keep this 0 NEWSYM BRRPlace1, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp1, resd 1 ; Keep this 0 NEWSYM BRRPlace2, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp2, resd 1 ; Keep this 0 NEWSYM BRRPlace3, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp3, resd 1 ; Keep this 0 NEWSYM BRRPlace4, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp4, resd 1 ; Keep this 0 NEWSYM BRRPlace5, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp5, resd 1 ; Keep this 0 NEWSYM BRRPlace6, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp6, resd 1 ; Keep this 0 NEWSYM BRRPlace7, resd 1 ; Place in the BRRBuffer for Voice 0 NEWSYM BRRTemp7, resd 1 ; Keep this 0 NEWSYM Voice0Freq, resd 1 ; Frequency of Voice 0 (Delta Freq) NEWSYM Voice1Freq, resd 1 ; Frequency of Voice 1 (Delta Freq) NEWSYM Voice2Freq, resd 1 ; Frequency of Voice 2 (Delta Freq) NEWSYM Voice3Freq, resd 1 ; Frequency of Voice 3 (Delta Freq) NEWSYM Voice4Freq, resd 1 ; Frequency of Voice 4 (Delta Freq) NEWSYM Voice5Freq, resd 1 ; Frequency of Voice 5 (Delta Freq) NEWSYM Voice6Freq, resd 1 ; Frequency of Voice 6 (Delta Freq) NEWSYM Voice7Freq, resd 1 ; Frequency of Voice 7 (Delta Freq) NEWSYM Voice0Pitch, resw 1 ; Previous Pitch for Voice 0 NEWSYM Voice1Pitch, resw 1 ; Previous Pitch for Voice 1 NEWSYM Voice2Pitch, resw 1 ; Previous Pitch for Voice 2 NEWSYM Voice3Pitch, resw 1 ; Previous Pitch for Voice 3 NEWSYM Voice4Pitch, resw 1 ; Previous Pitch for Voice 4 NEWSYM Voice5Pitch, resw 1 ; Previous Pitch for Voice 5 NEWSYM Voice6Pitch, resw 1 ; Previous Pitch for Voice 6 NEWSYM Voice7Pitch, resw 1 ; Previous Pitch for Voice 7 NEWSYM Voice0Status, resb 1 ; 0=Not Playing 1=Playing NEWSYM Voice1Status, resb 1 NEWSYM Voice2Status, resb 1 NEWSYM Voice3Status, resb 1 NEWSYM Voice4Status, resb 1 NEWSYM Voice5Status, resb 1 NEWSYM Voice6Status, resb 1 NEWSYM Voice7Status, resb 1 NEWSYM Voice0Ptr, resd 1 ; Ptr to Next BRR Block to be played NEWSYM Voice1Ptr, resd 1 NEWSYM Voice2Ptr, resd 1 NEWSYM Voice3Ptr, resd 1 NEWSYM Voice4Ptr, resd 1 NEWSYM Voice5Ptr, resd 1 NEWSYM Voice6Ptr, resd 1 NEWSYM Voice7Ptr, resd 1 NEWSYM Voice0LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice1LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice2LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice3LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice4LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice5LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice6LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice7LoopPtr, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice0BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice1BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice2BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice3BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice4BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice5BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice6BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice7BufPtr, resd 1 ; Ptr to Buffer Block to be played NEWSYM SoundCounter, resd 1 ; Counter used for sound generation NEWSYM SoundCounter2, resd 1 ; Counter used for sound generation NEWSYM Voice0Prev0, resd 1 NEWSYM Voice1Prev0, resd 1 NEWSYM Voice2Prev0, resd 1 NEWSYM Voice3Prev0, resd 1 NEWSYM Voice4Prev0, resd 1 NEWSYM Voice5Prev0, resd 1 NEWSYM Voice6Prev0, resd 1 NEWSYM Voice7Prev0, resd 1 NEWSYM Voice0Prev1, resd 1 NEWSYM Voice1Prev1, resd 1 NEWSYM Voice2Prev1, resd 1 NEWSYM Voice3Prev1, resd 1 NEWSYM Voice4Prev1, resd 1 NEWSYM Voice5Prev1, resd 1 NEWSYM Voice6Prev1, resd 1 NEWSYM Voice7Prev1, resd 1 NEWSYM Voice0Loop, resb 1 NEWSYM Voice1Loop, resb 1 NEWSYM Voice2Loop, resb 1 NEWSYM Voice3Loop, resb 1 NEWSYM Voice4Loop, resb 1 NEWSYM Voice5Loop, resb 1 NEWSYM Voice6Loop, resb 1 NEWSYM Voice7Loop, resb 1 NEWSYM Voice0End, resb 1 NEWSYM Voice1End, resb 1 NEWSYM Voice2End, resb 1 NEWSYM Voice3End, resb 1 NEWSYM Voice4End, resb 1 NEWSYM Voice5End, resb 1 NEWSYM Voice6End, resb 1 NEWSYM Voice7End, resb 1 NEWSYM Voice0Noise, resb 1 NEWSYM Voice1Noise, resb 1 NEWSYM Voice2Noise, resb 1 NEWSYM Voice3Noise, resb 1 NEWSYM Voice4Noise, resb 1 NEWSYM Voice5Noise, resb 1 NEWSYM Voice6Noise, resb 1 NEWSYM Voice7Noise, resb 1 NEWSYM Voice0Volume, resb 1 NEWSYM Voice1Volume, resb 1 NEWSYM Voice2Volume, resb 1 NEWSYM Voice3Volume, resb 1 NEWSYM Voice4Volume, resb 1 NEWSYM Voice5Volume, resb 1 NEWSYM Voice6Volume, resb 1 NEWSYM Voice7Volume, resb 1 NEWSYM Voice0VolumeR, resb 1 NEWSYM Voice1VolumeR, resb 1 NEWSYM Voice2VolumeR, resb 1 NEWSYM Voice3VolumeR, resb 1 NEWSYM Voice4VolumeR, resb 1 NEWSYM Voice5VolumeR, resb 1 NEWSYM Voice6VolumeR, resb 1 NEWSYM Voice7VolumeR, resb 1 NEWSYM Voice0VolumeL, resb 1 NEWSYM Voice1VolumeL, resb 1 NEWSYM Voice2VolumeL, resb 1 NEWSYM Voice3VolumeL, resb 1 NEWSYM Voice4VolumeL, resb 1 NEWSYM Voice5VolumeL, resb 1 NEWSYM Voice6VolumeL, resb 1 NEWSYM Voice7VolumeL, resb 1 NEWSYM Voice0Env, resb 1 NEWSYM Voice1Env, resb 1 NEWSYM Voice2Env, resb 1 NEWSYM Voice3Env, resb 1 NEWSYM Voice4Env, resb 1 NEWSYM Voice5Env, resb 1 NEWSYM Voice6Env, resb 1 NEWSYM Voice7Env, resb 1 NEWSYM Voice0Out, resb 1 NEWSYM Voice1Out, resb 1 NEWSYM Voice2Out, resb 1 NEWSYM Voice3Out, resb 1 NEWSYM Voice4Out, resb 1 NEWSYM Voice5Out, resb 1 NEWSYM Voice6Out, resb 1 NEWSYM Voice7Out, resb 1 ; 1 Attack, 2 Decrease,3 Sustain, 0 Gain NEWSYM Voice0State, resb 1 NEWSYM Voice1State, resb 1 NEWSYM Voice2State, resb 1 NEWSYM Voice3State, resb 1 NEWSYM Voice4State, resb 1 NEWSYM Voice5State, resb 1 NEWSYM Voice6State, resb 1 NEWSYM Voice7State, resb 1 NEWSYM Voice0Time, resd 1 NEWSYM Voice1Time, resd 1 NEWSYM Voice2Time, resd 1 NEWSYM Voice3Time, resd 1 NEWSYM Voice4Time, resd 1 NEWSYM Voice5Time, resd 1 NEWSYM Voice6Time, resd 1 NEWSYM Voice7Time, resd 1 NEWSYM Voice0Attack, resd 1 NEWSYM Voice1Attack, resd 1 NEWSYM Voice2Attack, resd 1 NEWSYM Voice3Attack, resd 1 NEWSYM Voice4Attack, resd 1 NEWSYM Voice5Attack, resd 1 NEWSYM Voice6Attack, resd 1 NEWSYM Voice7Attack, resd 1 NEWSYM Voice0Decay, resd 1 NEWSYM Voice1Decay, resd 1 NEWSYM Voice2Decay, resd 1 NEWSYM Voice3Decay, resd 1 NEWSYM Voice4Decay, resd 1 NEWSYM Voice5Decay, resd 1 NEWSYM Voice6Decay, resd 1 NEWSYM Voice7Decay, resd 1 NEWSYM Voice0SustainL, resb 1 NEWSYM Voice1SustainL, resb 1 NEWSYM Voice2SustainL, resb 1 NEWSYM Voice3SustainL, resb 1 NEWSYM Voice4SustainL, resb 1 NEWSYM Voice5SustainL, resb 1 NEWSYM Voice6SustainL, resb 1 NEWSYM Voice7SustainL, resb 1 NEWSYM Voice0SustainL2, resb 1 NEWSYM Voice1SustainL2, resb 1 NEWSYM Voice2SustainL2, resb 1 NEWSYM Voice3SustainL2, resb 1 NEWSYM Voice4SustainL2, resb 1 NEWSYM Voice5SustainL2, resb 1 NEWSYM Voice6SustainL2, resb 1 NEWSYM Voice7SustainL2, resb 1 NEWSYM Voice0SustainR, resd 1 NEWSYM Voice1SustainR, resd 1 NEWSYM Voice2SustainR, resd 1 NEWSYM Voice3SustainR, resd 1 NEWSYM Voice4SustainR, resd 1 NEWSYM Voice5SustainR, resd 1 NEWSYM Voice6SustainR, resd 1 NEWSYM Voice7SustainR, resd 1 NEWSYM Voice0SustainR2, resd 1 NEWSYM Voice1SustainR2, resd 1 NEWSYM Voice2SustainR2, resd 1 NEWSYM Voice3SustainR2, resd 1 NEWSYM Voice4SustainR2, resd 1 NEWSYM Voice5SustainR2, resd 1 NEWSYM Voice6SustainR2, resd 1 NEWSYM Voice7SustainR2, resd 1 NEWSYM Voice0IncNumber, resd 1 NEWSYM Voice1IncNumber, resd 1 NEWSYM Voice2IncNumber, resd 1 NEWSYM Voice3IncNumber, resd 1 NEWSYM Voice4IncNumber, resd 1 NEWSYM Voice5IncNumber, resd 1 NEWSYM Voice6IncNumber, resd 1 NEWSYM Voice7IncNumber, resd 1 ; END formerly initialized to 1 junk NEWSYM Voice0SLenNumber, resd 1 NEWSYM Voice1SLenNumber, resd 1 NEWSYM Voice2SLenNumber, resd 1 NEWSYM Voice3SLenNumber, resd 1 NEWSYM Voice4SLenNumber, resd 1 NEWSYM Voice5SLenNumber, resd 1 NEWSYM Voice6SLenNumber, resd 1 NEWSYM Voice7SLenNumber, resd 1 NEWSYM Voice0SEndNumber, resd 1 NEWSYM Voice1SEndNumber, resd 1 NEWSYM Voice2SEndNumber, resd 1 NEWSYM Voice3SEndNumber, resd 1 NEWSYM Voice4SEndNumber, resd 1 NEWSYM Voice5SEndNumber, resd 1 NEWSYM Voice6SEndNumber, resd 1 NEWSYM Voice7SEndNumber, resd 1 NEWSYM Voice0SEndLNumber, resd 1 NEWSYM Voice1SEndLNumber, resd 1 NEWSYM Voice2SEndLNumber, resd 1 NEWSYM Voice3SEndLNumber, resd 1 NEWSYM Voice4SEndLNumber, resd 1 NEWSYM Voice5SEndLNumber, resd 1 NEWSYM Voice6SEndLNumber, resd 1 NEWSYM Voice7SEndLNumber, resd 1 ; MORE junk that was initialized to 1 NEWSYM Voice0DecreaseNumber, resd 1 NEWSYM Voice1DecreaseNumber, resd 1 NEWSYM Voice2DecreaseNumber, resd 1 NEWSYM Voice3DecreaseNumber, resd 1 NEWSYM Voice4DecreaseNumber, resd 1 NEWSYM Voice5DecreaseNumber, resd 1 NEWSYM Voice6DecreaseNumber, resd 1 NEWSYM Voice7DecreaseNumber, resd 1 NEWSYM Voice0EnvInc, resd 1 NEWSYM Voice1EnvInc, resd 1 NEWSYM Voice2EnvInc, resd 1 NEWSYM Voice3EnvInc, resd 1 NEWSYM Voice4EnvInc, resd 1 NEWSYM Voice5EnvInc, resd 1 NEWSYM Voice6EnvInc, resd 1 NEWSYM Voice7EnvInc, resd 1 ; END initialized to 1 junk ; 0 = Direct, 1 = Increase, 2 = Increase2, 3 = Decrease, 4 = Decrease2 NEWSYM Voice0GainType, resb 1 NEWSYM Voice1GainType, resb 1 NEWSYM Voice2GainType, resb 1 NEWSYM Voice3GainType, resb 1 NEWSYM Voice4GainType, resb 1 NEWSYM Voice5GainType, resb 1 NEWSYM Voice6GainType, resb 1 NEWSYM Voice7GainType, resb 1 ; YET ANOTHER block that was initialized to 1 NEWSYM Voice0GainTime, resd 1 NEWSYM Voice1GainTime, resd 1 NEWSYM Voice2GainTime, resd 1 NEWSYM Voice3GainTime, resd 1 NEWSYM Voice4GainTime, resd 1 NEWSYM Voice5GainTime, resd 1 NEWSYM Voice6GainTime, resd 1 NEWSYM Voice7GainTime, resd 1 NEWSYM useless, resd 2 ;This is needed because of the stupid ;alignment dependency in the savestates. NEWSYM Freqdisp, resd 1 NEWSYM SBRateb, resd 1 NEWSYM Voice0Looped, resb 1 NEWSYM Voice1Looped, resb 1 NEWSYM Voice2Looped, resb 1 NEWSYM Voice3Looped, resb 1 NEWSYM Voice4Looped, resb 1 NEWSYM Voice5Looped, resb 1 NEWSYM Voice6Looped, resb 1 NEWSYM Voice7Looped, resb 1 VoiceNoiseEn resb 8 NEWSYM GainDecBendDataPos, resb 8 NEWSYM GainDecBendDataTime, resd 8 NEWSYM GainDecBendDataDat, resb 8 NEWSYM AdsrBlocksLeft, resb 8 NEWSYM AdsrNextTimeDepth, resd 8 TimeTemp resd 8 ; 104 bytes IncNTemp resd 8 EnvITemp resd 8 StatTemp resd 2 NEWSYM FutureExpand, resb 44 ; pharos equ hack *sigh* marksave: NEWSYM echoon0, resb 1 NEWSYM echoon1, resb 1 NEWSYM echoon2, resb 1 NEWSYM echoon3, resb 1 NEWSYM echoon4, resb 1 NEWSYM echoon5, resb 1 NEWSYM echoon6, resb 1 NEWSYM echoon7, resb 1 NEWSYM GlobalVL, resd 1 NEWSYM GlobalVR, resd 1 NEWSYM EchoVL, resd 1 NEWSYM EchoVR, resd 1 NEWSYM EchoT, resd 1 NEWSYM Voice0Volumee, resb 1 NEWSYM Voice1Volumee, resb 1 NEWSYM Voice2Volumee, resb 1 NEWSYM Voice3Volumee, resb 1 NEWSYM Voice4Volumee, resb 1 NEWSYM Voice5Volumee, resb 1 NEWSYM Voice6Volumee, resb 1 NEWSYM Voice7Volumee, resb 1 NEWSYM Voice0VolumeRe, resb 1 NEWSYM Voice1VolumeRe, resb 1 NEWSYM Voice2VolumeRe, resb 1 NEWSYM Voice3VolumeRe, resb 1 NEWSYM Voice4VolumeRe, resb 1 NEWSYM Voice5VolumeRe, resb 1 NEWSYM Voice6VolumeRe, resb 1 NEWSYM Voice7VolumeRe, resb 1 NEWSYM Voice0VolumeLe, resb 1 NEWSYM Voice1VolumeLe, resb 1 NEWSYM Voice2VolumeLe, resb 1 NEWSYM Voice3VolumeLe, resb 1 NEWSYM Voice4VolumeLe, resb 1 NEWSYM Voice5VolumeLe, resb 1 NEWSYM Voice6VolumeLe, resb 1 NEWSYM Voice7VolumeLe, resb 1 NEWSYM FIRTAPVal0, resd 1 NEWSYM FIRTAPVal1, resd 1 NEWSYM FIRTAPVal2, resd 1 NEWSYM FIRTAPVal3, resd 1 NEWSYM FIRTAPVal4, resd 1 NEWSYM FIRTAPVal5, resd 1 NEWSYM FIRTAPVal6, resd 1 NEWSYM FIRTAPVal7, resd 1 NEWSYM CEchoPtr, resd 1 NEWSYM EchoFB, resd 1 NEWSYM Voice0Ptre, resd 1 ; Ptr to Next BRR Block to be played NEWSYM Voice1Ptre, resd 1 NEWSYM Voice2Ptre, resd 1 NEWSYM Voice3Ptre, resd 1 NEWSYM Voice4Ptre, resd 1 NEWSYM Voice5Ptre, resd 1 NEWSYM Voice6Ptre, resd 1 NEWSYM Voice7Ptre, resd 1 NEWSYM Voice0LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice1LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice2LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice3LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice4LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice5LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice6LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice7LoopPtre, resd 1 ; Ptr to Loop BRR Block to be played NEWSYM Voice0BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice1BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice2BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice3BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice4BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice5BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice6BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM Voice7BufPtre, resd 1 ; Ptr to Buffer Block to be played NEWSYM CurFiltPtr, resd 1 NEWSYM FiltLoop, resd 16 NEWSYM FiltLoopR, resd 16 NEWSYM SoundLooped0, resb 1 NEWSYM SoundLooped1, resb 1 NEWSYM SoundLooped2, resb 1 NEWSYM SoundLooped3, resb 1 NEWSYM SoundLooped4, resb 1 NEWSYM SoundLooped5, resb 1 NEWSYM SoundLooped6, resb 1 NEWSYM SoundLooped7, resb 1 NEWSYM UniqueSoundv, resd 1 NEWSYM Voice0FirstBlock, resb 1 NEWSYM Voice1FirstBlock, resb 1 NEWSYM Voice2FirstBlock, resb 1 NEWSYM Voice3FirstBlock, resb 1 NEWSYM Voice4FirstBlock, resb 1 NEWSYM Voice5FirstBlock, resb 1 NEWSYM Voice6FirstBlock, resb 1 NEWSYM Voice7FirstBlock, resb 1 marksave2: SECTION .data ALIGN32 NEWSYM MaxEcho, dd 172 ; |AR Time 0 to 1|DR|Time 1 to SL|SL|Ratio| SR Time 1to 1/10| ;--------------------------------------------------------------------- ; |0 | 4.1 sec | 0| 1.2 sec | 0| 1/8 | 0| INF |10|1.2 sec ; |1 | 2.6 | 1| 740 msec | 1| 2/8 | 1| 38 |11|880 msec ; |2 | 1.5 | 2| 440 | 2| 3/8 | 2| 28 |12|740 ; |3 | 1.0 | 3| 290 | 3| 4/8 | 3| 24 |13|590 ; |4 |640 msec | 4| 180 | 4| 5/8 | 4| 19 |14|440 ; |5 |380 | 5| 110 | 5| 6/8 | 5| 14 |15|370 ; |6 |260 | 6| 74 | 6| 7/8 | 6| 12 |16|290 ; |7 |160 | 7| 37 | 7| 1 | 7| 9.4 |17|220 ; |8 | 96 -------------------------- 8| 7.1 |18|180 ; |9 | 64 | | 9| 5.9 |19|150 ; |A | 40 | | A| 4.7 |1A|110 ; |B | 24 | | B| 3.5 |1B| 92 ; |C | 16 | | C| 2.9 |1C| 74 ; |D | 10 | | D| 2.4 |1D| 55 ; |E | 6 | | E| 1.8 |1E| 37 ; |F | 0 | | F| 1.5 |1F| 28 ; --------------- --------------------------- ; All the values are in 1/11025 NEWSYM EchoRate dd 2,172,344,517,689,861,1033,1205,1378,1550,1722,1895, dd 2067,2239,2412,2584 NEWSYM AttackRate dd 45202,28665,16537,11025,7056,4189,2866,1764,1058,705,441 dd 264,176,110,66,4 NEWSYM DecayRate dd 13230,8158,4851,2697,1984,815,407,125 NEWSYM SustainRate dd 0FFFFFFFFh,418950,308700,265600,209475,154350,132300 dd 103635,78277,65047,51817,38587,31972,26460,19845,16537 dd 13230,9702,8158,6504,4851,3879,2697,1450 dd 1212,1014,815,606,407,202,125,70 NEWSYM SustainValue db 15,31,47,63,79,95,111,127 NEWSYM Increase dd 0FFFFFFFFh,45202,34177,28665,22050,16537,14332,11025 dd 8489,7056,5622,4189,3528,2866,2094,1764 dd 1433,1058,882,705,529,441,352,264 dd 220,176,132,110,88,66,44,22 NEWSYM IncreaseBent dd 0FFFFFFFFh,79100,59535,50160,38580,28665,25000,19250 dd 14332,12127,9800,7320,6160,4961,3650,3060 dd 2425,1845,1540,1212,920,770,614,460 dd 383,306,229,190,152,113,75,36 NEWSYM Decrease dd 0FFFFFFFFh,45202,34177,28665,22050,16537,14332,11025 dd 8489,7056,5622,4189,3528,2866,2094,1764 dd 1433,1058,882,705,529,441,352,264 dd 220,176,132,110,88,66,44,22 NEWSYM DecreaseRateExp dd 0FFFFFFFFh,418950,308700,264600,209470,154350,132300,103635 dd 78277,65047,51817,38587,31972,26460,19845,16537 dd 13230,9702,8158,6504,4851,4079,3197,2425 dd 1984,1653,1212,1014,815,606,407,198 GainDecBendData db 118,110,102,95,89,83,77,72,67,62,58,54,50,47,44,41,38,35 db 33,30,28,26,24,23,21,20,18,17,16,15,14,13 db 12,11,10,9,9,8,7,7,6,6,5,5,5,4,4,4,3,3,3,3,2,2,2,2,2,1,1,1,1 db 255 AdsrBendData db 122,118,114,110,106,102,99,95,92,89,86,83,80,77,74,72,69,67 db 64,62,60,58,56,54,52,50,48,47,45,44,42,41,39,38,36,35,34,33 db 32,30,29,28,27,26,25,24,24,23,22,21,20,20,19,18,18,17,16,16 db 15,15,14,14,13,13,12,12,11,11,11,10,10,9,9,9,8,8,8,7,7,7,7,6 db 6,6,6,5,5,5,5,5,4,4,4,4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2 db 2,2,1,1,1,1,1,1,1,1,1,1,1,1,255 NEWSYM AdsrSustLevLoc, db 58,39,27,19,13,8,3,1 dspsave equ marksave-BRRBuffer dspconvb equ marksave-Voice0Freq dspsave2 equ marksave2-echoon0 NEWSYM PHdspsave, dd dspsave NEWSYM PHdspconvb, dd dspconvb NEWSYM PHdspsave2, dd dspsave2 SECTION .bss spc700temp resd 2 SECTION .text %macro VoiceStart 2 mov byte[Voice0FirstBlock+%1],1 mov dword[spc700temp+4],0 cmp byte[Voice0Status+%1],0 je .moveon push eax mov eax,[Voice0EnvInc+%1*4] mov [spc700temp],eax mov dword[spc700temp+4],1 pop eax .moveon mov byte[Voice0Status+%1],0 push eax push ebx push edx mov eax,[DSPMem+%1*10h] cmp al,40h jae .noskip cmp ah,40h jae .noskip mov eax,[DSPMem+%1*10h+4] cmp eax,0050FF07h jne .noskip cmp byte[DSPMem+5Dh],6 jne .noskip mov byte[DSPMem+%1*10h],15 mov byte[DSPMem+%1*10h+1],15 pop edx pop ebx pop eax ret .noskip ; Check if adsr or gain test byte[DSPMem+05h+%1*10h],80h jz near .gain ; Calculate attack rate movzx eax,byte[DSPMem+05h+%1*10h] and al,0Fh cmp eax,0Fh je .skipattack mov ebx,[AttackRate+eax*4] mov [Voice0Time+%1*4],ebx xor edx,edx mov eax,127*65536 div ebx mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],8 mov dword[Voice0EnvInc+%1*4],0 mov byte[GainDecBendDataDat+%1],7Fh mov byte[Voice0Status+%1],1 jmp .finproc .skipattack mov al,[DSPMem+05h+%1*10h] shr al,4 and eax,07h mov edx,[DecayRate+eax*4] movzx eax,byte[DSPMem+06h+%1*10h] and al,1Fh mov ebx,[SustainRate+eax*4] cmp edx,ebx jae near .decayover ; ebx = total sustain time movzx eax,byte[DSPMem+06h+%1*10h] shr al,5 mov al,[AdsrSustLevLoc+eax] ; traverse through al entries in edx time ; then through 64-al entries in ebx-edx time mov [AdsrBlocksLeft+%1],al sub ebx,edx push ebx push eax mov ebx,eax mov eax,edx xor edx,edx div ebx mov [Voice0Time+%1*4],eax mov [GainDecBendDataTime+%1*4],eax pop eax pop ebx mov edx,ebx mov ebx,64 sub bl,al mov eax,edx xor edx,edx div ebx mov [AdsrNextTimeDepth+%1*4],eax mov dword[Voice0EnvInc+%1*4],007FFFFFh mov ebx,[Voice0Time+%1*4] xor edx,edx mov eax,127*65536 sub eax,122*65536 mov byte[GainDecBendDataPos+%1],0 mov byte[GainDecBendDataDat+%1],127 div ebx neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],9 mov byte[Voice0Status+%1],1 jmp .finproc .decayover sub edx,ebx push ebx mov eax,edx movzx ebx,byte[DSPMem+06h+%1*10h] shr bl,5 xor bl,07h mul ebx mov ebx,7 div ebx pop ebx add ebx,eax mov dword[Voice0EnvInc+%1*4],007FFFFFh shr ebx,5 mov [Voice0Time+%1*4],ebx mov [GainDecBendDataTime+%1*4],ebx xor edx,edx mov eax,127*65536 sub eax,118*65536 mov byte[GainDecBendDataPos+%1],0 mov byte[GainDecBendDataDat+%1],127 div ebx neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],7 mov byte[Voice0Status+%1],1 jmp .finproc .gain test byte[DSPMem+07h+%1*10h],80h jz near .Direct test byte[DSPMem+07h+%1*10h],40h jnz near .Increase test byte[DSPMem+07h+%1*10h],20h jz .LinearDec movzx eax,byte[DSPMem+07h+%1*10h] and al,1Fh mov ebx,[DecreaseRateExp+eax*4] mov dword[Voice0EnvInc+%1*4],007FFFFFh shr ebx,5 mov [Voice0Time+%1*4],ebx mov [GainDecBendDataTime+%1*4],ebx xor edx,edx mov eax,127*65536 sub eax,118*65536 mov byte[GainDecBendDataPos+%1],0 mov byte[GainDecBendDataDat+%1],127 div ebx neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],7 mov byte[Voice0Status+%1],1 jmp .finproc .LinearDec movzx eax,byte[DSPMem+07h+%1*10h] and al,1Fh mov ebx,[Decrease+eax*4] mov dword[Voice0EnvInc+%1*4],007FFFFFh mov [Voice0Time+%1*4],ebx xor edx,edx mov eax,127*65536 div ebx neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],5 mov byte[Voice0Status+%1],1 jmp .finproc .Increase test byte[DSPMem+07h+%1*10h],20h jz .LinearInc movzx eax,byte[DSPMem+07h+%1*10h] and al,1Fh mov ebx,[Increase+eax*4] mov dword[Voice0EnvInc+%1*4],0 mov [Voice0Time+%1*4],ebx xor edx,edx mov eax,127*65536 div ebx mov [Voice0IncNumber+%1*4],eax mov ebx,[Voice0Time+%1*4] mov eax,ebx shr eax,2 sub ebx,eax dec ebx mov [Voice0Time+%1*4],ebx mov byte[Voice0State+%1],6 mov byte[Voice0Status+%1],1 jmp .finproc .LinearInc movzx eax,byte[DSPMem+07h+%1*10h] and al,1Fh mov ebx,[Increase+eax*4] mov dword[Voice0EnvInc+%1*4],0 mov [Voice0Time+%1*4],ebx xor edx,edx mov eax,127*65536 div ebx mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],3 mov byte[Voice0Status+%1],1 jmp .finproc .Direct mov al,[DSPMem+07h+%1*10h] and al,7Fh mov dword[Voice0EnvInc+%1*4],0 mov [Voice0EnvInc+%1*4+2],al mov dword[Voice0Time+%1*4],0FFFFFFFFh mov dword[Voice0IncNumber+%1*4],0 mov byte[Voice0State+%1],4 mov byte[Voice0Status+%1],1 jmp .finproc .finproc cmp dword[spc700temp+4],0 je .skipall mov eax,[Voice0Time+%1*4] mov [TimeTemp+%1*4],eax mov eax,[Voice0IncNumber+%1*4] mov [IncNTemp+%1*4],eax mov eax,[Voice0EnvInc+%1*4] mov [EnvITemp+%1*4],eax mov al,[Voice0State+%1] mov [StatTemp+%1],al mov eax,[spc700temp] mov [Voice0EnvInc+%1*4],eax mov dword[Voice0Time+%1*4],127 shr eax,7 neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],210 jmp .novoice .skipall mov ax,[DSPMem+02h+%1*10h] cmp word[Voice0Pitch+%1*2],ax je .nopitchc mov [Voice0Pitch+%1*2],ax And EAX, 03FFFh Mul dword[dspPAdj] ShRD EAX,EDX,8 mov [Voice0Freq+%1*4],eax ; modpitch .nopitchc mov dword[BRRPlace0+%1*8],10000000h mov dword[Voice0Prev0+%1*4],0 mov dword[Voice0Prev1+%1*4],0 mov byte[Voice0End+%1],0 mov byte[Voice0Loop+%1],0 mov dword[PSampleBuf+%1*24*4+16*4],0 mov dword[PSampleBuf+%1*24*4+17*4],0 mov dword[PSampleBuf+%1*24*4+18*4],0 mov byte[SoundLooped0+%1],0 mov byte[echoon0+%1],0 test byte[DSPMem+4Dh],%2 jz .noecho mov byte[echoon0+%1],1 .noecho .novoice mov edx,[DSPMem+04h+%1*10h] and edx,0ffh shl edx,2 xor eax,eax mov ah,[DSPMem+5Dh] add ax,dx movzx ebx,word[SPCRAM+eax] mov [Voice0Ptr+%1*4],ebx movzx ebx,word[SPCRAM+eax+2] mov [Voice0LoopPtr+%1*4],ebx pop edx pop ebx pop eax ret %endmacro NEWSYM Voice0Start VoiceStart 0,1 ret NEWSYM Voice1Start VoiceStart 1,2 ret NEWSYM Voice2Start VoiceStart 2,4 ret NEWSYM Voice3Start VoiceStart 3,8 ret NEWSYM Voice4Start VoiceStart 4,16 ret NEWSYM Voice5Start VoiceStart 5,32 ret NEWSYM Voice6Start VoiceStart 6,64 ret NEWSYM Voice7Start VoiceStart 7,128 ret ; mov byte[Voice0Env+%1],3Fh ; jmp .Adsr ; Pass both voice # and next function name %macro VoiceStarterM 1 cmp al,%1 jne near %%nope push edx mov eax,[TimeTemp+%1*4] mov [Voice0Time+%1*4],eax mov eax,[IncNTemp+%1*4] mov [Voice0IncNumber+%1*4],eax mov eax,[EnvITemp+%1*4] mov [Voice0EnvInc+%1*4],eax mov al,[StatTemp+%1] mov [Voice0State+%1],al mov byte[SoundLooped0+%1],0 mov byte[echoon0+%1],0 test byte[DSPMem+4Dh],1 << %1 jz %%noecho mov byte[echoon0+%1],1 %%noecho mov edx,[DSPMem+04h+%1*10h] and edx,0ffh shl edx,2 xor eax,eax mov ah,[DSPMem+5Dh] add ax,dx movzx ebx,word[SPCRAM+eax] mov [Voice0Ptr+%1*4],ebx movzx ebx,word[SPCRAM+eax+2] mov [Voice0LoopPtr+%1*4],ebx mov ax,[DSPMem+02h+%1*10h] cmp word[Voice0Pitch+%1*2],ax je %%nopitchc mov [Voice0Pitch+%1*2],ax And EAX, 03FFFh Mul dword[dspPAdj] ShRD EAX,EDX,8 mov [Voice0Freq+%1*4],eax ; modpitch %%nopitchc mov dword[BRRPlace0+%1*8],10000000h mov dword[Voice0Prev0+%1*4],0 mov dword[Voice0Prev1+%1*4],0 mov byte[Voice0End+%1],0 mov byte[Voice0Loop+%1],0 mov dword[PSampleBuf+%1*24*4+16*4],0 mov dword[PSampleBuf+%1*24*4+17*4],0 mov dword[PSampleBuf+%1*24*4+18*4],0 pop edx ret %%nope %endmacro NEWSYM VoiceStarter VoiceStarterM 0 VoiceStarterM 1 VoiceStarterM 2 VoiceStarterM 3 VoiceStarterM 4 VoiceStarterM 5 VoiceStarterM 6 VoiceStarterM 7 ret section .bss NEWSYM NoiseInc, resd 1 NEWSYM NoisePointer, resd 1 NEWSYM LastNoise, resd 1 section .text %macro CalculatePMod 1 movzx eax,byte[PModBuffer+esi] mov ebx,[Voice0Freq+%1*4] add al,80h mul ebx shr eax,7 shl edx,25 or eax,edx mov ebx,eax %endmacro %macro ProcessPMod 1 push ecx push edx mov cl,[Voice0EnvInc+%1*4+2] mov ax,[edi+edx*2] imul cx shr ax,7 add dl,dl or ah,dl mov [PModBuffer+esi],ah pop edx pop ecx %endmacro section .bss powhack resd 1 paramhack resd 4 section .text ALIGN16 NEWSYM NonEchoMonoPM %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volume+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0Volume+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1 mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1 .PMod ProcessPMod ebp .NotNoise1 mov ax,[edi+edx*2] .AfterNoise1 imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [DSPBuffer+esi*2],eax add esi,2 CalculatePMod ebp %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM NonEchoStereoPM %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeR+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0VolumeR+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1b mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1b .PMod ProcessPMod ebp .NotNoise1b mov ax,[edi+edx*2] .AfterNoise1b movsx eax,ax push eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeL+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeL+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif add esi,2 mov cx,[VolumeConvTable+eax*2] pop eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4-4],eax CalculatePMod ebp %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM EchoMonoPM %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volume+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0Volume+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1 mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1 .PMod ProcessPMod ebp .NotNoise1 mov ax,[edi+edx*2] .AfterNoise1 movsx eax,ax push eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [DSPBuffer+esi*2],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volumee+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0Volumee+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] pop eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [EchoBuffer+esi*2],eax add esi,2 CalculatePMod ebp %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM EchoStereoPM %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeR+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0VolumeR+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1b mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1b .PMod ProcessPMod ebp .NotNoise1b mov ax,[edi+edx*2] .AfterNoise1b movsx eax,ax mov ebx,eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeRe+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov cx,[ds:VolumeConvTable+eax*2] %else movzx eax,byte[Voice0VolumeRe+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov cx,[VolumeConvTable+eax*2] %endif mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [EchoBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeL+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeL+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4+4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeLe+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeLe+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax %ifdef __MSDOS__ mov ebx,[ds:Voice0Freq+ebp*4] %else mov ebx,[Voice0Freq+ebp*4] %endif add [EchoBuffer+esi*4+4],eax add esi,2 CalculatePMod ebp %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ; interpolation is only done when the rate < mixRate, so ebx always contains ; less than 100000h. SECTION .data ALIGN16 NEWSYM DSPInterpolate, dd 0 SECTION .text ALIGN16 DSPInterpolate_4 push edi %ifdef __MSDOS__ lea edi,[ds:ebp*2+ebp] %else lea edi,[ebp*2+ebp] %endif shl edi,5 %ifdef __MSDOS__ movzx ebx,byte[ds:BRRPlace0+ebp*8+2] %else movzx ebx,byte[BRRPlace0+ebp*8+2] %endif mov ax,[PSampleBuf+edx*4+8+edi] mov dx,[DSPInterP+ebx*2+256*6] imul dx shl edx,16 mov dx,ax %ifdef __MSDOS__ mov eax,[ds:BRRPlace0+ebp*8+3] %else mov eax,[BRRPlace0+ebp*8+3] %endif mov ecx,edx mov ax,[PSampleBuf+eax*4+12+edi] mov dx,[DSPInterP+ebx*2+256*4] imul dx shl edx,16 mov dx,ax %ifdef __MSDOS__ mov eax,[ds:BRRPlace0+ebp*8+3] %else mov eax,[BRRPlace0+ebp*8+3] %endif add ecx,edx mov ax,[PSampleBuf+eax*4+16+edi] mov dx,[DSPInterP+ebx*2+256*2] imul dx shl edx,16 mov dx,ax %ifdef __MSDOS__ mov eax,[ds:BRRPlace0+ebp*8+3] %else mov eax,[BRRPlace0+ebp*8+3] %endif add ecx,edx mov ax,[PSampleBuf+eax*4+20+edi] mov dx,[DSPInterP+ebx*2] imul dx shl edx,16 mov dx,ax add ecx,edx sar ecx,11 cmp ecx, -32768 jge .sat1 mov ecx, -32768 .sat1 cmp ecx, 32767 jle .sat2 mov ecx, 32767 .sat2 mov ax,cx pop edi ret ALIGN16 DSPInterpolate_8: push edi %ifdef __MSDOS__ lea edi,[ds:ebp*2+ebp] %else lea edi,[ebp*2+ebp] %endif shl edi,5 %ifdef __MSDOS__ mov ebx,[ds:BRRPlace0+ebp*8] movzx eax,byte[ds:BRRPlace0+ebp*8+3] %else mov ebx,[BRRPlace0+ebp*8] movzx eax,byte[BRRPlace0+ebp*8+3] %endif shl eax,2 and ebx,0FFFFFFh add ebx,1000h shr ebx,9 and ebx,0FFF0h add ebx,fir_lut movq mm0,[eax+PSampleBuf+edi] packssdw mm0,[eax+PSampleBuf+edi+8] movq mm1,[eax+PSampleBuf+edi+16] packssdw mm1,[eax+PSampleBuf+edi+24] movq mm2,[ebx] movq mm3,[ebx+8] pmaddwd mm0,mm2 pmaddwd mm1,mm3 paddd mm0,mm1 movq mm1,mm0 psrlq mm0, 32 paddd mm0, mm1 psrad mm0, 14 packssdw mm0, mm0 movd eax, mm0 movsx eax, ax .end pop edi ret ALIGN16 DSPInterpolate_4_mmx: push edi %ifdef __MSDOS__ lea edi,[ds:ebp*2+ebp] %else lea edi,[ebp*2+ebp] %endif shl edi,5 %ifdef __MSDOS__ movzx eax,byte[ds:BRRPlace0+ebp*8+2] %else movzx eax,byte[BRRPlace0+ebp*8+2] %endif movq mm0,[edx*4+PSampleBuf+edi+8] packssdw mm0,[edx*4+PSampleBuf+edi+16] movq mm1,[DSPInterP+eax*8] pmaddwd mm0,mm1 movq mm1, mm0 psrlq mm0, 32 paddd mm0, mm1 psrad mm0, 11 packssdw mm0, mm0 movd eax, mm0 emms pop edi ret ALIGN16 NEWSYM NonEchoMonoInterpolated %ifdef __MSDOS__ mov edx,[ds:BRRPlace0+ebp*8+3] %else mov edx,[BRRPlace0+ebp*8+3] %endif cmp byte[UniqueSoundv],0 je .NotNoise1 mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1 .PMod ProcessPMod ebp .NotNoise1 call [DSPInterpolate] ;ebp ; mov edx,[BRRPlace0+ebp*8+3] ; mov ax,[edi+edx*2] ; DSPInterP (Samp*i+Samp2*i2+Samp3*i3+Samp4*i3)>>11 .AfterNoise1 %ifdef __MSDOS__ movzx edx,byte[ds:Voice0Volume+ebp] mov dh,[ds:Voice0EnvInc+ebp*4+2] mov ebx,[ds:Voice0Freq+ebp*4] %else movzx edx,byte[Voice0Volume+ebp] mov dh,[Voice0EnvInc+ebp*4+2] mov ebx,[Voice0Freq+ebp*4] %endif mov cx,[VolumeConvTable+edx*2] imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [DSPBuffer+esi*2],eax add esi,2 %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM EchoMonoInterpolated %ifdef __MSDOS__ mov edx,[ds:BRRPlace0+ebp*8+3] %else mov edx,[BRRPlace0+ebp*8+3] %endif cmp byte[UniqueSoundv],0 je .NotNoise1 mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1 .PMod ProcessPMod ebp .NotNoise1 call [DSPInterpolate] ;ebp ; mov edx,[BRRPlace0+ebp*8+3] ; mov ax,[edi+edx*2] .AfterNoise1 %ifdef __MSDOS__ movzx edx,byte[ds:Voice0Volume+ebp] mov dh,[ds:Voice0EnvInc+ebp*4+2] mov ebx,[ds:Voice0Freq+ebp*4] %else movzx edx,byte[Voice0Volume+ebp] mov dh,[Voice0EnvInc+ebp*4+2] mov ebx,[Voice0Freq+ebp*4] %endif mov cx,[VolumeConvTable+edx*2] %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx ; *** %else add [BRRPlace0+ebp*8],ebx ; *** %endif add esi,2 ; *** mov ebx,eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [DSPBuffer+esi*2-4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volumee+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0Volumee+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [EchoBuffer+esi*2-4],eax ret ALIGN16 NEWSYM NonEchoStereoInterpolated %ifdef __MSDOS__ mov edx,[ds:BRRPlace0+ebp*8+3] %else mov edx,[BRRPlace0+ebp*8+3] %endif cmp byte[UniqueSoundv],0 je .NotNoise1b mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1b .PMod ProcessPMod ebp .NotNoise1b call [DSPInterpolate]; %1 .AfterNoise1b %ifdef __MSDOS__ movzx edx,byte[ds:Voice0VolumeR+ebp] mov dh,[ds:Voice0EnvInc+ebp*4+2] mov ebx,[ds:Voice0Freq+ebp*4] %else movzx edx,byte[Voice0VolumeR+ebp] mov dh,[Voice0EnvInc+ebp*4+2] mov ebx,[Voice0Freq+ebp*4] %endif mov cx,[VolumeConvTable+edx*2] movsx eax,ax push eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeL+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeL+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif add esi,2 mov cx,[VolumeConvTable+eax*2] pop eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4-4],eax %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM EchoStereoInterpolated %ifdef __MSDOS__ mov edx,[ds:BRRPlace0+ebp*8+3] %else mov edx,[BRRPlace0+ebp*8+3] %endif cmp byte[UniqueSoundv],0 je .NotNoise1b mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1b .PMod ProcessPMod ebp .NotNoise1b ; mov ax,[edi+edx*2] call [DSPInterpolate] ;%1 .AfterNoise1b %ifdef __MSDOS__ movzx edx,byte[ds:Voice0VolumeR+ebp] mov dh,[ds:Voice0EnvInc+ebp*4+2] %else movzx edx,byte[Voice0VolumeR+ebp] mov dh,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+edx*2] movsx eax,ax mov ebx,eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeRe+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeRe+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [EchoBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeL+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeL+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4+4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeLe+ebp] mov ah,[dS:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeLe+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax %ifdef __MSDOS__ mov ebx,[ds:Voice0Freq+ebp*4] %else mov ebx,[Voice0Freq+ebp*4] %endif add [EchoBuffer+esi*4+4],eax add esi,2 %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM NonEchoMono %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volume+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0Volume+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1 mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1 .PMod ProcessPMod ebp .NotNoise1 mov ax,[edi+edx*2] .AfterNoise1 imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [DSPBuffer+esi*2],eax add esi,2 %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM NonEchoStereo %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeR+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0VolumeR+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1b mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1b .PMod ProcessPMod ebp .NotNoise1b mov ax,[edi+edx*2] .AfterNoise1b movsx eax,ax push eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeL+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeL+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif add esi,2 mov cx,[VolumeConvTable+eax*2] pop eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4-4],eax %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM EchoMono %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volume+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0Volume+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1 mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1 .PMod ProcessPMod ebp .NotNoise1 mov ax,[edi+edx*2] .AfterNoise1 movsx eax,ax push eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [DSPBuffer+esi*2],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0Volumee+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0Volumee+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] pop eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [EchoBuffer+esi*2],eax add esi,2 %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret ALIGN16 NEWSYM EchoStereo %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeR+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] mov edx,[ds:BRRPlace0+ebp*8+3] %else movzx eax,byte[Voice0VolumeR+ebp] mov ah,[Voice0EnvInc+ebp*4+2] mov edx,[BRRPlace0+ebp*8+3] %endif mov cx,[VolumeConvTable+eax*2] cmp byte[UniqueSoundv],0 je .NotNoise1b mov al,[powhack] test byte[DSPMem+3Dh],al jz .PMod mov eax, [NoiseInc] add dword[NoisePointer],eax mov eax,[NoisePointer] shr eax,18 ; maybe will need a change mov ax,[NoiseData+eax*2] mov [LastNoise],ax jmp .AfterNoise1b .PMod ProcessPMod ebp .NotNoise1b mov ax,[edi+edx*2] .AfterNoise1b movsx eax,ax mov ebx,eax imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeRe+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeRe+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add [EchoBuffer+esi*4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeL+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeL+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax add dword[DSPBuffer+esi*4+4],eax %ifdef __MSDOS__ movzx eax,byte[ds:Voice0VolumeLe+ebp] mov ah,[ds:Voice0EnvInc+ebp*4+2] %else movzx eax,byte[Voice0VolumeLe+ebp] mov ah,[Voice0EnvInc+ebp*4+2] %endif mov cx,[VolumeConvTable+eax*2] mov eax,ebx imul cx shr ax,7 add dl,dl or ah,dl movsx eax,ax %ifdef __MSDOS__ mov ebx,[ds:Voice0Freq+ebp*4] %else mov ebx,[Voice0Freq+ebp*4] %endif add [EchoBuffer+esi*4+4],eax add esi,2 %ifdef __MSDOS__ add [ds:BRRPlace0+ebp*8],ebx %else add [BRRPlace0+ebp*8],ebx %endif ret %macro ProcessVoiceStuff 4 mov ax,[DSPMem+02h+%1*10h] cmp word[Voice0Pitch+%1*2],ax je %%nopitchc mov [Voice0Pitch+%1*2],ax And EAX, 03FFFh Mul dword[dspPAdj] ShRD EAX,EDX,8 ; modpitch mov [Voice0Freq+%1*4],eax %%nopitchc jmp %%SkipProcess %%ProcessNextEnvelope cmp byte[Voice0State+%1],10 je near %%ADSRSustain cmp byte[Voice0State+%1],9 je near %%ADSRDecayProc cmp byte[Voice0State+%1],7 je near %%DecreaseBent cmp byte[Voice0State+%1],8 je near %%ADSRDecay cmp byte[Voice0State+%1],1 je near %%Decay cmp byte[Voice0State+%1],2 je near %%Sustain cmp byte[Voice0State+%1],3 je near %%Blank cmp byte[Voice0State+%1],4 je near %%EndofSamp cmp byte[Voice0State+%1],200 je near %%EndofSamp cmp byte[Voice0State+%1],210 je near %%EndofSamp2 cmp byte[Voice0State+%1],5 je %%MuteGain cmp byte[Voice0State+%1],6 je %%IncreaseBent jmp %%EndofSamp %%MuteGain mov dword[Voice0EnvInc+%1*4],0 mov dword[Voice0IncNumber+%1*4],0 mov dword[Voice0Time+%1*4],0FFFFFFFFh jmp %%ContinueGain %%IncreaseBent push ebx movzx eax,byte[DSPMem+07h+%1*10h] and al,1Fh mov ebx,[Increase+eax*4] mov [Voice0Time+%1*4],ebx shr dword[Voice0IncNumber+%1*4],2 mov byte[Voice0State+%1],3 pop ebx jmp %%ContinueGain %%ADSRDecay push ebx push edx mov al,[DSPMem+05h+%1*10h] shr al,4 and eax,07h mov edx,[DecayRate+eax*4] movzx eax,byte[DSPMem+06h+%1*10h] and al,1Fh mov ebx,[SustainRate+eax*4] cmp edx,ebx jae %%decayover ; ebx = total sustain time movzx eax,byte[DSPMem+06h+%1*10h] shr al,5 mov al,[AdsrSustLevLoc+eax] ; traverse through al entries in edx time ; then through 64-al entries in ebx-edx time mov [AdsrBlocksLeft+%1],al sub ebx,edx push ebx push eax mov ebx,eax mov eax,edx xor edx,edx div ebx mov [Voice0Time+%1*4],eax mov [GainDecBendDataTime+%1*4],eax pop eax pop ebx mov edx,ebx mov ebx,64 sub bl,al mov eax,edx xor edx,edx div ebx mov [AdsrNextTimeDepth+%1*4],eax mov dword[Voice0EnvInc+%1*4],007FFFFFh mov ebx,[Voice0Time+%1*4] xor edx,edx mov eax,127*65536-122*65536 mov byte[GainDecBendDataPos+%1],0 mov byte[GainDecBendDataDat+%1],127 div ebx neg eax mov [Voice0IncNumber+%1*4],eax pop edx pop ebx mov byte[Voice0State+%1],9 jmp %%ContinueGain %%decayover sub edx,ebx push ebx mov eax,edx movzx ebx,byte[DSPMem+06h+%1*10h] shr bl,5 xor bl,07h mul ebx mov ebx,7 div ebx pop ebx add ebx,eax mov dword[Voice0EnvInc+%1*4],007FFFFFh shr ebx,5 mov [Voice0Time+%1*4],ebx mov [GainDecBendDataTime+%1*4],ebx xor edx,edx mov eax,127*65536-118*65536 mov byte[GainDecBendDataPos+%1],0 mov byte[GainDecBendDataDat+%1],127 div ebx neg eax mov [Voice0IncNumber+%1*4],eax pop edx pop ebx mov byte[Voice0State+%1],7 jmp %%ContinueGain %%ADSRDecayProc push ebx push edx mov dword[Voice0EnvInc+%1*4],0 movzx ebx,byte[GainDecBendDataPos+%1] movzx edx,byte[GainDecBendDataDat+%1] mov dh,[AdsrBendData+ebx] movzx eax,byte[VolumeConvTable+edx*2] mov [Voice0EnvInc+%1*4+2],al mov dl,[GainDecBendDataDat+%1] mov dh,[AdsrBendData+ebx+1] sub al,[VolumeConvTable+edx*2] mov ebx,[GainDecBendDataTime+%1*4] mov [Voice0Time+%1*4],ebx xor edx,edx shl eax,16 inc byte[GainDecBendDataPos+%1] div ebx neg eax mov [Voice0IncNumber+%1*4],eax pop edx pop ebx dec byte[AdsrBlocksLeft+%1] jz %%nomoredecay jmp %%ContinueGain %%nomoredecay mov byte[Voice0State+%1],10 jmp %%ContinueGain %%ADSRSustain push ebx push edx mov dword[Voice0EnvInc+%1*4],0 movzx ebx,byte[GainDecBendDataPos+%1] movzx edx,byte[GainDecBendDataDat+%1] mov dh,[AdsrBendData+ebx] movzx eax,byte[VolumeConvTable+edx*2] mov [Voice0EnvInc+%1*4+2],al mov dl,[GainDecBendDataDat+%1] mov dh,[AdsrBendData+ebx+1] cmp dh,255 je %%nomoreadsr mov dl,[VolumeConvTable+edx*2] mov ebx,[AdsrNextTimeDepth+%1*4] sub al,dl mov [Voice0Time+%1*4],ebx xor edx,edx shl eax,16 inc byte[GainDecBendDataPos+%1] div ebx neg eax mov [Voice0IncNumber+%1*4],eax pop edx pop ebx jmp %%ContinueGain %%nomoreadsr pop edx pop ebx mov byte[Voice0State+%1],5 jmp %%MuteGain %%DecreaseBent push ebx push edx movzx ebx,byte[GainDecBendDataPos+%1] movzx edx,byte[GainDecBendDataDat+%1] mov dh,[GainDecBendData+ebx] mov dword[Voice0EnvInc+%1*4],0 movzx eax,byte[VolumeConvTable+edx*2] mov [Voice0EnvInc+%1*4+2],al mov dh,[GainDecBendData+ebx+1] cmp dh,255 je %%nomore mov ebx,[GainDecBendDataTime+%1*4] sub al,[VolumeConvTable+edx*2] mov [Voice0Time+%1*4],ebx xor edx,edx shl eax,16 inc byte[GainDecBendDataPos+%1] div ebx neg eax mov [Voice0IncNumber+%1*4],eax pop edx pop ebx jmp %%ContinueGain %%nomore pop edx pop ebx mov byte[Voice0State+%1],5 jmp %%MuteGain %%Decay ; Calculate Decay Value push ebx push edx mov dword[Voice0EnvInc+%1*4],07FFFFFh mov al,[DSPMem+05h+%1*10h] mov dl,[DSPMem+06h+%1*10h] shr al,4 and eax,07h and edx,1Fh mov ebx,[DecayRate+eax*4] cmp edx,1Fh je %%nodecayfix cmp ebx,[SustainRate+edx*4] jbe %%nodecayfix cmp al,0 jne %%nodecayskip mov al,[DSPMem+06h+%1*10h] and al,0E0h cmp al,0E0h je near %%Sustain2 %%nodecayskip mov al,[DSPMem+05h+%1*10h] shr al,4 and eax,07h mov ebx,[DecayRate+eax*4] sub ebx,[SustainRate+edx*4] cmp ebx,[SustainRate+edx*4] jae %%nodecayfix mov ebx,[SustainRate+edx*4] %%nodecayfix or ebx,ebx jnz %%nozero inc ebx %%nozero mov dl,[DSPMem+06h+%1*10h] shr dl,5 and dl,07h mov [Voice0Time+%1*4],ebx mov al,[SustainValue+edx] xor al,7Fh shl eax,16 xor edx,edx div ebx neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],2 pop edx pop ebx mov ebx,[Voice0Freq+%1*4] cmp dword[DSPInterpolate],0 je %%notinterpsound cmp byte[StereoSound],1 je near %%EndofProcessNEnvsi jmp %%EndofProcessNEnvi %%notinterpsound cmp byte[StereoSound],1 je near %%EndofProcessNEnvs jmp %%EndofProcessNEnv %%Sustain2 mov ebx,[SustainRate+edx*4] jmp %%continuesust %%Sustain ; Calculate Decay Value push ebx push edx mov al,[DSPMem+05h+%1*10h] mov dl,[DSPMem+06h+%1*10h] and edx,1Fh shr al,4 and eax,07h mov ebx,[SustainRate+edx*4] test ebx,80000000h jnz %%sustainokay sub ebx,[DecayRate+eax*4] %%continuesust cmp ebx,100 jg %%sustainokay mov ebx,100 %%sustainokay mov [Voice0Time+%1*4],ebx mov al,[Voice0EnvInc+%1*4+2] shl eax,16 xor edx,edx div ebx neg eax mov [Voice0IncNumber+%1*4],eax mov byte[Voice0State+%1],4 pop edx pop ebx mov ebx,[Voice0Freq+%1*4] cmp dword[DSPInterpolate],0 je %%notinterpsound2 cmp byte[StereoSound],1 je near %%EndofProcessNEnvsi jmp %%EndofProcessNEnvi %%notinterpsound2 cmp byte[StereoSound],1 je near %%EndofProcessNEnvs jmp %%EndofProcessNEnv %%Blank mov dword[Voice0EnvInc+%1*4],007F0000h mov dword[Voice0IncNumber+%1*4],0 mov dword[Voice0Time+%1*4],0FFFFFFFFh %%ContinueGain mov ebx,[Voice0Freq+%1*4] cmp dword[DSPInterpolate],0 je %%notinterpsound3 cmp byte[StereoSound],1 je near %%EndofProcessNEnvsi jmp %%EndofProcessNEnvi %%notinterpsound3 cmp byte[StereoSound],1 je near %%EndofProcessNEnvs jmp %%EndofProcessNEnv %%EndofSamp mov dword[DLPFsamples+%1*24*4+16*4],0 mov dword[DLPFsamples+%1*24*4+17*4],0 mov dword[DLPFsamples+%1*24*4+18*4],0 mov dword[DLPFsamples+%1*24*4+19*4],0 mov dword[Voice0EnvInc+%1*4],0 mov dword[Voice0IncNumber+%1*4],0 mov byte[Voice0Status+%1],0 mov byte[Voice0State+%1],0 mov byte[DSPMem+08h+%1*10h],0 mov byte[DSPMem+09h+%1*10h],0 or byte[DSPMem+7Ch],%3 jmp %2 %%EndofSamp2 mov dword[Voice0EnvInc+%1*4],0 mov dword[Voice0IncNumber+%1*4],0 mov byte[Voice0State+%1],0 mov byte[DSPMem+08h+%1*10h],0 mov byte[DSPMem+09h+%1*10h],0 mov al,%1 call VoiceStarter jmp %%SkipProcess2 %%SkipProcess xor esi,esi %%SkipProcess2 movzx eax,byte[DSPMem+00h+%1*10h] movzx ebx,byte[DSPMem+01h+%1*10h] mov al,[VolumeTableD+eax] mov bl,[VolumeTableD+ebx] mov [Voice0VolumeRe+%1],al mov [Voice0VolumeLe+%1],bl mov ah,al mov bh,bl test ah,80h jz %%notnegc neg ah %%notnegc test bh,80h jz %%notnegd neg bh %%notnegd add ah,bh shr ah,1 test al,80h jnz %%neg2 test bl,80h jz %%notneg2 %%neg2 neg ah %%notneg2 mov [Voice0Volumee+%1],ah movzx eax,byte[DSPMem+00h+%1*10h] movzx ebx,byte[DSPMem+01h+%1*10h] mov al,[VolumeTableD+eax] mov bl,[VolumeTableD+ebx] mov ah,[GlobalVL] mov bh,[GlobalVR] mov al,[VolumeConvTable+eax*2] mov bl,[VolumeConvTable+ebx*2] mov [Voice0VolumeR+%1],al mov [Voice0VolumeL+%1],bl mov ah,al mov bh,bl test ah,80h jz %%notneg neg ah %%notneg test bh,80h jz %%notnegb neg bh %%notnegb add ah,bh shr ah,1 test al,80h jnz %%neg3 test bl,80h jz %%notneg3 %%neg3 neg ah %%notneg3 mov [Voice0Volume+%1],ah ; cmp byte[Voice0Volume+%1],0 ; je %%volskip mov byte[lastbl],0 mov byte[loopbl],0 mov ebx,[Voice0Freq+%1*4] mov edi,[Voice0BufPtr+%1*4] mov byte[UniqueSoundv],0 test byte[DSPMem+3Dh],%3 jnz %%Unique %if %1<7 ; added test byte[DSPMem+2Dh],%3 << 1 jnz %%Uniquepm %endif ; added jmp %%NotUnique %%Uniquepm %%Unique mov byte[UniqueSoundv],1 %%NotUnique cmp dword[DSPInterpolate],0 je %%notinterpsound4 cmp byte[StereoSound],1 je %%NextSampleSi jmp %%NextSamplei %%notinterpsound4 cmp byte[StereoSound],1 je near %%NextSampleS %%NextSample cmp dword[BRRPlace0+%1*8],10000000h jae near %%ProcessBRR mov eax,[Voice0IncNumber+%1*4] add [Voice0EnvInc+%1*4],eax dec dword[Voice0Time+%1*4] jz %%ProcessNextEnvelope %%EndofProcessNEnv ;%5 %1, %2, %3, %4 call dword[paramhack];%5 cmp esi,[BufferSizeW] jne %%NextSample ; mov [DSPMem+09h+%1*10h],ah mov al,[Voice0EnvInc+%1*4+2] mov [DSPMem+08h+%1*10h],al cmp byte[ENVDisable],1 jne %%skipenvclear mov byte[DSPMem+08h+%1*10h],0 %%skipenvclear jmp %2 %%NextSampleSi cmp dword[BRRPlace0+%1*8],10000000h jae near %%ProcessBRR mov eax,[Voice0IncNumber+%1*4] add [Voice0EnvInc+%1*4],eax dec dword[Voice0Time+%1*4] jz %%ProcessNextEnvelope %%EndofProcessNEnvsi ;%8 %1, %2, %3, %4 call dword[paramhack+12];%8 cmp esi,[BufferSizeB] jne %%NextSampleSi ; mov [DSPMem+09h+%1*10h],ah mov al,[Voice0EnvInc+%1*4+2] mov [DSPMem+08h+%1*10h],al cmp byte[ENVDisable],1 jne %%skipenvclearsi mov byte[DSPMem+08h+%1*10h],0 %%skipenvclearsi jmp %2 %%NextSamplei cmp dword[BRRPlace0+%1*8],10000000h jae near %%ProcessBRR mov eax,[Voice0IncNumber+%1*4] add [Voice0EnvInc+%1*4],eax dec dword[Voice0Time+%1*4] jz %%ProcessNextEnvelope %%EndofProcessNEnvi ;%7 %1, %2, %3, %4 call dword[paramhack+8];%7 cmp esi,[BufferSizeW] jne %%NextSamplei ; mov [DSPMem+09h+%1*10h],ah mov al,[Voice0EnvInc+%1*4+2] mov [DSPMem+08h+%1*10h],al cmp byte[ENVDisable],1 jne %%skipenvcleari mov byte[DSPMem+08h+%1*10h],0 %%skipenvcleari jmp %2 %%NextSampleS cmp dword[BRRPlace0+%1*8],10000000h jae %%ProcessBRR mov eax,[Voice0IncNumber+%1*4] add [Voice0EnvInc+%1*4],eax dec dword[Voice0Time+%1*4] jz %%ProcessNextEnvelope %%EndofProcessNEnvs ;%6 %1, %2, %3, %4 call dword[paramhack+4];%6 cmp esi,[BufferSizeB] jne %%NextSampleS ; mov [DSPMem+09h+%1*10h],ah mov al,[Voice0EnvInc+%1*4+2] mov [DSPMem+08h+%1*10h],al cmp byte[ENVDisable],1 jne %%skipenvclear2 mov byte[DSPMem+08h+%1*10h],0 %%skipenvclear2 %%noclearenv jmp %2 %%ProcessBRR cmp byte[Voice0End+%1],1 je near %%noDecode1Block %%Decode1Block sub dword[BRRPlace0+%1*8],10000000h push esi mov esi, [Voice0Ptr+%1*4] ; cmp byte[Voice0Looped+%1],0 ; je %%nobrrcheck mov eax,[PSampleBuf+16*4+%1*24*4] mov [PSampleBuf+0*4+%1*24*4],eax mov eax,[PSampleBuf+17*4+%1*24*4] mov [PSampleBuf+1*4+%1*24*4],eax mov eax,[PSampleBuf+18*4+%1*24*4] mov [PSampleBuf+2*4+%1*24*4],eax mov edi,esi inc edi shl edi,2 add esi,SPCRAM add edi,[spcBuffera] mov eax,[Voice0Prev0+%1*4] mov [Voice0BufPtr+%1*4],edi mov [prev0],eax mov eax,[Voice0Prev1+%1*4] mov [prev1],eax mov ecx,%1 push ebp call BRRDecode pop ebp pop esi mov edi,[Voice0BufPtr+%1*4] movsx eax,word[edi] mov [PSampleBuf+3*4+%1*24*4],eax movsx eax,word[edi+2*1] mov [PSampleBuf+4*4+%1*24*4],eax movsx eax,word[edi+2*2] mov [PSampleBuf+5*4+%1*24*4],eax movsx eax,word[edi+2*3] mov [PSampleBuf+6*4+%1*24*4],eax movsx eax,word[edi+2*4] mov [PSampleBuf+7*4+%1*24*4],eax movsx eax,word[edi+2*5] mov [PSampleBuf+8*4+%1*24*4],eax movsx eax,word[edi+2*6] mov [PSampleBuf+9*4+%1*24*4],eax movsx eax,word[edi+2*7] mov [PSampleBuf+10*4+%1*24*4],eax movsx eax,word[edi+2*8] mov [PSampleBuf+11*4+%1*24*4],eax movsx eax,word[edi+2*9] mov [PSampleBuf+12*4+%1*24*4],eax movsx eax,word[edi+2*10] mov [PSampleBuf+13*4+%1*24*4],eax movsx eax,word[edi+2*11] mov [PSampleBuf+14*4+%1*24*4],eax movsx eax,word[edi+2*12] mov [PSampleBuf+15*4+%1*24*4],eax movsx eax,word[edi+2*13] mov [PSampleBuf+16*4+%1*24*4],eax movsx eax,word[edi+2*14] mov [PSampleBuf+17*4+%1*24*4],eax movsx eax,word[edi+2*15] mov [PSampleBuf+18*4+%1*24*4],eax movsx eax,word[BRRreadahead] mov [PSampleBuf+19*4+%1*24*4],eax movsx eax,word[BRRreadahead+2] mov [PSampleBuf+20*4+%1*24*4],eax movsx eax,word[BRRreadahead+4] mov [PSampleBuf+21*4+%1*24*4],eax movsx eax,word[BRRreadahead+6] mov [PSampleBuf+22*4+%1*24*4],eax mov eax,[prev0] mov [Voice0Prev0+%1*4],eax mov eax,[prev1] mov [Voice0Prev1+%1*4],eax mov al,[loopbl] mov [Voice0Loop+%1],al mov al,[lastbl] mov [Voice0End+%1],al mov ebx,[Voice0Freq+%1*4] add dword[Voice0Ptr+%1*4],9 cmp dword[DSPInterpolate],0 je %%notinterpsound6 cmp byte[StereoSound],1 je near %%NextSampleSi jmp %%NextSamplei %%notinterpsound6 cmp byte[StereoSound],1 je %%NextSampleS jmp %%NextSample %%noDecode1Block ; and byte[DSPMem+5Ch],%4 ; and byte[DSPMem+4Ch],%4 ; mov byte[Voice0Looped+%1],0 cmp byte[Voice0Loop+%1],1 jne %%EndSample ; mov byte[Voice0Looped+%1],1 mov byte[SoundLooped0+%1],1 or byte[DSPMem+7Ch],%3 %%SkipStuff3 ; mov dword[Voice0Prev0+%1*4],0 ; mov dword[Voice0Prev1+%1*4],0 ; push eax ; push edx ; push ebx ; mov edx,[DSPMem+04h+%1*10h] ; and edx,0ffh ; shl edx,2 ; xor eax,eax ; mov ah,[DSPMem+5Dh] ; add ax,dx ; xor ebx,ebx ; mov bx,[SPCRAM+eax] ; mov dword[Voice0Ptr+%1*4],ebx ; xor ebx,ebx ; mov bx,[SPCRAM+eax+2] ; mov dword[Voice0LoopPtr+%1*4],ebx ; pop ebx ; pop edx ; pop eax mov eax,[Voice0LoopPtr+%1*4] mov [Voice0Ptr+%1*4],eax ; mov eax,[Voice0Prev0+%1*4] ; mov [Voice0Prev1+%1*4],eax jmp %%Decode1Block %%EndSample ; cmp byte[ENVDisable],1 ; je %%noSkipStuff4 %%noSkipStuff4 or byte[DSPMem+7Ch],%3 mov byte[DSPMem+08h+%1*10h],0 %%SkipStuff4 mov dword[DLPFsamples+%1*24*4+16*4],0 mov dword[DLPFsamples+%1*24*4+17*4],0 mov dword[DLPFsamples+%1*24*4+18*4],0 mov dword[DLPFsamples+%1*24*4+19*4],0 ; and byte[DSPMem+5Ch],%4 mov dword[Voice0EnvInc+%1*4],0 mov dword[Voice0IncNumber+%1*4],0 mov byte[Voice0Status+%1],0 ; mov byte[DSPMem+09h+%1*10h],0h ; jmp %2 ;%%ProcessVoice1 ; jmp %2 %endmacro %macro ProcessVoiceHandler16 4 cmp byte[Voice0Disable+%1],1 jne near %2 cmp byte[Voice0Status+%1],1 jne near %2 mov ebp,%1 mov dword[powhack],1<<%1 mov eax,%1 dec al cmp al,0FFh je .nopitchmod cmp byte[Voice0Disable+eax],1 jne .nopitchmod cmp byte[Voice0Status+eax],1 jne .nopitchmod test byte[DSPMem+2Dh],%3 jnz .pitchmod .nopitchmod test byte[DSPMem+3Dh],%3 jnz .NoEcho cmp byte[echoon0+%1],1 je .echostuff .NoEcho mov dword[paramhack],NonEchoMono mov dword[paramhack+4],NonEchoStereo mov dword[paramhack+8],NonEchoMonoInterpolated mov dword[paramhack+12],NonEchoStereoInterpolated jmp .pvs ;ProcessVoiceStuff %1, %2, %3, %4, NonEchoMono, NonEchoStereo, NonEchoMonoInterpolated, NonEchoStereoInterpolated ; Process Echo .echostuff mov dword[paramhack],EchoMono mov dword[paramhack+4],EchoStereo mov dword[paramhack+8],EchoMonoInterpolated mov dword[paramhack+12],EchoStereoInterpolated jmp .pvs ;ProcessVoiceStuff %1, %2, %3, %4, EchoMono, EchoStereo, EchoMonoInterpolated, EchoStereoInterpolated .pitchmod mov al,[DSPMem+4+%1*10h] cmp al,[DSPMem+4+%1*10h-10h] je .nopitchmod test byte[DSPMem+3Dh],%3 jnz .NoEchopm cmp byte[echoon0+%1],1 je .echopm .NoEchopm mov dword[paramhack],NonEchoMonoPM mov dword[paramhack+4],NonEchoStereoPM mov dword[paramhack+8],NonEchoMonoPM mov dword[paramhack+12],NonEchoStereoPM jmp .pvs ;ProcessVoiceStuff %1, %2, %3, %4, NonEchoMonoPM, NonEchoStereoPM, NonEchoMonoPM, NonEchoStereoPM .echopm mov dword[paramhack],EchoMonoPM mov dword[paramhack+4],EchoStereoPM mov dword[paramhack+8],EchoMonoPM mov dword[paramhack+12],EchoStereoPM ;ProcessVoiceStuff %1, %2, %3, %4, EchoMonoPM, EchoStereoPM, EchoMonoPM, EchoStereoPM .pvs ProcessVoiceStuff %1, %2, %3, %4 %endmacro %macro FiltTapProc 1 sub edx,2 mov eax,[FIRTAPVal0+%1*4] and edx,0Fh mov ebx,[FiltLoop+edx*4] imul eax,ebx sar eax,7 add ecx,eax %endmacro %macro FiltTapProcR 1 sub edx,2 mov eax,[FIRTAPVal0+%1*4] and edx,0Fh mov ebx,[FiltLoopR+edx*4] imul eax,ebx sar eax,7 add ecx,eax %endmacro %macro MixEcho 0 mov al,[EchoVL] mov bl,[EchoVR] cmp bl,al ja .novol mov bl,al .novol mov [EchoT],bl ; Copy echobuf to DSPBuffer, EchoBuffer to echobuf cmp byte[StereoSound],1 je near .Stereo mov esi,[CEchoPtr] xor edi,edi .next ; Get current echo buffer mov ebx,[echobuf+esi*4] ; Process FIR Filter mov edx,[CurFiltPtr] mov eax,ebx mov [FiltLoop+edx*4],ebx mov ecx,[FIRTAPVal0] imul eax,ecx sar eax,7 mov ecx,eax FiltTapProc 1 FiltTapProc 2 FiltTapProc 3 FiltTapProc 4 FiltTapProc 5 FiltTapProc 6 FiltTapProc 7 inc dword[CurFiltPtr] and byte[CurFiltPtr],0Fh ; Set feedback on previous echo mov eax,[EchoFB] imul eax,ecx sar eax,7 ; Add in new echo/Store into Echo Buffer mov ecx,eax xor ebx,ebx add [DSPBuffer+edi*4],ecx mov eax,[EchoBuffer+edi*4] mov bl,[EchoT] mul ebx sar eax,7 add eax,ecx mov [echobuf+esi*4],eax inc esi cmp esi,[MaxEcho] jb .nexte xor esi,esi .nexte inc edi cmp edi,[BufferSizeB] jne .next mov [CEchoPtr],esi jmp .Mono .Stereo mov esi,[CEchoPtr] xor edi,edi .nexts ; Get current echo buffer mov ebx,[echobuf+esi*4] ; Process FIR Filter mov edx,[CurFiltPtr] mov eax,ebx mov [FiltLoop+edx*4],ebx mov ecx,[FIRTAPVal0] imul eax,ecx sar eax,7 mov ecx,eax FiltTapProc 1 FiltTapProc 2 FiltTapProc 3 FiltTapProc 4 FiltTapProc 5 FiltTapProc 6 FiltTapProc 7 add [DSPBuffer+edi*4],ecx ; Set feedback on previous echo mov eax,[EchoFB] imul eax,ecx sar eax,7 ; Add in new echo/Store into Echo Buffer mov ecx,eax mov eax,[EchoBuffer+edi*4] movzx ebx,byte[EchoVL] mul ebx sar eax,7 add eax,ecx mov [echobuf+esi*4],eax inc esi inc edi ; Get current echo buffer mov ebx,[echobuf+esi*4] ; Process FIR Filter mov edx,[CurFiltPtr] mov eax,ebx mov [FiltLoopR+edx*4],ebx mov ecx,[FIRTAPVal0] imul eax,ecx sar eax,7 mov ecx,eax FiltTapProcR 1 FiltTapProcR 2 FiltTapProcR 3 FiltTapProcR 4 FiltTapProcR 5 FiltTapProcR 6 FiltTapProcR 7 add [DSPBuffer+edi*4],ecx inc dword[CurFiltPtr] and byte[CurFiltPtr],0Fh ; Set feedback on previous echo mov eax,[EchoFB] imul eax,ecx sar eax,7 ; Add in new echo/Store into Echo Buffer mov ecx,eax mov eax,[EchoBuffer+edi*4] movzx ebx,byte[EchoVR] mul ebx sar eax,7 add eax,ecx mov [echobuf+esi*4],eax mov eax,[MaxEcho] inc esi shl eax,1 cmp esi,eax jb .nextes xor esi,esi .nextes inc edi cmp edi,[BufferSizeB] jne .nexts mov [CEchoPtr],esi .Mono %endmacro %macro MixEcho2 0 mov al,[EchoVL] mov bl,[EchoVR] cmp bl,al ja %%novol mov bl,al %%novol mov [EchoT],bl ; Copy echobuf to DSPBuffer, EchoBuffer to echobuf cmp byte[StereoSound],1 je %%Stereo mov esi,[CEchoPtr] xor edi,edi %%next ; Get current echo buffer mov ebx,[echobuf+esi*4] mov eax,[EchoFB] add [DSPBuffer+edi*4],ebx imul eax,ebx sar eax,7 ; Add in new echo/Store into Echo Buffer mov ecx,eax mov eax,[EchoBuffer+edi*4] movzx ebx,byte[EchoT] mul ebx sar eax,7 add eax,ecx mov [echobuf+esi*4],eax inc esi cmp esi,[MaxEcho] jae %%echowrap %%nexte inc edi cmp edi,[BufferSizeB] jne %%next mov [CEchoPtr],esi jmp %%Mono %%echowrap xor esi,esi jmp %%nexte %%Stereo mov esi,[CEchoPtr] xor edi,edi %%nexts ; Get current echo buffer mov ecx,[echobuf+esi*4] mov eax,[EchoFB] add [DSPBuffer+edi*4],ecx imul eax,ecx sar eax,7 ; Add in new echo/Store into Echo Buffer mov ecx,eax mov eax,[EchoBuffer+edi*4] movzx ebx,byte[EchoVL] mul ebx sar eax,7 add eax,ecx mov [echobuf+esi*4],eax inc esi inc edi ; Get current echo buffer mov ecx,[echobuf+esi*4] mov eax,[EchoFB] add [DSPBuffer+edi*4],ecx imul eax,ecx sar eax,7 ; Add in new echo/Store into Echo Buffer mov ecx,eax mov eax,[EchoBuffer+edi*4] movzx ebx,byte[EchoVR] mul ebx sar eax,7 add eax,ecx mov [echobuf+esi*4],eax mov eax,[MaxEcho] inc esi shl eax,1 cmp esi,eax jae %%echowrap2 %%nextes inc edi cmp edi,[BufferSizeB] jne %%nexts mov [CEchoPtr],esi jmp %%Mono %%echowrap2 xor esi,esi jmp %%nextes %%Mono %endmacro section .bss echowrittento resb 1 section .text NEWSYM ProcessSoundBuffer ; Clear the DSP Buffer mov edi,DSPBuffer mov ax,ds mov es,ax xor eax,eax mov ecx,[BufferSizeB] rep stosd ; Clear Echo Buffer cmp byte[EchoDis],1 je .nowriteecho test byte[DSPMem+6Ch],20h jnz .nowriteecho mov edi,EchoBuffer mov ecx,[BufferSizeB] rep stosd .nowriteecho cmp byte[EMUPause],1 jne .nopause ret .nopause ;When logging is enabled but don't want logging this pass, return cmp byte[AudioLogging],1 jne .rawdump ret .rawdump ; Process the sound :I ProcessVoiceHandler16 0,ProcessVoice116,1,254 NEWSYM ProcessVoice116 ProcessVoiceHandler16 1,ProcessVoice216,2,253 NEWSYM ProcessVoice216 ProcessVoiceHandler16 2,ProcessVoice316,4,251 NEWSYM ProcessVoice316 ProcessVoiceHandler16 3,ProcessVoice416,8,247 NEWSYM ProcessVoice416 ProcessVoiceHandler16 4,ProcessVoice516,16,239 NEWSYM ProcessVoice516 ProcessVoiceHandler16 5,ProcessVoice616,32,223 NEWSYM ProcessVoice616 ProcessVoiceHandler16 6,ProcessVoice716,64,191 NEWSYM ProcessVoice716 ProcessVoiceHandler16 7,ProcessVoice816,128,127 NEWSYM ProcessVoice816 cmp byte[EchoDis],1 je near .echowritten test byte[DSPMem+6Ch],20h jnz near .nowriteecho2 mov byte[echowrittento],1 ; Mix Echo with DSP Buffer cmp dword[FIRTAPVal0],7Fh jne near .echonotokay cmp dword[FIRTAPVal1],0 jne near .echonotokay cmp dword[FIRTAPVal2],0 jne near .echonotokay cmp dword[FIRTAPVal3],0 jne near .echonotokay cmp dword[FIRTAPVal4],0 jne near .echonotokay cmp dword[FIRTAPVal5],0 jne near .echonotokay cmp dword[FIRTAPVal6],0 jne near .echonotokay cmp dword[FIRTAPVal7],0 jne near .echonotokay MixEcho2 jmp .echowritten .echonotokay MixEcho jmp .echowritten .nowriteecho2 cmp byte[echowrittento],0 je .echowritten mov edi,echobuf mov ecx,[MaxEcho] cmp byte[StereoSound],1 jne .noechostereo add ecx,ecx .noechostereo xor eax,eax rep stosd mov byte[echowrittento],0 .echowritten cmp byte[RevStereo],0 je .norevstereo mov edi,DSPBuffer mov ax,ds mov es,ax xor eax,eax mov ecx,[BufferSizeB] shr ecx,1 .revstloop mov eax,[edi] mov ebx,[edi+4] mov [edi],ebx mov [edi+4],eax add edi,8 dec ecx jnz .revstloop .norevstereo cmp byte[LowPassFilterType],1 jne near LPFexit mov esi,DSPBuffer cmp byte[StereoSound],1 jz LPFstereo mov ecx, [BufferSizeB] shr ecx,1 mov ebx,[LPFsample1] NEWSYM LPFmonoloop mov eax,[esi] sar eax,1 add ebx,eax mov [esi],ebx add esi,4 mov ebx,[esi] sar ebx,1 add eax,ebx mov [esi],eax add esi,4 dec ecx jnz LPFmonoloop mov [LPFsample1],ebx jmp LPFexit NEWSYM LPFstereo mov ecx, [BufferSizeB] shr ecx,2 ; mov ecx, <------------------- # of samples to mix / 4 mov ebx,[LPFsample1] mov edx,[LPFsample2] NEWSYM LPFstereoloop push ecx mov eax,[esi] sar eax,1 add ebx,eax mov [esi],ebx mov ecx,[esi+4] sar ecx,1 add edx,ecx mov [esi+4],edx add esi,8 mov ebx,[esi] sar ebx,1 add eax,ebx mov [esi],eax mov edx,[esi+4] sar edx,1 add ecx,edx mov [esi+4],ecx add esi,8 pop ecx dec ecx jnz LPFstereoloop mov [LPFsample1],ebx mov [LPFsample2],edx NEWSYM LPFexit cmp byte[Surround],1 jnz .nosurround cmp byte[StereoSound],1 jnz .nosurround mov esi,DSPBuffer mov ecx,[BufferSizeB] shr ecx,1 .loop mov eax,[esi] mov edx,[esi+4] add edx,eax sar edx,1 sub eax,edx mov ebx,[esi+4] sub [esi+4],eax sub ebx,edx sub [esi],ebx add esi,8 dec ecx jnz .loop .nosurround ret