dpvm/it/SoundDrivers/AWE32B.ASM

4311 lines
147 KiB
NASM
Executable File

.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