.386P Segment DriverHeader PARA Public 'Code' Use16 Assume CS:Driver, DS:Nothing ;***** Driver Header ******* include drhead.inc EndS Segment Driver PARA Public 'Code' Use16 Assume CS:Driver, DS:Nothing ORG 0 StartDriver: include vtable.inc ;******** Required ProcedureTable ************* include reqproc.inc Comment ~ Index = BasePort + 802h 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ .............................. ³ Register ³ Channel Number ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ~ OldIRQHandler DD 0 AWEMemory DD 0 AWEMemoryUsed DD 0 AWEUpdateCount DW 0 AWEUpdateTimer DW 0 LoadSampleFuncF DW 0 LoadSampleFuncB DW 0 AWEDataTable DD 5*100 Dup (0) ; Start, Startloop, Endloop, Size MIDIPort DW 0 MIDIBuffer DB 256 Dup (0) MIDIBufferHead DB 0 MIDIBufferTail DB 0 SB16BasePort DW 0 MixerPort DW 0 Step DW 1 AWEUpdateFlag DB 0 Compress DB 0 DB 0 SBIRQMode DB 0 BlockLength DW 100 BlockLength2 DW 100 AWE32Msg DB "Sound Blaster AWE 32 detected", 13 DB "Address ", 0FDh, "Xh, ", 0FDh, "Dk Memory", 0 AWE32Msg2 DB "Sound Blaster AWE 32 detected", 13 DB "Port ", 0FDh, "Xh, IRQ ", 0FDh, "D, ", 0FDh, "Dk RAM", 0 AWE32Status DB "FreeAWE ", 0FDh, "Dk", 0 AWE32ReinitMsg DB "Sound Blaster AWE 32 reinitialised", 0 Stereo DB 0 Forced DB 0 DriverName DB "ITAWE32B.DRV", 0 FrequencyError DB "AWE Hardware frequency limit exceeded -> Note terminated", 0 IRQFlag DB 0FFh IRQData Label Word DW 20h, 1111111111111110b ; IRQ 0 DW 24h, 1111111111111101b ; IRQ 1 DW 28h, 1111110111111011b ; IRQ 2 DW 2Ch, 1111111111110111b ; IRQ 3 DW 30h, 1111111111101111b ; IRQ 4 DW 34h, 1111111111011111b ; IRQ 5 DW 38h, 1111111110111111b ; IRQ 6 DW 3Ch, 1111111101111111b ; IRQ 7 DW 1C0h, 1111111011111011b ; IRQ 8 DW 1C4h, 1111110111111011b ; IRQ 9 DW 1C8h, 1111101111111011b ; IRQ 10 DW 1CCh, 1111011111111011b ; IRQ 11 DW 1D0h, 1110111111111011b ; IRQ 12 DW 1D4h, 1101111111111011b ; IRQ 13 DW 1D8h, 1011111111111011b ; IRQ 14 DW 1DCh, 0111111111111011b ; IRQ 15 IMR DW 0 CPF EQU 0 PTRX EQU 20h CVCF EQU 40h VTFT EQU 60h PSST EQU 0C0h CSL EQU 0E0h CCCA EQU 100h HWCF4 EQU 129h HWCF5 EQU 12Ah HWCF6 EQU 12Dh SMALR EQU 134h SMARR EQU 135h SMALW EQU 136h SMARW EQU 137h SMLD EQU 43Ah SMRD EQU 23Ah WC EQU 23Bh HWCF1 EQU 43Dh HWCF2 EQU 43Eh CFG2 EQU 43Eh HWCF3 EQU 43Fh INIT1 EQU 440h INIT2 EQU 240h INIT3 EQU 460h INIT4 EQU 260h ENVVOL EQU 480h DCYSUSV EQU 4A0h ENVVAL EQU 4C0h DCYSUS EQU 4E0h SUSDCY EQU 4E0h ATKHLDV EQU 280h LFO1VAL EQU 2A0h ATKHLD EQU 2C0h HLDATK EQU 2C0h LFO2VAL EQU 2E0h IP EQU 300h IFATN EQU 320h PEFE EQU 340h FMMOD EQU 360h TREMFRQ EQU 380h FM2FRQ2 EQU 3A0h ALIGN 4 InitTable1 Label DW 003FFh, 0030h, 007FFh, 0130h, 00BFFh, 0230h, 00FFFh, 0330h DW 013FFh, 0430h, 017FFh, 0530h, 01BFFh, 0630h, 01FFFh, 0730h DW 023FFh, 0830h, 027FFh, 0930h, 02BFFh, 0A30h, 02FFFh, 0B30h DW 033FFh, 0C30h, 037FFh, 0D30h, 03BFFh, 0E30h, 03FFFh, 0F30h DW 043FFh, 0030h, 047FFh, 0130h, 04BFFh, 0230h, 04FFFh, 0330h DW 053FFh, 0430h, 057FFh, 0530h, 05BFFh, 0630h, 05FFFh, 0730h DW 063FFh, 0830h, 067FFh, 0930h, 06BFFh, 0A30h, 06FFFh, 0B30h DW 073FFh, 0C30h, 077FFh, 0D30h, 07BFFh, 0E30h, 07FFFh, 0F30h DW 083FFh, 0030h, 087FFh, 0130h, 08BFFh, 0230h, 08FFFh, 0330h DW 093FFh, 0430h, 097FFh, 0530h, 09BFFh, 0630h, 09FFFh, 0730h DW 0A3FFh, 0830h, 0A7FFh, 0930h, 0ABFFh, 0A30h, 0AFFFh, 0B30h DW 0B3FFh, 0C30h, 0B7FFh, 0D30h, 0BBFFh, 0E30h, 0BFFFh, 0F30h DW 0C3FFh, 0030h, 0C7FFh, 0130h, 0CBFFh, 0230h, 0CFFFh, 0330h DW 0D3FFh, 0430h, 0D7FFh, 0530h, 0DBFFh, 0630h, 0DFFFh, 0730h DW 0E3FFh, 0830h, 0E7FFh, 0930h, 0EBFFh, 0A30h, 0EFFFh, 0B30h DW 0F3FFh, 0C30h, 0F7FFh, 0D30h, 0FBFFh, 0E30h, 0FFFFh, 0F30h InitTable2 Label DW 003FFh, 8030h, 007FFh, 8130h, 00BFFh, 8230h, 00FFFh, 8330h DW 013FFh, 8430h, 017FFh, 8530h, 01BFFh, 8630h, 01FFFh, 8730h DW 023FFh, 8830h, 027FFh, 8930h, 02BFFh, 8A30h, 02FFFh, 8B30h DW 033FFh, 8C30h, 037FFh, 8D30h, 03BFFh, 8E30h, 03FFFh, 8F30h DW 043FFh, 8030h, 047FFh, 8130h, 04BFFh, 8230h, 04FFFh, 8330h DW 053FFh, 8430h, 057FFh, 8530h, 05BFFh, 8630h, 05FFFh, 8730h DW 063FFh, 8830h, 067FFh, 8930h, 06BFFh, 8A30h, 06FFFh, 8B30h DW 073FFh, 8C30h, 077FFh, 8D30h, 07BFFh, 8E30h, 07FFFh, 8F30h DW 083FFh, 8030h, 087FFh, 8130h, 08BFFh, 8230h, 08FFFh, 8330h DW 093FFh, 8430h, 097FFh, 8530h, 09BFFh, 8630h, 09FFFh, 8730h DW 0A3FFh, 8830h, 0A7FFh, 8930h, 0ABFFh, 8A30h, 0AFFFh, 8B30h DW 0B3FFh, 8C30h, 0B7FFh, 8D30h, 0BBFFh, 8E30h, 0BFFFh, 8F30h DW 0C3FFh, 8030h, 0C7FFh, 8130h, 0CBFFh, 8230h, 0CFFFh, 8330h DW 0D3FFh, 8430h, 0D7FFh, 8530h, 0DBFFh, 8630h, 0DFFFh, 8730h DW 0E3FFh, 8830h, 0E7FFh, 8930h, 0EBFFh, 8A30h, 0EFFFh, 8B30h DW 0F3FFh, 8C30h, 0F7FFh, 8D30h, 0FBFFh, 8E30h, 0FFFFh, 8F30h InitTable3 Label DW 0C10h, 8470h, 14FEh, 0B488h, 167Fh, 0A470h, 18E7h, 84B5h DW 1B6Eh, 842Ah, 1F1Dh, 852Ah, 0DA3h, 8F7Ch, 167Eh, 7254h DW 0, 842Ah, 1, 852Ah, 18E6h, 8BAAh, 1B6Dh, 7234h DW 229Fh, 8429h, 2746h, 8529h, 1F1Ch, 86E7h, 229Eh, 7224h DW 0DA4h, 8429h, 2C29h, 8529h, 2745h, 87F6h, 2C28h, 7254h DW 383Bh, 8428h, 320Fh, 8528h, 320Eh, 8F02h, 1341h, 7264h DW 3EB6h, 8428h, 3EB9h, 8528h, 383Ah, 8FA9h, 3EB5h, 7294h DW 3EB7h, 8474h, 3EBAh, 8575h, 3EB8h, 0C4C3h, 3EBBh, 45C3h DW 00000, 0A404h, 00001, 0A504h, 141Fh, 8671h, 14FDh, 8287h DW 3EBCh, 0E610h, 3EC8h, 8C7Bh, 31Ah, 87E6h, 3EC8h, 86F7h DW 3EC0h, 821Eh, 3EBEh, 0D208h, 3EBDh, 821Fh, 3ECAh, 8386h DW 3EC1h, 8C03h, 3EC9h, 831Eh, 3ECAh, 8C4Ch, 3EBFh, 8C55h DW 3EC9h, 0C208h, 3EC4h, 0BC84h, 3EC8h, 8EADh, 3EC8h, 0D308h DW 3EC2h, 8F7Eh, 3ECBh, 821Eh, 3ECBh, 0D208h, 3EC5h, 831Fh DW 3EC6h, 0C308h, 3EC3h, 32FFh, 3EC9h, 8265h, 3EC9h, 831Eh DW 1342h, 0D308h, 3EC7h, 33FFh, 0, 8365h, 1420h, 9570h InitTable4 Label DW 0C10h, 8470h, 14FEh, 0B488h, 167Fh, 0A470h, 18E7h, 84B5h DW 1B6Eh, 842Ah, 1F1Dh, 852Ah, 0DA3h, 0F7Ch, 167Eh, 7254h DW 0, 842Ah, 1, 852Ah, 18E6h, 0BAAh, 1B6Dh, 7234h DW 229Fh, 8429h, 2746h, 8529h, 1F1Ch, 6E7h, 229Eh, 7224h DW 0DA4h, 8429h, 2C29h, 8529h, 2745h, 07F6h, 2C28h, 7254h DW 383Bh, 8428h, 320Fh, 8528h, 320Eh, 0F02h, 1341h, 7264h DW 3EB6h, 8428h, 3EB9h, 8528h, 383Ah, 0FA9h, 3EB5h, 7294h DW 3EB7h, 8474h, 3EBAh, 8575h, 3EB8h, 44C3h, 3EBBh, 45C3h DW 00000, 0A404h, 00001, 0A504h, 141Fh, 0671h, 14FDh, 287h DW 3EBCh, 0E610h, 3EC8h, 0C7Bh, 31Ah, 7E6h, 3EC8h, 86F7h DW 3EC0h, 821Eh, 3EBEh, 0D208h, 3EBDh, 021Fh, 3ECAh, 386h DW 3EC1h, 0C03h, 3EC9h, 31Eh, 3ECAh, 8C4Ch, 3EBFh, 0C55h DW 3EC9h, 0C208h, 3EC4h, 0BC84h, 3EC8h, 0EADh, 3EC8h, 0D308h DW 3EC2h, 8F7Eh, 3ECBh, 021Eh, 3ECBh, 0D208h, 3EC5h, 31Fh DW 3EC6h, 0C308h, 3EC3h, 32FFh, 3EC9h, 0265h, 3EC9h, 831Eh DW 1342h, 0D308h, 3EC7h, 33FFh, 0, 8365h, 1420h, 9570h AWEVolumeTable Label Byte ; Value = -log(vol/256)*(20/.375) ; = -log(vol/256)*(160/3) DB 255, 128, 112, 103, 96, 91, 87, 83 ; 0->7 DB 80, 78, 75, 73, 71, 69, 67, 66 ; 8->15 DB 64, 63, 61, 60, 59, 58, 57, 56 ; 16->23 DB 55, 54, 53, 52, 51, 50, 50, 49 ; 24->31 DB 48, 47, 47, 46, 45, 45, 44, 44 ; 32->39 DB 43, 42, 42, 41, 41, 40, 40, 39 ; 40->47 DB 39, 38, 38, 37, 37, 36, 36, 36 ; 48->55 DB 35, 35, 34, 34, 34, 33, 33, 32 ; 56->63 DB 32, 32, 31, 31, 31, 30, 30, 30 ; 64->71 DB 29, 29, 29, 28, 28, 28, 28, 27 ; 72->79 DB 27, 27, 26, 26, 26, 26, 25, 25 ; 80->87 DB 25, 25, 24, 24, 24, 23, 23, 23 ; 88->95 DB 23, 22, 22, 22, 22, 22, 21, 21 ; 96->103 DB 21, 21, 20, 20, 20, 20, 20, 19 ; 104->111 DB 19, 19, 19, 19, 18, 18, 18, 18 ; 112->119 DB 18, 17, 17, 17, 17, 17, 16, 16 ; 120->127 DB 16 ; 128 Comment ~ ; Value = -log(vol/128)*(20/.375) ; = -log(vol/128)*(160/3) ; This is mathematically the correct table, but it seems too ; loud, and it overloads on playback. DB 255, 112, 96, 87, 80, 75, 71, 67 ; 0->7 DB 64, 61, 59, 57, 55, 53, 51, 50 ; 8->15 DB 48, 47, 45, 44, 43, 42, 41, 40 ; 16->23 DB 39, 38, 37, 36, 35, 34, 34, 33 ; 24->31 DB 32, 31, 31, 30, 29, 29, 28, 28 ; 32->39 DB 27, 26, 26, 25, 25, 24, 24, 23 ; 40->47 DB 23, 22, 22, 21, 21, 20, 20, 20 ; 48->55 DB 19, 19, 18, 18, 18, 17, 17, 16 ; 56->63 DB 16, 16, 15, 15, 15, 14, 14, 14 ; 64->71 DB 13, 13, 13, 13, 12, 12, 12, 11 ; 72->79 DB 11, 11, 10, 10, 10, 9, 9, 9 ; 80->87 DB 9, 8, 8, 8, 8, 7, 7, 7 ; 88->95 DB 7, 6, 6, 6, 6, 5, 5, 5 ; 96->103 DB 5, 4, 4, 4, 4, 4, 4, 3 ; 104->111 DB 3, 3, 3, 2, 2, 2, 2, 2 ; 112->119 DB 1, 1, 1, 1, 1, 1, 1, 1 ; 120->127 DB 0 ~ AWEPitchTable Label DWord ; Pitchval = 88200 * 2^(Pos / 4096) DD 88200, 88215, 88230, 88245, 88260, 88275, 88290, 88305 DD 88320, 88335, 88350, 88365, 88380, 88395, 88410, 88425 DD 88440, 88455, 88470, 88485, 88500, 88514, 88529, 88544 DD 88559, 88574, 88589, 88604, 88619, 88634, 88649, 88664 DD 88679, 88694, 88709, 88724, 88739, 88754, 88770, 88785 DD 88800, 88815, 88830, 88845, 88860, 88875, 88890, 88905 DD 88920, 88935, 88950, 88965, 88980, 88995, 89010, 89025 DD 89040, 89055, 89070, 89086, 89101, 89116, 89131, 89146 DD 89161, 89176, 89191, 89206, 89221, 89236, 89252, 89267 DD 89282, 89297, 89312, 89327, 89342, 89357, 89372, 89388 DD 89403, 89418, 89433, 89448, 89463, 89478, 89493, 89509 DD 89524, 89539, 89554, 89569, 89584, 89600, 89615, 89630 DD 89645, 89660, 89675, 89691, 89706, 89721, 89736, 89751 DD 89767, 89782, 89797, 89812, 89827, 89842, 89858, 89873 DD 89888, 89903, 89919, 89934, 89949, 89964, 89979, 89995 DD 90010, 90025, 90040, 90056, 90071, 90086, 90101, 90117 DD 90132, 90147, 90162, 90178, 90193, 90208, 90223, 90239 DD 90254, 90269, 90284, 90300, 90315, 90330, 90346, 90361 DD 90376, 90391, 90407, 90422, 90437, 90453, 90468, 90483 DD 90499, 90514, 90529, 90545, 90560, 90575, 90591, 90606 DD 90621, 90637, 90652, 90667, 90683, 90698, 90713, 90729 DD 90744, 90759, 90775, 90790, 90805, 90821, 90836, 90852 DD 90867, 90882, 90898, 90913, 90928, 90944, 90959, 90975 DD 90990, 91005, 91021, 91036, 91052, 91067, 91082, 91098 DD 91113, 91129, 91144, 91160, 91175, 91190, 91206, 91221 DD 91237, 91252, 91268, 91283, 91299, 91314, 91329, 91345 DD 91360, 91376, 91391, 91407, 91422, 91438, 91453, 91469 DD 91484, 91500, 91515, 91531, 91546, 91562, 91577, 91593 DD 91608, 91624, 91639, 91655, 91670, 91686, 91701, 91717 DD 91732, 91748, 91763, 91779, 91794, 91810, 91825, 91841 DD 91856, 91872, 91887, 91903, 91919, 91934, 91950, 91965 DD 91981, 91996, 92012, 92028, 92043, 92059, 92074, 92090 DD 92105, 92121, 92137, 92152, 92168, 92183, 92199, 92215 DD 92230, 92246, 92261, 92277, 92293, 92308, 92324, 92340 DD 92355, 92371, 92386, 92402, 92418, 92433, 92449, 92465 DD 92480, 92496, 92512, 92527, 92543, 92559, 92574, 92590 DD 92606, 92621, 92637, 92653, 92668, 92684, 92700, 92715 DD 92731, 92747, 92762, 92778, 92794, 92810, 92825, 92841 DD 92857, 92872, 92888, 92904, 92920, 92935, 92951, 92967 DD 92982, 92998, 93014, 93030, 93045, 93061, 93077, 93093 DD 93108, 93124, 93140, 93156, 93171, 93187, 93203, 93219 DD 93235, 93250, 93266, 93282, 93298, 93313, 93329, 93345 DD 93361, 93377, 93392, 93408, 93424, 93440, 93456, 93472 DD 93487, 93503, 93519, 93535, 93551, 93566, 93582, 93598 DD 93614, 93630, 93646, 93662, 93677, 93693, 93709, 93725 DD 93741, 93757, 93773, 93788, 93804, 93820, 93836, 93852 DD 93868, 93884, 93900, 93915, 93931, 93947, 93963, 93979 DD 93995, 94011, 94027, 94043, 94059, 94075, 94090, 94106 DD 94122, 94138, 94154, 94170, 94186, 94202, 94218, 94234 DD 94250, 94266, 94282, 94298, 94314, 94330, 94346, 94362 DD 94377, 94393, 94409, 94425, 94441, 94457, 94473, 94489 DD 94505, 94521, 94537, 94553, 94569, 94585, 94601, 94617 DD 94633, 94649, 94665, 94681, 94697, 94713, 94729, 94746 DD 94762, 94778, 94794, 94810, 94826, 94842, 94858, 94874 DD 94890, 94906, 94922, 94938, 94954, 94970, 94986, 95002 DD 95018, 95035, 95051, 95067, 95083, 95099, 95115, 95131 DD 95147, 95163, 95179, 95196, 95212, 95228, 95244, 95260 DD 95276, 95292, 95308, 95324, 95341, 95357, 95373, 95389 DD 95405, 95421, 95437, 95454, 95470, 95486, 95502, 95518 DD 95534, 95551, 95567, 95583, 95599, 95615, 95631, 95648 DD 95664, 95680, 95696, 95712, 95729, 95745, 95761, 95777 DD 95793, 95810, 95826, 95842, 95858, 95875, 95891, 95907 DD 95923, 95939, 95956, 95972, 95988, 96004, 96021, 96037 DD 96053, 96069, 96086, 96102, 96118, 96134, 96151, 96167 DD 96183, 96200, 96216, 96232, 96248, 96265, 96281, 96297 DD 96314, 96330, 96346, 96362, 96379, 96395, 96411, 96428 DD 96444, 96460, 96477, 96493, 96509, 96526, 96542, 96558 DD 96575, 96591, 96607, 96624, 96640, 96656, 96673, 96689 DD 96706, 96722, 96738, 96755, 96771, 96787, 96804, 96820 DD 96837, 96853, 96869, 96886, 96902, 96919, 96935, 96951 DD 96968, 96984, 97001, 97017, 97033, 97050, 97066, 97083 DD 97099, 97116, 97132, 97148, 97165, 97181, 97198, 97214 DD 97231, 97247, 97264, 97280, 97296, 97313, 97329, 97346 DD 97362, 97379, 97395, 97412, 97428, 97445, 97461, 97478 DD 97494, 97511, 97527, 97544, 97560, 97577, 97593, 97610 DD 97626, 97643, 97659, 97676, 97692, 97709, 97726, 97742 DD 97759, 97775, 97792, 97808, 97825, 97841, 97858, 97874 DD 97891, 97908, 97924, 97941, 97957, 97974, 97990, 98007 DD 98024, 98040, 98057, 98073, 98090, 98107, 98123, 98140 DD 98156, 98173, 98190, 98206, 98223, 98240, 98256, 98273 DD 98289, 98306, 98323, 98339, 98356, 98373, 98389, 98406 DD 98423, 98439, 98456, 98473, 98489, 98506, 98523, 98539 DD 98556, 98573, 98589, 98606, 98623, 98639, 98656, 98673 DD 98689, 98706, 98723, 98740, 98756, 98773, 98790, 98806 DD 98823, 98840, 98857, 98873, 98890, 98907, 98924, 98940 DD 98957, 98974, 98990, 99007, 99024, 99041, 99058, 99074 DD 99091, 99108, 99125, 99141, 99158, 99175, 99192, 99208 DD 99225, 99242, 99259, 99276, 99292, 99309, 99326, 99343 DD 99360, 99377, 99393, 99410, 99427, 99444, 99461, 99477 DD 99494, 99511, 99528, 99545, 99562, 99579, 99595, 99612 DD 99629, 99646, 99663, 99680, 99697, 99713, 99730, 99747 DD 99764, 99781, 99798, 99815, 99832, 99849, 99865, 99882 DD 99899, 99916, 99933, 99950, 99967, 99984, 100001, 100018 DD 100035, 100051, 100068, 100085, 100102, 100119, 100136, 100153 DD 100170, 100187, 100204, 100221, 100238, 100255, 100272, 100289 DD 100306, 100323, 100340, 100357, 100374, 100391, 100408, 100425 DD 100442, 100459, 100476, 100493, 100510, 100527, 100544, 100561 DD 100578, 100595, 100612, 100629, 100646, 100663, 100680, 100697 DD 100714, 100731, 100748, 100765, 100782, 100799, 100816, 100833 DD 100850, 100867, 100885, 100902, 100919, 100936, 100953, 100970 DD 100987, 101004, 101021, 101038, 101055, 101073, 101090, 101107 DD 101124, 101141, 101158, 101175, 101192, 101209, 101227, 101244 DD 101261, 101278, 101295, 101312, 101329, 101347, 101364, 101381 DD 101398, 101415, 101432, 101450, 101467, 101484, 101501, 101518 DD 101535, 101553, 101570, 101587, 101604, 101621, 101639, 101656 DD 101673, 101690, 101707, 101725, 101742, 101759, 101776, 101793 DD 101811, 101828, 101845, 101862, 101880, 101897, 101914, 101931 DD 101949, 101966, 101983, 102000, 102018, 102035, 102052, 102069 DD 102087, 102104, 102121, 102139, 102156, 102173, 102190, 102208 DD 102225, 102242, 102260, 102277, 102294, 102312, 102329, 102346 DD 102363, 102381, 102398, 102415, 102433, 102450, 102467, 102485 DD 102502, 102520, 102537, 102554, 102572, 102589, 102606, 102624 DD 102641, 102658, 102676, 102693, 102711, 102728, 102745, 102763 DD 102780, 102797, 102815, 102832, 102850, 102867, 102884, 102902 DD 102919, 102937, 102954, 102972, 102989, 103006, 103024, 103041 DD 103059, 103076, 103094, 103111, 103129, 103146, 103163, 103181 DD 103198, 103216, 103233, 103251, 103268, 103286, 103303, 103321 DD 103338, 103356, 103373, 103391, 103408, 103426, 103443, 103461 DD 103478, 103496, 103513, 103531, 103548, 103566, 103583, 103601 DD 103618, 103636, 103653, 103671, 103689, 103706, 103724, 103741 DD 103759, 103776, 103794, 103811, 103829, 103847, 103864, 103882 DD 103899, 103917, 103934, 103952, 103970, 103987, 104005, 104022 DD 104040, 104058, 104075, 104093, 104110, 104128, 104146, 104163 DD 104181, 104199, 104216, 104234, 104252, 104269, 104287, 104304 DD 104322, 104340, 104357, 104375, 104393, 104410, 104428, 104446 DD 104463, 104481, 104499, 104516, 104534, 104552, 104570, 104587 DD 104605, 104623, 104640, 104658, 104676, 104694, 104711, 104729 DD 104747, 104764, 104782, 104800, 104818, 104835, 104853, 104871 DD 104889, 104906, 104924, 104942, 104960, 104977, 104995, 105013 DD 105031, 105048, 105066, 105084, 105102, 105120, 105137, 105155 DD 105173, 105191, 105209, 105226, 105244, 105262, 105280, 105298 DD 105315, 105333, 105351, 105369, 105387, 105405, 105422, 105440 DD 105458, 105476, 105494, 105512, 105530, 105547, 105565, 105583 DD 105601, 105619, 105637, 105655, 105672, 105690, 105708, 105726 DD 105744, 105762, 105780, 105798, 105816, 105834, 105851, 105869 DD 105887, 105905, 105923, 105941, 105959, 105977, 105995, 106013 DD 106031, 106049, 106067, 106085, 106103, 106120, 106138, 106156 DD 106174, 106192, 106210, 106228, 106246, 106264, 106282, 106300 DD 106318, 106336, 106354, 106372, 106390, 106408, 106426, 106444 DD 106462, 106480, 106498, 106516, 106534, 106552, 106570, 106588 DD 106606, 106624, 106643, 106661, 106679, 106697, 106715, 106733 DD 106751, 106769, 106787, 106805, 106823, 106841, 106859, 106877 DD 106895, 106914, 106932, 106950, 106968, 106986, 107004, 107022 DD 107040, 107058, 107077, 107095, 107113, 107131, 107149, 107167 DD 107185, 107203, 107222, 107240, 107258, 107276, 107294, 107312 DD 107331, 107349, 107367, 107385, 107403, 107421, 107440, 107458 DD 107476, 107494, 107512, 107531, 107549, 107567, 107585, 107603 DD 107622, 107640, 107658, 107676, 107694, 107713, 107731, 107749 DD 107767, 107786, 107804, 107822, 107840, 107859, 107877, 107895 DD 107913, 107932, 107950, 107968, 107986, 108005, 108023, 108041 DD 108060, 108078, 108096, 108114, 108133, 108151, 108169, 108188 DD 108206, 108224, 108243, 108261, 108279, 108297, 108316, 108334 DD 108352, 108371, 108389, 108408, 108426, 108444, 108463, 108481 DD 108499, 108518, 108536, 108554, 108573, 108591, 108609, 108628 DD 108646, 108665, 108683, 108701, 108720, 108738, 108757, 108775 DD 108793, 108812, 108830, 108849, 108867, 108886, 108904, 108922 DD 108941, 108959, 108978, 108996, 109015, 109033, 109051, 109070 DD 109088, 109107, 109125, 109144, 109162, 109181, 109199, 109218 DD 109236, 109255, 109273, 109292, 109310, 109329, 109347, 109366 DD 109384, 109403, 109421, 109440, 109458, 109477, 109495, 109514 DD 109532, 109551, 109569, 109588, 109607, 109625, 109644, 109662 DD 109681, 109699, 109718, 109736, 109755, 109774, 109792, 109811 DD 109829, 109848, 109867, 109885, 109904, 109922, 109941, 109960 DD 109978, 109997, 110015, 110034, 110053, 110071, 110090, 110108 DD 110127, 110146, 110164, 110183, 110202, 110220, 110239, 110258 DD 110276, 110295, 110314, 110332, 110351, 110370, 110388, 110407 DD 110426, 110444, 110463, 110482, 110500, 110519, 110538, 110557 DD 110575, 110594, 110613, 110631, 110650, 110669, 110688, 110706 DD 110725, 110744, 110763, 110781, 110800, 110819, 110838, 110856 DD 110875, 110894, 110913, 110931, 110950, 110969, 110988, 111007 DD 111025, 111044, 111063, 111082, 111100, 111119, 111138, 111157 DD 111176, 111195, 111213, 111232, 111251, 111270, 111289, 111307 DD 111326, 111345, 111364, 111383, 111402, 111421, 111439, 111458 DD 111477, 111496, 111515, 111534, 111553, 111571, 111590, 111609 DD 111628, 111647, 111666, 111685, 111704, 111723, 111742, 111760 DD 111779, 111798, 111817, 111836, 111855, 111874, 111893, 111912 DD 111931, 111950, 111969, 111988, 112007, 112026, 112045, 112063 DD 112082, 112101, 112120, 112139, 112158, 112177, 112196, 112215 DD 112234, 112253, 112272, 112291, 112310, 112329, 112348, 112367 DD 112386, 112405, 112424, 112443, 112462, 112481, 112500, 112520 DD 112539, 112558, 112577, 112596, 112615, 112634, 112653, 112672 DD 112691, 112710, 112729, 112748, 112767, 112786, 112806, 112825 DD 112844, 112863, 112882, 112901, 112920, 112939, 112958, 112977 DD 112997, 113016, 113035, 113054, 113073, 113092, 113111, 113130 DD 113150, 113169, 113188, 113207, 113226, 113245, 113265, 113284 DD 113303, 113322, 113341, 113360, 113380, 113399, 113418, 113437 DD 113456, 113476, 113495, 113514, 113533, 113552, 113572, 113591 DD 113610, 113629, 113649, 113668, 113687, 113706, 113726, 113745 DD 113764, 113783, 113803, 113822, 113841, 113860, 113880, 113899 DD 113918, 113937, 113957, 113976, 113995, 114015, 114034, 114053 DD 114072, 114092, 114111, 114130, 114150, 114169, 114188, 114208 DD 114227, 114246, 114266, 114285, 114304, 114324, 114343, 114362 DD 114382, 114401, 114420, 114440, 114459, 114479, 114498, 114517 DD 114537, 114556, 114575, 114595, 114614, 114634, 114653, 114672 DD 114692, 114711, 114731, 114750, 114770, 114789, 114808, 114828 DD 114847, 114867, 114886, 114906, 114925, 114944, 114964, 114983 DD 115003, 115022, 115042, 115061, 115081, 115100, 115120, 115139 DD 115159, 115178, 115198, 115217, 115237, 115256, 115276, 115295 DD 115315, 115334, 115354, 115373, 115393, 115412, 115432, 115451 DD 115471, 115490, 115510, 115529, 115549, 115569, 115588, 115608 DD 115627, 115647, 115666, 115686, 115706, 115725, 115745, 115764 DD 115784, 115804, 115823, 115843, 115862, 115882, 115902, 115921 DD 115941, 115960, 115980, 116000, 116019, 116039, 116059, 116078 DD 116098, 116117, 116137, 116157, 116176, 116196, 116216, 116235 DD 116255, 116275, 116294, 116314, 116334, 116354, 116373, 116393 DD 116413, 116432, 116452, 116472, 116491, 116511, 116531, 116551 DD 116570, 116590, 116610, 116630, 116649, 116669, 116689, 116708 DD 116728, 116748, 116768, 116788, 116807, 116827, 116847, 116867 DD 116886, 116906, 116926, 116946, 116966, 116985, 117005, 117025 DD 117045, 117065, 117084, 117104, 117124, 117144, 117164, 117183 DD 117203, 117223, 117243, 117263, 117283, 117302, 117322, 117342 DD 117362, 117382, 117402, 117422, 117442, 117461, 117481, 117501 DD 117521, 117541, 117561, 117581, 117601, 117621, 117640, 117660 DD 117680, 117700, 117720, 117740, 117760, 117780, 117800, 117820 DD 117840, 117860, 117880, 117900, 117919, 117939, 117959, 117979 DD 117999, 118019, 118039, 118059, 118079, 118099, 118119, 118139 DD 118159, 118179, 118199, 118219, 118239, 118259, 118279, 118299 DD 118319, 118339, 118359, 118379, 118399, 118419, 118439, 118459 DD 118480, 118500, 118520, 118540, 118560, 118580, 118600, 118620 DD 118640, 118660, 118680, 118700, 118720, 118740, 118761, 118781 DD 118801, 118821, 118841, 118861, 118881, 118901, 118921, 118942 DD 118962, 118982, 119002, 119022, 119042, 119062, 119083, 119103 DD 119123, 119143, 119163, 119183, 119204, 119224, 119244, 119264 DD 119284, 119304, 119325, 119345, 119365, 119385, 119405, 119426 DD 119446, 119466, 119486, 119506, 119527, 119547, 119567, 119587 DD 119608, 119628, 119648, 119668, 119689, 119709, 119729, 119749 DD 119770, 119790, 119810, 119831, 119851, 119871, 119891, 119912 DD 119932, 119952, 119973, 119993, 120013, 120033, 120054, 120074 DD 120094, 120115, 120135, 120155, 120176, 120196, 120216, 120237 DD 120257, 120277, 120298, 120318, 120339, 120359, 120379, 120400 DD 120420, 120440, 120461, 120481, 120502, 120522, 120542, 120563 DD 120583, 120604, 120624, 120644, 120665, 120685, 120706, 120726 DD 120747, 120767, 120787, 120808, 120828, 120849, 120869, 120890 DD 120910, 120931, 120951, 120971, 120992, 121012, 121033, 121053 DD 121074, 121094, 121115, 121135, 121156, 121176, 121197, 121217 DD 121238, 121258, 121279, 121299, 121320, 121341, 121361, 121382 DD 121402, 121423, 121443, 121464, 121484, 121505, 121525, 121546 DD 121567, 121587, 121608, 121628, 121649, 121670, 121690, 121711 DD 121731, 121752, 121773, 121793, 121814, 121834, 121855, 121876 DD 121896, 121917, 121937, 121958, 121979, 121999, 122020, 122041 DD 122061, 122082, 122103, 122123, 122144, 122165, 122185, 122206 DD 122227, 122247, 122268, 122289, 122309, 122330, 122351, 122372 DD 122392, 122413, 122434, 122454, 122475, 122496, 122517, 122537 DD 122558, 122579, 122600, 122620, 122641, 122662, 122683, 122703 DD 122724, 122745, 122766, 122786, 122807, 122828, 122849, 122870 DD 122890, 122911, 122932, 122953, 122974, 122994, 123015, 123036 DD 123057, 123078, 123099, 123119, 123140, 123161, 123182, 123203 DD 123224, 123244, 123265, 123286, 123307, 123328, 123349, 123370 DD 123391, 123411, 123432, 123453, 123474, 123495, 123516, 123537 DD 123558, 123579, 123599, 123620, 123641, 123662, 123683, 123704 DD 123725, 123746, 123767, 123788, 123809, 123830, 123851, 123872 DD 123893, 123914, 123935, 123956, 123977, 123998, 124019, 124040 DD 124061, 124081, 124102, 124124, 124145, 124166, 124187, 124208 DD 124229, 124250, 124271, 124292, 124313, 124334, 124355, 124376 DD 124397, 124418, 124439, 124460, 124481, 124502, 124523, 124544 DD 124565, 124586, 124608, 124629, 124650, 124671, 124692, 124713 DD 124734, 124755, 124776, 124797, 124819, 124840, 124861, 124882 DD 124903, 124924, 124945, 124967, 124988, 125009, 125030, 125051 DD 125072, 125093, 125115, 125136, 125157, 125178, 125199, 125221 DD 125242, 125263, 125284, 125305, 125327, 125348, 125369, 125390 DD 125411, 125433, 125454, 125475, 125496, 125518, 125539, 125560 DD 125581, 125603, 125624, 125645, 125666, 125688, 125709, 125730 DD 125751, 125773, 125794, 125815, 125837, 125858, 125879, 125901 DD 125922, 125943, 125964, 125986, 126007, 126028, 126050, 126071 DD 126092, 126114, 126135, 126156, 126178, 126199, 126220, 126242 DD 126263, 126285, 126306, 126327, 126349, 126370, 126391, 126413 DD 126434, 126456, 126477, 126498, 126520, 126541, 126563, 126584 DD 126606, 126627, 126648, 126670, 126691, 126713, 126734, 126756 DD 126777, 126799, 126820, 126841, 126863, 126884, 126906, 126927 DD 126949, 126970, 126992, 127013, 127035, 127056, 127078, 127099 DD 127121, 127142, 127164, 127185, 127207, 127228, 127250, 127271 DD 127293, 127315, 127336, 127358, 127379, 127401, 127422, 127444 DD 127465, 127487, 127509, 127530, 127552, 127573, 127595, 127617 DD 127638, 127660, 127681, 127703, 127725, 127746, 127768, 127789 DD 127811, 127833, 127854, 127876, 127898, 127919, 127941, 127963 DD 127984, 128006, 128028, 128049, 128071, 128093, 128114, 128136 DD 128158, 128179, 128201, 128223, 128244, 128266, 128288, 128309 DD 128331, 128353, 128375, 128396, 128418, 128440, 128462, 128483 DD 128505, 128527, 128549, 128570, 128592, 128614, 128636, 128657 DD 128679, 128701, 128723, 128744, 128766, 128788, 128810, 128832 DD 128853, 128875, 128897, 128919, 128941, 128963, 128984, 129006 DD 129028, 129050, 129072, 129094, 129115, 129137, 129159, 129181 DD 129203, 129225, 129247, 129268, 129290, 129312, 129334, 129356 DD 129378, 129400, 129422, 129444, 129465, 129487, 129509, 129531 DD 129553, 129575, 129597, 129619, 129641, 129663, 129685, 129707 DD 129729, 129751, 129773, 129794, 129816, 129838, 129860, 129882 DD 129904, 129926, 129948, 129970, 129992, 130014, 130036, 130058 DD 130080, 130102, 130124, 130146, 130168, 130190, 130212, 130235 DD 130257, 130279, 130301, 130323, 130345, 130367, 130389, 130411 DD 130433, 130455, 130477, 130499, 130521, 130543, 130566, 130588 DD 130610, 130632, 130654, 130676, 130698, 130720, 130742, 130765 DD 130787, 130809, 130831, 130853, 130875, 130897, 130920, 130942 DD 130964, 130986, 131008, 131030, 131053, 131075, 131097, 131119 DD 131141, 131163, 131186, 131208, 131230, 131252, 131274, 131297 DD 131319, 131341, 131363, 131386, 131408, 131430, 131452, 131475 DD 131497, 131519, 131541, 131564, 131586, 131608, 131630, 131653 DD 131675, 131697, 131720, 131742, 131764, 131786, 131809, 131831 DD 131853, 131876, 131898, 131920, 131943, 131965, 131987, 132010 DD 132032, 132054, 132077, 132099, 132121, 132144, 132166, 132188 DD 132211, 132233, 132256, 132278, 132300, 132323, 132345, 132368 DD 132390, 132412, 132435, 132457, 132480, 132502, 132524, 132547 DD 132569, 132592, 132614, 132637, 132659, 132682, 132704, 132726 DD 132749, 132771, 132794, 132816, 132839, 132861, 132884, 132906 DD 132929, 132951, 132974, 132996, 133019, 133041, 133064, 133086 DD 133109, 133131, 133154, 133176, 133199, 133221, 133244, 133267 DD 133289, 133312, 133334, 133357, 133379, 133402, 133425, 133447 DD 133470, 133492, 133515, 133537, 133560, 133583, 133605, 133628 DD 133651, 133673, 133696, 133718, 133741, 133764, 133786, 133809 DD 133832, 133854, 133877, 133900, 133922, 133945, 133968, 133990 DD 134013, 134036, 134058, 134081, 134104, 134126, 134149, 134172 DD 134194, 134217, 134240, 134263, 134285, 134308, 134331, 134353 DD 134376, 134399, 134422, 134444, 134467, 134490, 134513, 134535 DD 134558, 134581, 134604, 134627, 134649, 134672, 134695, 134718 DD 134741, 134763, 134786, 134809, 134832, 134855, 134877, 134900 DD 134923, 134946, 134969, 134992, 135014, 135037, 135060, 135083 DD 135106, 135129, 135152, 135174, 135197, 135220, 135243, 135266 DD 135289, 135312, 135335, 135358, 135381, 135403, 135426, 135449 DD 135472, 135495, 135518, 135541, 135564, 135587, 135610, 135633 DD 135656, 135679, 135702, 135725, 135748, 135771, 135794, 135816 DD 135839, 135862, 135885, 135908, 135931, 135954, 135977, 136000 DD 136023, 136047, 136070, 136093, 136116, 136139, 136162, 136185 DD 136208, 136231, 136254, 136277, 136300, 136323, 136346, 136369 DD 136392, 136415, 136438, 136462, 136485, 136508, 136531, 136554 DD 136577, 136600, 136623, 136646, 136670, 136693, 136716, 136739 DD 136762, 136785, 136808, 136832, 136855, 136878, 136901, 136924 DD 136947, 136971, 136994, 137017, 137040, 137063, 137086, 137110 DD 137133, 137156, 137179, 137203, 137226, 137249, 137272, 137295 DD 137319, 137342, 137365, 137388, 137412, 137435, 137458, 137481 DD 137505, 137528, 137551, 137575, 137598, 137621, 137644, 137668 DD 137691, 137714, 137738, 137761, 137784, 137808, 137831, 137854 DD 137877, 137901, 137924, 137948, 137971, 137994, 138018, 138041 DD 138064, 138088, 138111, 138134, 138158, 138181, 138205, 138228 DD 138251, 138275, 138298, 138322, 138345, 138368, 138392, 138415 DD 138439, 138462, 138485, 138509, 138532, 138556, 138579, 138603 DD 138626, 138650, 138673, 138697, 138720, 138744, 138767, 138790 DD 138814, 138837, 138861, 138884, 138908, 138931, 138955, 138978 DD 139002, 139026, 139049, 139073, 139096, 139120, 139143, 139167 DD 139190, 139214, 139237, 139261, 139285, 139308, 139332, 139355 DD 139379, 139402, 139426, 139450, 139473, 139497, 139520, 139544 DD 139568, 139591, 139615, 139639, 139662, 139686, 139709, 139733 DD 139757, 139780, 139804, 139828, 139851, 139875, 139899, 139922 DD 139946, 139970, 139993, 140017, 140041, 140065, 140088, 140112 DD 140136, 140159, 140183, 140207, 140231, 140254, 140278, 140302 DD 140326, 140349, 140373, 140397, 140421, 140444, 140468, 140492 DD 140516, 140539, 140563, 140587, 140611, 140635, 140658, 140682 DD 140706, 140730, 140754, 140777, 140801, 140825, 140849, 140873 DD 140897, 140920, 140944, 140968, 140992, 141016, 141040, 141064 DD 141087, 141111, 141135, 141159, 141183, 141207, 141231, 141255 DD 141279, 141303, 141326, 141350, 141374, 141398, 141422, 141446 DD 141470, 141494, 141518, 141542, 141566, 141590, 141614, 141638 DD 141662, 141686, 141710, 141734, 141758, 141782, 141806, 141830 DD 141854, 141878, 141902, 141926, 141950, 141974, 141998, 142022 DD 142046, 142070, 142094, 142118, 142142, 142166, 142190, 142214 DD 142238, 142262, 142286, 142310, 142334, 142359, 142383, 142407 DD 142431, 142455, 142479, 142503, 142527, 142551, 142576, 142600 DD 142624, 142648, 142672, 142696, 142720, 142745, 142769, 142793 DD 142817, 142841, 142865, 142890, 142914, 142938, 142962, 142986 DD 143011, 143035, 143059, 143083, 143107, 143132, 143156, 143180 DD 143204, 143228, 143253, 143277, 143301, 143325, 143350, 143374 DD 143398, 143423, 143447, 143471, 143495, 143520, 143544, 143568 DD 143593, 143617, 143641, 143665, 143690, 143714, 143738, 143763 DD 143787, 143811, 143836, 143860, 143884, 143909, 143933, 143957 DD 143982, 144006, 144031, 144055, 144079, 144104, 144128, 144152 DD 144177, 144201, 144226, 144250, 144275, 144299, 144323, 144348 DD 144372, 144397, 144421, 144446, 144470, 144494, 144519, 144543 DD 144568, 144592, 144617, 144641, 144666, 144690, 144715, 144739 DD 144764, 144788, 144813, 144837, 144862, 144886, 144911, 144935 DD 144960, 144984, 145009, 145033, 145058, 145082, 145107, 145132 DD 145156, 145181, 145205, 145230, 145254, 145279, 145304, 145328 DD 145353, 145377, 145402, 145427, 145451, 145476, 145500, 145525 DD 145550, 145574, 145599, 145624, 145648, 145673, 145698, 145722 DD 145747, 145772, 145796, 145821, 145846, 145870, 145895, 145920 DD 145944, 145969, 145994, 146018, 146043, 146068, 146093, 146117 DD 146142, 146167, 146191, 146216, 146241, 146266, 146290, 146315 DD 146340, 146365, 146390, 146414, 146439, 146464, 146489, 146513 DD 146538, 146563, 146588, 146613, 146637, 146662, 146687, 146712 DD 146737, 146762, 146786, 146811, 146836, 146861, 146886, 146911 DD 146936, 146960, 146985, 147010, 147035, 147060, 147085, 147110 DD 147135, 147160, 147184, 147209, 147234, 147259, 147284, 147309 DD 147334, 147359, 147384, 147409, 147434, 147459, 147484, 147509 DD 147534, 147559, 147583, 147608, 147633, 147658, 147683, 147708 DD 147733, 147758, 147783, 147808, 147833, 147858, 147883, 147909 DD 147934, 147959, 147984, 148009, 148034, 148059, 148084, 148109 DD 148134, 148159, 148184, 148209, 148234, 148259, 148284, 148310 DD 148335, 148360, 148385, 148410, 148435, 148460, 148485, 148510 DD 148536, 148561, 148586, 148611, 148636, 148661, 148686, 148712 DD 148737, 148762, 148787, 148812, 148838, 148863, 148888, 148913 DD 148938, 148964, 148989, 149014, 149039, 149064, 149090, 149115 DD 149140, 149165, 149191, 149216, 149241, 149266, 149292, 149317 DD 149342, 149367, 149393, 149418, 149443, 149469, 149494, 149519 DD 149544, 149570, 149595, 149620, 149646, 149671, 149696, 149722 DD 149747, 149772, 149798, 149823, 149848, 149874, 149899, 149925 DD 149950, 149975, 150001, 150026, 150051, 150077, 150102, 150128 DD 150153, 150178, 150204, 150229, 150255, 150280, 150306, 150331 DD 150356, 150382, 150407, 150433, 150458, 150484, 150509, 150535 DD 150560, 150586, 150611, 150637, 150662, 150688, 150713, 150739 DD 150764, 150790, 150815, 150841, 150866, 150892, 150917, 150943 DD 150968, 150994, 151019, 151045, 151071, 151096, 151122, 151147 DD 151173, 151198, 151224, 151250, 151275, 151301, 151326, 151352 DD 151378, 151403, 151429, 151455, 151480, 151506, 151531, 151557 DD 151583, 151608, 151634, 151660, 151685, 151711, 151737, 151762 DD 151788, 151814, 151839, 151865, 151891, 151917, 151942, 151968 DD 151994, 152019, 152045, 152071, 152097, 152122, 152148, 152174 DD 152200, 152225, 152251, 152277, 152303, 152328, 152354, 152380 DD 152406, 152432, 152457, 152483, 152509, 152535, 152561, 152586 DD 152612, 152638, 152664, 152690, 152716, 152741, 152767, 152793 DD 152819, 152845, 152871, 152897, 152922, 152948, 152974, 153000 DD 153026, 153052, 153078, 153104, 153130, 153156, 153181, 153207 DD 153233, 153259, 153285, 153311, 153337, 153363, 153389, 153415 DD 153441, 153467, 153493, 153519, 153545, 153571, 153597, 153623 DD 153649, 153675, 153701, 153727, 153753, 153779, 153805, 153831 DD 153857, 153883, 153909, 153935, 153961, 153987, 154013, 154039 DD 154065, 154091, 154118, 154144, 154170, 154196, 154222, 154248 DD 154274, 154300, 154326, 154352, 154379, 154405, 154431, 154457 DD 154483, 154509, 154535, 154562, 154588, 154614, 154640, 154666 DD 154692, 154719, 154745, 154771, 154797, 154823, 154850, 154876 DD 154902, 154928, 154954, 154981, 155007, 155033, 155059, 155086 DD 155112, 155138, 155164, 155191, 155217, 155243, 155269, 155296 DD 155322, 155348, 155374, 155401, 155427, 155453, 155480, 155506 DD 155532, 155559, 155585, 155611, 155638, 155664, 155690, 155717 DD 155743, 155769, 155796, 155822, 155848, 155875, 155901, 155928 DD 155954, 155980, 156007, 156033, 156060, 156086, 156112, 156139 DD 156165, 156192, 156218, 156245, 156271, 156297, 156324, 156350 DD 156377, 156403, 156430, 156456, 156483, 156509, 156536, 156562 DD 156589, 156615, 156642, 156668, 156695, 156721, 156748, 156774 DD 156801, 156827, 156854, 156880, 156907, 156934, 156960, 156987 DD 157013, 157040, 157066, 157093, 157120, 157146, 157173, 157199 DD 157226, 157253, 157279, 157306, 157332, 157359, 157386, 157412 DD 157439, 157466, 157492, 157519, 157546, 157572, 157599, 157626 DD 157652, 157679, 157706, 157732, 157759, 157786, 157812, 157839 DD 157866, 157893, 157919, 157946, 157973, 157999, 158026, 158053 DD 158080, 158106, 158133, 158160, 158187, 158213, 158240, 158267 DD 158294, 158321, 158347, 158374, 158401, 158428, 158455, 158481 DD 158508, 158535, 158562, 158589, 158616, 158642, 158669, 158696 DD 158723, 158750, 158777, 158804, 158830, 158857, 158884, 158911 DD 158938, 158965, 158992, 159019, 159046, 159073, 159100, 159126 DD 159153, 159180, 159207, 159234, 159261, 159288, 159315, 159342 DD 159369, 159396, 159423, 159450, 159477, 159504, 159531, 159558 DD 159585, 159612, 159639, 159666, 159693, 159720, 159747, 159774 DD 159801, 159828, 159855, 159882, 159909, 159936, 159963, 159990 DD 160018, 160045, 160072, 160099, 160126, 160153, 160180, 160207 DD 160234, 160261, 160289, 160316, 160343, 160370, 160397, 160424 DD 160451, 160479, 160506, 160533, 160560, 160587, 160614, 160642 DD 160669, 160696, 160723, 160750, 160778, 160805, 160832, 160859 DD 160886, 160914, 160941, 160968, 160995, 161023, 161050, 161077 DD 161104, 161132, 161159, 161186, 161213, 161241, 161268, 161295 DD 161323, 161350, 161377, 161405, 161432, 161459, 161487, 161514 DD 161541, 161569, 161596, 161623, 161651, 161678, 161705, 161733 DD 161760, 161787, 161815, 161842, 161870, 161897, 161924, 161952 DD 161979, 162007, 162034, 162061, 162089, 162116, 162144, 162171 DD 162199, 162226, 162253, 162281, 162308, 162336, 162363, 162391 DD 162418, 162446, 162473, 162501, 162528, 162556, 162583, 162611 DD 162638, 162666, 162693, 162721, 162748, 162776, 162804, 162831 DD 162859, 162886, 162914, 162941, 162969, 162997, 163024, 163052 DD 163079, 163107, 163135, 163162, 163190, 163217, 163245, 163273 DD 163300, 163328, 163356, 163383, 163411, 163438, 163466, 163494 DD 163521, 163549, 163577, 163604, 163632, 163660, 163688, 163715 DD 163743, 163771, 163798, 163826, 163854, 163882, 163909, 163937 DD 163965, 163993, 164020, 164048, 164076, 164104, 164131, 164159 DD 164187, 164215, 164243, 164270, 164298, 164326, 164354, 164382 DD 164409, 164437, 164465, 164493, 164521, 164549, 164576, 164604 DD 164632, 164660, 164688, 164716, 164744, 164771, 164799, 164827 DD 164855, 164883, 164911, 164939, 164967, 164995, 165023, 165051 DD 165078, 165106, 165134, 165162, 165190, 165218, 165246, 165274 DD 165302, 165330, 165358, 165386, 165414, 165442, 165470, 165498 DD 165526, 165554, 165582, 165610, 165638, 165666, 165694, 165722 DD 165750, 165778, 165806, 165834, 165862, 165891, 165919, 165947 DD 165975, 166003, 166031, 166059, 166087, 166115, 166143, 166172 DD 166200, 166228, 166256, 166284, 166312, 166340, 166368, 166397 DD 166425, 166453, 166481, 166509, 166538, 166566, 166594, 166622 DD 166650, 166678, 166707, 166735, 166763, 166791, 166820, 166848 DD 166876, 166904, 166933, 166961, 166989, 167017, 167046, 167074 DD 167102, 167130, 167159, 167187, 167215, 167244, 167272, 167300 DD 167328, 167357, 167385, 167413, 167442, 167470, 167498, 167527 DD 167555, 167584, 167612, 167640, 167669, 167697, 167725, 167754 DD 167782, 167811, 167839, 167867, 167896, 167924, 167953, 167981 DD 168009, 168038, 168066, 168095, 168123, 168152, 168180, 168209 DD 168237, 168266, 168294, 168322, 168351, 168379, 168408, 168436 DD 168465, 168493, 168522, 168551, 168579, 168608, 168636, 168665 DD 168693, 168722, 168750, 168779, 168807, 168836, 168865, 168893 DD 168922, 168950, 168979, 169007, 169036, 169065, 169093, 169122 DD 169151, 169179, 169208, 169236, 169265, 169294, 169322, 169351 DD 169380, 169408, 169437, 169466, 169494, 169523, 169552, 169580 DD 169609, 169638, 169667, 169695, 169724, 169753, 169781, 169810 DD 169839, 169868, 169896, 169925, 169954, 169983, 170011, 170040 DD 170069, 170098, 170127, 170155, 170184, 170213, 170242, 170271 DD 170299, 170328, 170357, 170386, 170415, 170444, 170472, 170501 DD 170530, 170559, 170588, 170617, 170646, 170674, 170703, 170732 DD 170761, 170790, 170819, 170848, 170877, 170906, 170935, 170964 DD 170992, 171021, 171050, 171079, 171108, 171137, 171166, 171195 DD 171224, 171253, 171282, 171311, 171340, 171369, 171398, 171427 DD 171456, 171485, 171514, 171543, 171572, 171601, 171630, 171659 DD 171688, 171717, 171746, 171776, 171805, 171834, 171863, 171892 DD 171921, 171950, 171979, 172008, 172037, 172066, 172096, 172125 DD 172154, 172183, 172212, 172241, 172270, 172300, 172329, 172358 DD 172387, 172416, 172445, 172475, 172504, 172533, 172562, 172591 DD 172621, 172650, 172679, 172708, 172737, 172767, 172796, 172825 DD 172854, 172884, 172913, 172942, 172972, 173001, 173030, 173059 DD 173089, 173118, 173147, 173177, 173206, 173235, 173264, 173294 DD 173323, 173352, 173382, 173411, 173440, 173470, 173499, 173529 DD 173558, 173587, 173617, 173646, 173675, 173705, 173734, 173764 DD 173793, 173822, 173852, 173881, 173911, 173940, 173970, 173999 DD 174028, 174058, 174087, 174117, 174146, 174176, 174205, 174235 DD 174264, 174294, 174323, 174353, 174382, 174412, 174441, 174471 DD 174500, 174530, 174559, 174589, 174618, 174648, 174678, 174707 DD 174737, 174766, 174796, 174825, 174855, 174885, 174914, 174944 DD 174973, 175003, 175033, 175062, 175092, 175122, 175151, 175181 DD 175210, 175240, 175270, 175299, 175329, 175359, 175388, 175418 DD 175448, 175478, 175507, 175537, 175567, 175596, 175626, 175656 DD 175686, 175715, 175745, 175775, 175804, 175834, 175864, 175894 DD 175924, 175953, 175983, 176013, 176043, 176072, 176102, 176132 DD 176162, 176192, 176221, 176251, 176281, 176311, 176341, 176371 GUSScreenList Label DW 7 DW Near Ptr IdleFunctionList DW Near Ptr GlobalKeyLink DW Near Ptr FullScreenBox ; 0 DW Near Ptr ScreenHeader DW Near Ptr FillHeader DW Near Ptr GravisHeaderLine DW Near Ptr MixerText DW Near Ptr VolumeBox1 DW Near Ptr VolumeBox2 DW Near Ptr MasterVolumeLeft ; 7 DW Near Ptr MasterVolumeRight DW Near Ptr TrebleVolumeLeft DW Near Ptr TrebleVolumeRight DW Near Ptr BassVolumeLeft DW Near Ptr BassVolumeRight ; 12 DW Near Ptr SampleText DW Near Ptr SampleSize0Button ; 14 DW Near Ptr SampleSize1Button DW Near Ptr SampleSize2Button DW Near Ptr SampleSize3Button ; 17 DW Near Ptr EffectText DW Near Ptr EffectBox DW Near Ptr ChorusThumbBar ; 20 DW Near Ptr ReverbThumbBar DW DriverText DW 0 GravisHeaderLine DW 10 DB "Sound Blaster AWE 32 Driver", 0 DriverText DW 1 DB 27, 48 DB 21h DB "Sound Blaster AWE 32 Driver 1.5 for Impulse Tracker", 0 MixerText DW 1 DB 3, 13 DB 20h DB "Mixer options", 13 DB 13 DB " Master Volume Left", 13 DB " Master Volume Right", 13 DB 13 DB 13 DB " Treble Left", 13 DB " Treble Right", 13 DB " Bass Left", 13 DB " Bass Right", 13 DB 0 VolumeBox1 DW 0 DB 24, 14, 30, 17 DB 25 VolumeBox2 DW 0 DB 17, 18, 21, 23 DB 25 MasterVolumeLeft DW 9 DB 25, 15 DW 0, 31 DW 9, 0 DW 0FFFFh, 8, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh MasterVolumeRight DW 9 DB 25, 16 DW 0, 31 DW 9, 1 DW 7, 9, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh TrebleVolumeLeft DW 9 DB 18, 19 DW 0, 15 DW 9, 2 DW 8, 10, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh TrebleVolumeRight DW 9 DB 18, 20 DW 0, 15 DW 9, 3 DW 9, 11, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh BassVolumeLeft DW 9 DB 18, 21 DW 0, 15 DW 9, 4 DW 10, 12, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh BassVolumeRight DW 9 DB 18, 22 DW 0, 15 DW 9, 5 DW 11, 14, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh SampleText DW 1 DB 3, 25 DB 20h DB "Sample resizing options", 0 SampleSize0Button DW 2 DW 12, 15, 0FFFFh, 0FFFFh DW 0 DW 0, 0 DW 6 DW Offset GetCompress DriverSegment1 DW 0 DW 0 DW Offset SetCompress DriverSegment2 DW 0 DB 7, 27, 20, 29, 8 DB 0 DB " Original", 0 SampleSize1Button DW 2 DW 14, 16, 0FFFFh, 0FFFFh DW 0 DW 0, 0 DW 6 DW Offset GetCompress DriverSegment3 DW 0 DW 1 DW Offset SetCompress DriverSegment4 DW 0 DB 7, 30, 20, 32, 8 DB 0 DB " Half", 0 SampleSize2Button DW 2 DW 15, 17, 0FFFFh, 0FFFFh DW 0 DW 0, 0 DW 6 DW Offset GetCompress DriverSegment5 DW 0 DW 2 DW Offset SetCompress DriverSegment6 DW 0 DB 7, 33, 20, 35, 8 DB 0 DB " Quarter", 0 SampleSize3Button DW 2 DW 16, 20, 0FFFFh, 0FFFFh DW 0 DW 0, 0 DW 6 DW Offset GetCompress DriverSegment7 DW 0 DW 3 DW Offset SetCompress DriverSegment8 DW 0 DB 7, 36, 20, 38, 8 DB 0 DB " Eighth", 0 EffectText DW 1 DB 3, 40 DB 20h DB "Effect options", 13 DB 13 DB " Chorus", 13 DB " Reverb", 0 EffectBox DW 0 DB 12, 41, 30, 44 DB 25 ChorusThumbBar DW 9 DB 13, 42 DW 0, 127 DW 9, 6 DW 17, 21, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh ReverbThumbBar DW 9 DB 13, 43 DW 0, 127 DW 9, 7 DW 20, 0FFFFh, 0FFFFh, 0FFFFh DW 0FFFFh, 0FFFFh VolumeTable DB 6 Dup (0) CONFIGURATIONOFFSET EQU $+128 CONFIGSIZE EQU 2 Chorus DB 10, 64 GlobalKeyLink DB 7 GlobalKeyLink2 DD 0 IdleFunctionList DD 0 DD 0 FillHeader DW 8 FillHeader2 DD 0 FullScreenBox DW 0 DB 0, 0, 79, 49 DB 4 ScreenHeader DW 8 ScreenHeader2 DD 0 AWEParameters DB 64 Dup (0FFh), 64 Dup (0) ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SBOut ; AL = data ; DX = 2xCh Push AX SBOut1: In AL, DX Test AL, AL JS SBOut1 Pop AX Out DX, AL Ret EndP SBOut ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc DetectUART ; Given DX = Port ; From SB-DevKit ClI Inc DX Xor CX, CX DetectUART1: In AL, DX Test AL, 40h ; Ready for output LoopNZ DetectUART1 JNZ DetectUARTError Mov AL, 0FFh ; Reset! Out DX, AL Xor CX, CX DetectUART2: In AL, DX Test AL, 80h JNZ DetectUART3 Dec DX In AL, DX Inc DX Cmp AL, 0FEh JE DetectUART4 DetectUART3: Loop DetectUART2 DetectUARTError: StI StC Ret DetectUART4: ; Now to shove it into 'intelligent' mode. Xor CX, CX DetectUART5: In AL, DX Test AL, 40h LoopNZ DetectUART5 JNZ DetectUARTError Mov AL, 3Fh ; Intelligent mode! Out DX, AL DetectUART6: Xor CX, CX DetectUART7: In AL, DX Test AL, 80h JNZ DetectUART8 Dec DX In AL, DX Inc DX Cmp AL, 0FEh JE DetectUART9 DetectUART8: Loop DetectUART7 Jmp DetectUARTError DetectUART9: StI ClC Ret EndP DetectUART ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ReinitUART Mov DX, MIDIPort Test DX, DX JZ ReinitUART1 Call DetectUART ReinitUART1: Ret EndP ReinitUART ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ResetUART Mov DX, MIDIPort Test DX, DX JZ ResetUART1 Inc DX Mov AL, 0FFh Out DX, AL ResetUART1: Ret EndP ResetUART ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetCompress Far Mov CX, [SI+22] Mov CS:Compress, CL Mov AX, 1 ShL AX, CL Mov CS:Step, AX Call Music_LoadAllSamples Mov AX, 1 Ret EndP SetCompress ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc GetCompress Far Push CS Pop ES Mov DI, Offset Compress Ret EndP GetCompress ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Load8BitSamplesForwards ; Given DS:SI, ECX = count Push BX Mov BX, CS:Step Mov DX, CS:BasePort Add DX, 400h Xor AL, AL Load8BitSamplesForwards2: Mov AH, [SI] Add SI, BX JC Load8BitSamplesForwards4 Load8BitSamplesForwards3: Out DX, AX Dec ECX JNZ Load8BitSamplesForwards2 Pop BX Ret Load8BitSamplesForwards4: Add ESI, 10000h Int 3 Jmp Load8BitSamplesForwards3 EndP Load8BitSamplesForwards ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Load16BitSamplesForwards ; Given DS:SI, ECX = count Push BX Mov BX, CS:Step Mov DX, CS:BasePort Add DX, 400h Add BX, BX Load16BitSamplesForwards2: Mov AX, [SI] Add SI, BX JC Load16BitSamplesForwards4 Load16BitSamplesForwards3: Out DX, AX Dec ECX JNZ Load16BitSamplesForwards2 Pop BX Ret Load16BitSamplesForwards4: Add ESI, 10000h Int 3 Jmp Load16BitSamplesForwards3 EndP Load16BitSamplesForwards ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Load8BitSamplesBackwards ; Given DS:SI, ECX = count Push BX Mov BX, CS:Step Mov DX, CS:BasePort Add DX, 400h Xor AL, AL Sub SI, BX JC Load8BitSamplesBackwards6 Load8BitSamplesBackwards2: Sub SI, BX JC Load8BitSamplesBackwards4 Load8BitSamplesBackwards3: Mov AH, [SI] Out DX, AX Dec ECX JNZ Load8BitSamplesBackwards2 Pop BX Ret Load8BitSamplesBackwards4: Sub ESI, 10000h JC Load8BitSamplesBackwards5 Int 3 Jmp Load8BitSamplesBackwards3 Load8BitSamplesBackwards5: Xor ESI, ESI Jmp Load8BitSamplesBackwards3 Load8BitSamplesBackwards6: Sub ESI, 10000h Int 3 Jmp Load8BitSamplesBackwards2 EndP Load8BitSamplesBackwards ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Load16BitSamplesBackwards ; Given DS:SI, ECX = count Push BX Mov BX, CS:Step Mov DX, CS:BasePort Add DX, 400h Add BX, BX Sub SI, BX JC Load16BitSamplesBackwards6 Load16BitSamplesBackwards2: Sub SI, BX JC Load16BitSamplesBackwards4 Load16BitSamplesBackwards3: Mov AX, [SI] Out DX, AX Dec ECX JNZ Load16BitSamplesBackwards2 Pop BX Ret Load16BitSamplesBackwards4: Sub ESI, 10000h JC Load16BitSamplesBackwards5 Int 3 Jmp Load16BitSamplesBackwards3 Load16BitSamplesBackwards5: Xor ESI, ESI Jmp Load16BitSamplesBackwards3 Load16BitSamplesBackwards6: Sub ESI, 10000h Int 3 Jmp Load16BitSamplesBackwards2 EndP Load16BitSamplesBackwards ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc WriteDataChannel Or AX, DX Proc WriteData ; Have BX/EBX = value ; AX = xxyyh ; ^ ^ ; | | ; | \-- value to send to pointer register ; \---- 0, 1, 2 or 3, 4 ; 0 = data reg 0 ; 1 = data reg 1, dword ; 2 = data reg 2 ; 3 = data reg 3 ; 4 = data reg 4, word Push DX Push AX Mov DX, BasePort Add DX, 802h And AX, 0FFh Out DX, AX Pop AX Cmp AH, 1 JB WriteDataReg0 JE WriteDataReg1DWord Cmp AH, 3 JB WriteDataReg2 JE WriteDataReg3 Jmp WriteDataReg1Word WriteDataReg0: Sub DX, 802h Mov EAX, EBX Out DX, EAX Pop DX Ret WriteDataReg1DWord: Sub DX, 402h Mov EAX, EBX Out DX, EAX Pop DX Ret WriteDataReg1Word: Sub DX, 402h Mov AX, BX Out DX, AX Pop DX Ret WriteDataReg2: Sub DX, 400h Mov AX, BX Out DX, AX Pop DX Ret WriteDataReg3: Sub DL, 2 Mov AX, BX Out DX, AX Pop DX Ret EndP WriteData EndP WriteDataChannel ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ReadDataChannel Or AX, DX Proc ReadData ; AX = xxyyh ; ^ ^ ; | | ; | \-- value to send to pointer register ; \---- 0, 1, 2 or 3, 4 ; 0 = data reg 0 ; 1 = data reg 1, dword ; 2 = data reg 2 ; 3 = data reg 3 ; 4 = data reg 4, word Push DX Push AX Mov DX, BasePort Add DX, 802h And AX, 0FFh Out DX, AX Pop AX Cmp AH, 1 JB ReadDataReg0 JE ReadDataReg1DWord Cmp AH, 3 JB ReadDataReg2 JE ReadDataReg3 Jmp ReadDataReg1Word ReadDataReg0: Sub DX, 802h In EAX, DX Pop DX Ret ReadDataReg1DWord: Sub DX, 402h In EAX, DX Pop DX Ret ReadDataReg1Word: Sub DX, 402h In AX, DX Pop DX Ret ReadDataReg2: Sub DX, 400h In AX, DX Pop DX Ret ReadDataReg3: Sub DL, 2 In AX, DX Pop DX Ret EndP ReadData EndP ReadDataChannel ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetAWEFrequency Push DS Push SI Push CX Push DX Mov EAX, [SI+10h] ; Final freq Mov CL, Compress ShR EAX, CL Test EAX, EAX JZ SetAWEFrequencyError Cmp EAX, 88200*2 JAE SetAWEFrequencyError Push CS Pop DS Assume DS:Driver And ESI, 0FFFFh Mov BX, 0F000h Mov CX, 0FFFh ; Use binary search Xor DX, DX ; CX = upper, DX = lower SetAWEFrequency1: Cmp EAX, 88200 JAE SetAWEFrequency2 Sub BX, 1000h JC SetAWEFrequencyError Add EAX, EAX Jmp SetAWEFrequency1 SetAWEFrequency2: Cmp CX, DX JBE SetAWEFrequency5 Mov SI, CX Add SI, DX ShR SI, 1 Cmp EAX, [AWEPitchTable+ESI*4] JE SetAWEFrequency3 JB SetAWEFrequency4 ; In lower half ; In upper half Inc SI Mov DX, SI Jmp SetAWEFrequency2 SetAWEFrequency4: ; In lower half Dec SI Mov CX, SI Jmp SetAWEFrequency2 SetAWEFrequency5: Mov SI, CX SetAWEFrequency3: Add BX, SI Pop DX Pop CX Pop SI Pop DS Mov AX, IP Call WriteDataChannel Ret Assume DS:Nothing SetAWEFrequencyError: Call StopAWENote Mov Word Ptr [SI], 200h Test Byte Ptr [SI+3Ah], 80h JNZ SetAWEFrequencyError1 Mov BX, [SI+38h] And Byte Ptr [BX], Not 4 ; Signify channel off SetAWEFrequencyError1: Mov AX, IP Xor EBX, EBX Call WriteDataChannel Push CS Pop DS Mov SI, Offset FrequencyError Mov BX, 40 Call SetInfoLine Pop DX Pop CX Pop SI Pop DS Ret EndP SetAWEFrequency Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetAWEPan Mov AX, PSST Call ReadDataChannel ; Get starting offset Cmp CS:Stereo, 0 JE SetPan2 Test CL, 128 JNZ SetPan2 Mov BL, [SI+37h] ; Final pan Cmp BL, 100 ; Surround -> central JNE SetPan1 SetPan2: Mov BL, 32 SetPan1: ; BL = 0->64, need to extend to 0->255 Add BL, BL Add BL, BL SBB BL, 0 ; BL = 0->255 Not BL ShL EAX, 8 SHLD EBX, EAX, 24 Mov AX, PSST Call WriteDataChannel Ret EndP SetAWEPan ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetAWEVolume Test CH, 8 JZ SetAWEVolume1 Test CH, 1 JNZ SetAWEVolume5 Cmp Byte Ptr [SI+8], 0FFh JE SetAWEVolume4 SetAWEVolume5: Mov Byte Ptr [SI+8], 0FFh Mov AX, IFATN Call ReadDataChannel Mov BX, AX Mov AX, IFATN Mov BL, 0FFh Call WriteDataChannel SetAWEVolume4: Ret SetAWEVolume1: ; First check if channel has been disowned Xor BX, BX Mov BL, [SI+3Ah] ; BL = host channel Test BL, BL JS SetAWEVolume3 SetAWEVolume2: Mov AH, [CS:AWEParameters+BX] ; AH = filter Mov AL, [CS:AWEParameters+BX+64] ; AL = Q. ShR AL, 3 Mov [SI+5Bh], AH Cmp AL, [SI+3Fh] JE SetAWEVolume3 Mov [SI+3Fh], AL ; Set Q Mov BL, AL ShL EBX, 28 Mov AX, CCCA Call ReadDataChannel And EAX, 0FFFFFFFh Or EBX, EAX Mov AX, CCCA Call WriteDataChannel SetAWEVolume3: Mov AL, [SI+3Eh] Mul Byte Ptr [SI+5Bh] ShL AX, 1 Xor BX, BX Add AH, 1 Mov BL, [SI+20h] ; Final volume Mov [SI+8], BL Mov BL, [CS:AWEVolumeTable+BX] Mov BH, AH Mov AX, IFATN Call WriteDataChannel Ret EndP SetAWEVolume ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc StopAWENote Mov AX, DCYSUSV Mov BX, 80h Call WriteDataChannel Mov AX, VTFT Mov EBX, 0FFFFh Call WriteDataChannel Mov AX, CVCF Call WriteDataChannel Mov BX, 80h Mov AX, DCYSUSV Call WriteDataChannel Mov AX, VTFT Mov EBX, 0FFFFh Call WriteDataChannel Mov AX, CVCF Call WriteDataChannel Xor EBX, EBX Mov AX, ENVVOL Call WriteDataChannel Mov AX, ENVVAL Call WriteDataChannel Mov AX, SUSDCY Call WriteDataChannel Mov AX, ATKHLDV Call WriteDataChannel Mov AX, LFO1VAL Call WriteDataChannel Mov AX, HLDATK Call WriteDataChannel Mov AX, LFO2VAL Call WriteDataChannel Mov AX, IP Call WriteDataChannel Mov AX, IFATN Call WriteDataChannel Mov AX, PEFE Call WriteDataChannel Mov AX, FMMOD Call WriteDataChannel Mov AX, TREMFRQ Call WriteDataChannel Mov AX, FM2FRQ2 Call WriteDataChannel Mov AX, PTRX Call WriteDataChannel Mov AX, VTFT Call WriteDataChannel ; Mov AX, PSST ; Call WriteDataChannel Mov BL, 8 Mov AX, CSL Call WriteDataChannel Xor BX, BX Mov AX, CCCA Call WriteDataChannel Mov AX, CPF Call WriteDataChannel Ret EndP StopAWENote ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetAWERegisters ; DS:SI = channel info table ; CX = number of channels... Push CX Push SI ; Stage 1. ; Turn off any channel which has ; a new note to play ; If no new note to play and channel ; is on, then get current position Xor DX, DX ; DX = oscillator number GetAWERegisters1: Mov BX, [SI] Test BH, 2 ; Note cut command JZ GetAWERegisters2 Mov BX, 200h Mov [SI], BX Call StopAWENote Jmp GetAWERegisters4 GetAWERegisters2: Test BL, 1 ; Channel on? JZ GetAWERegisters4 Test BH, 1 ; New note? JZ GetAWERegisters3 ; Fade out volume Mov AX, DCYSUSV Mov BX, 807Fh Call WriteDataChannel ; Call StopAWENote Jmp GetAWERegisters4 GetAWERegisters3: ; Get offset Mov AX, CCCA Call ReadDataChannel Xor BX, BX And EAX, 00000000111111111111111111111111b Inc EAX ; Interpolator correction ; EAX = address in sound memory Mov BL, [SI+36h] ; BL = sample number LEA BX, [EBX*4+EBX] ShL BX, 2 Add BX, Offset AWEDataTable Cmp Byte Ptr [SI+0Ah], 8 JB GetAddressNoLoop JE GetAddressForwardsLoop GetAddressPingPongLoop: Cmp EAX, [CS:BX+16] JB SetOldAddress Neg EAX Add EAX, [CS:BX+8] Jmp SetOldAddress1 GetAddressNoLoop: Cmp EAX, [CS:BX+4] ; Start loop JB SetOldAddress Call StopAWENote ; OK.. gotta turn off channel Mov Word Ptr [SI], 0 Test Byte Ptr [SI+3Ah], 80h JNZ GetAWERegisters4 Mov BX, [SI+38h] And Byte Ptr [BX], Not 4 ; Signify channel off Jmp GetAWERegisters4 GetAddressForwardsLoop: SetOldAddress: Sub EAX, [CS:BX] ; EAX = address in sample JNS SetOldAddress1 Xor EAX, EAX SetOldAddress1: Push CX Mov CL, Compress ShL EAX, CL Pop CX XChg [SI+4Ch], EAX Mov [SI+2Ch], EAX GetAWERegisters4: Add SI, 128 Inc DX Dec CX JNZ GetAWERegisters1 Pop SI Pop CX Xor DX, DX ; DX = oscillator number SetAWERegisters1: ; Stage 2. ; If new frequency, play new frequency ; If new volume, play new volume ; If new pan, play new pan ; If new note, set ENVVOL, ENVVAL, SUSDCY, ATKHLDV, LFO1VAL, HLDATK ; LFO2VAL, IP, IFATN, PEFE, FMMOD, TREMFRQ, FM2FRQ2 ; PSST, CSL, CCCA ; VTFT, CVCF, DCYSUSV, PTRX, CPF Push CX Mov CX, [SI] Test CL, 1 ; Channel on? JZ SetAWERegistersEnd Test CH, 1 ; New note? JZ SetAWERegisters2 Xor BX, BX Mov BL, [SI+36h] LEA DI, [EBX*4+EBX] ShL DI, 2 Add DI, Offset AWEDataTable Mov AX, DCYSUSV Mov BX, 80h Call WriteDataChannel Mov AX, VTFT Xor EBX, EBX Call WriteDataChannel Mov AX, CVCF Call WriteDataChannel Cmp DWord Ptr [CS:DI], 0FFFFFFFFh JE SetAWERegistersError Mov AX, PTRX Call WriteDataChannel Mov AX, CPF Call WriteDataChannel Mov AX, ENVVOL Mov BX, 8000h Call WriteDataChannel Mov AX, ENVVAL Mov BX, 8000h Call WriteDataChannel Mov AX, SUSDCY Mov BX, 7F7Fh Call WriteDataChannel Mov AX, ATKHLDV Call WriteDataChannel Mov AX, LFO1VAL Mov BX, 8000h Call WriteDataChannel Mov AX, HLDATK Mov BX, 7F7Fh Call WriteDataChannel Mov AX, LFO2VAL Mov BX, 8000h Call WriteDataChannel Call SetAWEFrequency Call SetAWEVolume Mov AX, PEFE Xor BX, BX Call WriteDataChannel Mov AX, FMMOD Call WriteDataChannel Mov AX, TREMFRQ Mov BX, 10h Call WriteDataChannel Mov AX, FM2FRQ2 Call WriteDataChannel Mov EBX, [CS:DI+4] Dec EBX ; Interpolator offset Mov AX, PSST Call WriteDataChannel Call SetAWEPan Mov AL, [CS:VolumeTable+6] ; Chorus ShL EAX, 24 Mov EBX, [CS:DI+8] Dec EBX ; Interpolator offset Or EBX, EAX Mov AX, CSL Call WriteDataChannel Mov AL, [SI+3Fh] ShL EAX, 28 Push CX Mov CL, Compress Mov EBX, [SI+4Ch] ShR EBX, CL Pop CX Add EBX, [CS:DI] Dec EBX ; Interpolator offset Or EBX, EAX Mov AX, CCCA ; Current address. Call WriteDataChannel Mov AX, VTFT Mov EBX, 0FFFFh Call WriteDataChannel Mov AX, CVCF Call WriteDataChannel Mov AX, DCYSUSV Mov BX, 7F7Fh Call WriteDataChannel Mov AX, PTRX Mov EBX, 40000000h ; 25% reverb Or BH, [CS:VolumeTable+7] Call WriteDataChannel Mov AX, CPF Call WriteDataChannel Jmp SetAWERegistersEnd SetAWERegisters2: Test CL, 32 ; Frequency change? JZ SetAWERegisters3 Call SetAWEFrequency SetAWERegisters3: Test CL, 64 ; Volume change? JZ SetAWERegisters4 Call SetAWEVolume SetAWERegisters4: Test CH, 80h ; New pan? JZ SetAWERegistersEnd Call SetAWEPan SetAWERegistersEnd: Pop CX And Word Ptr [SI], 0111100010011111b Add SI, 128 Inc DX Dec CX JNZ SetAWERegisters1 Ret SetAWERegistersError: Call StopAWENote Mov Word Ptr [SI], 0 Test Byte Ptr [SI+3Ah], 80h JNZ SetAWERegistersEnd Mov BX, [SI+38h] And Byte Ptr [BX], Not 4 ; Signify channel off Jmp SetAWERegistersEnd EndP SetAWERegisters ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ACKIRQ Mov AL, 20h Cmp CS:IRQ, 7 JBE ACKIRQ1 Out 0A0h, AL ACKIRQ1: Out 20h, AL Ret EndP ACKIRQ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc CheckMIDI Push DS Push CS Pop DS Assume DS:Driver Xor BX, BX Mov DX, MIDIPort Mov BL, [MIDIBufferTail] Test DX, DX JZ CheckMIDIEnd Inc DX CheckMIDIAgain: In AL, DX Test AL, AL JS CheckMIDIAgain Dec DX In AL, DX Cmp AL, 0F0h JAE CheckMIDIEnd Inc BL Cmp BL, MIDIBufferHead JE CheckMIDIEnd Mov [MIDIBuffer+BX], AL Mov [MIDIBufferTail], BL CheckMIDIEnd: Pop DS Ret EndP CheckMIDI Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc MIDIIRQHandler Push AX BX DX Mov DX, CS:MixerPort Mov AL, 82h Out DX, AL Inc DL In AL, DX Test AL, 4 JZ MIDIIRQHandlerEnd Call CheckMIDI MIDIIRQHandlerEnd: Call AckIRQ Pop DX BX AX IRet EndP MIDIIRQHandler ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SBIRQHandler PushAD Push DS Push ES StI Push CS Pop DS Assume DS:Driver SBIRQHandlerAgain: Mov DX, MixerPort Mov AL, 82h Out DX, AL Inc DL In AL, DX Test AL, 4 JZ NoMIDIIRQ Push AX Call CheckMIDI Pop AX NoMIDIIRQ: ; Test AL, 2 ; JZ No16BitIRQ ; ; Push AX ; Mov DX, MixerPort ; Add DL, 0Fh-4 ; In AL, DX ; Pop AX ; ; No16BitIRQ: Test AL, 1 JNZ SB8BitIRQ SBNo8BitIRQ: Call AckIRQ Jmp SBEndIRQ SB8BitIRQ: Mov DX, MixerPort Add DL, 0Eh-4 In AL, DX ; 8-bit IRQ ack. Add DL, 0Ch-0Eh Mov AL, 80h ; Output block of silence Call SBOut Mov AX, BlockLength2 Call SBOut Mov AL, AH Call SBOut Mov AL, 0D3h Call SBOut ClD Call ACKIRQ Inc IRQFlag JNZ SBEndIRQ Call SaveEMSPageFrame Assume DS:Nothing SB8BitIRQAgain: Call Update ; Returns DS:SI, CX Mov BX, BlockLength Cmp BX, BlockLength2 JE SBIRQHandler2 Mov BlockLength2, BX Mov DX, SB16BasePort Add DL, 0Ch Mov AL, 0D0h Call SBOut Mov AL, 80h ; Output block of silence Call SBOut Mov AL, BL Call SBOut Mov AL, BH Call SBOut SBIRQHandler2: Call SetAWERegisters Sub CS:IRQFlag, 1 JNC SB8BitIRQAgain Call RestoreEMSPageFrame SBEndIRQ: Pop ES Pop DS PopAD IRet EndP SBIRQHandler Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc AWEIRQHandler ; IRQ Handler has to ; 1) Update AWE registers ; 2) Update song position Push AX Push DS Mov AX, AWEUpdateTimer Add AWEUpdateCount, AX JC AWEIRQHandler1 Mov AL, 20h Out 20h, AL Jmp AWEIRQHandler2 AWEIRQHandler1: PushF Call [OldIRQHandler] AWEIRQHandler2: Xor AWEUpdateFlag, 1 JZ AWEIRQHandlerEnd PushAD Push ES ClD Call SaveEMSPageFrame Call Update ; Returns DS:SI, CX Call SetAWERegisters Call RestoreEMSPageFrame Pop ES PopAD AWEIRQHandlerEnd: Pop DS Pop AX IRet EndP AWEIRQHandler ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc EnableRAM Mov DX, BasePort Mov CX, 29 EnableRAM1: Mov AX, DCYSUSV Or AX, CX Mov BX, 80h Call WriteData Mov AX, VTFT Or AX, CX Xor EBX, EBX Call WriteData Mov AX, CVCF Or AX, CX Xor EBX, EBX Call WriteData Mov AX, PTRX Or AX, CX Mov EBX, 40000000h Call WriteData Mov AX, CPF Or AX, CX Mov EBX, 40000000h Call WriteData Mov AX, PSST Or AX, CX Xor EBX, EBX Call WriteData Mov AX, CSL Or AX, CX Xor EBX, EBX Call WriteData Mov AX, CCCA Or AX, CX Mov EBX, 6000000h ; Left write Call WriteData Dec CX JNS EnableRAM1 Ret EndP EnableRAM ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc TestAWE ; Given DX = baseport. Push DX Add DX, 802h In AL, DX In AL, DX Not AL Mov BL, AL Out DX, AL In AL, DX Cmp AL, BL JNE TestAWE1 ; Register changed In AX, DX ; Is upper part of pointer Mov BX, AX ; changing? Mov CX, 128 TestAWE2: In AX, DX Cmp AL, BL JNE TestAWE1 Cmp AH, BH JNE TestAWE3 Dec CX JNZ TestAWE2 Jmp TestAWE1 TestAWE3: Pop DX ClC Ret TestAWE1: Pop DX StC Ret EndP TestAWE ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc InitSetAWE Mov CX, 31 InitSetAWE1: Mov AX, 31 Sub AX, CX Mov BX, [SI] Or AX, INIT1 Call WriteData Add SI, 2 Dec CX JNS InitSetAWE1 Mov CX, 31 InitSetAWE2: Mov AX, 31 Sub AX, CX Mov BX, [SI] Or AX, INIT2 Call WriteData Add SI, 2 Dec CX JNS InitSetAWE2 Mov CX, 31 InitSetAWE3: Mov AX, 31 Sub AX, CX Mov BX, [SI] Or AX, INIT3 Call WriteData Add SI, 2 Dec CX JNS InitSetAWE3 Mov CX, 31 InitSetAWE4: Mov AX, 31 Sub AX, CX Mov BX, [SI] Or AX, INIT4 Call WriteData Add SI, 2 Dec CX JNS InitSetAWE4 Ret EndP InitSetAWE ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc InitAWE Push CS Pop DS Assume DS:Driver Mov DX, BasePort Mov AX, HWCF1 Mov BX, 59h Call WriteData Mov AX, CFG2 Mov BX, 20h Call WriteData Mov CX, 31 InitAwe1: Mov BX, 80h Mov AX, DCYSUSV Or AX, CX Call WriteData Xor EBX, EBX Mov AX, ENVVOL Or AX, CX Call WriteData Mov AX, ENVVAL Or AX, CX Call WriteData Mov AX, SUSDCY Or AX, CX Call WriteData Mov AX, ATKHLDV Or AX, CX Call WriteData Mov AX, LFO1VAL Or AX, CX Call WriteData Mov AX, HLDATK Or AX, CX Call WriteData Mov AX, LFO2VAL Or AX, CX Call WriteData Mov AX, IP Or AX, CX Call WriteData Mov AX, IFATN Or AX, CX Call WriteData Mov AX, PEFE Or AX, CX Call WriteData Mov AX, FMMOD Or AX, CX Call WriteData Mov AX, TREMFRQ Or AX, CX Call WriteData Mov AX, FM2FRQ2 Or AX, CX Call WriteData Mov AX, PTRX Or AX, CX Call WriteData Mov AX, VTFT Or AX, CX Call WriteData Mov AX, PSST Or AX, CX Call WriteData Mov AX, CSL Or AX, CX Call WriteData Mov AX, CCCA Or AX, CX Call WriteData Dec CX JNS InitAWE1 Mov CX, 31 InitAWE8: Mov AX, CPF Or AX, CX Call WriteData Mov AX, CVCF Or AX, CX Call WriteData Dec CX JNS InitAWE8 ; Initialise still... Mov AX, SMALR Call WriteData Mov AX, SMARR Call WriteData Mov AX, SMALW Call WriteData Mov AX, SMARW Call WriteData Mov SI, Offset InitTable1 Call InitSetAWE ; Wait for 1024 sample periods Mov AX, WC Call ReadData Mov BX, AX Mov CX, AX Add CX, 400h ; 1024 Cmp BX, CX JB InitAWE3 InitAWE4: Mov AX, WC Call ReadData Cmp AX, CX JA InitAWE4 InitAWE3: Mov AX, WC Call ReadData Cmp AX, CX JB InitAWE3 Mov SI, Offset InitTable2 Call InitSetAWE Mov SI, Offset InitTable3 Call InitSetAWE Mov AX, HWCF4 Xor EBX, EBX Call WriteData Mov AX, HWCF5 Mov EBX, 83h Call WriteData Mov AX, HWCF6 Mov EBX, 8000h Call WriteData Mov SI, Offset InitTable4 Call InitSetAWE Mov AX, HWCF3 Mov BX, 4 Call WriteData Ret EndP InitAWE Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc InitDRAMRefresh Mov AX, DCYSUSV+1Eh Mov BX, 80h Call WriteData Mov AX, DCYSUSV+1Fh Call WriteData ; Mov AX, VTFT+1Eh Xor EBX, EBX Call WriteData Mov AX, CVCF+1Eh Call WriteData Mov AX, VTFT+1Fh Call WriteData Mov AX, CVCF+1Fh Call WriteData ; Mov AX, PTRX+1Eh Call WriteData Mov AX, CPF+1Eh Call WriteData Mov AX, PTRX+1Fh Call WriteData Mov AX, CPF+1Fh Call WriteData ; Mov AX, PSST+1Eh Call WriteData Mov AX, PSST+1Fh Call WriteData Mov BX, 0FFFFh Mov AX, CSL+1Eh Call WriteData Mov AX, CSL+1Fh Call WriteData Xor BX, BX Mov AX, CCCA+1Eh Call WriteData Mov AX, CCCA+1Fh Call WriteData Ret EndP InitDRAMRefresh Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ResetDSP Far ; AX = Port Push AX Push CX Push DX Mov DX, AX Add DL, 6 Mov AL, 1 Out DX, AL In AL, DX In AL, DX In AL, DX In AL, DX Xor AL, AL Out DX, AL Add DL, 8 Mov CX, 200 ResetDSP1: In AL, DX Test AL, AL JS ResetDSP2 Loop ResetDSP1 Jmp ResetDSP3 ResetDSP2: Sub DL, 4 In AL, DX Cmp AL, 0AAh JE ResetDSP4 Add DL, 4 Loop ResetDSP1 ResetDSP3: StC ResetDSP4: Pop DX Pop CX Pop AX Ret EndP ResetDSP ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SBGetRegister Out DX, AL Inc DX In AL, DX Dec DX Ret EndP SBGetRegister ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SBIn ; DX = 2xEh, returns AL SBIn1: In AL, DX ShR AL, 7 LoopZ SBIn ; Test AL, AL ; JNS SBIn1 Add DL, 0Ah-0Eh ; DX = 2xAh -> Data read port In AL, DX Add DL, 0Eh-0Ah Ret EndP SBIn ; ÄÄ DetectCard ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Returns carry set if error, else carry clear. Has to setup internal vars ; (eg. appropriate IRQ/DMA whatever). ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc DetectCard Far Push CS Pop DS Assume DS:Driver Mov Forced, AL Mov DX, BasePort Cmp DX, 0FFFFh JE DetectCard1 Cmp DX, 620h JB DetectCard3 Cmp DX, 680h JA DetectCard3 Call TestAWE JNC DetectCardFound Ret DetectCard1: Mov DX, 620h DetectCard2: Call TestAWE JNC DetectCardFound Add DL, 20h Cmp DL, 80h JBE DetectCard2 DetectCard3: StC Ret DetectCardFound: Mov BasePort, DX ; Initialise AWE 32 Call InitAWE Call InitDRAMRefresh ; Detect amount of RAM. Mov DX, BasePort Mov CX, 29 DetectCardMemory1: Mov AX, DCYSUSV Or AX, CX Mov BX, 80h Call WriteData Mov AX, VTFT Or AX, CX Xor EBX, EBX Call WriteData Mov AX, CVCF Or AX, CX Xor EBX, EBX Call WriteData Mov AX, PTRX Or AX, CX Mov EBX, 40000000h Call WriteData Mov AX, CPF Or AX, CX Mov EBX, 40000000h Call WriteData Mov AX, PSST Or AX, CX Xor EBX, EBX Call WriteData Mov AX, CSL Or AX, CX Xor EBX, EBX Call WriteData Mov AX, CCCA Or AX, CX Mov EBX, 4000000h ; Left read Test CL, 2 JZ DetectCardMemory2 Mov EBX, 6000000h ; Left write DetectCardMemory2: Call WriteData Dec CX JNS DetectCardMemory1 Xor EDI, EDI ; Amount of memory stored in ; EDI Mov AX, SMALW Mov EBX, 200000h Call WriteData Mov AX, SMLD Mov BX, 0FFFFh Call WriteData Mov AX, SMLD Mov BX, 5555h Call WriteData Mov AX, SMLD Mov BX, 0AAAAh Call WriteData Mov AX, SMALR Mov EBX, 200000h Call WriteData Mov AX, SMLD Call ReadData Mov AX, SMLD Call ReadData Cmp AX, 0FFFFh JNE DetectCardMemory6 Mov AX, SMLD Call ReadData Cmp AX, 5555h JNE DetectCardMemory6 Mov AX, SMLD Call ReadData Cmp AX, 0AAAAh JNE DetectCardMemory6 Mov EDI, 20000h DetectCardMemory3: ; Set read/write addresses.. Mov AX, SMALW Mov EBX, EDI Add EBX, 200000h Call WriteData Mov AX, SMLD Mov BX, 5555h Call WriteData Mov AX, SMLD Mov BX, 0AAAAh Call WriteData Mov AX, SMALR Mov EBX, 200000h Call WriteData Mov AX, SMLD Call ReadData Mov AX, SMLD Call ReadData Cmp AX, 0FFFFh JNE DetectCardMemory5 Mov AX, SMALR Mov EBX, EDI Add EBX, 200000h Call WriteData Mov AX, SMLD Call ReadData Mov AX, SMLD Call ReadData Cmp AX, 5555h JNE DetectCardMemory5 Mov AX, SMLD Call ReadData Cmp AX, 0AAAAh JNE DetectCardMemory5 DetectCardMemory4: Add EDI, 20000h Cmp EDI, 0E00000h JB DetectCardMemory3 DetectCardMemory5: Cmp EDI, 0DFFFE0h JB DetectCardMemory7 Mov EDI, 0DFFFE0h DetectCardMemory7: Test EDI, EDI JZ DetectCardMemory6 Mov AWEMemory, EDI Mov MixerPort, 210h Mov AX, BasePort Sub AX, 400h Call ResetDSP JNC DetectMixer2 DetectMixer1: Mov AX, MixerPort Call ResetDSP JNC DetectMixer2 DetectMixer3: Add MixerPort, 10h Cmp MixerPort, 280h JBE DetectMixer1 Mov DX, BasePort Sub DX, 400h Mov MixerPort, DX Jmp DetectCard4 DetectMixer2: ; OK... DSP found. ; Get DSP version Mov DX, AX Add DL, 0Ch ; 2xCh -> Data ready to send... Mov CX, 200 DetectMixerLoop1: In AL, DX ; Test AL, AL ; JS DetectMixerLoop1 ShR AL, 7 LoopNZ DetectMixerLoop1 Mov AL, 0E1h ; Get DSP version command Out DX, AL Add DL, 0Eh-0Ch ; DX = 2xEh -> Data available status Call SBIn Mov AH, AL ; AH = Major version number Call SBIn ; AL = Minor version number Cmp AX, 40Ch ; SB DSP = 4.12+ JB DetectMixer3 Sub DL, 0Eh Mov MixerPort, DX DetectCard4: Mov SB16BasePort, DX Add MixerPort, 4 ; Mixerport Add DL, 4 Mov AL, 30h Call SBGetRegister ShR AL, 3 Mov VolumeTable, AL Mov AL, 31h Call SBGetRegister ShR AL, 3 Mov [VolumeTable+1], AL Mov AL, 44h Call SBGetRegister ShR AL, 4 Mov [VolumeTable+2], AL Mov AL, 45h Call SBGetRegister ShR AL, 4 Mov [VolumeTable+3], AL Mov AL, 46h Call SBGetRegister ShR AL, 4 Mov [VolumeTable+4], AL Mov AL, 47h Call SBGetRegister ShR AL, 4 Mov [VolumeTable+5], AL Mov DX, MixerPort Mov AX, 0C034h Out DX, AX Mov AL, 35h Out DX, AX Mov DX, MixerPort Mov AL, 80h ; IRQ select Out DX, AL Inc DL ; 2x5h = Mixer data port In AL, DX Dec DL Mov BX, IRQ Cmp BX, 0FFFFh JE DetectCardIRQ1 Cmp Forced, 0 JE DetectCardIRQ1 Mov AH, 11h Cmp BL, 2 JE SetCardIRQ1 Cmp BL, 9 JE SetCardIRQ1 Mov AH, 12h Cmp BL, 5 JE SetCardIRQ1 Mov AH, 14h Cmp BL, 7 JE SetCardIRQ1 Mov AH, 18h Cmp BL, 10 JE SetCardIRQ1 Jmp NoWindows SetCardIRQ1: Mov AL, 80h Out DX, AL Inc DL Mov AL, AH Out DX, AL Dec DL Jmp DetectCard6 DetectCardIRQ1: Mov BX, 2 Test AL, 1 JNZ DetectCardIRQ2 Mov BL, 5 Test AL, 2 JNZ DetectCardIRQ2 Mov BL, 7 Test AL, 4 JNZ DetectCardIRQ2 Mov BL, 10 Test AL, 8 JNZ DetectCardIRQ2 StC Ret DetectCardIRQ2: Cmp IRQ, 0FFFFh JE DetectCardIRQ3 Cmp BX, IRQ JE DetectCard6 StC Ret DetectCardIRQ3: Mov IRQ, BX DetectCard6: Mov AX, 1600h ; Windows detection. Int 2Fh Test AL, 7Fh JZ NoWindows Mov SBIRQMode, 1 NoWindows: Mov EAX, 'Jeff' ClC Ret DetectCardMemory6: StC Ret EndP DetectCard Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetSamplingRate PushA Mov AX, CS:SB16BasePort Mov DX, AX Call ResetDSP Add DL, 0Ch ; Set mixing frequency Mov AL, 40h Call SBOut Mov AL, 211 Call SBOut ; 22222 Hz. Mov AL, 80h Call SBOut Mov AX, BlockLength Dec AX Call SBOut Mov AL, AH Call SBOut PopA Ret EndP SetSamplingRate ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetMIDIIRQ PushAD Push DS Push ES Push CS Pop DS Assume DS:Driver Xor AX, AX Mov ES, AX Mov DI, IRQ ShL DI, 2 Add DI, Offset IRQData Mov BX, [DI] Mov AX, CS ShL EAX, 16 Mov AX, Offset MIDIIRQHandler XChg [ES:BX], EAX Mov OldIRQHandler, EAX Mov AX, IMR And AX, [DI+2] Out 21h, AL Mov AL, AH Out 0A1h, AL Pop ES Pop DS PopAD Ret EndP SetMIDIIRQ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetIRQ PushAD Push DS Push ES Push CS Pop DS Assume DS:Driver Xor AX, AX Mov ES, AX Mov DI, IRQ ShL DI, 2 Add DI, Offset IRQData Mov BX, [DI] Mov AX, CS ShL EAX, 16 Mov AX, Offset SBIRQHandler XChg [ES:BX], EAX Mov OldIRQHandler, EAX Mov AX, IMR And AX, [DI+2] Out 21h, AL Mov AL, AH Out 0A1h, AL Pop ES Pop DS PopAD Ret EndP SetIRQ Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ResetIRQ PushAD Push DS Push ES Push CS Pop DS Assume DS:Driver Xor AX, AX Mov ES, AX Mov DI, IRQ ShL DI, 2 Mov BX, [IRQData+DI] Mov EAX, OldIRQHandler Mov [ES:BX], EAX Mov AX, IMR Out 21h, AL Mov AL, AH Out 0A1h, AL Pop ES Pop DS PopAD Ret EndP ResetIRQ Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc InitMIDI Mov DX, 330h Call DetectUART JC DetectMIDI1 Mov MIDIPort, 330h Jmp DetectMIDIEnd DetectMIDI1: Mov DX, 300h Call DetectUART JC DetectMIDIEnd Mov MIDIPort, 300h DetectMIDIEnd: Ret EndP InitMIDI ;ÄÄ InitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Sets up any memory required for output ; Initiates output ; ; Parameters: AX = Number of Channels ; ; If sucessful, returns: ; Carry flag clear ; DS:SI = pointer to text to display ; AX = parameter 1 in text ; BX = parameter 2 in text ; CX = parameter 3 in text ; DX = parameter 4 in text ; DI = parameter 5 in text ; ; If unsucessful, returns: ; Carry flag set ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc InitSound Far Push CS Pop DS Mov ECX, IdleUpdateInfoLine Mov EDX, GlobalKeyList Mov IdleFunctionList, ECX Mov GlobalKeyLink2, EDX Mov ECX, FillHeaderFunction Mov EDX, DrawHeaderFunction Mov FillHeader2, ECX Mov ScreenHeader2, EDX Mov AX, CS Mov DriverSegment1, AX Mov DriverSegment2, AX Mov DriverSegment3, AX Mov DriverSegment4, AX Mov DriverSegment5, AX Mov DriverSegment6, AX Mov DriverSegment7, AX Mov DriverSegment8, AX In AL, 0A1h Mov AH, AL In AL, 21h Mov IMR, AX Cmp SBIRQMode, 0 JE InitSound1 Call SetIRQ Call GetTempo Call SetTempo Call ResetMemory Call SetSamplingRate Call InitMIDI Mov SI, Offset AWE32Msg2 Mov AX, BasePort Mov BX, IRQ Mov ECX, AWEMemory SHR ECX, 9 Ret InitSound1: Call SetMIDIIRQ Call GetTempo Call SetTempo Call ResetMemory Xor AX, AX Mov ES, AX ; ES = 0 Mov AX, CS ShL EAX, 16 Mov AX, Offset AWEIRQHandler ClI XChg DWord Ptr [ES:20h], EAX ; Clock tick Mov OldIRQHandler, EAX StI InitSound2: Call InitMIDI Mov SI, Offset AWE32Msg Mov AX, BasePort Mov EBX, AWEMemory SHR EBX, 9 Ret EndP InitSound ;ÄÄ ReInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Reinitialises sound output ; Initiates sound output ; ; Parameters: AX = number of channels. ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ReInitSound Far Push CS Pop DS Assume DS:Driver Mov SI, Offset AWE32ReinitMsg Mov BX, 40 Call SetInfoLine Call ResetUART Call InitAWE Call InitDRAMRefresh Cmp SBIRQMode, 0 JE ReInitSound1 Call ResetIRQ Call SetIRQ Call SetSamplingRate Call ReinitUART Ret ReInitSound1: Xor AX, AX Mov ES, AX ; ES = 0 Mov AX, CS ShL EAX, 16 Mov AX, Offset AWEIRQHandler Mov DWord Ptr [ES:20h], EAX ; Clock tick Call ResetIRQ Call SetMIDIIRQ Call ReinitUART Ret EndP ReInitSound Assume DS:Nothing ;ÄÄ UnInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Stops sound output, releases any memory used by driver ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc UnInitSound Far Call GotoHomeDirectory ; Now to save config into driver file. Push CS Pop DS Assume DS:Driver Mov AX, 3D02h ; Read write access Mov DX, Offset DriverName Int 21h JC SaveConfig2 Mov BX, AX Mov AX, 4200h Xor CX, CX Mov DX, Offset CONFIGURATIONOFFSET Int 21h JC SaveConfig1 Mov AH, 40h Mov CX, CONFIGSIZE Mov DX, Offset Chorus Int 21h SaveConfig1: PushF Mov AH, 3Eh Int 21h PopF SaveConfig2: Call ResetIRQ Cmp SBIRQMode, 0 JE UnInitSound1 Mov DX, SB16BasePort Add DL, 0Ch Mov AL, 0D0h Call SBOut Call ResetUART ; Mov AX, SB16BasePort ; Call ResetDSP Call InitAWE Ret UnInitSound1: Mov AL, 34h Out 43h, AL Xor AX, AX Out 40h, AL Out 40h, AL Mov ES, AX Mov EAX, OldIRQHandler Mov [ES:20h], EAX Mov AX, SB16BasePort Call ResetDSP Call ResetUART Call InitAWE Call ResetIRQ Ret EndP UnInitSound Assume DS:Nothing ;ÄÄ Poll ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; This procedure is called as often as possible by IT.EXE ; AX = Playmode (0 for nothing in particular, 1 = pattern, 2 = song) ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Poll Far Push CS Pop DS Assume DS:Driver Poll1: Call [UARTBufferEmpty] JNC PollEnd Xor BX, BX ClI Mov BL, MIDIBufferHead Cmp BL, MIDIBufferTail JZ PollEnd ; Nothing in queue Inc BL Mov AL, [MIDIBuffer+BX] Mov MIDIBufferHead, BL Call [UARTSend] Jmp Poll1 PollEnd: StI Ret EndP Poll Assume DS:Nothing ;ÄÄ SetTempo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: BX = tempo ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetTempo Far Push AX Push BX Push DX Cmp CS:SBIRQMode, 0 JE SetTempo1 ; BlockLength = 55555/BPM Mov AX, 55555 Xor DX, DX Div BX Dec AX Mov BlockLength, AX ; Mov DX, SB16BasePort ; Add DL, 0Ch Jmp SetTempo2 SetTempo1: ; Frames per second = 2 * (0.4*Tempo) Mov AX, 0C214h Mov DX, 16h ; Ticks = (1193181/(2*0.4))/Tempo Div BX ; AX contains counter. Mov AWEUpdateTimer, AX Out 40h, AL ; Timer IRQ. Mov AL, AH Out 40h, AL SetTempo2: Pop DX Pop BX Pop AX Ret EndP SetTempo ;ÄÄ SetMixVolume ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AX = MixVolume ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetMixVolume Far Ret EndP SetMixVolume ;ÄÄ SetStereo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AL = Stereo on/off, 0 = off. ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetStereo Far Mov CS:Stereo, AL Ret EndP SetStereo ;ÄÄ LoadSample ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AX = sample to load ; DS:SI points to sample header ; ES:0 points to first sample ; ; Returns: **Carry set if NO error** ; **Carry clear if error** ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadSample Far ; if no sample, then do nothing ; MemoryUsed = length of sample ; if sustain loop, then use sustain ; loop information ; if no sustain loop, then use loop ; information ; if no loop or sustain loop, ; memoryused += 16; (16 zero samples ; at the end) ; PushAD Push DS Push ES Push FS Push AX ClI Call EnableRAM ; Enable access to DRAM. ; Set destination address Mov AX, SMALW Mov EBX, CS:AWEMemoryUsed Add EBX, 200000h Call WriteData Mov DX, CS:BasePort Add DX, 802h ; Index Mov AX, 32+26 Out DX, AX Pop AX Mov FS, CS:SongDataArea LEA DI, [EAX*4+EAX] ShL DI, 2 Add DI, Offset AWEDataTable-20 Mov ECX, -1 Mov DWord Ptr [CS:DI], ECX ; Start Mov DWord Ptr [CS:DI+4], ECX ; Loop start Mov DWord Ptr [CS:DI+8], ECX ; Loop end Mov DWord Ptr [CS:DI+12], ECX ; Size occupied Mov DWord Ptr [CS:DI+16], ECX ; Size occupied Mov BP, AX Add BP, BP Mov BP, [FS:64910+BP] Xor CX, CX ; From the start of the sample.. Call GetSampleLocation ; Returns DS:ESI, ECX = length JC LoadSampleNoError JZ LoadSample1 ; 16 bit Mov CS:LoadSampleFuncF, Offset Load16BitSamplesForwards Mov CS:LoadSampleFuncB, Offset Load16BitSamplesBackwards Jmp LoadSample2 LoadSample1: ; 8 bit Mov CS:LoadSampleFuncF, Offset Load8BitSamplesForwards Mov CS:LoadSampleFuncB, Offset Load8BitSamplesBackwards LoadSample2: Mov AL, [FS:BP+12h] Test AL, 30h ; Loop or sustain loop? JZ LoadSampleNoLoop Mov EBX, [FS:BP+34h] ; Loop begin Mov EDX, [FS:BP+38h] ; Loop end Test AL, 20h ; Sustain loop? JZ LoadSample3 ShR AL, 1 Mov EBX, [FS:BP+40h] Mov EDX, [FS:BP+44h] Jmp LoadSample3 LoadSampleError: ClC Jmp LoadSampleEnd LoadSampleNoError: StC LoadSampleEnd: StI Pop FS Pop ES Pop DS PopAD Ret LoadSampleNoLoop: ; ECX contains length of sample Mov EAX, ECX Mov EDX, AWEMemoryUsed Mov EBX, AWEMemory Sub EBX, EDX ; EBX = AWEMemory remaining Mov CL, Compress ShR EAX, CL ; Compress sample Add EAX, 16 ; zeroes at end of sample Cmp EAX, EBX JA LoadSampleError Mov ECX, EAX Add AWEMemoryUsed, EAX ; Record memory as used Mov [CS:DI+12], EAX Add EDX, 200000h Sub ECX, 16 ; Number of samples to transfer Mov [CS:DI], EDX Add EDX, ECX Mov [CS:DI+4], EDX ; Loop start Add EDX, 14 Mov [CS:DI+8], EDX ; Loop end ; Now to transfer samples to AWE32 Call [CS:LoadSampleFuncF] ; Now to shove a whole lot of zeroes Xor AX, AX Mov CX, 16 LoadSampleNoLoop2: Out DX, AX Loop LoadsampleNoLoop2 Jmp LoadSampleNoError LoadSample3: ; OK... EBX = loop start ; EDX = loop end ; AL&40h = ping pong Test AL, 40h JNZ LoadSamplePingPong Mov CL, Compress Push EBX ShR EDX, CL ShR EBX, CL Mov EAX, EDX Add EAX, 2 ; For loop fixing Mov ECX, AWEMemory Sub ECX, AWEMemoryUsed ; ECX = AWEMemoryRemaining Cmp EAX, ECX Pop ECX JA LoadSampleError ; Sufficient memory? Push ECX Mov ECX, EAX Mov EAX, AWEMemoryUsed Add AWEMemoryUsed, ECX Mov [CS:DI+12], ECX Sub ECX, 2 Add EAX, 200000h Mov [CS:DI], EAX Add EDX, EAX Add EAX, EBX Mov [CS:DI+4], EAX Mov [CS:DI+8], EDX Call [CS:LoadSampleFuncF] ; Now to fix loop.. 1 extra ; sample. Pop ESI ; Loop start Test Byte Ptr [FS:BP+12h], 2 JZ LoadSampleForwards1 Add ESI, ESI LoadSampleForwards1: Int 3 Mov ECX, 2 Call [CS:LoadSampleFuncF] Jmp LoadSampleNoError LoadSamplePingPong: Mov CL, Compress ShR EDX, CL ShR EBX, CL Mov EAX, EDX Add EAX, EDX Sub EAX, EBX Inc EAX Mov ECX, AWEMemory Sub ECX, AWEMemoryUsed Cmp EAX, ECX JA LoadSampleError Mov [CS:DI+12], EAX Mov ECX, AWEMemoryUsed Add AWEMemoryUsed, EAX Add ECX, 200000h Add EAX, ECX Dec EAX Mov [CS:DI], ECX Add ECX, EBX Mov [CS:DI+4], ECX Mov [CS:DI+8], EAX Mov EAX, [CS:DI] Add EAX, EDX Mov [CS:DI+16], EAX Mov ECX, EDX Sub EDX, EBX Push EDX Call [CS:LoadSampleFuncF] Pop ECX Inc ECX Call [CS:LoadSampleFuncB] Jmp LoadSampleNoError EndP LoadSample ;ÄÄ ReleaseSample ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AX = sample to release ; DS:SI points to sample header ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ReleaseSample Far PushAD LEA DI, [EAX*4+EAX] ; DI = AX * 5 ShL DI, 2 Add DI, Offset AWEDataTable Mov EBX, [CS:DI+12] Mov EAX, CS:AWEMemoryUsed Sub EAX, EBX Add EAX, 200000h Cmp EAX, [CS:DI] JNE ReleaseSample1 Sub AWEMemoryUsed, EBX ReleaseSample1: Mov EAX, -1 Mov [CS:DI], EAX Mov [CS:DI+4], EAX Mov [CS:DI+8], EAX Mov [CS:DI+12], EAX PopAD Ret EndP ReleaseSample ;ÄÄ ResetMemory ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Frees all on-board memory ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ResetMemory Far Push CS Pop ES Xor EAX, EAX Mov CS:AWEMemoryUsed, EAX Mov DI, Offset AWEDataTable Mov CX, 1000 Mov AX, 0FFFFh Rep StosW Ret EndP ResetMemory ;ÄÄ GetStatus ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Returns text to show on status line, AX = display parameter ; Carry set if not to show anything. ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc GetStatus Far Push CS Pop DS Assume DS:Driver Mov SI, Offset AWE32Status Mov EAX, AWEMemory Sub EAX, AWEMemoryUsed SHR EAX, 9 ClC Ret EndP GetStatus ;ÄÄ SoundCardScreen ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Function to have driver interactive part of program ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SoundCardScreen Far Mov AX, 5 Mov SI, 1 Mov CX, CS Mov DX, Offset GUSScreenList ClC Ret EndP SoundCardScreen ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc GetVariable Far ; Returns AX, given DI Xor AH, AH Mov AL, [CS:VolumeTable+DI] Ret EndP GetVariable ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetVariable Far ; Given AX, DI Push DS Push DX Push CS Pop DS Assume DS:Driver Mov [VolumeTable+DI], AL Mov DX, MixerPort Mov AL, 30h Mov AH, [VolumeTable] ShL AH, 3 Out DX, AX Mov AL, 31h Mov AH, [VolumeTable+1] ShL AH, 3 Out DX, AX Mov AL, 44h Mov AH, [VolumeTable+2] ShL AH, 4 Out DX, AX Mov AL, 45h Mov AH, [VolumeTable+3] ShL AH, 4 Out DX, AX Mov AL, 46h Mov AH, [VolumeTable+4] ShL AH, 4 Out DX, AX Mov AL, 47h Mov AH, [VolumeTable+5] ShL AH, 4 Out DX, AX Pop DX Pop DS Ret EndP SetVariable Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc UARTOut Ret EndP UARTOut ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ InterpretState DB 0 InterpretType DB 0 Proc SendUARTOut Far ; Local interpreter activated with 0F0h 0F0h. Mov AH, CS:InterpretState Cmp AH, 2 JB SendUARTOut1 ; In interpreter. JE SendUARTOut3 ; Have InterpretType, now get parameter, then return to normal. Push BX Mov BL, CS:InterpretType ; Want BX = InterpretType*64+Channel ; ShL BX, 6 Add BL, [DI+20h] And BX, 127 Mov [CS:AWEParameters+BX], AL Pop BX Mov CS:InterpretState, 0 Test SI, SI JZ SendUARTOut4 Or Byte Ptr [SI], 64 SendUARTOut4: Ret SendUARTOut3: Mov InterpretType, AL Jmp SendUARTOutStateInc SendUARTOut1: Cmp AL, 0F0h JNE SendUARTOut2 SendUARTOutStateInc: Inc CS:InterpretState Ret SendUARTOut2: Test AH, AH JZ SendUARTOutEnd Push AX Mov AL, 0F0h Call UARTOut Pop AX Mov CS:InterpretState, 0 SendUARTOutEnd: Cmp AL, 0FCh JE ResetFilters Cmp AL, 0FAh JE ResetFilters Cmp AL, 0FFh JNE SendUARTOutNoClear ResetFilters: PushA Push ES Push CS Pop ES Mov DI, Offset AWEParameters Mov CX, 32 Or AX, -1 Rep StosW Mov CX, 32 Inc AX Rep StosW Pop ES PopA SendUARTOutNoClear: Call UARTOut Ret EndP SendUARTOut ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ EndDriver: ;******** Provided Variable Table ************* MaxNumberOfChannels DW 30 ; Maximum number of channels the ; driver can handle. StopAfterPlay DW 0 DefaultChannels DW 30 DriverFlags DW 1 ; MIDI Out supported DW 4 Dup (0) ;******** Provided Procedure Table ************* ProvidedTableStart: DW Offset DetectCard DW Offset InitSound ; Playing related DW Offset ReinitSound DW Offset UninitSound DW Offset Poll DW Offset SetTempo ; Sound variable related DW Offset SetMixVolume DW Offset SetStereo DW Offset LoadSample ; Sample related DW Offset ReleaseSample DW Offset ResetMemory DW Offset GetStatus ; Returns string to show on status line DW Offset SoundCardScreen ; Sound card 'screen' DW Offset GetVariable ; For interface DW Offset SetVariable DW Offset SendUARTOut ; For MIDI Out ProvidedTableEnd: DW 32-(ProvidedTableEnd-ProvidedTableStart)/2 Dup (0) EndS End