.386P Segment DriverHeader PARA Public 'Code' Use16 Assume CS:Driver, DS:Nothing REGISTERED EQU 1 ;***** 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 STEREOENABLED EQU 1 MIXRESOLUTION EQU 32 FileID DW 22 ; 0 = Ozone ; 1 = Andrew Seargant ; 2 = David Goodale ; 3 = Nebula ; 4 = Christian Bode ; 5 = Flatrich ; 6 = MAZ ; 7 = Barthelemy DEFOSSEZ ; 8 = Daedalus ; 9 = Joost ; 10= Yannis ; 11= Mike Marton ; 12= HB ; 13= Catspaw ; 14= Airon ; 15= Mike Blaine ; 16= Jason Tracer ; 17= Akos Matte ; 18= Kristian Sergiejew ; 19= Jonathan Bartlett ; 20= DeltaX ; 21= Zinc ; 22= Draggy FileHandle DW 0 LowerLimit DD -3.2768E4 UpperLimit DD 3.2767E4 WAVOutputMsg DB "Writing to disk", 13 DB "Output frequency ", 0FDh, "D", 0 WAVFileErrorMsg DB "Unable to create output file! ", 0 WAVMemErrorMsg DB "Unable to allocate memory!", 0 NoReinitMsg DB "File output routines should NOT require reinitialisation ", 0 WriteError DB "Error writing to output file. Output file closed ", 0 WAVEFileHeader DB "RIFF" WAVEFileSize DD 0 WAVEFileHeader2 DB "WAVEfmt " WAVEFileHeaderLength DD 10h WAVEFileID DW 1 WAVEChannels DW 1 ; 1 = mono, 2 = stereo MixSpeed DW 44100 ; Default to CD quality WAVEMixSpeedFiller DW 0 WAVEBytesPerSecond DD 0 WAVEBytesPerSample DW 2 WAVEBits DW 16 WAVEHeader3 DB "data" WAVEDataSize DD 0 IFDEF REGISTERED Stereo DB 0 StereoSet DB 0 ENDIF BytesToMix DW 0 MixVolume DW 0 MixSegment DW 0 MixHandler DW Offset M32MixHandler OldDirectory DB 80 Dup (0) CreatingMsg DB "Created file " OutputFileName DB " ", 0 ClosedFileMsg DB "Closed output file ", 0 OUTPUT DB "OUTPUT" include mix.inc include wav.mix ; ÄÄ DetectCard ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Returns carry set if error, else carry clear. Has to setup internal vars ; (eg. appropriate IRQ/DMA whatever). ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc DetectCard Far Call GetEMSPageFrame Mov EMSPageFrame, AX Call SetupRamp Mov EAX, 'Jeff' ClC ; Always assume true Ret EndP DetectCard ;ÄÄ 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 Assume DS:Driver FNINIT Mov AH, 48h Mov BX, 2643 ; (65536 / (.4*31)) * 4 * 2 Int 21h JNC InitSound1 Mov SI, Offset WAVMemErrorMsg Ret InitSound1: Mov MixSegment, AX Mov SI, Offset WAVOutputMsg Mov AX, CmdLineMixSpeed And AX, AX JZ InitSound3 Cmp AX, 8000 JA InitSound4 Mov AX, 8000 InitSound4: Cmp AX, 64000 JB InitSound5 Mov AX, 64000 InitSound5: Mov MixSpeed, AX InitSound3: Mov AX, MixSpeed Ret EndP InitSound Assume DS:Nothing ;ÄÄ ReInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Reinitialises sound output ; Initiates sound output ; ; Parameters: AX = number of channels. ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ReInitSound Far Push CS Pop DS Mov SI, Offset NoReinitMsg Mov BX, 40 Call SetInfoLine Ret EndP ReInitSound ;ÄÄ UnInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Stops sound output, releases any memory used by driver ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc UnInitSound Far Push CS Pop DS Assume DS:Driver Mov AX, MixSegment Test AX, AX JZ UnInitsound1 Mov ES, AX Mov AH, 49h Int 21h UnInitSound1: Mov BX, FileHandle Test BX, BX JZ UnInitSound2 Mov AX, 4200h ; Move to start of file Xor CX, CX Xor DX, DX Int 21h ; Start of file Mov EAX, WAVEDataSize Add EAX, 24h Mov WAVEFileSize, EAX Mov AH, 40h Mov DX, Offset WAVEFileHeader Mov CX, 2Ch Int 21h Mov AH, 3Eh Int 21h UnInitSound2: Ret EndP UnInitSound Assume DS:Nothing ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc CopyFileName ; Given DI Push DS Call GetFileName Assume DS:Nothing ; Returns DS:SI Push CS Pop ES Mov CX, 11 Mov AL, ' ' Push DI Rep StosB Pop DI Mov CX, 8 Cmp Byte Ptr [SI], 0 JE CopyFileName2 Cmp Byte Ptr [SI], '.' JE CopyFileName2 CopyFileName1: LodsB Cmp AL, '.' JE CopyFileName3 StosB Loop CopyFileName1 Pop DS Ret CopyFileName2: Push CS Pop DS Mov SI, Offset OUTPUT Mov CX, 6 Rep MovsB CopyFileName3: Pop DS Ret EndP CopyFileName ;ÄÄ Poll ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; This procedure is called as often as possible by IT.EXE ; AX = Playmode (0 for nothing in particular, 1 = pattern, 2 = song) ; BX = pattern ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Poll Far Cmp MixSegment, 0 JNE Poll2 Ret Poll2: Test AX, AX JNZ Poll1 Cmp CS:FileHandle, 0 JE Poll7 PushAD Push DS Push CS Pop DS Assume DS:Driver Mov SI, Offset ClosedFileMsg Mov BX, 100 Call SetInfoLine PollCloseFile: Xor BX, BX XChg BX, FileHandle Mov AX, 4200h ; Move to start of file Xor CX, CX Xor DX, DX Int 21h ; Start of file Mov EAX, WAVEDataSize Add EAX, 24h Mov WAVEFileSize, EAX Mov AH, 40h Mov DX, Offset WAVEFileHeader Mov CX, 2Ch Int 21h Mov AH, 3Eh ; Close file Int 21h Pop DS PopAD Assume DS:Nothing Ret Poll7: IFDEF REGISTERED Mov AL, CS:StereoSet Mov CS:Stereo, AL ENDIF Ret Poll1: PushAD Push DS Push ES Cmp CS:FileHandle, 0 JNE Poll8 ; Create file... BX = pattern Push CS Pop DS Assume DS:Driver Mov SI, Offset OldDirectory Mov Word Ptr [SI], '.' Call SetDirectory Call GotoHomeDirectory Cmp AX, 1 JE Poll9 Mov DI, Offset OutputFileName Call CopyFileName Mov AX, 'W.' StosW Mov AX, 'VA' StosW Jmp Poll12 Poll9: Mov DI, Offset OutputFileName Call CopyFileName Xor DX, DX Mov AX, BX ; AX = pattern Mov BX, 10 Div BX Mov CL, DL Xor DX, DX Div BX Mov AH, AL Mov AL, '.' Add AH, '0' StosW Mov AL, DL Mov AH, CL Add AX, '00' StosW Poll12: Mov AH, 3Ch Xor CX, CX Mov DX, Offset OutputFileName Int 21h ; Create file... Mov SI, Offset CreatingMsg JNC Poll10 Poll11: Mov SI, Offset WAVFileErrorMsg Mov BX, 100 Call SetInfoLine Call StopPlayBack Mov SI, Offset OldDirectory Call SetDirectory Pop ES Pop DS PopAD Ret Poll10: Mov FileHandle, AX Xor EDX, EDX Mov WAVEDataSize, EDX Mov DX, MixSpeed IFDEF REGISTERED Mov CL, Stereo Inc CX ShL EDX, CL ELSE ShL EDX, 1 ENDIF Mov WAVEBytesPerSecond, EDX IFDEF REGISTERED Mov DX, 1 ShL DX, CL Mov WAVEBytesPerSample, DX Mov Byte Ptr [WAVEChannels], CL ENDIF Mov BX, AX Mov CX, 2Ch Mov DX, Offset WAVEFileHeader Mov AH, 40h Int 21h Mov BX, 100 Call SetInfoLine Mov SI, Offset OldDirectory Call SetDirectory Assume DS:Nothing Poll8: Call SaveEMSPageFrame Call Update ; Got DS:SI, CX Call M32MixHandler Call RestoreEMSPageFrame ; Now reorder everything in mixbuff Mov DS, CS:MixSegment Push DS Pop ES Mov CX, CS:BytesToMix Mov BX, 8 IFDEF REGISTERED Cmp CS:Stereo, 0 JE PollNoStereo Add CX, CX Mov BX, 4 ENDIF PollNoStereo: Push CX Xor SI, SI Xor DI, DI Xor DX, DX Poll3: Mov EAX, [SI] Test EAX, EAX JS FloatNegative Cmp EAX, UpperLimit JL FloatOK Mov AX, 7FFFh Jmp Poll4 FloatNegative: Cmp EAX, LowerLimit JL FloatOK Mov AX, 8000h Jmp Poll4 FloatOK: Fld DWord Ptr [SI] FISt DWord Ptr [SI] Mov AX, [SI] Poll4: Add SI, BX StosW Dec CX JNZ Poll3 Pop CX Add CX, CX Mov AH, 40h ; Write Mov BX, CS:FileHandle Int 21h JC PollError Cmp AX, CX JE PollNoError PollError: Push CS Pop DS Mov SI, Offset WriteError Mov BX, 100 Call SetInfoLine Call StopPlayBack Pop ES Push CS Pop DS Jmp PollCloseFile PollNoError: Add Word Ptr [CS:WAVEDataSize], AX AdC Word Ptr [CS:WAVEDataSize+2], 0 Pop ES Pop DS PopAD Ret EndP Poll ;ÄÄ SetTempo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AX = tempo ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetTempo Far Push AX Push BX Push DX Push BX Mov AX, CS:MixSpeed Mov BX, AX Xor DX, DX ShL AX, 1 RCL DX, 1 ; DX:AX = Mixspeed*2 ShR BX, 1 ; BX = Mixspeed/2 Add AX, BX AdC DX, 0 ; DX:AX = Mixspeed*2.5 Pop BX ; BX = tempo Div BX Mov CS:BytesToMix, AX Pop DX Pop BX Pop AX Ret EndP SetTempo ;ÄÄ SetMixVolume ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AX = MixVolume ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetMixVolume Far Mov CS:MixVolume, AX Ret EndP SetMixVolume ;ÄÄ SetStereo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AL = Stereo on/off, 0 = off. ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetStereo Far IFDEF REGISTERED Mov CS:StereoSet, AL ENDIF 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 PushAD Push DS Push ES Push FS Mov FS, CS:SongDataArea 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 LoadSampleEnd ; Zero flag ON if 16 bit.. Mov AX, 0 Mov BL, [FS:BP+12h] JNZ LoadSample1 ; 8 bit Test BL, 10h ; Loop JZ LoadSample8_2 Mov ESI, [FS:BP+34h] Mov ECX, [FS:BP+38h] Test BL, 40h JZ LoadSample8_1 Mov ESI, ECX Sub ESI, 2 JNC LoadSample8_1 Xor ESI, ESI LoadSample8_1: Call UpdateSampleLocation Mov AL, [SI] LoadSample8_2: Mov ESI, ECX Call UpdateSampleLocation Mov [SI], AL Jmp LoadSampleEnd LoadSample1: ; 16 bit Test BL, 10h ; Loop JZ LoadSample16_2 Mov ESI, [FS:BP+34h] Mov ECX, [FS:BP+38h] Test BL, 40h JZ LoadSample16_1 Mov ESI, ECX Sub ESI, 2 JNC LoadSample16_1 Xor ESI, ESI LoadSample16_1: Add ESI, ESI Call UpdateSampleLocation Mov AX, [SI] LoadSample16_2: Mov ESI, ECX Add ESI, ESI Call UpdateSampleLocation Mov [SI], AX LoadSampleEnd: Pop FS Pop ES Pop DS PopAD StC Ret EndP LoadSample ;ÄÄ ReleaseSample ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Parameters: AX = sample to release ; DS:SI points to sample header ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ReleaseSample Far Ret EndP ReleaseSample ;ÄÄ ResetMemory ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Frees all on-board memory ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc ResetMemory Far Ret EndP ResetMemory ;ÄÄ GetStatus ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Returns text to show on status line, AX = display parameter ; Carry set if not to show anything. ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc GetStatus Far StC Ret EndP GetStatus ;ÄÄ SoundCardScreen ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; Function to have driver interactive part of program ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SoundCardScreen Far Xor AX, AX StC Ret EndP SoundCardScreen ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc GetVariable Far Ret EndP GetVariable ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SetVariable Far Ret EndP SetVariable ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ EndDriver: ;******** Provided Variable Table ************* MaxNumberOfChannels DW 0FFFFh ; Maximum number of channels the ; driver can handle. StopPlaySection DW 1 DefaultChannels DW 256 DW 5 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 ProvidedTableEnd: DW 32-(ProvidedTableEnd-ProvidedTableStart)/2 Dup (0) EndS End