905 lines
24 KiB
NASM
Executable File
905 lines
24 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 0
|
|
DMABUFFERLENGTH EQU 4096
|
|
MIXRESOLUTION EQU 16 ; 16 bit mixing for the SB Pro
|
|
MIXTABLESIZE EQU 2*256*65
|
|
|
|
SBProMsg DB "Using DAC on LPT1, Port ", 0FDh, "Xh", 0
|
|
|
|
SBProNoMemoryMsg DB " Using DAC on LPT1", 13
|
|
DB " Error: Insufficient memory", 0
|
|
|
|
ReinitMsg DB "DAC on LPT1 reinitialised", 0
|
|
|
|
DSPVersion DW 0
|
|
Forced DB 0
|
|
InInterrupt DB 0
|
|
|
|
BytesToMix DW 1000
|
|
MixSpeed DW 22000
|
|
MixConst DW 0
|
|
|
|
MixSegment DW 0
|
|
DMASegment DW 0
|
|
|
|
MixTransferOffset DW 0
|
|
MixTransferRemaining DW 0
|
|
|
|
DMASize DW 2048
|
|
|
|
OldIRQHandler DD 0
|
|
TimerAccumulator DW 0
|
|
|
|
; ÄÄ MixingRoutines ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
MixBufferPos DW 0
|
|
OutputBufferPos DW 0
|
|
OutputBlockEnd DW 1024
|
|
|
|
include mix.inc
|
|
include mono12b.mix
|
|
|
|
MixFunctionTables Label
|
|
|
|
include mono12b.inc ; contains the tables
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc GetMixConst ; Work out value.. and nearest
|
|
; mixspeed value.
|
|
|
|
PushA
|
|
Push DS
|
|
Push ES
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Driver
|
|
|
|
Mov AX, CmdLineMixSpeed
|
|
Mov CX, MixSpeed
|
|
|
|
Cmp AX, 12000
|
|
JB GetMixConst1
|
|
|
|
Cmp AX, 44100
|
|
JA GetMixConst1
|
|
|
|
Mov CX, AX
|
|
|
|
GetMixConst1:
|
|
Mov DX, 0012h
|
|
Mov AX, 34DDh
|
|
|
|
Div CX
|
|
; AX = mix const
|
|
Mov MixConst, AX
|
|
|
|
Mov DX, 12h
|
|
Mov AX, 34DDh
|
|
Div MixConst
|
|
|
|
Mov MixSpeed, AX
|
|
|
|
Pop ES
|
|
Pop DS
|
|
PopA
|
|
Ret
|
|
|
|
EndP GetMixConst
|
|
Assume DS:Nothing
|
|
|
|
; ÄÄ DetectCard ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Returns carry set if error, else carry clear. Has to setup internal vars
|
|
; (eg. appropriate IRQ/DMA whatever).
|
|
;
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc DetectCard Far
|
|
|
|
Push ES
|
|
|
|
Xor AX, AX
|
|
Mov ES, AX
|
|
Mov AX, [ES:408h] ; LPT1 port
|
|
|
|
Pop ES
|
|
And AX, AX
|
|
JZ DetectCard1
|
|
|
|
Mov Word Ptr CS:LPTPortNumber, AX
|
|
|
|
Mov EAX, 'Jeff'
|
|
ClC
|
|
Ret
|
|
|
|
DetectCard1:
|
|
StC
|
|
Ret
|
|
|
|
EndP DetectCard
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc MixSamples ; Given DS:SI = info tables, CX = numchannels
|
|
|
|
; 1. Clean buffer
|
|
; + update variables
|
|
; 2. Update parameters
|
|
; 3. Mix func
|
|
; 4. Return
|
|
|
|
Push CX
|
|
|
|
Mov CX, BytesToMix
|
|
Mov ES, MixSegment
|
|
Mov DI, MIXTABLESIZE
|
|
Mov AX, 2020h
|
|
|
|
Mov BX, CX ; BX = bytes to mix
|
|
Mov DX, CX
|
|
|
|
Mov MixTransferOffset, DI ; } Memory write
|
|
Rep StosW ; } Memory write
|
|
Mov MixTransferRemaining, DX ; }
|
|
|
|
Pop CX
|
|
|
|
MixSamples2:
|
|
Test Byte Ptr [SI], 1
|
|
JZ MixSamplesEnd2
|
|
Cmp Byte Ptr [SI+36h], 100
|
|
JE MixSamplesEnd2
|
|
|
|
Push CX
|
|
Mov CX, [SI]
|
|
|
|
Test CH, 2
|
|
JZ MixSamples3
|
|
And Byte Ptr [SI], Not 1
|
|
Jmp MixSamplesEnd
|
|
|
|
MixSamples3:
|
|
Test CL, 20h ; New freq?
|
|
JZ MixSamples5
|
|
|
|
Mov AX, [SI+10h]
|
|
Mov DX, [SI+12h]
|
|
Mov BX, MixSpeed
|
|
Cmp DX, BX
|
|
JAE MixSamplesHandleError
|
|
|
|
Div BX
|
|
ShL EAX, 16
|
|
Xor AX, AX
|
|
Div BX
|
|
Mov STEPVALUE, EAX
|
|
|
|
MixSamples4:
|
|
Test CH, 1
|
|
JZ MixSamples5
|
|
|
|
Mov DWord Ptr [SI+1Ch], 0 ; Current Volume = 0
|
|
; for volume sliding.
|
|
MixSamples5:
|
|
Test CX, 8440h ; New volume or panning?
|
|
JZ MixSamplesMix
|
|
|
|
Xor AX, AX
|
|
Test CH, 8 ; Muted?
|
|
JNZ MixModeCommon
|
|
|
|
Mix0Mode: ; 16-bit mixing, no interpolation, no ramping
|
|
Mix0ModeMono:
|
|
Mov AL, [SI+20h]
|
|
ShR AL, 1
|
|
Mov [SI+0Ch], AX
|
|
Mov [SI+0Eh], AX
|
|
Mov AX, 0
|
|
JZ MixModeCommon
|
|
Mov AX, 30 ; Use left only-mixing for mono
|
|
|
|
MixModeCommon: ; Requires AX = 30/60/90 etc. depending
|
|
; On mixing mode type.
|
|
; This will add 180 for 16-bit,
|
|
; And sort out loop types.
|
|
Mov BL, [SI+0Ah]
|
|
Test Byte Ptr [SI+18h], 2 ; 16 bit?
|
|
JZ MixModeCommon1
|
|
|
|
Add AX, 60
|
|
|
|
MixModeCommon1:
|
|
Cmp BL, 8
|
|
JB MixModeCommon3 ; No loop
|
|
JE MixModeCommon2 ; Forwards loop
|
|
|
|
Add AX, 10
|
|
|
|
MixModeCommon2:
|
|
Add AX, 10
|
|
|
|
MixModeCommon3:
|
|
Add AX, Offset MixFunctionTables
|
|
Mov [SI+8], AX ; Offset...
|
|
|
|
|
|
MixSamplesMix:
|
|
Mov BX, [SI+8] ; BX = offset into
|
|
Mov EAX, [CS:BX+2]
|
|
Mov DWord Ptr PreMixFunction, EAX
|
|
Mov EAX, [CS:BX+6]
|
|
Mov DWord Ptr MixFunctionSeparateBackwards, EAX
|
|
|
|
Mov AX, MixTransferRemaining
|
|
Mov MixBlockSize, AX
|
|
Mov MixBufferOffset, MIXTABLESIZE
|
|
|
|
Mov EAX, CURRENTPOSITION
|
|
Mov OLDPOSITION, EAX
|
|
|
|
Call Word Ptr [CS:BX]
|
|
|
|
And Word Ptr [SI], 0111100010001101b
|
|
Jmp MixSamplesEnd
|
|
|
|
MixSamplesHandleError:
|
|
Mov Word Ptr [SI], 200h
|
|
|
|
Test Byte Ptr [SI+3Ah], 80h
|
|
JNZ MixSamplesEnd
|
|
|
|
Mov BX, [SI+38h]
|
|
And Byte Ptr [BX], Not 4 ; Turn off channel
|
|
|
|
MixSamplesEnd:
|
|
Pop CX
|
|
|
|
MixSamplesEnd2:
|
|
Add SI, 128
|
|
Dec CX
|
|
JNZ MixSamples2
|
|
|
|
Ret
|
|
|
|
EndP MixSamples
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc PCSpeakerIRQHandler
|
|
|
|
Push AX
|
|
Push BX
|
|
Push DX
|
|
Push DS
|
|
|
|
Mov DS, CS:DMASegment
|
|
Mov BX, CS:OutputBufferPos
|
|
|
|
LPTPortNumber EQU $+1
|
|
Mov DX, 1234h
|
|
|
|
Mov AL, [BX]
|
|
Out DX, AL
|
|
|
|
Mov AX, CS
|
|
Mov DS, AX
|
|
Assume DS:Driver
|
|
|
|
Inc BX
|
|
; OK.. which IRQ handler?
|
|
Mov AX, MixConst
|
|
Add TimerAccumulator, AX
|
|
JC PCSpeakerIRQHandler1
|
|
|
|
Mov AL, 20h
|
|
Out 20h, AL
|
|
Jmp PCSpeakerIRQHandler2
|
|
|
|
PCSpeakerIRQHandler1:
|
|
PushF
|
|
Call OldIRQHandler
|
|
|
|
PCSpeakerIRQHandler2:
|
|
Mov OutputBufferPos, BX
|
|
Cmp BX, OutputBlockEnd
|
|
JAE PCSpeakerIRQHandler3
|
|
|
|
PCSpeakerIRQHandlerEnd:
|
|
Pop DS
|
|
Pop DX
|
|
Pop BX
|
|
Pop AX
|
|
|
|
IRet
|
|
|
|
PCSpeakerIRQHandler3:
|
|
Mov BX, DMASize
|
|
Mov AX, OutputBlockEnd
|
|
Add AX, BX
|
|
Cmp AX, DMABUFFERLENGTH
|
|
JBE PCSpeakerIRQHandler4
|
|
|
|
Mov AX, BX
|
|
Mov OutputBufferPos, 0
|
|
|
|
PCSpeakerIRQHandler4:
|
|
Mov OutputBlockEnd, AX
|
|
|
|
Cmp InInterrupt, 0
|
|
JA PCSpeakerIRQHandlerEnd
|
|
|
|
Inc InInterrupt
|
|
|
|
ClD
|
|
|
|
PushAD
|
|
Push ES
|
|
|
|
Mov ES, CS:DMASegment
|
|
Mov DI, OutputBufferPos
|
|
|
|
Call SaveEMSPageFrame
|
|
|
|
StI
|
|
; BX = bytes required
|
|
|
|
Cmp MixTransferRemaining, 0
|
|
JNE SBProIRQHandler4
|
|
Assume DS:Nothing
|
|
|
|
SBProIRQHandler3:
|
|
Push BX
|
|
Push ES
|
|
Push DI
|
|
|
|
Call Update
|
|
Call MixSamples
|
|
|
|
Pop DI
|
|
Pop ES
|
|
Pop BX
|
|
|
|
SBProIRQHandler4:
|
|
Mov DS, MixSegment
|
|
Mov SI, MixTransferOffset
|
|
Mov DX, BX ; DX = samples to transfer
|
|
Cmp DX, MixTransferRemaining
|
|
JBE SBProIRQHandler5
|
|
|
|
Mov DX, MixTransferRemaining
|
|
|
|
SBProIRQHandler5:
|
|
Push BX
|
|
Push DX
|
|
|
|
SBProIRQHandler6:
|
|
Mov AX, [SI]
|
|
SAR AX, 6
|
|
|
|
Test AH, AH
|
|
JNZ SBProIRQHandlerClip1
|
|
|
|
SBProIRQHandler7:
|
|
StosB ; } Memory write
|
|
|
|
Add SI, 2
|
|
Dec DX
|
|
JNZ SBProIRQHandler6
|
|
|
|
Pop DX
|
|
Pop BX
|
|
|
|
Sub MixTransferRemaining, DX ; } Memory write
|
|
Sub BX, DX
|
|
JNZ SBProIRQHandler3
|
|
|
|
Mov MixTransferOffset, SI ; } Memory write
|
|
|
|
Call RestoreEMSPageFrame
|
|
|
|
Dec InInterrupt
|
|
|
|
PCSpkEnd2:
|
|
Pop ES
|
|
PopAD
|
|
Pop DS
|
|
Pop DX
|
|
Pop BX
|
|
Pop AX
|
|
IRet
|
|
|
|
SBProIRQHandlerClip1:
|
|
Mov AL, 0
|
|
JS SBProIRQHandler7
|
|
Mov AL, 0FFh
|
|
Jmp SBProIRQHandler7
|
|
|
|
EndP PCSpeakerIRQHandler
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetIRQ
|
|
|
|
PushAD
|
|
Push DS
|
|
Push ES
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Driver
|
|
|
|
Mov OutputBufferPos, 0
|
|
Mov OutputBlockEnd, 1024
|
|
|
|
Mov AL, 34h ; Program IRQ 0. LSB&MSB, Rate gen
|
|
Out 43h, AL
|
|
|
|
Mov AX, MixConst
|
|
Out 40h, AL
|
|
Mov AL, AH
|
|
Out 40h, AL
|
|
|
|
Xor AX, AX
|
|
Mov ES, AX
|
|
|
|
Mov AX, CS
|
|
ShL EAX, 16
|
|
Mov AX, Offset PCSpeakerIRQHandler
|
|
|
|
ClI
|
|
|
|
XChg [ES:20h], EAX
|
|
Mov OldIRQHandler, EAX
|
|
|
|
StI
|
|
|
|
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
|
|
|
|
Mov AL, 34h ; Reset IRQ calling rate.
|
|
Out 43h, AL
|
|
Xor AL, AL
|
|
Out 40h, AL
|
|
Out 40h, AL
|
|
|
|
Xor AX, AX
|
|
Mov ES, AX
|
|
|
|
Mov EAX, OldIRQHandler
|
|
Mov [ES:20h], EAX
|
|
|
|
Pop ES
|
|
Pop DS
|
|
PopAD
|
|
|
|
Ret
|
|
|
|
EndP ResetIRQ
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
;ÄÄ 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
|
|
|
|
Call GetEMSPageFrame
|
|
Mov EMSPageFrame, AX
|
|
|
|
Call GetMixConst
|
|
|
|
Mov AX, 661
|
|
Mul MixSpeed
|
|
Add AX, 0FFFFh
|
|
AdC DX, 2080
|
|
|
|
Mov BX, DMABUFFERLENGTH/16
|
|
Add BX, DX
|
|
|
|
; Allocate MixSegment first
|
|
Mov AH, 48h
|
|
|
|
Int 21h
|
|
JNC InitSound1
|
|
|
|
InitSoundNoMemory:
|
|
Mov SI, Offset SBProNoMemoryMsg
|
|
Ret
|
|
|
|
InitSound1:
|
|
Mov MixSegment, AX
|
|
Add AX, DX
|
|
Mov DMASegment, AX
|
|
|
|
Call GetTempo
|
|
Call SetTempo
|
|
Call SetIRQ
|
|
|
|
Mov SI, Offset SBProMsg
|
|
Mov AX, Word Ptr LPTPortNumber
|
|
|
|
Ret
|
|
|
|
EndP InitSound
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄ ReInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Reinitialises sound output
|
|
; Initiates sound output
|
|
;
|
|
; Parameters: AX = number of channels.
|
|
;
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc ReInitSound Far
|
|
|
|
PushA
|
|
Push DS
|
|
Push ES
|
|
|
|
Push CS
|
|
Pop DS
|
|
Assume DS:Driver
|
|
|
|
Call ResetIRQ
|
|
Call SetIRQ
|
|
|
|
Mov SI, Offset ReInitMsg
|
|
Mov BX, 40
|
|
Call SetInfoLine
|
|
|
|
Pop ES
|
|
Pop DS
|
|
PopA
|
|
|
|
Ret
|
|
|
|
EndP ReInitSound
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄ UnInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Stops sound output, releases any memory used by driver
|
|
;
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc UnInitSound Far
|
|
|
|
Mov AX, MixSegment
|
|
Test AX, AX
|
|
JZ UnInitSound1
|
|
|
|
Mov ES, AX
|
|
Mov AH, 49h ; Release MixSegment
|
|
Int 21h
|
|
|
|
Call ResetIRQ
|
|
|
|
UnInitSound1:
|
|
Ret
|
|
|
|
EndP UnInitSound
|
|
|
|
;ÄÄ 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
|
|
|
|
Ret
|
|
|
|
EndP Poll
|
|
|
|
;ÄÄ SetTempo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Parameters: BX = tempo
|
|
;
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetTempo Far
|
|
|
|
Push AX
|
|
Push BX
|
|
Push DX
|
|
|
|
Push BX
|
|
|
|
Mov AX, 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 BytesToMix, AX
|
|
|
|
Pop DX
|
|
Pop BX
|
|
Pop AX
|
|
|
|
Ret
|
|
|
|
EndP SetTempo
|
|
|
|
;ÄÄ SetMixVolume ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Parameters: AX = MixVolume
|
|
;
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetMixVolume Far
|
|
|
|
PushA
|
|
Push DS
|
|
|
|
Mov BX, AX ; BX = MixVolume
|
|
|
|
Mov AX, CS:MixSegment
|
|
Test AX, AX
|
|
JZ SetMixVolume2
|
|
|
|
Mov DS, AX
|
|
|
|
Mov CX, MIXTABLESIZE/2
|
|
Mov SI, MIXTABLESIZE-2; Starting point - working backwards
|
|
|
|
SetMixVolume1:
|
|
Mov AX, CX
|
|
|
|
Dec AX ; AH = volume, AL = wave value.
|
|
Xor DX, DX
|
|
XChg AH, DL ; DL = Volume, AX = wave value
|
|
CBW
|
|
|
|
IMul DX ; DX:AX = Volume * Wave Value
|
|
; Ranges -8192->8128
|
|
|
|
IMul BX ; DX:AX = Volume * Wave Value * Mixing Volume
|
|
; Ranges -1048576->1040384
|
|
|
|
Add AX, 64
|
|
AdC DX, 0
|
|
|
|
ShRD AX, DX, 7
|
|
Mov [SI], AX
|
|
Sub SI, 2
|
|
|
|
Loop SetMixVolume1
|
|
|
|
SetMixVolume2:
|
|
Pop DS
|
|
PopA
|
|
|
|
Ret
|
|
|
|
EndP SetMixVolume
|
|
|
|
;ÄÄ SetStereo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Parameters: AL = Stereo on/off, 0 = off.
|
|
;
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetStereo Far
|
|
|
|
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
|
|
|
|
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 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
;
|
|
; Frees all on-board memory
|
|
;
|
|
; 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
|
|
|
|
StC
|
|
Ret
|
|
|
|
EndP SoundCardScreen
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc GetVariable Far ; Returns AX, given DI
|
|
|
|
Ret
|
|
|
|
EndP GetVariable
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
Proc SetVariable Far ; Given AX, DI
|
|
|
|
Ret
|
|
|
|
EndP SetVariable
|
|
Assume DS:Nothing
|
|
|
|
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
|
|
|
EndDriver:
|
|
|
|
;******** Provided Variable Table *************
|
|
|
|
MaxNumberOfChannels DW 0FFFFh ; Maximum number of channels the
|
|
; driver can handle.
|
|
|
|
StopAfterPlay DW 0
|
|
DefaultChannels DW 64
|
|
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
|