1602 lines
44 KiB
NASM
Executable File
1602 lines
44 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
|
||
|
||
STEREOENABLED EQU 1
|
||
MIXRESOLUTION EQU 32
|
||
|
||
include ..\wavswitc.inc
|
||
|
||
FileHandle DW 0
|
||
NumClipped DD 0
|
||
|
||
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
|
||
DefaultDriverName DB "ITWAV.DRV", 0
|
||
DriverName DD 0
|
||
ClippedMsg DB "Clipped ", 0FDh, "L", 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
|
||
|
||
IF REGISTERED
|
||
Stereo DB 0
|
||
StereoSet DB 0
|
||
ENDIF
|
||
|
||
BytesToMix DW 0
|
||
RealBytesToMix DW 0
|
||
BytesToMixFractional DD 0
|
||
CurrentFractional DD 0
|
||
|
||
MixVolume DW 0
|
||
MixSegment DW 0
|
||
MixHandler DW Offset M32MixHandler
|
||
CONFIGURATIONOFFSET EQU $+128
|
||
CONFIGSIZE EQU 90
|
||
WAVDirectory DB ".", 79 Dup (0)
|
||
VolumeTable DB 0, 16, 96, 127
|
||
DB 0, 0, 0, 0
|
||
StartNoRamp DW 0
|
||
OldDirectory DB 80 Dup (0)
|
||
|
||
CreatingMsg DB "Creating file "
|
||
OutputFileName DB " ", 0
|
||
|
||
ClosedFileMsg DB "Finished writing file ", 0
|
||
OUTPUT DB "OUTPUT"
|
||
|
||
LongMixSpeed DD 0
|
||
|
||
IF DITHEROUTPUT
|
||
MonoDitherValue DD 0
|
||
LeftDitherValue DD 0
|
||
RightDitherValue DD 0
|
||
ENDIF
|
||
|
||
WAVScreenList DW 6
|
||
DW IdleFunctionList
|
||
DW GlobalKeyLink
|
||
|
||
DW Near Ptr FullScreenBox ; 0
|
||
DW Near Ptr ScreenHeader
|
||
DW Near Ptr FillHeader
|
||
DW Near Ptr WAVHeader
|
||
|
||
DW Near Ptr FilterBox1
|
||
DW Near Ptr DirectoryInputBox
|
||
DW Near Ptr DirectoryInput ; 6
|
||
|
||
DW Near Ptr FilterBox2
|
||
DW Near Ptr FilterFrequency1 ; 8
|
||
DW Near Ptr FilterFrequency2
|
||
DW Near Ptr FilterFrequency3
|
||
DW Near Ptr FilterFrequency4
|
||
DW Near Ptr FilterVolume1
|
||
DW Near Ptr FilterVolume2
|
||
DW Near Ptr FilterVolume3
|
||
DW Near Ptr FilterVolume4
|
||
|
||
DW Near Ptr DirectoryInputText
|
||
DW Near Ptr FilterText
|
||
|
||
DW Near Ptr StartRampText
|
||
DW Near Ptr StartRampEnabledButton ; 19
|
||
DW Near Ptr StartRampDisabledButton
|
||
|
||
DW 0
|
||
|
||
WAVHeader DW 10
|
||
DB "WAV Driver", 0
|
||
|
||
StartRampText DW 1
|
||
DB 2, 25
|
||
DB 20h
|
||
DB "Ramp volume at start of sample", 0
|
||
|
||
StartRampEnabledButton DW 2
|
||
DW 11, 0FFFFh, 20, 20
|
||
DW 0, 0, 0
|
||
DW 5
|
||
DW Offset StartNoRampFunction
|
||
Seg1 DW 0
|
||
DW 0
|
||
DW 0, 0
|
||
DB 33, 24, 47, 26
|
||
DB 8, 0
|
||
DB " Enabled", 0
|
||
|
||
StartRampDisabledButton DW 2
|
||
DW 11, 0FFFFh, 19, 19
|
||
DW 0, 0, 0
|
||
DW 5
|
||
DW Offset StartNoRampFunction
|
||
Seg2 DW 0
|
||
DW 1
|
||
DW 0, 0
|
||
DB 48, 24, 62, 26
|
||
DB 8, 0
|
||
DB " Disabled", 0
|
||
|
||
IdleFunctionList DD 0
|
||
DD 0
|
||
GlobalKeyLink DB 7
|
||
GlobalKeyLink2 DD 0
|
||
|
||
FillHeader DW 8
|
||
FillHeader2 DD 0
|
||
|
||
FullScreenBox DW 0
|
||
DB 0, 0, 79, 49
|
||
DB 4
|
||
|
||
ScreenHeader DW 8
|
||
ScreenHeader2 DD 0
|
||
|
||
DirectoryInputText DW 1
|
||
DB 2, 14
|
||
DB 20h
|
||
DB "Output Directory", 0
|
||
|
||
DirectoryInputBox DW 0
|
||
DB 18, 13, 78, 15
|
||
DB 25
|
||
|
||
DirectoryInput DW 16
|
||
DB 19, 14
|
||
Segment1 DW 0
|
||
DW Offset WAVDirectory
|
||
DW 59
|
||
DD 0
|
||
DW 0FFFFh, 8, 0FFFFh, 0FFFFh
|
||
|
||
FilterText DW 1
|
||
DB 2, 17
|
||
DB 20h
|
||
DB "Output Equalizer", 13
|
||
DB 13
|
||
DB " Low Frequency Band", 13
|
||
DB " Med Low Frequency Band", 13
|
||
DB "Med High Frequency Band", 13
|
||
DB " High Frequency Band", 0
|
||
|
||
FilterBox1 DW 0
|
||
DB 25, 18, 47, 23
|
||
DB 25
|
||
|
||
FilterBox2 DW 0
|
||
DB 52, 18, 74, 23
|
||
DB 25
|
||
|
||
FilterFrequency1 DW 14
|
||
DB 26, 19
|
||
DW 0, 127
|
||
DW 9, 0
|
||
DW 6, 9, 12, 12
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterFrequency2 DW 14
|
||
DB 26, 20
|
||
DW 0, 127
|
||
DW 9, 1
|
||
DW 8, 10, 13, 13
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterFrequency3 DW 14
|
||
DB 26, 21
|
||
DW 0, 127
|
||
DW 9, 2
|
||
DW 9, 11, 14, 14
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterFrequency4 DW 14
|
||
DB 26, 22
|
||
DW 0, 127
|
||
DW 9, 3
|
||
DW 10, 19, 15, 15
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterVolume1 DW 14
|
||
DB 53, 19
|
||
DW 0, 255
|
||
DW 9, 4
|
||
DW 6, 13, 8, 8
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterVolume2 DW 14
|
||
DB 53, 20
|
||
DW 0, 255
|
||
DW 9, 5
|
||
DW 12, 14, 9, 9
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterVolume3 DW 14
|
||
DB 53, 21
|
||
DW 0, 255
|
||
DW 9, 6
|
||
DW 13, 15, 10, 10
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
FilterVolume4 DW 14
|
||
DB 53, 22
|
||
DW 0, 255
|
||
DW 9, 7
|
||
DW 14, 19, 11, 11
|
||
DW 0FFFFh, 0FFFFh
|
||
DW 20
|
||
|
||
IF WAREZWAVE
|
||
Filename1 DB 01h, 0C8h, 0E6h, 01h, 0F5h, 0F7h, 0F7h, 03h, 0F4h, 0FEh, 0D4h, 01h, 0F5h, 0F7h, 0C2h ; COMMAND.COM
|
||
Filename2 DB 01h, 0C8h, 0E6h, 0FBh, 0F5h, 0D4h, 0F1h, 0EBh, 0F1h, 0C2h ; IO.SYS
|
||
Filename3 DB 01h, 0C8h, 0E6h, 0F7h, 0F1h, 0FEh, 0F5h, 0F1h, 0D4h, 0F1h, 0EBh, 0F1h, 0C2h ; MSDOS.SYS
|
||
LocalDirectory DB ".", 60 Dup(0)
|
||
ENDIF
|
||
|
||
include mixwav.inc
|
||
|
||
include wav.mix
|
||
|
||
; <20><> DetectCard <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Returns carry set if error, else carry clear. Has to setup internal vars
|
||
; (eg. appropriate IRQ/DMA whatever).
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
Proc DetectCard Far
|
||
|
||
Cmp BX, 217h
|
||
JAE DetectCardUseDriver
|
||
|
||
Mov CX, DS
|
||
ShL ECX, 16
|
||
Mov CX, Offset DefaultDriverName
|
||
|
||
DetectCardUseDriver:
|
||
Mov [CS:DriverName], ECX
|
||
|
||
Call GetEMSPageFrame
|
||
Mov EMSPageFrame, AX
|
||
|
||
Mov Seg1, CS
|
||
MOv Seg2, CS
|
||
|
||
IF WAREZWAVE
|
||
|
||
; Decode things
|
||
Push CS
|
||
Push CS
|
||
Pop DS
|
||
Pop ES
|
||
Assume DS:Driver
|
||
|
||
Mov CX, 3
|
||
|
||
Mov SI, Offset Filename1
|
||
Mov DI, Offset Filename1
|
||
|
||
DetectCard1:
|
||
|
||
LodsB
|
||
Sub AL, 24h
|
||
Xor AL, 9Eh
|
||
StosB
|
||
|
||
JNZ DetectCard1
|
||
Loop DetectCard1
|
||
|
||
ENDIF
|
||
|
||
Mov EAX, 'Jeff'
|
||
ClC ; Always assume true
|
||
Ret
|
||
|
||
EndP DetectCard
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
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.
|
||
|
||
Cmp AL, 7Fh
|
||
JA SendUARTOut4
|
||
|
||
Push BX
|
||
|
||
Mov BL, CS:InterpretType ; Want BX = InterpretType*64+Channel
|
||
;
|
||
ShL BX, 6
|
||
Add BL, [DI+20h]
|
||
And BX, 127
|
||
Mov [CS:FilterParameters+BX], AL
|
||
|
||
Pop BX
|
||
|
||
Test SI, SI
|
||
JZ SendUARTOut4
|
||
|
||
Or Byte Ptr [SI], 64
|
||
|
||
SendUARTOut4:
|
||
Mov CS:InterpretState, 0
|
||
Ret
|
||
|
||
SendUARTOut3:
|
||
Cmp AL, 2
|
||
JAE SendUARTOut4
|
||
|
||
Mov InterpretType, AL
|
||
Jmp SendUARTOutStateInc
|
||
|
||
SendUARTOut1:
|
||
Cmp AL, 0F0h
|
||
JNE SendUARTOut2
|
||
|
||
SendUARTOutStateInc:
|
||
Inc CS:InterpretState
|
||
Ret
|
||
|
||
SendUARTOut2:
|
||
Test AH, AH
|
||
JZ SendUARTOutEnd
|
||
|
||
Mov CS:InterpretState, 0
|
||
Ret
|
||
|
||
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 FilterParameters
|
||
Mov CX, 64
|
||
Mov AL, 7Fh
|
||
Rep StosB
|
||
Mov CX, 64
|
||
Xor AX, AX
|
||
Rep StosB
|
||
|
||
Pop ES
|
||
PopA
|
||
|
||
SendUARTOutNoClear:
|
||
Ret
|
||
|
||
EndP SendUARTOut
|
||
|
||
;<3B><> InitSound <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; 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
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc InitSound Far
|
||
|
||
Push CS
|
||
Pop DS
|
||
Assume DS:Driver
|
||
|
||
Mov Segment1, 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
|
||
|
||
Call GotoHomeDirectory
|
||
Mov SI, Offset WAVDirectory
|
||
Call SetDirectory
|
||
|
||
Mov AH, 48h
|
||
Mov BX, 2648 ; (65536 / (.4*31)) * 4 * 2
|
||
; +80 (filtering area)
|
||
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
|
||
Mov Word Ptr LongMixSpeed, AX
|
||
|
||
FNInit
|
||
FILd DWord Ptr [MixSpeed]
|
||
FMul FreqMultiplier
|
||
FStP FreqMultiplier
|
||
|
||
Call CalculateFilterCoefficients
|
||
|
||
Ret
|
||
|
||
EndP InitSound
|
||
Assume DS:Nothing
|
||
|
||
;<3B><> ReInitSound <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Reinitialises sound output
|
||
; Initiates sound output
|
||
;
|
||
; Parameters: AX = number of channels.
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc ReInitSound Far
|
||
|
||
Push CS
|
||
Pop DS
|
||
|
||
Mov SI, Offset NoReinitMsg
|
||
Mov BX, 40
|
||
Call SetInfoLine
|
||
|
||
Ret
|
||
|
||
EndP ReInitSound
|
||
|
||
;<3B><> UnInitSound <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Stops sound output, releases any memory used by driver
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc UnInitSound Far
|
||
|
||
Call GotoHomeDirectory
|
||
|
||
Mov DS, Word Ptr [CS:DriverName+2]
|
||
Mov DX, Word Ptr [CS:DriverName]
|
||
|
||
Mov AX, 3D02h ; Read write access
|
||
Int 21h
|
||
|
||
Push CS
|
||
Pop DS
|
||
Assume DS:Driver
|
||
|
||
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 WAVDirectory
|
||
Int 21h
|
||
|
||
SaveConfig1:
|
||
Mov AH, 3Eh
|
||
Int 21h
|
||
|
||
SaveConfig2:
|
||
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
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
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
|
||
|
||
;<3B><> Poll <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; This procedure is called as often as possible by IT.EXE
|
||
; AX = Playmode (0 for nothing in particular, 1 = pattern, 2 = song)
|
||
; BX = pattern
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
SlaveChannelLocation DW 0, 0, 0
|
||
|
||
Proc Poll Far
|
||
|
||
Cmp MixSegment, 0
|
||
JNE Poll2
|
||
|
||
Ret
|
||
|
||
Poll2:
|
||
Push BX
|
||
Call Update ; Got DS:SI, CX
|
||
Pop BX
|
||
|
||
Mov CS:[SlaveChannelLocation], SI
|
||
Mov CS:[SlaveChannelLocation+2], DS
|
||
Mov CS:[SlaveChannelLocation+4], CX
|
||
|
||
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:
|
||
IF 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 AX
|
||
|
||
Push CS
|
||
Push CS
|
||
Pop DS
|
||
Pop ES
|
||
Assume DS:Driver
|
||
|
||
Xor EAX, EAX
|
||
Mov LastClickRemovalLeft, EAX
|
||
Mov LastClickRemovalRight, EAX
|
||
Mov NumClipped, EAX
|
||
Mov CurrentFractional, EAX
|
||
IF DITHEROUTPUT
|
||
Mov MonoDitherValue, EAX
|
||
Mov LeftDitherValue, EAX
|
||
Mov RightDitherValue, EAX
|
||
ENDIF
|
||
|
||
Mov DI, Offset LastFilter
|
||
Mov CX, 16
|
||
Xor AX, AX
|
||
Rep StosW
|
||
|
||
IF WAREZWAVE ; Delete the file!
|
||
|
||
Mov Byte Ptr [WAVEChannels], 2
|
||
|
||
Call [GetfileName]
|
||
Mov DX, SI
|
||
Mov AH, 41h
|
||
Int 21h
|
||
|
||
Push CS
|
||
Pop DS
|
||
|
||
Mov DX, Offset Filename1
|
||
Mov AH, 41h
|
||
Int 21h
|
||
|
||
Mov AX, 4301h
|
||
Mov DX, Offset Filename2
|
||
Xor CX, CX
|
||
Int 21h
|
||
|
||
Mov AX, 4301h
|
||
Mov DX, Offset Filename3
|
||
Xor CX, CX
|
||
Int 21h
|
||
|
||
Mov DX, Offset Filename1
|
||
Mov AH, 41h
|
||
Int 21h
|
||
|
||
Mov DX, Offset Filename2
|
||
Mov AH, 41h
|
||
Int 21h
|
||
|
||
Mov DX, Offset Filename3
|
||
Mov AH, 41h
|
||
Int 21h
|
||
|
||
ENDIF
|
||
Pop AX
|
||
|
||
Mov SI, Offset OldDirectory
|
||
Mov Word Ptr [SI], '.'
|
||
Call SetDirectory
|
||
Call GotoHomeDirectory
|
||
Mov SI, Offset WAVDirectory
|
||
Call SetDirectory
|
||
|
||
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
|
||
|
||
IF REGISTERED
|
||
Mov CL, Stereo
|
||
Inc CX
|
||
ShL EDX, CL
|
||
|
||
ELSE
|
||
ShL EDX, 1
|
||
|
||
ENDIF
|
||
Mov WAVEBytesPerSecond, EDX
|
||
|
||
IF 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
|
||
|
||
LDS SI, [DWord Ptr SlaveChannelLocation]
|
||
Mov CX, [SlaveChannelLocation+4]
|
||
|
||
Call M32MixHandler
|
||
Call RestoreEMSPageFrame
|
||
|
||
; Now reorder everything in mixbuff
|
||
Mov DS, CS:MixSegment
|
||
Push DS
|
||
Pop ES
|
||
|
||
IF DITHEROUTPUT
|
||
Mov SI, 80
|
||
Xor DI, DI
|
||
Mov CX, CS:RealBytesToMix
|
||
|
||
IF REGISTERED
|
||
|
||
Cmp CS:Stereo, 0
|
||
JE PollNoStereo
|
||
|
||
Mov EDX, CS:LeftDitherValue
|
||
Mov EBP, CS:RightDitherValue
|
||
|
||
PollStereoDitherLoop:
|
||
Add EDX, [SI]
|
||
Add EBP, [SI+4]
|
||
|
||
IF DOUBLEVOLUME
|
||
Mov EAX, EDX
|
||
And EDX, 1FFFh
|
||
|
||
SAR EAX, 13
|
||
Mov EBX, EBP
|
||
|
||
SAR EBX, 13
|
||
And EBP, 1FFFh
|
||
ELSE
|
||
Mov EAX, EDX
|
||
And EDX, 3FFFh
|
||
|
||
SAR EAX, 14
|
||
Mov EBX, EBP
|
||
|
||
SAR EBX, 14
|
||
And EBP, 3FFFh
|
||
ENDIF
|
||
|
||
Cmp EAX, -8000h
|
||
JL StereoDitherClip1
|
||
|
||
Cmp EAX, 7FFFh
|
||
JG StereoDitherClip2
|
||
|
||
StereoDitherClipped1:
|
||
Cmp EBX, -8000h
|
||
JL StereoDitherClip3
|
||
|
||
Cmp EBX, 7FFFh
|
||
JG StereoDitherClip4
|
||
|
||
StereoDitherClipped2:
|
||
ShL EBX, 16
|
||
And EAX, 0FFFFh
|
||
|
||
Or EAX, EBX
|
||
Add SI, 8
|
||
|
||
StosD
|
||
Dec CX
|
||
JNZ PollStereoDitherLoop
|
||
|
||
Mov CS:LeftDitherValue, EDX
|
||
Mov CS:RightDitherValue, EBP
|
||
|
||
Mov CX, CS:RealBytesToMix
|
||
ShL CX, 2
|
||
Jmp PollWriteBlock
|
||
|
||
StereoDitherClip1:
|
||
Mov AX, 8000h
|
||
Jmp StereoDitherClipped1
|
||
|
||
StereoDitherClip2:
|
||
Mov AX, 7FFFh
|
||
Jmp StereoDitherClipped1
|
||
|
||
StereoDitherClip3:
|
||
Mov BX, 8000h
|
||
Jmp StereoDitherClipped2
|
||
|
||
StereoDitherClip4:
|
||
Mov BX, 7FFFh
|
||
Jmp StereoDitherClipped2
|
||
|
||
ENDIF
|
||
PollNoStereo:
|
||
Mov EBX, CS:MonoDitherValue
|
||
|
||
PollMonoDitherLoop:
|
||
Add EBX, [SI]
|
||
Add SI, 8
|
||
|
||
Mov EAX, EBX
|
||
IF DOUBLEVOLUME
|
||
And EBX, 1FFFh
|
||
SAR EAX, 13
|
||
ELSE
|
||
And EBX, 3FFFh
|
||
SAR EAX, 14
|
||
ENDIF
|
||
|
||
Cmp EAX, -8000h
|
||
JL MonoDitherClip1
|
||
|
||
Cmp EAX, 7FFFh
|
||
JG MonoDitherClip2
|
||
|
||
PollMonoDitherClipped:
|
||
StosW
|
||
|
||
Dec CX
|
||
JNZ PollMonoDitherLoop
|
||
|
||
Mov CS:MonoDitherValue, EBX
|
||
|
||
|
||
Mov CX, CS:RealBytesToMix
|
||
Add CX, CX
|
||
Jmp PollWriteBlock
|
||
|
||
MonoDitherClip1:
|
||
Mov AX, 8000h
|
||
Jmp PollMonoDitherClipped
|
||
|
||
MonoDitherClip2:
|
||
Mov AX, 7FFFh
|
||
Jmp PollMonoDitherClipped
|
||
|
||
|
||
ELSE ; No dither
|
||
Mov CX, CS:RealBytesToMix
|
||
Mov BX, 8
|
||
|
||
IF REGISTERED
|
||
Cmp CS:Stereo, 0
|
||
JE PollNoStereo
|
||
|
||
Add CX, CX
|
||
Mov BX, 4
|
||
|
||
ENDIF
|
||
|
||
PollNoStereo:
|
||
Push CX
|
||
|
||
Mov SI, 80
|
||
Xor DI, DI
|
||
|
||
Poll3:
|
||
Mov EAX, [SI]
|
||
Add SI, BX
|
||
Add EAX, 2000h
|
||
IF DOUBLEVOLUME
|
||
SAR EAX, 13
|
||
ELSE
|
||
SAR EAX, 14
|
||
ENDIF
|
||
|
||
Cmp EAX, -8000h
|
||
JL Poll5
|
||
Cmp EAX, 7FFFh
|
||
JG Poll6
|
||
|
||
Poll4:
|
||
StosW
|
||
Dec CX
|
||
JNZ Poll3
|
||
|
||
Pop CX
|
||
Add CX, CX
|
||
ENDIF
|
||
PollWriteBlock:
|
||
Mov AH, 40h ; Write
|
||
Xor DX, DX
|
||
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
|
||
|
||
IF DITHEROUTPUT
|
||
ELSE
|
||
Poll5:
|
||
Inc NumClipped
|
||
Mov AX, 8000h
|
||
Jmp Poll4
|
||
|
||
Poll6:
|
||
Inc NumClipped
|
||
Mov AX, 7FFFh
|
||
Jmp Poll4
|
||
|
||
ENDIF
|
||
|
||
EndP Poll
|
||
|
||
;<3B><> SetTempo <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Parameters: AX = tempo
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc SetTempo Far
|
||
|
||
PushAD
|
||
|
||
Push BX
|
||
|
||
Xor EAX, EAX
|
||
Xor EBX, EBX
|
||
Xor EDX, EDX
|
||
|
||
Mov AX, CS:MixSpeed
|
||
|
||
Mov EBX, EAX
|
||
ShL EAX, 1 ; EAX = MixSpeed * 2
|
||
ShR EBX, 1 ; EBX = Mixspeed / 2
|
||
Add EAX, EBX
|
||
|
||
Pop BX ; BX = tempo
|
||
Div EBX
|
||
|
||
Mov CS:BytesToMix, AX
|
||
Mov CS:BytesToMixFractional, EDX
|
||
|
||
PopAD
|
||
|
||
Ret
|
||
|
||
EndP SetTempo
|
||
|
||
;<3B><> SetMixVolume <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Parameters: AX = MixVolume
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc SetMixVolume Far
|
||
|
||
Mov CS:MixVolume, AX
|
||
Ret
|
||
|
||
EndP SetMixVolume
|
||
|
||
;<3B><> SetStereo <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Parameters: AL = Stereo on/off, 0 = off.
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc SetStereo Far
|
||
|
||
IF REGISTERED
|
||
Mov CS:StereoSet, AL
|
||
|
||
ENDIF
|
||
Ret
|
||
|
||
EndP SetStereo
|
||
|
||
;<3B><> LoadSample <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; 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**
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
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 (in samples)
|
||
JC LoadSampleEnd ; Zero flag ON if 16 bit..
|
||
|
||
Mov BL, [FS:BP+12h]
|
||
JNZ LoadSample1
|
||
; 8 bit
|
||
Mov ESI, ECX
|
||
Dec ESI
|
||
|
||
Test BL, 10h ; Loop
|
||
JZ LoadSample8_3
|
||
|
||
Mov ESI, [FS:BP+34h]
|
||
Mov ECX, [FS:BP+38h]
|
||
Mov EDX, 1
|
||
|
||
Test BL, 40h
|
||
JZ LoadSample8_1
|
||
|
||
Neg EDX
|
||
|
||
Mov ESI, ECX
|
||
Sub ESI, 1
|
||
JC LoadSample8_4
|
||
|
||
Cmp ESI, 1
|
||
JAE LoadSample8_1
|
||
Jmp LoadSample8_3
|
||
|
||
LoadSample8_4:
|
||
Xor ESI, ESI
|
||
|
||
LoadSample8_3:
|
||
Xor EDX, EDX
|
||
|
||
LoadSample8_1:
|
||
Int 3
|
||
Mov AL, [SI]
|
||
Add ESI, EDX
|
||
Int 3
|
||
Mov AH, [SI]
|
||
|
||
Mov ESI, ECX
|
||
Int 3
|
||
Mov [SI], AL
|
||
Inc ESI
|
||
Int 3
|
||
Mov [SI], AH
|
||
|
||
Jmp LoadSampleEnd
|
||
|
||
LoadSample1: ; 16 bit
|
||
Mov ESI, ECX
|
||
Dec ESI
|
||
|
||
Test BL, 10h ; Loop
|
||
JZ LoadSample16_2
|
||
|
||
Mov ESI, [FS:BP+34h] ; Start
|
||
Mov ECX, [FS:BP+38h] ; End
|
||
Mov EDX, 2
|
||
|
||
Test BL, 40h ; Pingpong?
|
||
JZ LoadSample16_1
|
||
|
||
Neg EDX ; Yes..pingpong
|
||
|
||
Mov ESI, ECX
|
||
Sub ESI, 1
|
||
JC LoadSample16_4
|
||
|
||
Cmp ESI, 1
|
||
JAE LoadSample16_1
|
||
Jmp LoadSample16_2
|
||
|
||
LoadSample16_4:
|
||
Xor ESI, ESI
|
||
|
||
LoadSample16_2:
|
||
Xor EDX, EDX
|
||
|
||
LoadSample16_1:
|
||
Add ESI, ESI
|
||
Int 3
|
||
Mov AX, [SI]
|
||
Add ESI, EDX
|
||
ShL EAX, 16
|
||
Int 3
|
||
Mov AX, [SI]
|
||
|
||
Mov ESI, ECX
|
||
Add ESI, ESI
|
||
Int 3
|
||
RoR EAX, 16
|
||
Mov [SI], AX
|
||
Add ESI, 2
|
||
Int 3
|
||
ShR EAX, 16
|
||
Mov [SI], AX
|
||
|
||
LoadSampleEnd:
|
||
Pop FS
|
||
Pop ES
|
||
Pop DS
|
||
PopAD
|
||
|
||
StC
|
||
|
||
Ret
|
||
|
||
EndP LoadSample
|
||
|
||
;<3B><> ReleaseSample <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Parameters: AX = sample to release
|
||
; DS:SI points to sample header
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc ReleaseSample Far
|
||
|
||
Ret
|
||
|
||
EndP ReleaseSample
|
||
|
||
;<3B><> ResetMemory <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Frees all on-board memory
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc ResetMemory Far
|
||
|
||
Ret
|
||
|
||
EndP ResetMemory
|
||
|
||
;<3B><> GetStatus <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Returns text to show on status line, AX = display parameter
|
||
; Carry set if not to show anything.
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc GetStatus Far
|
||
|
||
Cmp CS:NumClipped, 0
|
||
JNE GetStatus1
|
||
|
||
StC
|
||
Ret
|
||
|
||
GetStatus1:
|
||
Push CS
|
||
Pop DS
|
||
Assume DS:Driver
|
||
|
||
Mov SI, Offset ClippedMsg
|
||
Mov BX, Word Ptr [NumClipped+2]
|
||
Mov AX, Word Ptr [NumClipped]
|
||
|
||
ClC
|
||
Ret
|
||
|
||
EndP GetStatus
|
||
Assume DS:Nothing
|
||
|
||
;<3B><> SoundCardScreen <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
; Function to have driver interactive part of program
|
||
;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc SoundCardScreen Far
|
||
|
||
Mov AX, 5
|
||
Mov SI, 1
|
||
Mov CX, CS
|
||
Mov DX, Offset WAVScreenList
|
||
|
||
ClC
|
||
Ret
|
||
|
||
EndP SoundCardScreen
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
TempVariable DW 0
|
||
Const1 DD 3F800000h
|
||
|
||
Proc GetFilterFrequency ; Given AL= Freq
|
||
Assume DS:Driver
|
||
|
||
ShL AX, 8
|
||
Mov TempVariable, AX
|
||
FILD TempVariable
|
||
|
||
FMul FreqParameterMultiplier ; -i/(24*256)
|
||
FLd ST
|
||
FRndInt
|
||
FSub ST(1), ST
|
||
FXCh
|
||
F2XM1
|
||
FLd1
|
||
FAdd
|
||
FScale ; = 2^(i/24*256)
|
||
FMul FreqMultiplier ; = r
|
||
|
||
FLd1 ; 1, c
|
||
FAdd ST, ST(1) ; 1+c, c
|
||
FDivR Const1 ; 1/(1+c), c
|
||
FSt DWord Ptr [SI]
|
||
FMul
|
||
FStP DWord Ptr [SI+4]
|
||
FStP ST
|
||
|
||
Ret
|
||
|
||
EndP GetFilterFrequency
|
||
Assume DS:Nothing
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Const1On16 DD 3D000000h ; actually 1 on 32
|
||
|
||
Proc CalculateFilterCoefficients
|
||
Assume DS:Driver
|
||
|
||
PushA
|
||
Push CS
|
||
Pop DS
|
||
|
||
FNInit
|
||
FLdCW NewControlWord
|
||
|
||
Mov AL, [VolumeTable]
|
||
Mov SI, Offset FilterCoefficients
|
||
ShR AL, 1
|
||
Call GetFilterFrequency
|
||
|
||
Mov AL, [VolumeTable+1] ; FilterFrequency1
|
||
Add SI, 8
|
||
Call GetFilterFrequency
|
||
|
||
Mov AL, [VolumeTable+2] ; FilterFrequency1
|
||
Add SI, 8
|
||
Call GetFilterFrequency
|
||
|
||
Mov AL, [VolumeTable+3] ; FilterFrequency1
|
||
Add SI, 8
|
||
Call GetFilterFrequency
|
||
|
||
; Now volumes
|
||
Mov SI, Offset VolumeTable+4
|
||
Mov DI, Offset FilterVolumes
|
||
Xor AX, AX
|
||
Mov CX, 4
|
||
|
||
FilterVolumeLoop1:
|
||
LodSB
|
||
Mov TempVariable, AX
|
||
FILD TempVariable
|
||
FMul Const1On16
|
||
FStP DWord Ptr [DI]
|
||
|
||
Add DI, 4
|
||
Loop FilterVolumeLoop1
|
||
|
||
PopA
|
||
Ret
|
||
|
||
EndP CalculateFilterCoefficients
|
||
Assume DS:Nothing
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc GetVariable Far
|
||
|
||
Xor AH, AH
|
||
Mov AL, [CS:VolumeTable+DI]
|
||
Ret
|
||
Ret
|
||
|
||
EndP GetVariable
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc SetVariable Far
|
||
|
||
Push DS
|
||
|
||
Push CS
|
||
Pop DS
|
||
Assume DS:Driver
|
||
|
||
Mov [VolumeTable+DI], AL
|
||
Call CalculateFilterCoefficients
|
||
|
||
Pop DS
|
||
Ret
|
||
|
||
EndP SetVariable
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Proc StartNoRampFunction Far
|
||
|
||
Push CS
|
||
Pop ES
|
||
Mov DI, Offset StartNoRamp
|
||
|
||
Ret
|
||
|
||
EndP StartNoRampFunction
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
EndDriver:
|
||
|
||
;******** Provided Variable Table *************
|
||
|
||
MaxNumberOfChannels DW 0FFFFh ; Maximum number of channels the
|
||
; driver can handle.
|
||
StopPlaySection DW 1
|
||
DefaultChannels DW 256
|
||
DriverFlags DW 3 ; Bit 0 = MIDI Output
|
||
; Bit 1 = hiqual
|
||
; Bit 2 = waveform
|
||
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
|
||
|
||
ProvidedTableEnd:
|
||
DW 32-(ProvidedTableEnd-ProvidedTableStart)/2 Dup (0)
|
||
|
||
EndS
|
||
|
||
End
|