quickdev16/tools/zsnes/src/cpu/dspproc.asm
2009-04-22 20:04:28 +02:00

5204 lines
145 KiB
NASM

;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