Added sound drivers to repository

This commit is contained in:
Jeffrey Lim @ Vision 2014-12-25 14:31:52 +10:30
parent d743c5dd04
commit 94c80b2514
176 changed files with 127052 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

2116
SoundDrivers/AD1816.ASM Executable file

File diff suppressed because it is too large Load Diff

56
SoundDrivers/AMD3DI.MIX Executable file
View File

@ -0,0 +1,56 @@
; 8-bit interpolated mixing routine, 4 samples at a time. Rearranged
; MM7 contains volume as packed floating point
; MM6 contains offset as packed integer offset
; MM5 = DeltaOffset
; MM7 = RVol|LVol
; MM6 = (1-Offset2)|Offset2|(1-Offset1)|Offset1
MovD MM0, [SampleBlock1] ; MM0 = x|x|x|x|S2H|S2L|S1H|S1L
MovQ MM2, MM6
PSRAW MM2, 1
PUnpckLBW MM0, MM0 ; MM0 = S2H|S2L|S1H|S1L
PAddW MM6, MM5
PMAddWD MM0, MM2 ; MM0 = IS2|IS1
MovD MM1, [SampleBlock2] ; MM1 = x|x|x|x|S4H|S4L|S3H|S3L
MovQ MM2, MM6
PUnpckLBW MM1, MM1 ; MM1 = S4H|S4L|S3H|S3L
PSRAW MM2, 1
PI2FD MM0, MM0 ; MM0 = FIS2|FIS1
PMAddWD MM1, MM2 ; MM1 = IS4|IS3
MovQ MM2, MM0
PUnpckLDQ MM0, MM0 ; MM0 = FIS1|FIS1
PUnpckHDQ MM2, MM2 ; MM2 = FIS2|FIS2
PI2FD MM1, MM1 ; MM1 = FIS4|FIS3
PFMul MM0, MM7 ; MM0 = R1|L1
PAddW MM6, MM5
PFMul MM2, MM7 ; MM2 = R2|L2
MovQ MM3, MM1
PFAdd MM0, [Buffer1]
PUnpckLDQ MM1, MM1 ; MM1 = FIS3|FIS3
PFAdd MM2, [Buffer2]
PUnpckHDQ MM3, MM3 ; MM3 = FIS4|FIS4
PFMul MM1, MM7
MovQ [Buffer1], MM0
PFMul MM3, MM7
PFAdd MM1, [Buffer3]
MovQ [Buffer2], MM2
PFAdd MM3, [Buffer4]
MovQ [Buffer3], MM1
MovQ [Buffer4], MM3

304
SoundDrivers/AMD3DNI.MIX Executable file
View File

@ -0,0 +1,304 @@
; 8-bit non interpolated mixing routine, 8 samples at a time. Not rearranged
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovD MM0, [SampleBlock1] ; Low 4 bytes contain samples 1-4
MovD MM1, [SampleBlock2] ; Low 4 bytes contain samples 5-8
PUnpckLBW MM0, MM0 ; MM0 = S4|S3|S2|S1
PUnpckLBW MM1, MM1 ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
MovQ MM3, MM1
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
; What category do PI2FD instructions fall under? Are they AMD-3D ALU (ie.
; only one resource shared between pipes?)
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PI2FD MM1, MM1 ; MM1 = FS6|FS5
PI2FD MM2, MM2 ; MM2 = FS4|FS3
PI2FD MM3, MM3 ; MM3 = FS8|FS7
MovQ MM4, MM0
MovQ MM5, MM2
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFMul MM0, MM7 ; MM0 = R1|L1
PFMul MM4, MM7 ; MM4 = R2|L2
PFMul MM2, MM7 ; MM2 = R3|L3
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM0, [Buffer1]
PFAdd MM4, [Buffer2]
PFAdd MM2, [Buffer3]
PFAdd MM5, [Buffer4]
MovQ [Buffer1], MM0
MovQ [Buffer2], MM4
MovQ [Buffer3], MM2
MovQ [Buffer4], MM5
MovQ MM0, MM1
MovQ MM2, MM3
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFMul MM0, MM7
PFMul MM1, MM7
PFMul MM2, MM7
PFMul MM3, MM7
PFAdd MM0, [Buffer5]
PFAdd MM1, [Buffer6]
PFAdd MM2, [Buffer7]
PFAdd MM3, [Buffer8]
MovQ [Buffer5], MM0
MovQ [Buffer6], MM1
MovQ [Buffer7], MM2
MovQ [Buffer8], MM3
;-----------------------------------------------------------------------------
; Rearranged to improve pairing
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovD MM0, [SampleBlock1] ; Low 4 bytes contain samples 1-4
MovD MM1, [SampleBlock2] ; Low 4 bytes contain samples 5-8
PUnpckLBW MM0, MM0 ; MM0 = S4|S3|S2|S1
PUnpckLBW MM1, MM1 ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
MovQ MM3, MM1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
PI2FD MM1, MM1 ; MM1 = FS6|FS5
MovQ MM4, MM0
PI2FD MM2, MM2 ; MM2 = FS4|FS3
MovQ MM5, MM2
PI2FD MM3, MM3 ; MM3 = FS8|FS7
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PFMul MM0, MM7 ; MM0 = R1|L1
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PFMul MM4, MM7 ; MM4 = R2|L2
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFMul MM2, MM7 ; MM2 = R3|L3
PFAdd MM0, [Buffer1]
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM4, [Buffer2]
PFAdd MM2, [Buffer3]
MovQ [Buffer1], MM0
MovQ [Buffer2], MM4
PFAdd MM5, [Buffer4]
MovQ [Buffer3], MM2
MovQ MM0, MM1
MovQ [Buffer4], MM5
MovQ MM2, MM3
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PFMul MM0, MM7
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PFMul MM1, MM7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFAdd MM0, [Buffer5]
PFMul MM2, MM7
PFAdd MM1, [Buffer6]
PFMul MM3, MM7
MovQ [Buffer5], MM0
PFAdd MM2, [Buffer7]
MovQ [Buffer6], MM1
PFAdd MM3, [Buffer8]
MovQ [Buffer7], MM2 ; These will be rearranged to match
MovQ [Buffer8], MM3 ; the next iteration.
; 16-bit non interpolated mixing routine, 8 samples at a time. Not rearranged
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovQ MM0, [SampleBlock1] ; MM0 = S4|S3|S2|S1
MovQ MM1, [SampleBlock2] ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
MovQ MM3, MM1
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
; What category do PI2FD instructions fall under? Are they AMD-3D ALU (ie.
; only one resource shared between pipes?)
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PI2FD MM1, MM1 ; MM1 = FS6|FS5
PI2FD MM2, MM2 ; MM2 = FS4|FS3
PI2FD MM3, MM3 ; MM3 = FS8|FS7
MovQ MM4, MM0
MovQ MM5, MM2
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFMul MM0, MM7 ; MM0 = R1|L1
PFMul MM4, MM7 ; MM4 = R2|L2
PFMul MM2, MM7 ; MM2 = R3|L3
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM0, [Buffer1]
PFAdd MM4, [Buffer2]
PFAdd MM2, [Buffer3]
PFAdd MM5, [Buffer4]
MovQ [Buffer1], MM0
MovQ [Buffer2], MM4
MovQ [Buffer3], MM2
MovQ [Buffer4], MM5
MovQ MM0, MM1
MovQ MM2, MM3
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFMul MM0, MM7
PFMul MM1, MM7
PFMul MM2, MM7
PFMul MM3, MM7
PFAdd MM0, [Buffer5]
PFAdd MM1, [Buffer6]
PFAdd MM2, [Buffer7]
PFAdd MM3, [Buffer8]
MovQ [Buffer5], MM0
MovQ [Buffer6], MM1
MovQ [Buffer7], MM2
MovQ [Buffer8], MM3
;-----------------------------------------------------------------------------
; Rearranged to improve pairing
; MM7 contains volume as packed floating point MM7 = RVol|LVol
MovQ MM0, [SampleBlock1] ; MM0 = S4|S3|S2|S1
MovQ MM1, [SampleBlock2] ; MM1 = S8|S7|S6|S5
MovQ MM2, MM0
PUnpckLWD MM0, MM0 ; MM0 = S2|S1
MovQ MM3, MM1
PUnpckLWD MM1, MM1 ; MM1 = S6|S5
PI2FD MM0, MM0 ; MM0 = FS2|FS1
PUnpckHWD MM2, MM2 ; MM2 = S4|S3
PI2FD MM1, MM1 ; MM1 = FS6|FS5
PUnpckHWD MM3, MM3 ; MM3 = S8|S7
; What category do PI2FD instructions fall under? Are they AMD-3D ALU (ie.
; only one resource shared between pipes?)
MovQ MM4, MM0
PI2FD MM2, MM2 ; MM2 = FS4|FS3
MovQ MM5, MM2
PI2FD MM3, MM3 ; MM3 = FS8|FS7
PUnpckLDQ MM0, MM0 ; MM0 = FS1|FS1
PUnpckHDQ MM4, MM4 ; MM4 = FS2|FS2
PFMul MM0, MM7 ; MM0 = R1|L1
PUnpckLDQ MM2, MM2 ; MM2 = FS3|FS3
PFMul MM4, MM7 ; MM4 = R2|L2
PUnpckHDQ MM5, MM5 ; MM5 = FS4|FS4
PFAdd MM0, [Buffer1]
PFMul MM2, MM7 ; MM2 = R3|L3
PFAdd MM4, [Buffer2]
PFMul MM5, MM7 ; MM5 = R4|L4
PFAdd MM2, [Buffer3]
MovQ [Buffer1], MM0
PFAdd MM5, [Buffer4]
MovQ [Buffer2], MM4
MovQ MM0, MM1
MovQ [Buffer3], MM2
MovQ MM2, MM3
MovQ [Buffer4], MM5
PUnpckLDQ MM0, MM0 ; MM0 = FS5|FS5
PUnpckHDQ MM1, MM1 ; MM1 = FS6|FS6
PFMul MM0, MM7
PUnpckLDQ MM2, MM2 ; MM2 = FS7|FS7
PFMul MM1, MM7
PUnpckHDQ MM3, MM3 ; MM3 = FS8|FS8
PFAdd MM0, [Buffer5]
PFMul MM2, MM7
PFAdd MM1, [Buffer6]
PFMul MM3, MM7
MovQ [Buffer5], MM0
PFAdd MM2, [Buffer7]
MovQ [Buffer6], MM1
PFAdd MM3, [Buffer8]
MovQ [Buffer7], MM2
MovQ [Buffer8], MM3

4310
SoundDrivers/AWE32B.ASM Executable file

File diff suppressed because it is too large Load Diff

3961
SoundDrivers/AWE32DRV.ASM Executable file

File diff suppressed because it is too large Load Diff

2070
SoundDrivers/BASE1.ASM Executable file

File diff suppressed because it is too large Load Diff

101
SoundDrivers/DEBUG.INC Executable file
View File

@ -0,0 +1,101 @@
;
; Debug macro. To write to the file, use "Trace <logmessage>"
;
IF TRACEENABLED
IF CREATENEWLOGFILE
FirstTime DB 0
ENDIF
LogFileName DB "Logfile.Txt", 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc WriteDebugFile
PushA
Push DS
Push CS
Pop DS
Mov DX, Offset LogFileName
IF CREATENEWLOGFILE
Cmp DS:FirstTime, 0
JNE WriteDebugFile1
Mov AH, 3Ch
Xor CX, CX
Int 21h
JC WriteDebugFileEnd
Mov DS:FirstTime, 1
XChg AX, BX
Jmp WriteDebugFile2
WriteDebugFile1:
ENDIF
Mov AX, 3D02h
Int 21h
JC WriteDebugFileEnd
XChg AX, BX
Mov AX, 4202h
Xor CX, CX
Xor DX, DX
Int 21h ; Move to end of file
WriteDebugFile2:
Mov AH, 40h
Mov CX, 82
Mov DX, SI
Int 21h
Mov AH, 3Eh
Int 21h
WriteDebugFileEnd:
Pop DS
PopA
Ret
EndP WriteDebugFile
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
Local X, Y
PushF
Push SI
Jmp Y
X:
DB LogMessage
DB 80-($-Offset X) Dup (0)
DB 0Dh, 0Ah
Y:
Mov SI, Offset X
Call WriteDebugFile
Pop SI
PopF
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ELSE
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Trace Macro LogMessage
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ENDIF

113
SoundDrivers/DMA.INC Executable file
View File

@ -0,0 +1,113 @@
DMAData Label Byte
; Port/Mask, Port/Clear, Port/DMAMode, Address, Page, Count, Port/Mask
DB 0Ah, 4, 0Ch, 0, 0Bh, 58h, 87h, 0, 1, 0Ah, 0
DB 0Ah, 5, 0Ch, 0, 0Bh, 59h, 83h, 2, 3, 0Ah, 1
DB 0Ah, 6, 0Ch, 0, 0Bh, 5Ah, 81h, 4, 5, 0Ah, 2
DB 0Ah, 7, 0Ch, 0, 0Bh, 5Bh, 82h, 6, 7, 0Ah, 3
DB 0D4h, 4, 0D8h, 0, 0D6h, 58h, 8Fh, 0C0h, 0C2h, 0D4h, 0
DB 0D4h, 5, 0D8h, 0, 0D6h, 59h, 8Bh, 0C4h, 0C6h, 0D4h, 1
DB 0D4h, 6, 0D8h, 0, 0D6h, 5Ah, 89h, 0C8h, 0CAh, 0D4h, 2
DB 0D4h, 7, 0D8h, 0, 0D6h, 5Bh, 8Ah, 0CCh, 0CEh, 0D4h, 3
ActualDMAPtr Label DWord
ActualDMAOffset DW 0
ActualDMASegment DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetDMA ; BX:AX points to DMA buffer
; DL = DMA Channel
; DI = DMA Size
PushA
Push DS
Push CS
Pop DS
Assume DS:Driver
Mov ActualDMASegment, BX
Mov ActualDMAOffset, AX
Mov CH, BH
ShR CH, 4
ShL BX, 4
Add BX, AX
AdC CH, 0
Mov SI, BX ; CH:BH:BL contains 24 bit DMA address
Neg SI
Cmp SI, DI
JA SetDMA1
Add ActualDMAOffset, SI
Add BX, SI
AdC CH, 0
SetDMA1:
Cmp DL, 3
JBE SetDMA2
ShR DI, 1
Push CX
ShR CH, 1
Pop CX
RCR BX, 1
SetDMA2:
Mov AL, 11
Mul DL
Mov SI, AX
Add SI, Offset DMAData
Xor DX, DX
LodsB ; Set mask
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Clear Ptrs
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Set Mode
Mov DL, AL
LodsB
Out DX, AL
LodsB
Mov DL, AL ; DL = page port
Mov AL, CH
Out DX, AL
LodsB
Mov DL, AL ; DL = address port
Mov AL, BL
Out DX, AL
Mov AL, BH
Out DX, AL
LodsB
Mov DL, AL ; DL = count port
Mov AX, DI
Dec AX
Out DX, AL
Mov AL, AH
Out DX, AL
LodsB ; Reset mask
Mov DL, AL
LodsB
Out DX, AL
Pop DS
PopA
Ret
EndP SetDMA
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

113
SoundDrivers/DMANAI.INC Executable file
View File

@ -0,0 +1,113 @@
DMAData Label Byte
; Port/Mask, Port/Clear, Port/DMAMode, Address, Page, Count, Port/Mask
DB 0Ah, 4, 0Ch, 0, 0Bh, 08h, 87h, 0, 1, 0Ah, 0
DB 0Ah, 5, 0Ch, 0, 0Bh, 09h, 83h, 2, 3, 0Ah, 1
DB 0Ah, 6, 0Ch, 0, 0Bh, 0Ah, 81h, 4, 5, 0Ah, 2
DB 0Ah, 7, 0Ch, 0, 0Bh, 0Bh, 82h, 6, 7, 0Ah, 3
DB 0D4h, 4, 0D8h, 0, 0D6h, 08h, 8Fh, 0C0h, 0C2h, 0D4h, 0
DB 0D4h, 5, 0D8h, 0, 0D6h, 09h, 8Bh, 0C4h, 0C6h, 0D4h, 1
DB 0D4h, 6, 0D8h, 0, 0D6h, 0Ah, 89h, 0C8h, 0CAh, 0D4h, 2
DB 0D4h, 7, 0D8h, 0, 0D6h, 0Bh, 8Ah, 0CCh, 0CEh, 0D4h, 3
ActualDMAPtr Label DWord
ActualDMAOffset DW 0
ActualDMASegment DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetDMA ; BX:AX points to DMA buffer
; DL = DMA Channel
; DI = DMA Size
PushA
Push DS
Push CS
Pop DS
Assume DS:Driver
Mov ActualDMASegment, BX
Mov ActualDMAOffset, AX
Mov CH, BH
ShR CH, 4
ShL BX, 4
Add BX, AX
AdC CH, 0
Mov SI, BX ; CH:BH:BL contains 24 bit DMA address
Neg SI
Cmp SI, DI
JA SetDMA1
Add ActualDMAOffset, SI
Add BX, SI
AdC CH, 0
SetDMA1:
Cmp DL, 3
JBE SetDMA2
ShR DI, 1
Push CX
ShR CH, 1
Pop CX
RCR BX, 1
SetDMA2:
Mov AL, 11
Mul DL
Mov SI, AX
Add SI, Offset DMAData
Xor DX, DX
LodsB ; Set mask
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Clear Ptrs
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Set Mode
Mov DL, AL
LodsB
Out DX, AL
LodsB
Mov DL, AL ; DL = page port
Mov AL, CH
Out DX, AL
LodsB
Mov DL, AL ; DL = address port
Mov AL, BL
Out DX, AL
Mov AL, BH
Out DX, AL
LodsB
Mov DL, AL ; DL = count port
Mov AX, DI
Dec AX
Out DX, AL
Mov AL, AH
Out DX, AL
LodsB ; Reset mask
Mov DL, AL
LodsB
Out DX, AL
Pop DS
PopA
Ret
EndP SetDMA
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

116
SoundDrivers/DMASIRQ.INC Executable file
View File

@ -0,0 +1,116 @@
DMAData Label Byte
; Port/Mask, Port/Clear, Port/DMAMode, Address, Page, Count, Port/Mask
DB 0Ah, 4, 0Ch, 0, 0Bh, 58h, 87h, 0, 1, 0Ah, 0
DB 0Ah, 5, 0Ch, 0, 0Bh, 59h, 83h, 2, 3, 0Ah, 1
DB 0Ah, 6, 0Ch, 0, 0Bh, 5Ah, 81h, 4, 5, 0Ah, 2
DB 0Ah, 7, 0Ch, 0, 0Bh, 5Bh, 82h, 6, 7, 0Ah, 3
DB 0D4h, 4, 0D8h, 0, 0D6h, 58h, 8Fh, 0C0h, 0C2h, 0D4h, 0
DB 0D4h, 5, 0D8h, 0, 0D6h, 59h, 8Bh, 0C4h, 0C6h, 0D4h, 1
DB 0D4h, 6, 0D8h, 0, 0D6h, 5Ah, 89h, 0C8h, 0CAh, 0D4h, 2
DB 0D4h, 7, 0D8h, 0, 0D6h, 5Bh, 8Ah, 0CCh, 0CEh, 0D4h, 3
ActualDMAPtr Label DWord
ActualDMAOffset DW 0
ActualDMASegment DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetDMA ; BX:AX points to DMA buffer
; DL = DMA Channel
; DI = DMA Size
PushA
Push DS
Push CS
Pop DS
Assume DS:Driver
Mov ActualDMASegment, BX
Mov ActualDMAOffset, AX
Mov CH, BH
ShR CH, 4
ShL BX, 4
Add BX, AX
AdC CH, 0
Mov SI, BX ; CH:BH:BL contains 24 bit DMA address
Neg SI
Cmp SI, DI
JA SetDMA1
Add ActualDMAOffset, SI
Add BX, SI
AdC CH, 0
SetDMA1:
Cmp DL, 3
JBE SetDMA2
ShR DI, 1
Push CX
ShR CH, 1
Pop CX
RCR BX, 1
SetDMA2:
Mov AL, 11
Mul DL
Mov SI, AX
Add SI, Offset DMAData
Xor DX, DX
LodsB ; Set mask
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Clear Ptrs
Mov DL, AL
LodsB
Out DX, AL
LodsB ; Set Mode
Mov DL, AL
LodsB
Out DX, AL
LodsB
Mov DL, AL ; DL = page port
Mov AL, CH
Out DX, AL
LodsB
Mov DL, AL ; DL = address port
Mov AL, BL
Out DX, AL
Mov AL, BH
Out DX, AL
LodsB
Mov DL, AL ; DL = count port
Mov AX, DI
Dec AX
Out DX, AL
Mov AL, AH
Out DX, AL
Mov Byte Ptr [CS:DMAPort1], DL
Mov Byte Ptr [CS:DMAPort2], DL
LodsB ; Reset mask
Mov DL, AL
LodsB
Out DX, AL
Pop DS
PopA
Ret
EndP SetDMA
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

8
SoundDrivers/DRHEAD.INC Executable file
View File

@ -0,0 +1,8 @@
ID DB "Impulse Tracker Advanced Sound Driver", 13, 10
DB "Copyright (C) 1995-1998 Jeffrey Lim", 0
DB 26
DB 126 - ($ - Offset ID) Dup (0)
LengthOfDriver DW Offset EndDriver - Offset StartDriver

2300
SoundDrivers/ENVIVO.ASM Executable file

File diff suppressed because it is too large Load Diff

161
SoundDrivers/EQUALIZE.INC Executable file
View File

@ -0,0 +1,161 @@
; Do output filtering
; First copy old contents across
; Assumes destination is MixSegment:0
; data order is lastvalues, coefficients, volumes
Push CS
Pop DS
Assume DS:Driver
Xor DI, DI
Mov SI, Offset LastFilter
Mov EAX, [SI+40h]
Mov EBX, [SI+44h]
Mov ECX, [SI+48h]
Mov EDX, [SI+4Ch]
Or EAX, EBX
Or ECX, EDX
Or EAX, ECX
JZ NoEqualize
Mov CX, 80/4
Mov ES, MixSegment
Rep MovsD
; Now do filtering.
FNInit
Mov CX, BytesToMix
Push ES
Pop DS
Assume DS:Nothing
Mov SI, DMABUFFERLENGTH*2+80
OutputFilter1:
FILD DWord Ptr [SI] ; Left sample
FILD DWord Ptr [SI+4] ; R, L
FLd DWord Ptr [DS:20h] ; LB, R, L
FMul ST, ST(2) ; L.LB, R, L
FLd DWord Ptr [DS:20h] ; LB, L.LB, R, L
FMul ST, ST(2) ; R.LB, L.LB, R, L
FLd DWord Ptr [DS:0] ; OL, R.LB, L.LB, R, L
FMul DWord Ptr [DS:24h] ; OL.LB, R.LB, L.LB, R, L
FLd DWord Ptr [DS:4] ; OR, OL.LB, R.LB, L.LB, R, L
FMul DWord Ptr [DS:24h] ; OR.LB, OL.LB, R.LB, L.LB, R, L
FXCh ; OL.LB, OR.LB, R.LB, L.LB, R, L
FAddP ST(3), ST
FAdd ; RLB, LLB, R, L
FLd DWord Ptr [DS:28h] ; MB, RLB, LLB, R, L
FMul ST, ST(4) ; L.MB, RLB, LLB, R, L
FLd DWord Ptr [DS:28h] ; MB, L.MB, RLB, LLB, R, L
FMul ST, ST(4) ; R.MB, L.MB, RLB, LLB, R, L
FLd DWord Ptr [DS:8] ; OL, R.MB, L.MB, RLB, LLB, R, L
FMul DWord Ptr [DS:2Ch] ; OL.MB, R.MB, L.MB, RLB, LLB, R, L
FLd DWord Ptr [DS:0Ch] ; OR, OL.MB, R.MB, L.MB, RLB, LLB, R, L
FMul DWord Ptr [DS:2Ch] ; OR.MB, OL.MB, R.MB, L.MB, RLB, LLB, R, L
FXCh ; OL.MB, OR.MB, R.MB, L.MB, RLB, LLB, R, L
FAddP ST(3), ST
FAdd ; RMB, LMB, RLB, LLB, R, L
FXCh ST(3) ; LLB, LMB, RLB, RMB, R, L
FStP DWord Ptr [DS:0]
FStP DWord Ptr [DS:8]
FStP DWord Ptr [DS:4]
FStP DWord Ptr [DS:0Ch]
FLd DWord Ptr [DS:30h]
FMul ST, ST(2)
FLd DWord Ptr [DS:30h]
FMul ST, ST(2)
FLd DWord Ptr [DS:10h]
FMul DWord Ptr [DS:34h]
FLd DWord Ptr [DS:14h]
FMul DWord Ptr [DS:34h]
FXCh
FAddP ST(3), ST
FAdd
FLd DWord Ptr [DS:38h]
FMul ST, ST(4)
FLd DWord Ptr [DS:38h]
FMul ST, ST(4)
FLd DWord Ptr [DS:18h]
FMul DWord Ptr [DS:3Ch]
FLd DWord Ptr [DS:1Ch]
FMul DWord Ptr [DS:3Ch]
FXCh
FAddP ST(3), ST
FAdd
FXCh ST(3)
FStP DWord Ptr [DS:10h]
FStP DWord Ptr [DS:18h]
FStP DWord Ptr [DS:14h]
FStP DWord Ptr [DS:1Ch] ; R, L
; For each one, output value += ((band value) - (previous band value)) * Volume
FLd DWord Ptr [DS:18h]
FSub DWord Ptr [DS:10h] ; L4, R, L
FLd DWord Ptr [DS:1Ch]
FSub DWord Ptr [DS:14h] ; R4, L4, R, L
FLd DWord Ptr [DS:10h]
FSub DWord Ptr [DS:8]
FLd DWord Ptr [DS:14h]
FSub DWord Ptr [DS:0Ch] ; R3, L3, R4, L4, R, L
FLd DWord Ptr [DS:8]
FSub DWord Ptr [DS:0]
FLd DWord Ptr [DS:0Ch]
FSub DWord Ptr [DS:4] ; R2, L2, R3, L3, R4, L4, R, L
FXCh ST(5) ; L4, L2, R3, L3, R4, R2, R, L
FMul DWord Ptr [DS:4Ch] ; L4V, L2, R3, L3, R4, R2, R, L
FXCh ST(4) ; R4, L2, R3, L3, L4V, R2, R, L
FMul DWord Ptr [DS:4Ch] ; R4V, L2, R3, L3, L4V, R2, R, L
FXCh ST(3) ; L3, L2, R3, R4V, L4V, R2, R, L
FMul DWord Ptr [DS:48h] ; L3V, L2, R3, R4V, L4V, R2, R, L
FXCh ST(2) ; R3, L2, L3V, R4V, L4V, R2, R, L
FMul DWord Ptr [DS:48h] ; R3V, L2, L3V, R4V, L4V, R2, R, L
FXCh ; L2, R3V, L3V, R4V, L4V, R2, R, L
FMul DWord Ptr [DS:44h] ; L2V, R3V, L3V, R4V, L4V, R2, R, L
FXCh ST(5) ; R2, R3V, L3V, R4V, L4V, L2V, R, L
FMul DWord Ptr [DS:44h] ; R2V, R3V, L3V, R4V, L4V, L2V, R, L
FXCh ST(4) ; L4V, R3V, L3V, R4V, R2V, L2V, R, L
FAddP ST(7), ST ; R3V, L3V, R4V, R2V, L2V, R, L
FAddP ST(5), ST ; L3V, R4V, R2V, L2V, R, L
FAddP ST(3), ST
FAdd
FLd DWord Ptr [DS:0]
FMul DWord Ptr [DS:40h] ; L1V, RV, LV, R, L
FLd DWord Ptr [DS:4] ;
FMul DWord Ptr [DS:40h] ; R1V, L1V, RV, LV, R, L
FXCh ST(2) ; RV, L1V, R1V, LV, R, L
FAddP ST(4), ST ; L1V, R1V, LV, R, L
FAddP ST(4), ST ; R1V, LV, R, L
FAddP ST(2), ST
FAddP ST(2), ST
FIStP DWord Ptr [SI+4]
FIStP DWord Ptr [SI]
Add SI, 8
Dec CX
JNZ OutputFilter1
; Transfer contents out
Push CS
Pop ES
Mov DI, Offset LastFilter
Xor SI, SI
Mov CX, 32/4
Rep MovsD
; Finished output filtering!
NoEqualize:

2265
SoundDrivers/ES1688.ASM Executable file

File diff suppressed because it is too large Load Diff

1751
SoundDrivers/ES1688MX.ASM Executable file

File diff suppressed because it is too large Load Diff

2328
SoundDrivers/ES1868.ASM Executable file

File diff suppressed because it is too large Load Diff

1734
SoundDrivers/ES1868MX.ASM Executable file

File diff suppressed because it is too large Load Diff

2328
SoundDrivers/ES1869.ASM Executable file

File diff suppressed because it is too large Load Diff

1734
SoundDrivers/ES1869MX.ASM Executable file

File diff suppressed because it is too large Load Diff

933
SoundDrivers/EWS64.ASM Executable file
View File

@ -0,0 +1,933 @@
.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
;***********************************************
TRACEENABLED = 0
CREATENEWLOGFILE = 1
include debug.inc
PNPVENDORID EQU 36A8630Eh
MMT_MAXENTRIES EQU 64
MMT_MAXSIZE EQU 3*MMT_MAXENTRIES
ST97Message DB "EWS 64 Synthesizer Detected", 13
; DB "Port ", 0FDh, "Xh, IRQ ", 0FDh, "D, ", 0FDh, "Dk RAM", 0
DB "Port ", 0FDh, "Xh, ", 0FDh, "D Voices, ", 0FDh, "Dk", 0
StatusLine DB "FreeEWS ", 0FDh, "Dk", 0
MMTData DW MMT_MAXSIZE Dup (0)
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
; ÄÄ EmptyFunction ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc EmptyFunction Far
Xor AX, AX
StC
Ret
EndP EmptyFunction
; ÄÄ ST97InString ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97InString ; ES:DI points to deposit point.
; EAX = memory address
; CX = count
ClI
Mov BL, 2 ; Ctrl=RD_MEM, Data=Memory Address
Call ST97OutDWord
Mov DX, CS:BasePort ; Length
Mov AX, CX
Call ST97SendByte
Mov AL, AH
Call ST97SendByte
ST97InString1:
Call ST97InByte
Cmp AL, 0ABh
JE ST97InStringError
Cmp AL, 0ACh
JNE ST97InString1
ST97InString2:
Inc DX
Inc DX
Rep InsW
ClC
StI
Ret
ST97InStringError:
StC
StI
Ret
EndP ST97InString
; ÄÄ ST97ReceiveByte ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97ReceiveByte ; Returns AL
Push DX
Mov DX, CS:BasePort
Inc DX
ST97ReceiveByte1:
In AL, DX
Test AL, AL
JS ST97ReceiveByte1
Dec DX
In AL, DX
Pop DX
Ret
EndP ST97ReceiveByte
; ÄÄ ST97InByte ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97InByte ; Returns AL
Jmp ST97ReceiveByte
EndP ST97InByte
; ÄÄ ST97InWord ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97InWord ; Returns AX
ClI
Call ST97ReceiveByte
Mov AL, AH
Call ST97ReceiveByte
XChg AL, AH
StI
Ret
EndP ST97InWord
; ÄÄ ST97InDWord ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97InDWord ; Returns EAX
ClI
Call ST97ReceiveByte
RoR EAX, 8
Call ST97ReceiveByte
RoR EAX, 8
Call ST97ReceiveByte
RoR EAX, 8
Call ST97ReceiveByte
RoR EAX, 8
StI
Ret
EndP ST97InDWord
; ÄÄ ST97SendByte ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97SendByte ; DX = port, AL = data
Push AX
Push DX
Mov DX, CS:BasePort
Inc DX
ST97SendByte1:
In AL, DX
Test AL, 40h
JNZ ST97SendByte1
Pop DX
Pop AX
Out DX, AL
Ret
EndP ST97SendByte
; ÄÄ ST97OutByte ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97OutByte ; AL = data, AH = command, destroys AX
ClI
Push DX
Mov DX, CS:BasePort
Inc DX
XChg AH, AL
Call ST97SendByte
Dec DX
Mov AL, AH
Call ST97SendByte
Pop DX
StI
Ret
EndP ST97OutByte
; ÄÄ ST97OutWord ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97OutWord ; AX = data, BL = command, destroys AX
ClI
Push DX
Push AX
Mov DX, CS:BasePort
Mov AL, BL
Inc DX
Call ST97SendByte
Pop AX
Dec DX
Call ST97SendByte
Mov AL, AH
Call ST97SendByte
Pop DX
StI
Ret
EndP ST97OutWord
; ÄÄ ST97OutDWord ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ST97OutDWord ; EAX = data, BL = command
ClI
Push DX
Push AX
Mov DX, CS:BasePort
Mov AL, BL
Inc DX
Call ST97SendByte
Pop AX
Dec DX
Call ST97SendByte
ShR EAX, 8
Call ST97SendByte
ShR EAX, 8
Call ST97SendByte
ShR EAX, 8
Call ST97SendByte
Pop DX
StI
Ret
EndP ST97OutDWord
; ÄÄ DetectCard ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Returns carry set if error, else carry clear. Has to setup internal vars
; (eg. appropriate IRQ/DMA whatever).
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
PnP_SerialID DD 0
PnP_VendorID DD 0
PnP_ReadPort DW 0
PnP_CSN DB 0
PnP_CardFound DB 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ResetUART ; Given DX = Port
ClI
Inc DX
Mov AL, 0FFh ; Reset!
Out DX, AL
Out DX, AL ; Two resets required to ensure it'll work
Xor CX, CX
ResetUART2:
In AL, DX
Test AL, 80h
JNZ ResetUART3
Dec DX
In AL, DX
Inc DX
Cmp AL, 0FEh
JE ResetUART4
ResetUART3:
Loop ResetUART2
ResetUARTError:
StI
StC
Ret
ResetUART4: ; Now to shove it into 'intelligent' mode.
Xor CX, CX
ResetUART5:
In AL, DX
Test AL, 40h
LoopNZ ResetUART5
JNZ ResetUARTError
Mov AL, 3Fh ; Intelligent mode!
Out DX, AL
ResetUART6:
Xor CX, CX
ResetUART7:
In AL, DX
Test AL, 80h
JNZ ResetUART8
Dec DX
In AL, DX
Inc DX
Cmp AL, 0FEh
JE ResetUART9
ResetUART8:
Loop ResetUART7
Jmp ResetUARTError
ResetUART9:
StI
ClC
Ret
EndP ResetUART
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PnP_Delay
Assume DS:Driver
Push AX CX
Mov CX, 180h
PnP_Delay1:
In AL, 21h
Loop PnP_Delay1
Pop CX AX
Ret
EndP PnP_Delay
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PnP_WriteData
Mov DX, 279h
Out DX, AL
Mov AL, AH
Mov DH, 0Ah
Out DX, AL
Ret
EndP PnP_WriteData
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PnP_ReadData
Mov DX, 279h
Out DX, AL
Mov DX, PnP_ReadPort
In AL, DX
Ret
EndP PnP_ReadData
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PnP_Isolate
Mov AX, 402h
Call Pnp_WriteData ; Reset CSNs
PnP_IsolateNextCard:
Mov AX, 0003h
Call PnP_WriteData ; Wake[0]
Mov AX, PnP_ReadPort
ShL AX, 6
Xor AL, AL
Call PnP_WriteData ; Set Read Data port.
Call PnP_Delay
Call PnP_Delay
Call PnP_Delay
Call PnP_Delay
Mov AL, 1 ; Serial Isolation
Mov DX, 279h
Out DX, AL
Call PnP_Delay
Call PnP_Delay
Call PnP_Delay
Call PnP_Delay
Mov BL, 6Ah
Mov CX, 64
Mov DX, PnP_ReadPort
ClI
PnP_Isolate1:
ShR PnP_SerialID, 1
RCR PnP_VendorID, 1
Mov BH, BL
ShR BH, 1
Xor BH, BL
ShR BX, 1
In AL, DX
Mov AH, AL
Call PnP_Delay
In AL, DX
Call PnP_Delay
Cmp AX, 55AAh
JNE PnP_Isolate2
Xor BL, 80h
Or PnP_SerialID, 80000000h
PnP_Isolate2:
Dec CX
JNZ PnP_Isolate1
Mov CX, 8
Xor BH, BH
PnP_Isolate3:
ShR BH, 1
In AL, DX
Mov AH, AL
Call PnP_Delay
In AL, DX
Call PnP_Delay
Cmp AX, 55AAh
JNE PnP_Isolate4
Or BH, 80h
PnP_Isolate4:
Dec CX
JNZ PnP_Isolate3
StI
Cmp BL, BH ; Matching Checksum?
JNE PnP_IsolateFinished
; assign CSN
Inc PnP_CSN
Mov AL, 6
MOv AH, PnP_CSN
Call PnP_WriteData
Cmp PnP_VendorID, PNPVENDORID
JNE PnP_IsolateNextCard
Mov AL, 3
Call PnP_WriteData
Mov AX, 407h ; LDN 4
Call PnP_WriteData
Mov AL, 60h
Call PnP_ReadData
Mov AH, AL
Mov AL, 61h
Call PnP_ReadData ; AX = address.
Cmp BasePort, 0FFFFh
JE PnPBasePortOK
Cmp BasePort, AX
JNE PnP_IsolateNextCard
PnPBasePortOK:
Mov BasePort, AX
Mov AL, 70h
Call PnP_ReadData ; AL[3:0] = IRQ
And AX, 15
JZ PnP_IsolateNextCard
Mov IRQ, AX
Mov Pnp_CardFound, 1
Jmp PnP_IsolateNextCard
PnP_IsolateFinished:
Mov AL, PnP_CSN
ShL AL, 1
Or AL, PnP_CardFound
Ret
EndP PnP_Isolate
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc DetectCard Far ; returns carry clear if succesful
Trace "Detecting EWS64XL"
Push CS
Pop DS
Xor AL, AL
Mov DX, 279h
Out DX, AL
Out DX, AL
Mov AL, 6Ah ; Starting value
Mov CX, 32
PnP_InitiationKeyLoop:
Out DX, AL
Mov AH, AL
ShR AH, 1
Xor AH, AL
ShR AX, 1
Dec CX
JNZ PnP_InitiationKeyLoop
; Try three ports before concluding no PnP cards: 20Fh, 27Bh, 213h
PnP_DetectCardPort1:
Mov PnP_ReadPort, 20Fh
Call PnP_Isolate
JZ PnP_DetectCardPort2
Test AL, 1
JZ PnP_DetectCardNotFound
Jmp PnP_DetectCardFound
PnP_DetectCardPort2:
Mov PnP_ReadPort, 27Bh
Call PnP_Isolate
JZ PnP_DetectCardPort3
Test AL, 1
JZ PnP_DetectCardNotFound
Jmp PnP_DetectCardFound
PnP_DetectCardPort3:
Mov PnP_ReadPort, 213h
Call PnP_Isolate
Test AL, 1
JNZ PnP_DetectCardFound
PnP_DetectCardNotFound:
Trace "EWS64XL Not found"
StC
Jmp PnP_DetectEnd
PnP_DetectCardFound:
; Check whether the MPU can be reset
Mov DX, BasePort
Call ResetUART
JC PnP_DetectCardNotFound
; Find memory mapping table
Mov AX, 300h ; Ctrl 3 (GET_MMT), Data 0
Call ST97OutByte
Call ST97InDWord
Push CS
Pop ES
Mov CX, MMT_MAXSIZE
Mov DI, Offset MMTData
Call ST97InString
Trace "EWS64XL Found"
PnP_DetectEnd: ; Return PnP to wait for key state
Mov AX, 202h
Call PnP_WriteData
Mov EAX, 'Jeff'
Ret
EndP DetectCard
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
Trace "EWS64XL InitSound"
Mov SI, Offset ST97Message
Comment ~
Mov AX, BasePort
Mov BX, IRQ
Mov ECX, DWord Ptr [MMTData+2]
ShR ECX, 9
~
Xor BX, BX
Mov AX, 5100h ; Cntrl = GET_VOI, Data = 0
Call ST97OutByte
Call ST97InByte
Mov BL, AL
Mov AX, BasePort
Mov ECX, DWord Ptr [MMTData+2]
ShR ECX, 9
Trace "EWS64XL InitSoundEnd"
ClC
Ret
EndP InitSound
Assume DS:Nothing
;ÄÄ ReInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Reinitialises sound output
; Initiates sound output
;
; Parameters: AX = number of channels.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ReInitSound Far
Ret
EndP ReInitSound
;ÄÄ UnInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Stops sound output, releases any memory used by driver
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc UnInitSound Far
Mov DX, CS:BasePort
Inc DX
Mov AL, 0FFh
Out DX, AL
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
Ret
EndP SetTempo
;ÄÄ SetMixVolume ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AX = MixVolume
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetMixVolume Far
Ret
EndP SetMixVolume
;ÄÄ SetStereo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AL = Stereo on/off, 0 = off.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetStereo Far
Ret
EndP SetStereo
;ÄÄ LoadSample ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AX = sample to load (0 based)
; 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 (1 based)
; 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
Push CS
Pop DS
Assume DS:Driver
Mov SI, Offset MMTData+6
Xor EAX, EAX
GetStatus1:
Mov CX, [SI]
Add SI, 6
Cmp CX, -1
JE GetStatus2
Cmp CX, 1
JA GetStatus1
JB GetStatus1
Add EAX, [SI+2]
Sub EAX, [SI-4]
Jmp GetStatus1
GetStatus2:
Mov SI, Offset StatusLine
ShR EAX, 9
ClC
Ret
EndP GetStatus
Assume DS:Nothing
;ÄÄ 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 64 ; 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

3016
SoundDrivers/EWSCODEC.ASM Executable file

File diff suppressed because it is too large Load Diff

2531
SoundDrivers/EWSCODMX.ASM Executable file

File diff suppressed because it is too large Load Diff

BIN
SoundDrivers/EXECOM.COM Executable file

Binary file not shown.

83
SoundDrivers/FOURIER.INC Executable file
View File

@ -0,0 +1,83 @@
FourierBufferStart DW 0
FourierBufferInputStart DW 0
FourierBufferInputFractional DW 0
FourierBufferStepOffset DW 1
FourierBufferStepFractional DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc UpdateFourierBuffer
PushAD
Push DS
Push ES
Push CS
Pop DS
Assume DS:Driver
Xor EBX, EBX
Xor ESI, ESI
Mov BX, MixTransferOffset
Mov DI, FourierBufferStart
ShR BX, 3
Mov CX, BytesToMix
Mov SI, FourierBufferInputStart
Add SI, BX
Add CX, BX
Mov BP, FourierBufferInputFractional
Mov DX, FourierBufferStepOffset
Mov BX, FourierBufferStepFractional
Mov ES, FourierSegment
Mov DS, MixSegment
Assume DS:Nothing
UpdateFourierBuffer1:
Mov EAX, [ESI*8]
Add EAX, [ESI*8+4]
SAR EAX, 13
Cmp EAX, 7FFFh
JG UpdateFourierBuffer3
Cmp EAX, -8000h
JL UpdateFourierBuffer4
UpdateFourierBuffer2:
StosW
Add BP, BX
AdC SI, DX
And DI, (FOURIERBUFFERLENGTH*2)-1
; Cmp past end of buffer?
Cmp SI, CX
JB UpdateFourierBuffer1
Sub SI, CX
Mov FourierBufferStart, DI
Mov FourierBufferInputFractional, BP
Mov FourierBufferInputStart, SI
Pop ES
Pop DS
PopAD
Ret
UpdateFourierBuffer3:
Mov AX, 7FFFh
Jmp UpdateFourierBuffer2
UpdateFourierBuffer4:
Mov AX, 8000h
Jmp UpdateFourierBuffer2
EndP UpdateFourierBuffer
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

34
SoundDrivers/FREQ.INC Executable file
View File

@ -0,0 +1,34 @@
FilterFrequencyTable Label DWord
DD 3A9F7867h, 3A9AEE36h, 3A96851Bh, 3A923C25h
DD 3A8E1269h, 3A8A0703h, 3A861918h, 3A8247CFh
DD 3A7D24B3h, 3A75EFD6h, 3A6EEF7Dh, 3A68222Ch
DD 3A61866Dh, 3A5B1AD6h, 3A54DE0Bh, 3A4ECEB3h
DD 3A48EB87h, 3A433341h, 3A3DA4ACh, 3A383E96h
DD 3A32FFD8h, 3A2DE754h, 3A28F3F3h, 3A2424A6h
DD 3A1F7867h, 3A1AEE36h, 3A16851Bh, 3A123C25h
DD 3A0E1269h, 3A0A0703h, 3A061918h, 3A0247CFh
DD 39FD24B3h, 39F5EFD6h, 39EEEF7Dh, 39E8222Ch
DD 39E1866Dh, 39DB1AD6h, 39D4DE0Bh, 39CECEB3h
DD 39C8EB87h, 39C33341h, 39BDA4ACh, 39B83E96h
DD 39B2FFD8h, 39ADE754h, 39A8F3F3h, 39A424A6h
DD 399F7867h, 399AEE36h, 3996851Bh, 39923C25h
DD 398E1269h, 398A0703h, 39861918h, 398247CFh
DD 397D24B3h, 3975EFD6h, 396EEF7Dh, 3968222Ch
DD 3961866Dh, 395B1AD6h, 3954DE0Bh, 394ECEB3h
DD 3948EB87h, 39433341h, 393DA4ACh, 39383E96h
DD 3932FFD8h, 392DE754h, 3928F3F3h, 392424A6h
DD 391F7867h, 391AEE36h, 3916851Bh, 39123C25h
DD 390E1269h, 390A0703h, 39061918h, 390247CFh
DD 38FD24B3h, 38F5EFD6h, 38EEEF7Dh, 38E8222Ch
DD 38E1866Dh, 38DB1AD6h, 38D4DE0Bh, 38CECEB3h
DD 38C8EB87h, 38C33341h, 38BDA4ACh, 38B83E96h
DD 38B2FFD8h, 38ADE754h, 38A8F3F3h, 38A424A6h
DD 389F7867h, 389AEE36h, 3896851Bh, 38923C25h
DD 388E1269h, 388A0703h, 38861918h, 388247CFh
DD 387D24B3h, 3875EFD6h, 386EEF7Dh, 3868222Ch
DD 3861866Dh, 385B1AD6h, 3854DE0Bh, 384ECEB3h
DD 3848EB87h, 38433341h, 383DA4ACh, 38383E96h
DD 3832FFD8h, 382DE754h, 3828F3F3h, 382424A6h
DD 381F7867h, 381AEE36h, 3816851Bh, 38123C25h
DD 380E1269h, 380A0703h, 38061918h, 380247CFh

2328
SoundDrivers/GOLD16.ASM Executable file

File diff suppressed because it is too large Load Diff

2316
SoundDrivers/GUS.INC Executable file

File diff suppressed because it is too large Load Diff

5
SoundDrivers/GUSDRV.ASM Executable file
View File

@ -0,0 +1,5 @@
RAMP EQU 1
include gus.inc

3
SoundDrivers/GUSDRV2.ASM Executable file
View File

@ -0,0 +1,3 @@
include gus.inc

5
SoundDrivers/GUSHIQ2.ASM Executable file
View File

@ -0,0 +1,5 @@
RIC EQU 1
include gus.inc

4
SoundDrivers/GUSHIQDR.ASM Executable file
View File

@ -0,0 +1,4 @@
RAMP EQU 1
RIC EQU 1
include gus.inc

2091
SoundDrivers/GUSMAX.ASM Executable file

File diff suppressed because it is too large Load Diff

1589
SoundDrivers/GUSMAXMX.ASM Executable file

File diff suppressed because it is too large Load Diff

2462
SoundDrivers/GUSMIXDR.ASM Executable file

File diff suppressed because it is too large Load Diff

27
SoundDrivers/GUSNRAMP.INC Executable file
View File

@ -0,0 +1,27 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetGUSVolume ; BX = new volume
; To do:
; 1) Set ramp start
; 2) Set ramp end
; 3) Set current volume
; 4) Start ramp
; 5) Save new volume.
Mov AL, 9
Out DX, AL
Add BX, BX
Mov AX, [CS:GUSVolumeTable+BX]
Inc DX
Out DX, AX
Call GUSDelay
Out DX, AX
Dec DX
Ret
EndP SetGUSVolume

415
SoundDrivers/GUSNRIC.INC Executable file
View File

@ -0,0 +1,415 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetGUSRegisters ; Given DS:SI, CX
Mov ES, CS:SongDataArea
Push CX
Push SI
Xor AX, AX
GetOffsetLoop:
Push AX
Push CX
Mov DX, GUSVoiceSelect
Out DX, AL ; OK.. now to play with this
; voice.
Call GUSDelay
Inc DL ; DX = select rego
Mov BX, [SI]
Test BH, 2
JZ GetOffsetLoop2
Mov BX, 200h
Mov [SI], BX
GetOffsetLoop2:
Test BL, 1 ; Channel not on!
JZ GetOffsetLoop1
Test BH, 1
JZ GetOffsetLoop3 ; Prev 1.
Xor BX, BX
Call SetGUSVolume
Mov AL, 80h
Out DX, AL
Add DL, 2
In AL, DX
Sub DL, 2
Mov AH, AL
And AX, 400h
Out DX, AL ; AL = 0 (Mode control)
Mov AL, 3
Or AL, AH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Jmp GetOffsetLoop1
GetOffsetLoop3:
Mov EAX, [SI+4Ch]
Mov [SI+2Ch], EAX
Mov AL, 8Ah
Out DX, AL
Inc DX
In AX, DX
Dec DX
And AH, 31
ShL EAX, 16 ; Load high part of EAX
Mov AL, 8Bh
Out DX, AL
Inc DX
In AX, DX
; EAX = 000OOOOO OOOOOOOO OOOOOOOF FFFFFFFF
; Need: 00000000 0000OOOO OOOOOOOO OOOOOOOO
ShR EAX, 9
; EAX contains current loc.
; Convert to Offset (in sample)
MovZX EBX, Byte Ptr [SI+36h]
Sub EAX, [CS:GUSDataTable+EBX*4]
Push CX
Mov CL, CS:Compress
ShL EAX, CL
Pop CX
Mov [SI+4Ch], EAX
GetOffsetLoop1:
Add SI, SLAVECHANNELSIZE
Pop CX
Pop AX
Inc AX
Loop GetOffsetLoop
Pop SI
Pop CX
Xor AX, AX
SetGUSRegisters1:
Push AX
Push CX
Mov DX, GUSVoiceSelect
Out DX, AL ; OK.. now to play with this
; voice.
Call GUSDelay
Mov CX, [SI] ; CX = flags.
Inc DL ; DX = select rego
SetGUSRegisters21:
Test CL, 32 ; Frequency change
JZ SetGUSRegisters7
Push DX
Mov EAX, [SI+10h] ; EAX = freq.
Push CX
Mov CL, CS:Compress
ShR EAX, CL
Pop CX
Xor EDX, EDX
MovZX EBX, MixSpeed
Div EBX ; EAX = I portion.
Test EAX, Not 63
JNZ SetGUSRegisters6
Push EAX
Xor EAX, EAX
Div EBX
Pop EBX ; EBX:EAX = IIII FFFF etc.
SHRD EAX, EBX, 6
; Have: IIIIIIII IIIIIIII FFFFFFFF FFFFFFFF
; Req: IIIIIIFF FFFFFFF0
Pop DX
Mov AL, 1
Out DX, AL
ShR EAX, 16
Add AX, 1
SBB AX, 0 ; Just in case!
And AX, Not 1
Inc DX
Out DX, AX
Dec DX
Jmp SetGUSRegisters7
SetGUSRegisters6:
Mov CH, 2 ; Signify to turn off channel
Pop DX
SetGUSRegisters7:
MovZX BX, Byte Ptr [SI+36h] ; BX = sample number.
Cmp BL, 99
JA SetGUSRegisters20
ShL BX, 2 ; GUSDataTable+BX = position
Cmp DWord Ptr [CS:GUSDataTable+BX], 0FFFFFFFFh
JNE SetGUSRegisters10
SetGUSRegisters20:
Mov CH, 2
Jmp SetGUSRegisters9
SetGUSRegisters10:
Test CH, 5 ; Loop changed?!??!?
JZ SetGUSRegisters8
Mov AL, 3 ; Starting location low.
Out DX, AL
Mov EAX, [SI+40h]
Call GUSGetAddress
; Reqd: ...OOOOO OOOOOOOO OOOOOOOI III.....
Inc DX
Out DX, AX
Dec DX
Mov AL, 2 ; Starting location high
Out DX, AL
ShR EAX, 16
Inc DX
Out DX, AX
Dec DX
; Ending location...
Mov AL, 5 ; Ending location low
Out DX, AL
Mov EAX, [SI+44h]
Call GUSGetAddress
Inc DX
Out DX, AX
Dec DX
Mov AL, 4 ; Ending location high
Out DX, AL
SHR EAX, 16
Inc DX
Out DX, AX
Dec DX
SetGUSRegisters8:
Test CH, 1 ; Do Current position?
JZ SetGUSRegisters9
Mov AL, 0Bh ; Current location LOW
Out DX, AL
Mov EAX, [SI+4Ch]
Mov [SI+2Ch], EAX
; EAX = OOOOOOOO OOOOOOOO OOOOOOOO OOOOOOOO
; Req: xxxOOOOO OOOOOOOO OOOOOOOF FFFFFFFF
Call GUSGetAddress
Mov DI, AX
Inc DX
Out DX, AX
Dec DX
Mov AL, 0Ah ; Current location HIGH
Out DX, AL
SHR EAX, 16
Inc DX
Out DX, AX
Call GUSDelay
Out DX, AX
Dec DX
Mov AL, 0Bh
Out DX, AL
Mov AX, DI
Inc DX
Out DX, AX
Dec DX
SetGUSRegisters9:
Test CL, 64 ; New volume??
JZ SetGUSPanning
SetGUSRegisters23:
Xor BX, BX
Test CH, 8
JNZ SetGUSRegistersMuted
Mov BL, Byte Ptr [SI+20h] ; BL = volume, 0->128
SetGUSRegistersMuted:
Call SetGUSVolume
SetGUSPanning:
Test CH, 128 ; New panning?
JZ SetGUSRegisters5
Mov AL, 0Ch ; Set panning.
Out DX, AL
Test CS:Stereo, 1
JZ SetGUSRegisters3
Mov AL, [SI+37h]
Cmp AL, 100
JNE SetGUSRegisters4
SetGUSRegisters3:
Mov AL, 32 ; Surround goes to mono :(
SetGUSRegisters4: ; AL = 0->64
ShR AL, 1 ; AL = 0->32
Sub AL, 1
AdC AL, 0 ; AL = 0->31
ShR AL, 1
Add DL, 2
Out DX, AL
Sub DL, 2
SetGUSRegisters5:
; Now for control register.
; If CH | 2, then turn rego OFF
; If CH | 5, then turn rego ON
; If CL | 1, then check channel
Test CH, 2
JNZ SetGUSRegisters11
Test CH, 5
JNZ SetGUSRegisters12
Test CL, 1
JZ SetGUSRegisters13
Mov AL, 80h ; Read voice control
Out DX, AL
Add DL, 2
In AL, DX
Sub DL, 2
Test AL, 1
JZ SetGUSRegisters13
Xor BX, BX
Call SetGUSVolume
Jmp SetGUSRegisters14
SetGUSRegisters11:
; Turn off.
Xor AL, AL
Out DX, AL ; AL = 0 (Mode control)
Mov AL, 2
Add DL, 2
Mov AH, [SI+18h] ; 16 bit?
Add AH, AH
Or AL, AH
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Xor BX, BX
Call SetGUSVolume
SetGUSRegisters14:
Test CL, 1
JZ SetGUSRegisters13
Xor CX, CX ; Turn off channel
Test Byte Ptr [SI+3Ah], 80h
JNZ SetGUSRegisters13
Mov BX, [SI+38h]
And Byte Ptr [BX], Not 4 ; Signify channel off
Jmp SetGUSRegisters13
SetGUSRegisters12: ; Turn on
Xor AL, AL
Out DX, AL
Mov AL, [SI+0Ah]
Cmp CS:Convert16To8Bit, 0
JNZ SetGUSRegistersNo16Bit
Mov AH, [SI+18h] ; 16 bit?
Add AH, AH
Or AL, AH
SetGUSRegistersNo16Bit:
Test CL, 1
JNZ SetGUSRegisters15
Mov AL, 2
Xor CX, CX
SetGUSRegisters15:
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
SetGUSRegisters13:
And CX, 0111100010011111b ; Turns off:
; 1) Freq, pan & vol recalc
; 2) New note/note stop/loop cha
Mov [SI], CX
Add SI, SLAVECHANNELSIZE
; Call CheckMIDI
Pop CX
Pop AX
Inc AX
Dec CX
JNZ SetGUSRegisters1
Ret
EndP SetGUSRegisters

2270
SoundDrivers/GUSPNPM.ASM Executable file

File diff suppressed because it is too large Load Diff

1769
SoundDrivers/GUSPNPMX.ASM Executable file

File diff suppressed because it is too large Load Diff

114
SoundDrivers/GUSRAMP.INC Executable file
View File

@ -0,0 +1,114 @@
Proc SetGUSVolume ; BX = new volume
; To do:
; 1) Set ramp start
; 2) Set ramp end
; 3) Set current volume
; 4) Start ramp
; 5) Save new volume.
Push BX
Push CX
Mov AL, 0Dh
Out DX, AL
Mov AL, 3 ; Stop Ramp!
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Add BX, BX
Mov CX, [CS:GUSVolumeTable+BX] ; CX = new volume
Mov BX, [SI+2]
Add BX, BX
Mov BX, [CS:GUSVolumeTable+BX] ; BX = old volume
Cmp BX, CX
JNE SetGUSVolume2
Mov AL, 89h
Out DX, AL
Inc DX
In AX, DX
Dec DX
Mov BX, AX ; BX = old volume
SetGUSVolume2:
Push BX ; Old volume on stack
Xor AH, AH ; Ramp up
Cmp CX, BX
JAE SetGUSVolume1
XChg BX, CX
Mov AH, 40h ; Ramp down
SetGUSVolume1:
Mov AL, 6 ; Ramp rate
Out DX, AL
Mov AL, Byte Ptr CS:UsedChannels
ShR AL, 1
Add AL, 16
Add DL, 2
Out DX, AL
Sub DL, 2
Mov AL, 7 ; Ramp start
Out DX, AL
Mov AL, BH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Mov AL, 8 ; Ramp end
Out DX, AL
Mov AL, CH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Mov AL, 9
Out DX, AL
Pop BX ; BX = old volume
XChg BX, AX
Inc DX
Out DX, AX
Call GUSDelay
Out DX, AX
Dec DX
Mov AL, 0Dh ; Ramp control
Out DX, AL
Mov AL, BH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Pop CX
Pop BX
Mov [SI+2], BX
Ret
EndP SetGUSVolume

651
SoundDrivers/GUSRIC.INC Executable file
View File

@ -0,0 +1,651 @@
Proc SetGUSRegisters ; Given DS:SI, CX
Mov ES, CS:SongDataArea
Push CX
Push SI
Xor AX, AX
GetOffsetLoop:
Push AX
Push CX
Mov DX, GUSVoiceSelect
Out DX, AL ; OK.. now to play with this
; voice.
Call GUSDelay
Inc DL ; DX = select rego
Mov BX, [SI]
Test BH, 2
JZ GetOffsetLoop2
Mov BX, 200h
Mov [SI], BX
GetOffsetLoop2:
Test BL, 1 ; Channel not on!
JZ GetOffsetLoop1
Test BH, 1
JZ GetOffsetLoop3 ; Prev 1.
Xor BX, BX
Call SetGUSVolume
Mov AL, 80h
Out DX, AL
Add DL, 2
In AL, DX
Sub DL, 2
Mov AH, AL
And AX, 400h
Out DX, AL ; AL = 0 (Mode control)
Mov AL, 3
Or AL, AH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Jmp GetOffsetLoop1
GetOffsetLoop3:
Mov EAX, [SI+4Ch]
Mov [SI+2Ch], EAX
Mov AL, 8Ah
Out DX, AL
Inc DX
In AX, DX
Dec DX
And AH, 31
ShL EAX, 16 ; Load high part of EAX
Mov AL, 8Bh
Out DX, AL
Inc DX
In AX, DX
; EAX = 000OOOOO OOOOOOOO OOOOOOOF FFFFFFFF
; Need: 00000000 0000OOOO OOOOOOOO OOOOOOOO
ShR EAX, 9
; EAX contains current loc.
; Convert to Offset (in sample)
MovZX EBX, Byte Ptr [SI+36h]
Sub EAX, [CS:GUSDataTable+EBX*4]
Push CX
Mov CL, CS:Compress
ShL EAX, CL
Pop CX
Mov [SI+4Ch], EAX
Cmp EAX, [SI+44h]
JBE GetOffsetLoop1
Cmp Byte Ptr [SI+0Ah], 0
JNE GetOffsetLoop1
Or Word Ptr [SI], 200h
GetOffsetLoop1:
Add SI, SLAVECHANNELSIZE
Pop CX
Pop AX
Inc AX
Dec CX
JNZ GetOffsetLoop
Pop SI
Pop CX
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Push CX
Push SI
Push SI
Mov BX, 1
Mov DX, 1
ReinitChannels1:
Test Byte Ptr [SI], 1
JZ ReinitChannels2
Mov BX, DX
ReinitChannels2:
Inc DX
Add SI, 128
Loop ReinitChannels1
Pop SI
Mov CX, BX
Cmp BX, 14
JAE RIC3
Mov BX, 14
RIC3:
Cmp BX, 32
JB RIC4
Mov BX, 32
RIC4:
Cmp BX, CS:UsedChannels
JE EndOfFreqChange
JA RIC5
Mov BX, CS:UsedChannels
Dec BX
RIC5:
; Now.. get new mixspeed.
; Prepare all new frequencies
; then write all active voices
; + all new frequencies.
; BX = num channels...
Push BX
Push BX
Push BX
Add BX, BX ; BX = pointer into mixtable.
MovZX EBX, [CS:GUSMixTable+BX-28]
Mov CS:MixSpeed, BX
Push CX
Push SI
PrepareNewFreq2:
Test Byte Ptr [SI], 1
JZ PrepareNewFreq3
Test Word Ptr [SI], 100h
JNZ PrepareNewFreq3
Mov EAX, [SI+10h] ; EAX = freq.
Push CX
Mov CL, CS:Compress
ShR EAX, CL
Pop CX
Xor EDX, EDX
Div EBX ; EAX = I portion.
Push EAX
Xor EAX, EAX
Div EBX
Pop EDX ; EDX:EAX = IIII FFFF etc.
SHRD EAX, EDX, 22
Add AX, 1
SBB AX, 0 ; Just in case!
And AX, Not 1
Mov [SI+4], AX
PrepareNewFreq3:
Add SI, 128
Loop PrepareNewFreq2
Pop SI
Pop CX
Pop BX
Mov DI, CS:UsedChannels
Cmp DI, BX
JB KillExtraChannels1
Mov DI, BX
Mov BX, 32
; XChg DI, BX
KillExtraChannels1:
Cmp DI, BX
JAE KillExtraChannels2
Mov DX, GUSVoiceSelect
Mov AX, DI
Out DX, AL
Inc DX ; Select rego
Mov AL, 0Dh ; Volume Ramp.
Out DX, AL
Mov AL, 3
Add DL, 2
Out DX, AL
Sub DL, 2
Xor AL, AL
Out DX, AL ; AL = 0 (Mode control)
Mov AL, 3
Add DL, 2
Out DX, AL
Sub DL, 2
Mov AL, 9
Out DX, AL
Xor AX, AX
Inc DX
Out DX, AX
Dec DX
Mov AL, 0Ch ; Set panning.
Out DX, AL
Mov AL, 8
Add DL, 2
Out DX, AL
Sub DL, 2
Comment ~
Call GUSDelay
Mov AL, 0Dh ; Volume Ramp.
Out DX, AL
Mov AL, 3
Add DL, 2
Out DX, AL
Sub DL, 2
Xor AL, AL
Out DX, AL ; AL = 0 (Mode control)
Mov AL, 3
Add DL, 2
Out DX, AL
Sub DL, 2
Mov AL, 9
Out DX, AL
Xor AX, AX
Inc DX
Out DX, AX
Dec DX
Mov AL, 0Ch ; Set panning.
Out DX, AL
Mov AL, 8
Add DL, 2
Out DX, AL
Sub DL, 2
~
Inc DI
Jmp KillExtraChannels1
KillExtraChannels2:
Xor BX, BX ; BX = channel number
PrepareNewFreq4:
Mov DX, GUSVoiceSelect
Mov AL, BL
Out DX, AL
Inc DX ; Select rego
Test Byte Ptr [SI], 1
JZ PrepareNewFreq5
Test Word Ptr [SI], 120h ; New note or new freq?
JNZ PrepareNewFreq5
Or Byte Ptr [SI], 2h
Mov AL, 1
Out DX, AL
Inc DX
Mov AX, [SI+4]
Out DX, AX
PrepareNewFreq5:
Inc BX
Add SI, 128
Loop PrepareNewFreq4
Mov DX, GUSRegisterSelect
Mov AL, 0Eh
Out DX, AL
Add DL, 2
Pop AX
Dec AL
Or AL, 0C0h
Out DX, AL
Pop CS:UsedChannels
EndOfFreqChange:
Pop SI
Pop CX
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Xor AX, AX
SetGUSRegisters1:
Push AX
Push CX
Mov DX, GUSVoiceSelect
Out DX, AL ; OK.. now to play with this
; voice.
Call GUSDelay
Mov CX, [SI] ; CX = flags.
Inc DL ; DX = select rego
SetGUSRegisters21:
Test CL, 32 ; Frequency change
JZ SetGUSRegisters7
Push DX
Mov EAX, [SI+10h] ; EAX = freq.
Push CX
Mov CL, CS:Compress
ShR EAX, CL
Pop CX
Xor EDX, EDX
MovZX EBX, MixSpeed
Div EBX ; EAX = I portion.
Test EAX, Not 63
JNZ SetGUSRegisters6
Push EAX
Xor EAX, EAX
Div EBX
Pop EBX ; EBX:EAX = IIII FFFF etc.
SHRD EAX, EBX, 6
; Have: IIIIIIII IIIIIIII FFFFFFFF FFFFFFFF
; Req: IIIIIIFF FFFFFFF0
Pop DX
Mov AL, 1
Out DX, AL
ShR EAX, 16
Add AX, 1
SBB AX, 0 ; Just in case!
And AX, Not 1
Inc DX
Out DX, AX
Dec DX
Jmp SetGUSRegisters7
SetGUSRegisters6:
Mov CH, 2 ; Signify to turn off channel
Pop DX
SetGUSRegisters7:
MovZX BX, Byte Ptr [SI+36h] ; BX = sample number.
Cmp BL, 99
JA SetGUSRegisters20
ShL BX, 2 ; GUSDataTable+BX = position
Cmp DWord Ptr [CS:GUSDataTable+BX], 0FFFFFFFFh
JNE SetGUSRegisters10
SetGUSRegisters20:
Mov CH, 2
Jmp SetGUSRegisters9
SetGUSRegisters10:
Test CX, 502h ; Loop changed?!??!?
JZ SetGUSRegisters8
Mov AL, 3 ; Starting location low.
Out DX, AL
Mov EAX, [SI+40h]
Call GUSGetAddress
; Reqd: ...OOOOO OOOOOOOO OOOOOOOI III.....
Inc DX
Out DX, AX
Dec DX
Mov AL, 2 ; Starting location high
Out DX, AL
ShR EAX, 16
Inc DX
Out DX, AX
Dec DX
; Ending location...
Mov AL, 5 ; Ending location low
Out DX, AL
Mov EAX, [SI+44h]
Call GUSGetAddress
Inc DX
Out DX, AX
Dec DX
Mov AL, 4 ; Ending location high
Out DX, AL
SHR EAX, 16
Inc DX
Out DX, AX
Dec DX
SetGUSRegisters8:
Test CH, 1 ; Do Current position?
JZ SetGUSRegisters9
Mov AL, 0Bh ; Current location LOW
Out DX, AL
Mov EAX, [SI+4Ch]
Mov [SI+2Ch], EAX
; EAX = OOOOOOOO OOOOOOOO OOOOOOOO OOOOOOOO
; Req: xxxOOOOO OOOOOOOO OOOOOOOF FFFFFFFF
Call GUSGetAddress
Mov DI, AX
Inc DX
Out DX, AX
Dec DX
Mov AL, 0Ah ; Current location HIGH
Out DX, AL
SHR EAX, 16
Inc DX
Out DX, AX
Call GUSDelay
Out DX, AX
Dec DX
Mov AL, 0Bh
Out DX, AL
Mov AX, DI
Inc DX
Out DX, AX
Dec DX
SetGUSRegisters9:
Test CL, 64 ; New volume??
JZ SetGUSPanning
SetGUSRegisters23:
Xor BX, BX
Test CH, 8
JNZ SetGUSRegistersMuted
Mov BL, Byte Ptr [SI+20h] ; BL = volume, 0->128
SetGUSRegistersMuted:
Call SetGUSVolume
SetGUSPanning:
Test CH, 128 ; New panning?
JZ SetGUSRegisters5
Mov AL, 0Ch ; Set panning.
Out DX, AL
Test CS:Stereo, 1
JZ SetGUSRegisters3
Mov AL, [SI+37h]
Cmp AL, 100
JNE SetGUSRegisters4
SetGUSRegisters3:
Mov AL, 32 ; Surround goes to mono :(
SetGUSRegisters4: ; AL = 0->64
ShR AL, 1 ; AL = 0->32
Sub AL, 1
AdC AL, 0 ; AL = 0->31
ShR AL, 1
Add DL, 2
Out DX, AL
Sub DL, 2
SetGUSRegisters5:
; Now for control register.
; If CH | 2, then turn rego OFF
; If CH | 5, then turn rego ON
; If CL | 1, then check channel
Test CH, 2
JNZ SetGUSRegisters11
Test CH, 5
JNZ SetGUSRegisters12
Test CL, 1
JZ SetGUSRegisters13
Mov AL, 80h ; Read voice control
Out DX, AL
Add DL, 2
In AL, DX
Sub DL, 2
Test AL, 1
JZ SetGUSRegisters13
Xor BX, BX
Call SetGUSVolume
Jmp SetGUSRegisters14
SetGUSRegisters11:
; Turn off.
Xor AL, AL
Out DX, AL ; AL = 0 (Mode control)
Mov AL, 2
Add DL, 2
Mov AH, [SI+18h] ; 16 bit?
Add AH, AH
Or AL, AH
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Xor BX, BX
Call SetGUSVolume
SetGUSRegisters14:
Test CL, 1
JZ SetGUSRegisters13
Xor CX, CX ; Turn off channel
Test Byte Ptr [SI+3Ah], 80h
JNZ SetGUSRegisters13
Mov BX, [SI+38h]
And Byte Ptr [BX], Not 4 ; Signify channel off
Jmp SetGUSRegisters13
SetGUSRegisters12: ; Turn on
Xor AL, AL
Out DX, AL
Mov AL, [SI+0Ah]
Cmp CS:Convert16To8Bit, 0
JNZ SetGUSRegistersNo16Bit
Mov AH, [SI+18h] ; 16 bit?
Add AH, AH
Or AL, AH
SetGUSRegistersNo16Bit:
Test CL, 1
JNZ SetGUSRegisters15
Mov AL, 2
Xor CX, CX
SetGUSRegisters15:
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
SetGUSRegisters13:
And CX, 0111100010011111b ; Turns off:
; 1) Freq, pan & vol recalc
; 2) New note/note stop/loop cha
Mov [SI], CX
Add SI, SLAVECHANNELSIZE
Pop CX
Pop AX
Inc AX
Dec CX
JNZ SetGUSRegisters1
Ret
EndP SetGUSRegisters

20
SoundDrivers/IRQ.INC Executable file
View File

@ -0,0 +1,20 @@
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

2302
SoundDrivers/IWCODEC.ASM Executable file

File diff suppressed because it is too large Load Diff

2713
SoundDrivers/IWDRV.ASM Executable file

File diff suppressed because it is too large Load Diff

388
SoundDrivers/K6MSAM.INC Executable file
View File

@ -0,0 +1,388 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Align 4
include q.inc
FilterParameters DB 64 Dup (07Fh), 64 Dup (0)
Const2048 DD 16384.0
FreqMultiplier DD 3A9F7867h ; = 1/(2*PI*110.0*2^0.25)
FreqParameterMultiplier DD 0B92AAAAAh ; = -1/(24*256)
NUMBEROFFILTERBANDS = 4
IF OUTPUTFILTERENABLED
LastFilter DD NUMBEROFFILTERBANDS*2 Dup (0) ; 4 stereo values
FilterCoefficients DD NUMBEROFFILTERBANDS*2 Dup (0)
FilterVolumes DD NUMBEROFFILTERBANDS Dup (0)
ENDIF
FilterFreqValue DW 0
NewControlWord DW 7Fh
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc MixSamples ; Given DS:SI = info tables, CX = numchannels
Assume DS:Nothing
; 1. Clean buffer
; + update variables
; 2. Update parameters
; 3. Mix func
; 4. Return
Push CX
Mov CX, BytesToMix
Mov ES, CS:MixSegment
Mov DI, DMABUFFERLENGTH*2+80
Xor EAX, EAX
Mov DX, CX
Add CX, CX
Mov CS:MixTransferOffset, DI
Cmp CS:Stereo, 0
JE CS:MixSamples1
Mov DX, CX
MixSamples1:
Rep StosD
Mov CS: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 MixSamplesNoStop
And Byte Ptr [SI], Not 1
Cmp MixMode, 2
JB MixSamplesEnd
Mov DWord Ptr [SI+0Ch], 0
Jmp MixModeCommon
MixSamplesNoStop:
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
Xor EAX, EAX
Mov [SI+3Ch], AX ; For filter.
Mov [SI+6Eh], AX
Mov DWord Ptr [SI+1Ch], EAX ; Current Volume = 0
; for volume sliding.
Mov [SI+06h], DX
Mov [SI+5Eh], AX
Mov [SI+7Eh], AX
MixSamples5:
Test CX, 8540h ; New volume or panning?
JZ MixSamplesMix
Mov AX, 4*60
Test CH, 8 ; Muted?
JZ MixMMXNoMute
Xor EDX, EDX
Mov [SI+06h], DX
Mov [SI+0Ch], EDX
Mov [SI+5Eh], DX
Mov [SI+1Ch], EDX
Mov [SI+6Eh], DX
Mov [SI+3Ch], DX
Mov [SI+7Eh], DX
Xor BX, BX
Mov BL, [SI+3Ah]
Test BL, BL
JS MixModeCommon1
Mov DL, [CS:FilterParameters+BX]
Mov BL, [CS:FilterParameters+BX+64]
Mov [SI+5Bh], DL
Mov [SI+3Fh], BL
Jmp MixModeCommon1
MixMMXNoMute:
Xor BX, BX
Mov BL, [SI+3Ah]
Test BL, BL ; Disowned? Then use channel filters.
JNS MixGetChannelFilters
Mov BL, [SI+3Fh]
Jmp MixChannelFilters
MixGetChannelFilters:
; Filter = [FilterParameters+BX]
; Q = [FilterParameters+BX+64]
Mov AL, [CS:FilterParameters+BX] ; AX = Filter
Mov BL, [CS:FilterParameters+BX+64] ; BX = Q
; If the values are different, then force recalculate volume. (and hence mixmode)
Cmp [SI+5Bh], AL
JE MixChannelFiltersSame
Cmp [SI+3Fh], BL
JE MixChannelFiltersSame
Mov DWord Ptr [SI+0Ch], 0
MixChannelFiltersSame:
Mov [SI+5Bh], AL
Mov [SI+3Fh], BL
MixChannelFilters:
Cmp MixMode, 3
JNE MixMMXNoFilters
Mov AL, [SI+3Eh]
Mul Byte Ptr [SI+5Bh]
Mov CS:FilterFreqValue, AX
Cmp AX, 127*255
JNE MixChannelFiltersOK
Test BL, BL
JZ MixMMXNoFilters
MixChannelFiltersOK:
ShL BX, 2
FNInit
FLdCW [CS:NewControlWord]
FILD [CS:FilterFreqValue] ; 0->127*256
FMul [CS:FreqParameterMultiplier] ; -i/(24*256)
FLd ST
FRndInt
FSub ST(1), ST
FXCh
F2XM1
FLd1
FAdd
FScale ; = 2^(i/24*256)
FMul [CS:FreqMultiplier] ; = r
FLd ST ; r, r
FMul ST(1), ST ; r, r^2
FLd [CS:QualityFactorTable+BX] ; 2d, r, r^2
FMul ST(1), ST ; 2d, 2dr, r^2
FAdd
FLd1 ; 1, d+1, e
FXCh ; d+1, 1, e
FSubR ST(1), ST
FAdd ST, ST(2) ; 1+d+e, d, e
FDivR Const2048 ; 1/(1+d+e), d, e
FISt Word Ptr [SI+5Eh] ;
FLd ST(2) ; e, 1/(1+d+e), d, e
FAdd ST, ST
FAddP ST(2), ST ; 1/(1+d+e), d+2e, e
FMul ST(2), ST ; 1/(1+d+e), d+2e, e/(1+d+e)
FMul
FIStP Word Ptr [SI+6Eh]
FChs
FIStP Word Ptr [SI+7Eh]
FStP ST
Mov DWord Ptr [SI+0Ch], 0
MixMMXNoFilters:
Mov EBX, [SI+0Ch]
Cmp Stereo, 0
JNE MixMMXStereo
MixMMXMono:
Mov AX, [SI+4Ah]
Mul MixVolume
ShRD AX, DX, 9
Mov [SI+0Ch], AX
Mov [SI+0Eh], AX
Jmp MixModeVolumeCheck
MixMMXStereo:
Mov AL, [SI+37h] ; Final pan
Cmp AL, 100
JE MixMMXSurround
Mul Byte Ptr MixVolume ; 0->128
Mul Word Ptr [SI+4Ah] ; 0->32768
ShRD AX, DX, 15 ; Maxvol = 8192
Mov [SI+0Eh], AX ; Store into right volume
Mov AL, 64 ; Do left volume
Sub AL, [SI+37h] ; AL = 64-FinalPan
Mul Byte Ptr MixVolume
Mul Word Ptr [SI+4Ah]
ShRD AX, DX, 15
Mov [SI+0Ch], AX
Jmp MixModeVolumeCheck
MixMMXSurround:
Mov AX, [SI+4Ah]
Mul MixVolume
ShRD AX, DX, 10
Mov [SI+0Ch], AX
Neg AX
Mov [SI+0Eh], AX
MixModeVolumeCheck:
Test CH, 3+4
JNZ MixModeCommon
Cmp EBX, [SI+0Ch] ; Same as last volume?
JE MixSamplesMix
MixModeCommon: ; Requires AX = 30 etc. depending
; On mixing mode type.
; This will add 180 for 16-bit,
; And sort out loop types.
Mov AX, MixModeOffset
Cmp DWord Ptr [SI+0Ch], 0
JNE MixModeActualMix
Cmp MixMode, 2
JB MixMMXGeneralNoRamp
Cmp DWord Ptr [SI+1Ch], 0
JNE MixModeActualMix
MixMMXGeneralNoRamp:
Mov AX, 4*60
Jmp MixModeCommon1
MixModeActualMix:
Cmp MixMode, 3
JNE MixModeFilter
Cmp Word Ptr [SI+6Eh], 0
JNE MixModeFilter
Cmp Word Ptr [SI+7Eh], 0
JNE MixModeFilter
Sub AX, 60
MixModeFilter:
Test Byte Ptr [SI+18h], 2 ; 16 bit?
JZ MixModeCommon1
Add AX, 30
MixModeCommon1:
Cmp Byte Ptr [SI+0Ah], 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, BytesToMix
Mov MixBlockSize, AX
Mov MixBufferOffset, DMABUFFERLENGTH*2+80
Mov EAX, CURRENTPOSITION
Mov OLDPOSITION, EAX
Push Word Ptr [SI+8]
Call Word Ptr [CS:BX]
Pop BX
And Word Ptr [SI], 0111100010001101b
Cmp BX, Offset MixFunctionTables+60*2
JB MixSamplesEnd
Cmp BX, Offset MixFunctionTables+60*4
JAE MixSamplesEnd
MovDR AX, MM6
Mov [SI+0Ch], EAX
Mov [SI+1Ch], EAX
Cmp BX, Offset MixfunctionTables+60*3
JB MixSamplesEnd
Mov ES, CS:MixSegment
Mov DX, [ES:10h]
Mov BX, [ES:14h]
Mov [SI+3Ch], DX
Mov [SI+6h], BX
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
IF OUTPUTFILTERENABLED
include equalize.inc
ENDIF
Ret
EndP MixSamples
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

119
SoundDrivers/K6TRANS.INC Executable file
View File

@ -0,0 +1,119 @@
; To be embedded within the IRQ handler.
Push DX
Cmp CS:Stereo, 0
JNE TransferStereoBufferMMX
TransferMonoBufferMMX: ; DX = number of 32 bit numbers -> 16 bit.
Push DX
ShR DX, 3
JZ TransferMonoBufferMMX2
TransferMonoBufferMMX1:
MovD MM0, [SI]
MovD MM1, [SI+8]
MovD MM2, [SI+10h]
MovD MM3, [SI+18h]
MovD MM4, [SI+20h]
MovD MM5, [SI+28h]
MovD MM6, [SI+30h]
MovD MM7, [SI+38h]
PUnpckLDQ MM0, MM1 ; MM0 = S2|S1
PUnpckLDQ MM2, MM3 ; MM2 = S4|S3
PUnpckLDQ MM4, MM5 ; MM4 = S6|S5
PUnpckLDQ MM6, MM7 ; MM6 = S8|S7
PF2ID MM0, MM0
PF2ID MM2, MM2
PF2ID MM4, MM4
PF2ID MM6, MM6
PackSSDW MM0, MM2
PackSSDW MM4, MM6
MovQ [DI], MM0
MovQ [DI+8], MM4
Add SI, 40h
Add DI, 10h
Dec DX
JNZ TransferMonoBufferMMX1
TransferMonoBufferMMX2:
Pop CX
Mov DX, CX
And CX, 7
JZ TransferMonoBufferMMX4
TransferMonoBufferMMX3:
MovD MM0, [SI]
PF2ID MM0, MM0
MovD EAX, MM0
StosW
Add SI, 8
Loop TransferMonoBufferMMX3
TransferMonoBufferMMX4:
Jmp MMXMixTransferEnd
TransferStereoBufferMMX: ; DX is always an even number for stereo
Push DX
ShR DX, 3
JZ TransferStereoBufferMMX2
TransferStereoBufferMMX1: ; DX = number of 32 bit numbers -> 16 bit
MovQ MM0, [SI]
MovQ MM1, [SI+8]
MovQ MM2, [SI+10h]
MovQ MM3, [SI+18h]
PF2ID MM0, MM0
PF2ID MM1, MM1
PF2ID MM2, MM2
PF2ID MM3, MM3
PackSSDW MM0, MM1
PackSSDW MM2, MM3
MovQ [DI], MM0
MovQ [DI+8], MM2
Add SI, 20h
Add DI, 10h
Dec DX
JNZ TransferStereoBufferMMX1
TransferStereoBufferMMX2:
Pop CX
Mov DX, CX
And CX, 7
ShR CX, 1 ; Always an even number!
JZ TransferStereoBufferMMX4
TransferStereoBufferMMX3:
MovQ MM0, [SI]
PF2ID MM0, MM0
PackSSDW MM0, MM0
MovD [DI], MM0
Add SI, 8
Add DI, 4
Loop TransferStereoBufferMMX3
TransferStereoBufferMMX4:
MMXMixTransferEnd:
Pop DX

71
SoundDrivers/LOADSAM.INC Executable file
View File

@ -0,0 +1,71 @@
Proc LoadSample Far ; Fix up end of sample bytes
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..
Xor EAX, EAX
Mov BL, [FS:BP+12h]
Test BL, 10h ; Loop
JZ LoadSample2
Mov ESI, [FS:BP+34h] ; Start of loop
Test BL, 40h ; Pingpong?
JZ LoadSample1
Mov ESI, [FS:BP+38h]
Sub ESI, 2
JNC LoadSample1
Xor ESI, ESI
LoadSample1:
Test BL, 2
JZ LoadSample4
Add ESI, ESI
LoadSample4:
Int 3
Mov AL, [SI]
Inc ESI
Int 3
Mov AH, [SI]
LoadSample2:
Mov ESI, [FS:BP+30h]
Test BL, 2
JZ LoadSample3
Add ESI, ESI
LoadSample3:
Int 3
Mov [SI], AL
Inc ESI
Int 3
Mov [SI], AH
LoadSampleEnd:
Pop FS
Pop ES
Pop DS
PopAD
StC
Ret
EndP LoadSample

904
SoundDrivers/LPT1DRV.ASM Executable file
View File

@ -0,0 +1,904 @@
.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

904
SoundDrivers/LPT2DRV.ASM Executable file
View File

@ -0,0 +1,904 @@
.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 LPT2, Port ", 0FDh, "Xh", 0
SBProNoMemoryMsg DB " Using DAC on LPT2", 13
DB " Error: Insufficient memory", 0
ReinitMsg DB "DAC on LPT2 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:40Ah] ; LPT2 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

49
SoundDrivers/M12BIT.INC Executable file
View File

@ -0,0 +1,49 @@
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix12Left8Bit, MFS8Bit, MBS8Bit, Mix12Single8Bit
DW Offset MixForwardsLoop, PreMix12Left8Bit, MFS8Bit, MBS8Bit, Mix12Single8Bit
DW Offset MixPingPongLoop, PreMix12Left8Bit, MFS8Bit, MBS8Bit, Mix12Single8Bit
; Right only
DW Offset MixNoLoop, PreMix12Right8Bit, MFS8Bit, MBS8Bit, Mix12Single8Bit
DW Offset MixForwardsLoop, PreMix12Right8Bit, MFS8Bit, MBS8Bit, Mix12Single8Bit
DW Offset MixPingPongLoop, PreMix12Right8Bit, MFS8Bit, MBS8Bit, Mix12Single8Bit
; Central
DW Offset MixNoLoop, PreMix12Central8Bit, MFS8Bit, MBS8Bit, Mix12Central8Bit
DW Offset MixForwardsLoop, PreMix12Central8Bit, MFS8Bit, MBS8Bit, Mix12Central8Bit
DW Offset MixPingPongLoop, PreMix12Central8Bit, MFS8Bit, MBS8Bit, Mix12Central8Bit
; Stereo
DW Offset MixNoLoop, PreMix12Panned8Bit, MFS8Bit, MBS8Bit, Mix12Panned8Bit
DW Offset MixForwardsLoop, PreMix12Panned8Bit, MFS8Bit, MBS8Bit, Mix12Panned8Bit
DW Offset MixPingPongLoop, PreMix12Panned8Bit, MFS8Bit, MBS8Bit, Mix12Panned8Bit
; Surround
DW Offset MixNoLoop, PreMix12Surround8Bit, MFS8Bit, MBS8Bit, Mix12Surround8Bit
DW Offset MixForwardsLoop, PreMix12Surround8Bit, MFS8Bit, MBS8Bit, Mix12Surround8Bit
DW Offset MixPingPongLoop, PreMix12Surround8Bit, MFS8Bit, MBS8Bit, Mix12Surround8Bit
; 16 bit tables
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix12Left16Bit, MFS16Bit, MBS16Bit, Mix12Single16Bit
DW Offset MixForwardsLoop, PreMix12Left16Bit, MFS16Bit, MBS16Bit, Mix12Single16Bit
DW Offset MixPingPongLoop, PreMix12Left16Bit, MFS16Bit, MBS16Bit, Mix12Single16Bit
; Right only
DW Offset MixNoLoop, PreMix12Right16Bit, MFS16Bit, MBS16Bit, Mix12Single16Bit
DW Offset MixForwardsLoop, PreMix12Right16Bit, MFS16Bit, MBS16Bit, Mix12Single16Bit
DW Offset MixPingPongLoop, PreMix12Right16Bit, MFS16Bit, MBS16Bit, Mix12Single16Bit
; Central
DW Offset MixNoLoop, PreMix12Central16Bit, MFS16Bit, MBS16Bit, Mix12Central16Bit
DW Offset MixForwardsLoop, PreMix12Central16Bit, MFS16Bit, MBS16Bit, Mix12Central16Bit
DW Offset MixPingPongLoop, PreMix12Central16Bit, MFS16Bit, MBS16Bit, Mix12Central16Bit
; Stereo
DW Offset MixNoLoop, PreMix12Panned16Bit, MFS16Bit, MBS16Bit, Mix12Panned16Bit
DW Offset MixForwardsLoop, PreMix12Panned16Bit, MFS16Bit, MBS16Bit, Mix12Panned16Bit
DW Offset MixPingPongLoop, PreMix12Panned16Bit, MFS16Bit, MBS16Bit, Mix12Panned16Bit
; Surround
DW Offset MixNoLoop, PreMix12Surround16Bit, MFS16Bit, MBS16Bit, Mix12Surround16Bit
DW Offset MixForwardsLoop, PreMix12Surround16Bit, MFS16Bit, MBS16Bit, Mix12Surround16Bit
DW Offset MixPingPongLoop, PreMix12Surround16Bit, MFS16Bit, MBS16Bit, Mix12Surround16Bit

813
SoundDrivers/M12BIT.MIX Executable file
View File

@ -0,0 +1,813 @@
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
M12Mix8Single Macro Index
M12Mix8Single&Index&:
Mov BL, [ES:DI] ;; 2
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8Central Macro Index
M12Mix8Central&Index&:
Mov BL, [ES:DI] ;; 2
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8Surround Macro Index
M12Mix8Surround&Index&:
Mov BL, [ES:DI] ;; 2
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
; Panned output
M12Mix8PannedNext Macro Index
M12Mix8PannedVolume&Index& EQU $+1
Mov BH, 12h
Mov BL, [ES:DI]
EndM
M12Mix8Panned Macro Index
M12Mix8Panned&Index&:
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix8PannedRightVolumeOffset&Index& EQU $+3
Mov AX, [BX+1200h]
M12Mix8PannedNext %(Index+1)
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16Single Macro Index
M12Mix16Single&Index&:
Mov BL, [ES:EDI+EDI+1]
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
EndM
M12Mix16Central Macro Index
M12Mix16Central&Index&:
Mov BL, [ES:EDI+EDI+1]
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16Surround Macro Index
M12Mix16Surround&Index&:
Mov BL, [ES:EDI+EDI+1]
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
; Panned output
M12Mix16PannedNext Macro Index
M12Mix16PannedVolume&Index& EQU $+1
Mov BH, 12h
Mov BL, [ES:EDI+EDI+1]
EndM
M12Mix16Panned Macro Index
M12Mix16Panned&Index&:
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix16PannedRightVolumeOffset&Index& EQU $+3
Mov AX, [BX+1200h]
M12Mix16PannedNext %(Index+1)
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8SingleOffset Macro Index
DW Offset M12Mix8Single&Index&
EndM
REPT 16
M12Mix8SingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single8Bit
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Single8BitOffsetTable+BX]
M12Single8BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix8Single 0
M12Mix8Single 1
M12Mix8Single 2
M12Mix8Single 3
M12Mix8Single 4
M12Mix8Single 5
M12Mix8Single 6
M12Mix8Single 7
M12Mix8Single 8
M12Mix8Single 9
M12Mix8Single 10
M12Mix8Single 11
M12Mix8Single 12
M12Mix8Single 13
M12Mix8Single 14
M12Mix8Single 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Single0
Ret
EndP Mix12Single8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left8Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Single8BitVolume], AL
Ret
EndP PreMix12Left8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right8Bit
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Mov Byte Ptr [CS:M12Single8BitVolume], AL
Ret
EndP PreMix12Right8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8CentralOffset Macro Index
DW Offset M12Mix8Central&Index&
EndM
REPT 16
M12Mix8CentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Central8BitOffsetTable+BX]
M12Central8BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix8Central 0
M12Mix8Central 1
M12Mix8Central 2
M12Mix8Central 3
M12Mix8Central 4
M12Mix8Central 5
M12Mix8Central 6
M12Mix8Central 7
M12Mix8Central 8
M12Mix8Central 9
M12Mix8Central 10
M12Mix8Central 11
M12Mix8Central 12
M12Mix8Central 13
M12Mix8Central 14
M12Mix8Central 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Central0
Ret
EndP Mix12Central8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central8Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Central8BitVolume], AL
Ret
EndP PreMix12Central8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8SurroundOffset Macro Index
DW Offset M12Mix8Surround&Index&
EndM
REPT 16
M12Mix8SurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Surround8BitOffsetTable+BX]
M12Surround8BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix8Surround 0
M12Mix8Surround 1
M12Mix8Surround 2
M12Mix8Surround 3
M12Mix8Surround 4
M12Mix8Surround 5
M12Mix8Surround 6
M12Mix8Surround 7
M12Mix8Surround 8
M12Mix8Surround 9
M12Mix8Surround 10
M12Mix8Surround 11
M12Mix8Surround 12
M12Mix8Surround 13
M12Mix8Surround 14
M12Mix8Surround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Surround0
Ret
EndP Mix12Surround8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround8Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Surround8BitVolume], AL
Ret
EndP PreMix12Surround8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8PannedOffset Macro Index
DW Offset M12Mix8Panned&Index&
EndM
REPT 16
M12Mix8PannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Panned8BitOffsetTable+BX]
M12Mix8PannedNext 0
RetN
M12Mix8Panned 0
M12Mix8Panned 1
M12Mix8Panned 2
M12Mix8Panned 3
M12Mix8Panned 4
M12Mix8Panned 5
M12Mix8Panned 6
M12Mix8Panned 7
M12Mix8Panned 8
M12Mix8Panned 9
M12Mix8Panned 10
M12Mix8Panned 11
M12Mix8Panned 12
M12Mix8Panned 13
M12Mix8Panned 14
M12Mix8Panned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Panned0
Ret
EndP Mix12Panned8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned8Bit
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12PannedMacro Macro Index
Mov Byte Ptr [CS:M12Mix8PannedVolume&Index&], AL
EndM
REPT 17
PreMix12PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Mov AL, [SI+0Ch]
Sub AL, [SI+0Eh]
Add AL, AL
IndexCounter = 0
PreMix12PannedMacro2 Macro Index
Mov Byte Ptr [CS:M12Mix8PannedRightVolumeOffset&Index&], AL
EndM
REPT 16
PreMix12PannedMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned8Bit
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16SingleOffset Macro Index
DW Offset M12Mix16Single&Index&
EndM
REPT 16
M12Mix16SingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single16Bit
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Single16BitOffsetTable+BX]
M12Single16BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix16Single 0
M12Mix16Single 1
M12Mix16Single 2
M12Mix16Single 3
M12Mix16Single 4
M12Mix16Single 5
M12Mix16Single 6
M12Mix16Single 7
M12Mix16Single 8
M12Mix16Single 9
M12Mix16Single 10
M12Mix16Single 11
M12Mix16Single 12
M12Mix16Single 13
M12Mix16Single 14
M12Mix16Single 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16Single0
Ret
EndP Mix12Single16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left16Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Single16BitVolume], AL
Ret
EndP PreMix12Left16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right16Bit
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Mov Byte Ptr [CS:M12Single16BitVolume], AL
Ret
EndP PreMix12Right16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16CentralOffset Macro Index
DW Offset M12Mix16Central&Index&
EndM
REPT 16
M12Mix16CentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Central16BitOffsetTable+BX]
M12Central16BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix16Central 0
M12Mix16Central 1
M12Mix16Central 2
M12Mix16Central 3
M12Mix16Central 4
M12Mix16Central 5
M12Mix16Central 6
M12Mix16Central 7
M12Mix16Central 8
M12Mix16Central 9
M12Mix16Central 10
M12Mix16Central 11
M12Mix16Central 12
M12Mix16Central 13
M12Mix16Central 14
M12Mix16Central 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16Central0
Ret
EndP Mix12Central16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central16Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Central16BitVolume], AL
Ret
EndP PreMix12Central16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16SurroundOffset Macro Index
DW Offset M12Mix16Surround&Index&
EndM
REPT 16
M12Mix16SurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Surround16BitOffsetTable+BX]
M12Surround16BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix16Surround 0
M12Mix16Surround 1
M12Mix16Surround 2
M12Mix16Surround 3
M12Mix16Surround 4
M12Mix16Surround 5
M12Mix16Surround 6
M12Mix16Surround 7
M12Mix16Surround 8
M12Mix16Surround 9
M12Mix16Surround 10
M12Mix16Surround 11
M12Mix16Surround 12
M12Mix16Surround 13
M12Mix16Surround 14
M12Mix16Surround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16Surround0
Ret
EndP Mix12Surround16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround16Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Surround16BitVolume], AL
Ret
EndP PreMix12Surround16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16PannedOffset Macro Index
DW Offset M12Mix16Panned&Index&
EndM
REPT 16
M12Mix16PannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Panned16BitOffsetTable+BX]
M12Mix16PannedNext 0
RetN
Pan12Bit16Loop:
M12Mix16PannedNext 16
M12Mix16Panned 0
M12Mix16Panned 1
M12Mix16Panned 2
M12Mix16Panned 3
M12Mix16Panned 4
M12Mix16Panned 5
M12Mix16Panned 6
M12Mix16Panned 7
M12Mix16Panned 8
M12Mix16Panned 9
M12Mix16Panned 10
M12Mix16Panned 11
M12Mix16Panned 12
M12Mix16Panned 13
M12Mix16Panned 14
M12Mix16Panned15:
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+EXTRAOFFSET], AX
M12Mix16PannedRightVolumeOffset15 EQU $+3
Mov AX, [BX+1200h]
Sub [SI+MixResolution/8+EXTRAOFFSET], AX
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ Pan12Bit16Loop
Ret
EndP Mix12Panned16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned16Bit
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12PannedMacro Macro Index
Mov Byte Ptr [CS:M12Mix16PannedVolume&Index&], AL
EndM
REPT 17
PreMix12PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Mov AL, [SI+0Ch]
Sub AL, [SI+0Eh]
Add AL, AL
IndexCounter = 0
PreMix12PannedMacro2 Macro Index
Mov Byte Ptr [CS:M12Mix16PannedRightVolumeOffset&Index&], AL
EndM
REPT 16
PreMix12PannedMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

49
SoundDrivers/M12BITF.INC Executable file
View File

@ -0,0 +1,49 @@
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix12Left8BitF, MFS8Bit, MBS8Bit, Mix12Single8BitF
DW Offset MixForwardsLoop, PreMix12Left8BitF, MFS8Bit, MBS8Bit, Mix12Single8BitF
DW Offset MixPingPongLoop, PreMix12Left8BitF, MFS8Bit, MBS8Bit, Mix12Single8BitF
; Right only
DW Offset MixNoLoop, PreMix12Right8BitF, MFS8Bit, MBS8Bit, Mix12Single8BitF
DW Offset MixForwardsLoop, PreMix12Right8BitF, MFS8Bit, MBS8Bit, Mix12Single8BitF
DW Offset MixPingPongLoop, PreMix12Right8BitF, MFS8Bit, MBS8Bit, Mix12Single8BitF
; Central
DW Offset MixNoLoop, PreMix12Central8BitF, MFS8Bit, MBS8Bit, Mix12Central8BitF
DW Offset MixForwardsLoop, PreMix12Central8BitF, MFS8Bit, MBS8Bit, Mix12Central8BitF
DW Offset MixPingPongLoop, PreMix12Central8BitF, MFS8Bit, MBS8Bit, Mix12Central8BitF
; Stereo
DW Offset MixNoLoop, PreMix12Panned8BitF, MFS8Bit, MBS8Bit, Mix12Panned8BitF
DW Offset MixForwardsLoop, PreMix12Panned8BitF, MFS8Bit, MBS8Bit, Mix12Panned8BitF
DW Offset MixPingPongLoop, PreMix12Panned8BitF, MFS8Bit, MBS8Bit, Mix12Panned8BitF
; Surround
DW Offset MixNoLoop, PreMix12Surround8BitF, MFS8Bit, MBS8Bit, Mix12Surround8BitF
DW Offset MixForwardsLoop, PreMix12Surround8BitF, MFS8Bit, MBS8Bit, Mix12Surround8BitF
DW Offset MixPingPongLoop, PreMix12Surround8BitF, MFS8Bit, MBS8Bit, Mix12Surround8BitF
; 16 bit tables
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix12Left16BitF, MFS16Bit, MBS16Bit, Mix12Single16BitF
DW Offset MixForwardsLoop, PreMix12Left16BitF, MFS16Bit, MBS16Bit, Mix12Single16BitF
DW Offset MixPingPongLoop, PreMix12Left16BitF, MFS16Bit, MBS16Bit, Mix12Single16BitF
; Right only
DW Offset MixNoLoop, PreMix12Right16BitF, MFS16Bit, MBS16Bit, Mix12Single16BitF
DW Offset MixForwardsLoop, PreMix12Right16BitF, MFS16Bit, MBS16Bit, Mix12Single16BitF
DW Offset MixPingPongLoop, PreMix12Right16BitF, MFS16Bit, MBS16Bit, Mix12Single16BitF
; Central
DW Offset MixNoLoop, PreMix12Central16BitF, MFS16Bit, MBS16Bit, Mix12Central16BitF
DW Offset MixForwardsLoop, PreMix12Central16BitF, MFS16Bit, MBS16Bit, Mix12Central16BitF
DW Offset MixPingPongLoop, PreMix12Central16BitF, MFS16Bit, MBS16Bit, Mix12Central16BitF
; Stereo
DW Offset MixNoLoop, PreMix12Panned16BitF, MFS16Bit, MBS16Bit, Mix12Panned16BitF
DW Offset MixForwardsLoop, PreMix12Panned16BitF, MFS16Bit, MBS16Bit, Mix12Panned16BitF
DW Offset MixPingPongLoop, PreMix12Panned16BitF, MFS16Bit, MBS16Bit, Mix12Panned16BitF
; Surround
DW Offset MixNoLoop, PreMix12Surround16BitF, MFS16Bit, MBS16Bit, Mix12Surround16BitF
DW Offset MixForwardsLoop, PreMix12Surround16BitF, MFS16Bit, MBS16Bit, Mix12Surround16BitF
DW Offset MixPingPongLoop, PreMix12Surround16BitF, MFS16Bit, MBS16Bit, Mix12Surround16BitF

807
SoundDrivers/M12BITF.MIX Executable file
View File

@ -0,0 +1,807 @@
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
Get8BitFWaveform Macro
Mov AL, [ES:DI]
Add BL, 80h
Add AL, 80h
Add BL, AL
RCR BL, 1
Sub BL, 80h
EndM
Get16BitFWaveform Macro
Mov AL, [ES:EDI+EDI+1]
Add BL, 80h
Add AL, 80h
Add BL, AL
RCR BL, 1
Sub BL, 80h
EndM
M12Mix8FSingle Macro Index
M12Mix8FSingle&Index&:
Get8BitFWaveForm
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8FCentral Macro Index
M12Mix8FCentral&Index&:
Get8BitFWaveform
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8FSurround Macro Index
M12Mix8FSurround&Index&:
Get8BitFWaveform
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8FPanned Macro Index
M12Mix8FPanned&Index&:
Get8BitFWaveform
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [EBX+EBX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix8FPannedRightVolumeOffset&Index& EQU $+4
Mov AX, [EBX+EBX+1200h]
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16FSingle Macro Index
M12Mix16FSingle&Index&:
Get16BitFWaveForm
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
EndM
M12Mix16FCentral Macro Index
M12Mix16FCentral&Index&:
Get16BitFWaveform
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16FSurround Macro Index
M12Mix16FSurround&Index&:
Get16BitFWaveform
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
; Panned output
M12Mix16FPanned Macro Index
M12Mix16FPanned&Index&:
Get16BitFWaveform
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [EBX+EBX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix16FPannedRightVolumeOffset&Index& EQU $+4
Mov AX, [EBX+EBX+1200h]
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single8BitFOffsetTable Label Word
IndexCounter = 15
M12Mix8FSingleOffset Macro Index
DW Offset M12Mix8FSingle&Index&
EndM
REPT 16
M12Mix8FSingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single8BitF
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Single8BitFOffsetTable+BX]
Mix12Single8BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:DI]
RetN
M12Mix8FSingle 0
M12Mix8FSingle 1
M12Mix8FSingle 2
M12Mix8FSingle 3
M12Mix8FSingle 4
M12Mix8FSingle 5
M12Mix8FSingle 6
M12Mix8FSingle 7
M12Mix8FSingle 8
M12Mix8FSingle 9
M12Mix8FSingle 10
M12Mix8FSingle 11
M12Mix8FSingle 12
M12Mix8FSingle 13
M12Mix8FSingle 14
M12Mix8FSingle 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8FSingle0
Ret
EndP Mix12Single8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left8BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Single8BitFVolume], AL
Ret
EndP PreMix12Left8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right8BitF
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Mov Byte Ptr [CS:Mix12Single8BitFVolume], AL
Ret
EndP PreMix12Right8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central8BitFOffsetTable Label Word
IndexCounter = 15
M12Mix8FCentralOffset Macro Index
DW Offset M12Mix8FCentral&Index&
EndM
REPT 16
M12Mix8FCentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central8BitF
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Central8BitFOffsetTable+BX]
Mix12Central8BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:DI]
RetN
M12Mix8FCentral 0
M12Mix8FCentral 1
M12Mix8FCentral 2
M12Mix8FCentral 3
M12Mix8FCentral 4
M12Mix8FCentral 5
M12Mix8FCentral 6
M12Mix8FCentral 7
M12Mix8FCentral 8
M12Mix8FCentral 9
M12Mix8FCentral 10
M12Mix8FCentral 11
M12Mix8FCentral 12
M12Mix8FCentral 13
M12Mix8FCentral 14
M12Mix8FCentral 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8FCentral0
Ret
EndP Mix12Central8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central8BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Central8BitFVolume], AL
Ret
EndP PreMix12Central8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround8BitFOffsetTable Label Word
IndexCounter = 15
M12Mix8FSurroundOffset Macro Index
DW Offset M12Mix8FSurround&Index&
EndM
REPT 16
M12Mix8FSurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround8BitF
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Surround8BitFOffsetTable+BX]
Mix12Surround8BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:DI]
RetN
M12Mix8FSurround 0
M12Mix8FSurround 1
M12Mix8FSurround 2
M12Mix8FSurround 3
M12Mix8FSurround 4
M12Mix8FSurround 5
M12Mix8FSurround 6
M12Mix8FSurround 7
M12Mix8FSurround 8
M12Mix8FSurround 9
M12Mix8FSurround 10
M12Mix8FSurround 11
M12Mix8FSurround 12
M12Mix8FSurround 13
M12Mix8FSurround 14
M12Mix8FSurround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8FSurround0
Ret
EndP Mix12Surround8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround8BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Surround8BitFVolume], AL
Ret
EndP PreMix12Surround8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned8BitFOffsetTable Label Word
IndexCounter = 15
M12Mix8FPannedOffset Macro Index
DW Offset M12Mix8FPanned&Index&
EndM
REPT 16
M12Mix8FPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned8BitF
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Panned8BitFOffsetTable+BX]
Mix12Panned8BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:DI]
RetN
M12Mix8FPanned 0
M12Mix8FPanned 1
M12Mix8FPanned 2
M12Mix8FPanned 3
M12Mix8FPanned 4
M12Mix8FPanned 5
M12Mix8FPanned 6
M12Mix8FPanned 7
M12Mix8FPanned 8
M12Mix8FPanned 9
M12Mix8FPanned 10
M12Mix8FPanned 11
M12Mix8FPanned 12
M12Mix8FPanned 13
M12Mix8FPanned 14
M12Mix8FPanned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8FPanned0
Ret
EndP Mix12Panned8BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned8BitF
Mov AL, [SI+0Eh]
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Panned8BitFVolume], AL
Xor AL, AL
Mov AH, [SI+0Ch]
Sub AH, [SI+0Eh]
Add AH, AH
MovSX EAX, AX
IndexCounter = 0
PreMix12Panned8BitFMacro2 Macro Index
Mov DWord Ptr [CS:M12Mix8FPannedRightVolumeOffset&Index&], EAX
EndM
REPT 16
PreMix12Panned8BitFMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned8BitF
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single16BitFOffsetTable Label Word
IndexCounter = 15
M12Mix16FSingleOffset Macro Index
DW Offset M12Mix16FSingle&Index&
EndM
REPT 16
M12Mix16FSingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single16BitF
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Single16BitFOffsetTable+BX]
Mix12Single16BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:EDI+EDI+1]
RetN
M12Mix16FSingle 0
M12Mix16FSingle 1
M12Mix16FSingle 2
M12Mix16FSingle 3
M12Mix16FSingle 4
M12Mix16FSingle 5
M12Mix16FSingle 6
M12Mix16FSingle 7
M12Mix16FSingle 8
M12Mix16FSingle 9
M12Mix16FSingle 10
M12Mix16FSingle 11
M12Mix16FSingle 12
M12Mix16FSingle 13
M12Mix16FSingle 14
M12Mix16FSingle 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16FSingle0
Ret
EndP Mix12Single16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left16BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Single16BitFVolume], AL
Ret
EndP PreMix12Left16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right16BitF
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Mov Byte Ptr [CS:Mix12Single16BitFVolume], AL
Ret
EndP PreMix12Right16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central16BitFOffsetTable Label Word
IndexCounter = 15
M12Mix16FCentralOffset Macro Index
DW Offset M12Mix16FCentral&Index&
EndM
REPT 16
M12Mix16FCentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central16BitF
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Central16BitFOffsetTable+BX]
Mix12Central16BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:EDI+EDI+1]
RetN
M12Mix16FCentral 0
M12Mix16FCentral 1
M12Mix16FCentral 2
M12Mix16FCentral 3
M12Mix16FCentral 4
M12Mix16FCentral 5
M12Mix16FCentral 6
M12Mix16FCentral 7
M12Mix16FCentral 8
M12Mix16FCentral 9
M12Mix16FCentral 10
M12Mix16FCentral 11
M12Mix16FCentral 12
M12Mix16FCentral 13
M12Mix16FCentral 14
M12Mix16FCentral 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16FCentral0
Ret
EndP Mix12Central16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central16BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Central16BitFVolume], AL
Ret
EndP PreMix12Central16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround16BitFOffsetTable Label Word
IndexCounter = 15
M12Mix16FSurroundOffset Macro Index
DW Offset M12Mix16FSurround&Index&
EndM
REPT 16
M12Mix16FSurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround16BitF
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Surround16BitFOffsetTable+BX]
Mix12Surround16BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:EDI+EDI+1]
RetN
M12Mix16FSurround 0
M12Mix16FSurround 1
M12Mix16FSurround 2
M12Mix16FSurround 3
M12Mix16FSurround 4
M12Mix16FSurround 5
M12Mix16FSurround 6
M12Mix16FSurround 7
M12Mix16FSurround 8
M12Mix16FSurround 9
M12Mix16FSurround 10
M12Mix16FSurround 11
M12Mix16FSurround 12
M12Mix16FSurround 13
M12Mix16FSurround 14
M12Mix16FSurround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16FSurround0
Ret
EndP Mix12Surround16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround16BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Surround16BitFVolume], AL
Ret
EndP PreMix12Surround16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned16BitFOffsetTable Label Word
IndexCounter = 15
M12Mix16FPannedOffset Macro Index
DW Offset M12Mix16FPanned&Index&
EndM
REPT 16
M12Mix16FPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned16BitF
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Panned16BitFOffsetTable+BX]
Mix12Panned16BitFVolume EQU $+3
Mov EBX, 0
Mov BL, [ES:EDI+EDI+1]
RetN
Pan12BitF16Loop:
M12Mix16FPanned 0
M12Mix16FPanned 1
M12Mix16FPanned 2
M12Mix16FPanned 3
M12Mix16FPanned 4
M12Mix16FPanned 5
M12Mix16FPanned 6
M12Mix16FPanned 7
M12Mix16FPanned 8
M12Mix16FPanned 9
M12Mix16FPanned 10
M12Mix16FPanned 11
M12Mix16FPanned 12
M12Mix16FPanned 13
M12Mix16FPanned 14
M12Mix16FPanned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ Pan12BitF16Loop
Ret
EndP Mix12Panned16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned16BitF
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:Mix12Panned16BitFVolume], AL
Xor AL, AL
Mov AH, [SI+0Ch]
Sub AH, [SI+0Eh]
Add AH, AH
MovSX EAX, AX
IndexCounter = 0
PreMix12PannedMacro2 Macro Index
Mov DWord Ptr [CS:M12Mix16FPannedRightVolumeOffset&Index&], EAX
EndM
REPT 16
PreMix12PannedMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned16BitF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

49
SoundDrivers/M12BITI.INC Executable file
View File

@ -0,0 +1,49 @@
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix12Left8BitI, MFS8Bit, MBS8Bit, Mix12Single8BitI
DW Offset MixForwardsLoop, PreMix12Left8BitI, MFS8Bit, MBS8Bit, Mix12Single8BitI
DW Offset MixPingPongLoop, PreMix12Left8BitI, MFS8Bit, MBS8Bit, Mix12Single8BitI
; Right only
DW Offset MixNoLoop, PreMix12Right8BitI, MFS8Bit, MBS8Bit, Mix12Single8BitI
DW Offset MixForwardsLoop, PreMix12Right8BitI, MFS8Bit, MBS8Bit, Mix12Single8BitI
DW Offset MixPingPongLoop, PreMix12Right8BitI, MFS8Bit, MBS8Bit, Mix12Single8BitI
; Central
DW Offset MixNoLoop, PreMix12Central8BitI, MFS8Bit, MBS8Bit, Mix12Central8BitI
DW Offset MixForwardsLoop, PreMix12Central8BitI, MFS8Bit, MBS8Bit, Mix12Central8BitI
DW Offset MixPingPongLoop, PreMix12Central8BitI, MFS8Bit, MBS8Bit, Mix12Central8BitI
; Stereo
DW Offset MixNoLoop, PreMix12Panned8BitI, MFS8Bit, MBS8Bit, Mix12Panned8BitI
DW Offset MixForwardsLoop, PreMix12Panned8BitI, MFS8Bit, MBS8Bit, Mix12Panned8BitI
DW Offset MixPingPongLoop, PreMix12Panned8BitI, MFS8Bit, MBS8Bit, Mix12Panned8BitI
; Surround
DW Offset MixNoLoop, PreMix12Surround8BitI, MFS8Bit, MBS8Bit, Mix12Surround8BitI
DW Offset MixForwardsLoop, PreMix12Surround8BitI, MFS8Bit, MBS8Bit, Mix12Surround8BitI
DW Offset MixPingPongLoop, PreMix12Surround8BitI, MFS8Bit, MBS8Bit, Mix12Surround8BitI
; 16 bit tables
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix12Left16BitI, MFS16Bit, MBS16Bit, Mix12Single16BitI
DW Offset MixForwardsLoop, PreMix12Left16BitI, MFS16Bit, MBS16Bit, Mix12Single16BitI
DW Offset MixPingPongLoop, PreMix12Left16BitI, MFS16Bit, MBS16Bit, Mix12Single16BitI
; Right only
DW Offset MixNoLoop, PreMix12Right16BitI, MFS16Bit, MBS16Bit, Mix12Single16BitI
DW Offset MixForwardsLoop, PreMix12Right16BitI, MFS16Bit, MBS16Bit, Mix12Single16BitI
DW Offset MixPingPongLoop, PreMix12Right16BitI, MFS16Bit, MBS16Bit, Mix12Single16BitI
; Central
DW Offset MixNoLoop, PreMix12Central16BitI, MFS16Bit, MBS16Bit, Mix12Central16BitI
DW Offset MixForwardsLoop, PreMix12Central16BitI, MFS16Bit, MBS16Bit, Mix12Central16BitI
DW Offset MixPingPongLoop, PreMix12Central16BitI, MFS16Bit, MBS16Bit, Mix12Central16BitI
; Stereo
DW Offset MixNoLoop, PreMix12Panned16BitI, MFS16Bit, MBS16Bit, Mix12Panned16BitI
DW Offset MixForwardsLoop, PreMix12Panned16BitI, MFS16Bit, MBS16Bit, Mix12Panned16BitI
DW Offset MixPingPongLoop, PreMix12Panned16BitI, MFS16Bit, MBS16Bit, Mix12Panned16BitI
; Surround
DW Offset MixNoLoop, PreMix12Surround16BitI, MFS16Bit, MBS16Bit, Mix12Surround16BitI
DW Offset MixForwardsLoop, PreMix12Surround16BitI, MFS16Bit, MBS16Bit, Mix12Surround16BitI
DW Offset MixPingPongLoop, PreMix12Surround16BitI, MFS16Bit, MBS16Bit, Mix12Surround16BitI

866
SoundDrivers/M12BITI.MIX Executable file
View File

@ -0,0 +1,866 @@
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
; Interpolation = [DI+1]*Error + [DI]*(1-Error)
; = [DI+1]*Error + [DI] - [DI]*Error
; = Error*([DI+1]-[DI]) + [DI]
Get8BitIWaveform Macro
MovSX EBX, Byte Ptr [ES:DI] ; 5
MovSX EAX, Byte Ptr [ES:DI+1] ; 5
Sub EAX, EBX ; 2
IMul EAX, ECX
SAR EAX, 16 ; 3
Add BL, AL ; 1
EndM
Get16BitIWaveform Macro
MovSX EBX, Byte Ptr [ES:EDI+EDI+1] ; 5
MovSX EAX, Byte Ptr [ES:EDI+EDI+3] ; 5
Sub EAX, EBX ; 2
IMul EAX, ECX
SAR EAX, 16 ; 3
Add BL, AL ; 1
EndM
M12Mix8ISingle Macro Index
M12Mix8ISingle&Index&:
Get8BitIWaveform
M12Mix8ISingleVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR
Mov AX, [BX]
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8ICentral Macro Index
M12Mix8ICentral&Index&:
Get8BitIWaveform
M12Mix8ICentralVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR ;; 1
Mov AX, [BX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8ISurround Macro Index
M12Mix8ISurround&Index&:
Get8BitIWaveform
M12Mix8ISurroundVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR ;; 1
Mov AX, [BX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8IPanned Macro Index
M12Mix8IPanned&Index&:
Get8BitIWaveform
M12Mix8IPannedVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix8IPannedRightVolumeOffset&Index& EQU $+3
Mov AX, [BX+1200h]
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16ISingle Macro Index
M12Mix16ISingle&Index&:
Get16BitIWaveForm
M12Mix16ISingleVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR
Mov AX, [BX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
EndM
M12Mix16ICentral Macro Index
M12Mix16ICentral&Index&:
Get16BitIWaveform
M12Mix16ICentralVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR
Mov AX, [BX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16ISurround Macro Index
M12Mix16ISurround&Index&:
Get16BitIWaveform
M12Mix16ISurroundVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR
Mov AX, [BX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
; Panned output
M12Mix16IPanned Macro Index
M12Mix16IPanned&Index&:
Get16BitIWaveform
M12Mix16IPannedVolume&Index& EQU $+1
Mov BH, 12h
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix16IPannedRightVolumeOffset&Index& EQU $+3
Mov AX, [BX+1200h]
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single8BitIOffsetTable Label Word
IndexCounter = 15
M12Mix8ISingleOffset Macro Index
DW Offset M12Mix8ISingle&Index&
EndM
REPT 16
M12Mix8ISingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single8BitI
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Single8BitIOffsetTable+BX]
M12Mix8ISingle 0
M12Mix8ISingle 1
M12Mix8ISingle 2
M12Mix8ISingle 3
M12Mix8ISingle 4
M12Mix8ISingle 5
M12Mix8ISingle 6
M12Mix8ISingle 7
M12Mix8ISingle 8
M12Mix8ISingle 9
M12Mix8ISingle 10
M12Mix8ISingle 11
M12Mix8ISingle 12
M12Mix8ISingle 13
M12Mix8ISingle 14
M12Mix8ISingle 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8ISingle0
Ret
EndP Mix12Single8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left8BitI
Mov AL, [SI+0Eh]
PreMix12Left8BitI1:
IndexCounter = 0
PreMix12Single8BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix8ISingleVolume&Index&], AL
EndM
REPT 16
PreMix12Single8BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Left8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right8BitI
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Jmp PreMix12Left8BitI1
Ret
EndP PreMix12Right8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central8BitIOffsetTable Label Word
IndexCounter = 15
M12Mix8ICentralOffset Macro Index
DW Offset M12Mix8ICentral&Index&
EndM
REPT 16
M12Mix8ICentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central8BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Central8BitIOffsetTable+BX]
M12Mix8ICentral 0
M12Mix8ICentral 1
M12Mix8ICentral 2
M12Mix8ICentral 3
M12Mix8ICentral 4
M12Mix8ICentral 5
M12Mix8ICentral 6
M12Mix8ICentral 7
M12Mix8ICentral 8
M12Mix8ICentral 9
M12Mix8ICentral 10
M12Mix8ICentral 11
M12Mix8ICentral 12
M12Mix8ICentral 13
M12Mix8ICentral 14
M12Mix8ICentral 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8ICentral0
Ret
EndP Mix12Central8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central8BitI
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12Central8BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix8ICentralVolume&Index&], AL
EndM
REPT 16
PreMix12Central8BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Central8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround8BitIOffsetTable Label Word
IndexCounter = 15
M12Mix8ISurroundOffset Macro Index
DW Offset M12Mix8ISurround&Index&
EndM
REPT 16
M12Mix8ISurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround8BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Surround8BitIOffsetTable+BX]
M12Mix8ISurround 0
M12Mix8ISurround 1
M12Mix8ISurround 2
M12Mix8ISurround 3
M12Mix8ISurround 4
M12Mix8ISurround 5
M12Mix8ISurround 6
M12Mix8ISurround 7
M12Mix8ISurround 8
M12Mix8ISurround 9
M12Mix8ISurround 10
M12Mix8ISurround 11
M12Mix8ISurround 12
M12Mix8ISurround 13
M12Mix8ISurround 14
M12Mix8ISurround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8ISurround0
Ret
EndP Mix12Surround8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround8BitI
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12Surround8BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix8ISurroundVolume&Index&], AL
EndM
REPT 16
PreMix12Surround8BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Surround8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned8BitIOffsetTable Label Word
IndexCounter = 15
M12Mix8IPannedOffset Macro Index
DW Offset M12Mix8IPanned&Index&
EndM
REPT 16
M12Mix8IPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned8BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Panned8BitIOffsetTable+BX]
M12Mix8IPanned 0
M12Mix8IPanned 1
M12Mix8IPanned 2
M12Mix8IPanned 3
M12Mix8IPanned 4
M12Mix8IPanned 5
M12Mix8IPanned 6
M12Mix8IPanned 7
M12Mix8IPanned 8
M12Mix8IPanned 9
M12Mix8IPanned 10
M12Mix8IPanned 11
M12Mix8IPanned 12
M12Mix8IPanned 13
M12Mix8IPanned 14
M12Mix8IPanned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8IPanned0
Ret
EndP Mix12Panned8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned8BitI
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12Panned8BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix8IPannedVolume&Index&], AL
EndM
REPT 16
PreMix12Panned8BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Mov AL, [SI+0Ch]
Sub AL, [SI+0Eh]
Add AL, AL
IndexCounter = 0
PreMix12Panned8BitIMacro2 Macro Index
Mov Byte Ptr [CS:M12Mix8IPannedRightVolumeOffset&Index&], AL
EndM
REPT 16
PreMix12Panned8BitIMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned8BitI
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single16BitIOffsetTable Label Word
IndexCounter = 15
M12Mix16ISingleOffset Macro Index
DW Offset M12Mix16ISingle&Index&
EndM
REPT 16
M12Mix16ISingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single16BitI
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Single16BitIOffsetTable+BX]
M12Mix16ISingle 0
M12Mix16ISingle 1
M12Mix16ISingle 2
M12Mix16ISingle 3
M12Mix16ISingle 4
M12Mix16ISingle 5
M12Mix16ISingle 6
M12Mix16ISingle 7
M12Mix16ISingle 8
M12Mix16ISingle 9
M12Mix16ISingle 10
M12Mix16ISingle 11
M12Mix16ISingle 12
M12Mix16ISingle 13
M12Mix16ISingle 14
M12Mix16ISingle 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16ISingle0
Ret
EndP Mix12Single16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left16BitI
Mov AL, [SI+0Eh]
PreMix12Left16BitI1:
IndexCounter = 0
PreMix12Single16BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix16ISingleVolume&Index&], AL
EndM
REPT 16
PreMix12Single16BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Left16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right16BitI
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Jmp PreMix12Left16BitI1
EndP PreMix12Right16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central16BitIOffsetTable Label Word
IndexCounter = 15
M12Mix16ICentralOffset Macro Index
DW Offset M12Mix16ICentral&Index&
EndM
REPT 16
M12Mix16ICentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central16BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Central16BitIOffsetTable+BX]
M12Mix16ICentral 0
M12Mix16ICentral 1
M12Mix16ICentral 2
M12Mix16ICentral 3
M12Mix16ICentral 4
M12Mix16ICentral 5
M12Mix16ICentral 6
M12Mix16ICentral 7
M12Mix16ICentral 8
M12Mix16ICentral 9
M12Mix16ICentral 10
M12Mix16ICentral 11
M12Mix16ICentral 12
M12Mix16ICentral 13
M12Mix16ICentral 14
M12Mix16ICentral 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16ICentral0
Ret
EndP Mix12Central16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central16BitI
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12Central16BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix16ICentralVolume&Index&], AL
EndM
REPT 16
PreMix12Central16BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Central16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround16BitIOffsetTable Label Word
IndexCounter = 15
M12Mix16ISurroundOffset Macro Index
DW Offset M12Mix16ISurround&Index&
EndM
REPT 16
M12Mix16ISurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround16BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Surround16BitIOffsetTable+BX]
M12Mix16ISurround 0
M12Mix16ISurround 1
M12Mix16ISurround 2
M12Mix16ISurround 3
M12Mix16ISurround 4
M12Mix16ISurround 5
M12Mix16ISurround 6
M12Mix16ISurround 7
M12Mix16ISurround 8
M12Mix16ISurround 9
M12Mix16ISurround 10
M12Mix16ISurround 11
M12Mix16ISurround 12
M12Mix16ISurround 13
M12Mix16ISurround 14
M12Mix16ISurround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16ISurround0
Ret
EndP Mix12Surround16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround16BitI
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12Surround16BitIMacro Macro Index
Mov Byte Ptr [CS:M12Mix16ISurroundVolume&Index&], AL
EndM
REPT 16
PreMix12Surround16BitIMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Surround16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned16BitIOffsetTable Label Word
IndexCounter = 15
M12Mix16IPannedOffset Macro Index
DW Offset M12Mix16IPanned&Index&
EndM
REPT 16
M12Mix16IPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned16BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix12Panned16BitIOffsetTable+BX]
Pan12BitI16Loop:
M12Mix16IPanned 0
M12Mix16IPanned 1
M12Mix16IPanned 2
M12Mix16IPanned 3
M12Mix16IPanned 4
M12Mix16IPanned 5
M12Mix16IPanned 6
M12Mix16IPanned 7
M12Mix16IPanned 8
M12Mix16IPanned 9
M12Mix16IPanned 10
M12Mix16IPanned 11
M12Mix16IPanned 12
M12Mix16IPanned 13
M12Mix16IPanned 14
M12Mix16IPanned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ Pan12BitI16Loop
Ret
EndP Mix12Panned16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned16BitI
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12PannedMacro Macro Index
Mov Byte Ptr [CS:M12Mix16IPannedVolume&Index&], AL
EndM
REPT 16
PreMix12PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Mov AL, [SI+0Ch]
Sub AL, [SI+0Eh]
Add AL, AL
IndexCounter = 0
PreMix12PannedMacro2 Macro Index
Mov Byte Ptr [CS:M12Mix16IPannedRightVolumeOffset&Index&], AL
EndM
REPT 16
PreMix12PannedMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

832
SoundDrivers/M12BITST.MIX Executable file
View File

@ -0,0 +1,832 @@
; 12 bit mixing routines, using Stack Segment.
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
M12Mix8Single Macro Index
M12Mix8Single&Index&:
Add ERROR, DELTAERROR ;; 1
Mov BL, [SP] ;; 1
AdC DI, DELTAOFFSET ;; 1
Mov AX, [EBX+EBX] ;; 2
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8Central Macro Index
M12Mix8Central&Index&:
Mov BL, [SP] ;; 2
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
M12Mix8Surround Macro Index
M12Mix8Surround&Index&:
Mov BL, [SP] ;; 2
Add ERROR, DELTAERROR ;; 1
Mov AX, [EBX+EBX] ;; 2
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX ;; 3
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX ;; 3
EndM
; Panned output
M12Mix8PannedNext Macro Index
M12Mix8PannedVolume&Index& EQU $+1
Mov BH, 12h
Mov BL, [SP]
EndM
M12Mix8Panned Macro Index
M12Mix8Panned&Index&:
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix8PannedRightVolumeOffset&Index& EQU $+3
Mov AX, [BX+1200h]
M12Mix8PannedNext %(Index+1)
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16Single Macro Index
M12Mix16Single&Index&:
Mov BL, [ES:EDI+EDI+1]
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
EndM
M12Mix16Central Macro Index
M12Mix16Central&Index&:
Mov BL, [ES:EDI+EDI+1]
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
M12Mix16Surround Macro Index
M12Mix16Surround&Index&:
Mov BL, [ES:EDI+EDI+1]
Add ERROR, DELTAERROR
Mov AX, [EBX+EBX]
AdC DI, DELTAOFFSET
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
Add [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
; Panned output
M12Mix16PannedNext Macro Index
M12Mix16PannedVolume&Index& EQU $+1
Mov BH, 12h
Mov BL, [ES:EDI+EDI+1]
EndM
M12Mix16Panned Macro Index
M12Mix16Panned&Index&:
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+(Index-15)*MixResolution/4+EXTRAOFFSET], AX
M12Mix16PannedRightVolumeOffset&Index& EQU $+3
Mov AX, [BX+1200h]
M12Mix16PannedNext %(Index+1)
Sub [SI+(Index-15)*MixResolution/4+MixResolution/8+EXTRAOFFSET], AX
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8SingleOffset Macro Index
DW Offset M12Mix8Single&Index&
EndM
REPT 16
M12Mix8SingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
ALIGN 2
OldStackSegment DW 0
OldStackPointer DW 0
MixingOffset DW 0
Proc Mix12Single8Bit
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Mov AX, [CS:Mix12BitSingle8BitOffsetTable+BX]
Mov [CS:OldStackSegment], SS
Mov [CS:OldStackPointer], SP
Mov [CS:MixingOffset], AX
M12Single8BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
Mov ESP, EDI
Jmp [CS:MixingOffset]
M12Mix8Single 0
M12Mix8Single 1
M12Mix8Single 2
M12Mix8Single 3
M12Mix8Single 4
M12Mix8Single 5
M12Mix8Single 6
M12Mix8Single 7
M12Mix8Single 8
M12Mix8Single 9
M12Mix8Single 10
M12Mix8Single 11
M12Mix8Single 12
M12Mix8Single 13
M12Mix8Single 14
M12Mix8Single 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Single0
Mov SS, [CS:StackSegment]
Mov SP, [CS:StackPointer]
Ret
EndP Mix12Single8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left8Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Single8BitVolume], AL
Ret
EndP PreMix12Left8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right8Bit
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Mov Byte Ptr [CS:M12Single8BitVolume], AL
Ret
EndP PreMix12Right8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8CentralOffset Macro Index
DW Offset M12Mix8Central&Index&
EndM
REPT 16
M12Mix8CentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Mov AX, [CS:Mix12BitSingle8BitOffsetTable+BX]
Mov [CS:OldStackSegment], SS
Mov [CS:OldStackPointer], SP
Mov [CS:MixingOffset], AX
M12Central8BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
Mov ESP, EDI
Jmp [CS:MixingOffset]
M12Mix8Central 0
M12Mix8Central 1
M12Mix8Central 2
M12Mix8Central 3
M12Mix8Central 4
M12Mix8Central 5
M12Mix8Central 6
M12Mix8Central 7
M12Mix8Central 8
M12Mix8Central 9
M12Mix8Central 10
M12Mix8Central 11
M12Mix8Central 12
M12Mix8Central 13
M12Mix8Central 14
M12Mix8Central 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Central0
Mov SS, [CS:StackSegment]
Mov SP, [CS:StackPointer]
Ret
EndP Mix12Central8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central8Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Central8BitVolume], AL
Ret
EndP PreMix12Central8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8SurroundOffset Macro Index
DW Offset M12Mix8Surround&Index&
EndM
REPT 16
M12Mix8SurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Surround8BitOffsetTable+BX]
M12Surround8BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix8Surround 0
M12Mix8Surround 1
M12Mix8Surround 2
M12Mix8Surround 3
M12Mix8Surround 4
M12Mix8Surround 5
M12Mix8Surround 6
M12Mix8Surround 7
M12Mix8Surround 8
M12Mix8Surround 9
M12Mix8Surround 10
M12Mix8Surround 11
M12Mix8Surround 12
M12Mix8Surround 13
M12Mix8Surround 14
M12Mix8Surround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Surround0
Ret
EndP Mix12Surround8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround8Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Surround8BitVolume], AL
Ret
EndP PreMix12Surround8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned8BitOffsetTable Label Word
IndexCounter = 15
M12Mix8PannedOffset Macro Index
DW Offset M12Mix8Panned&Index&
EndM
REPT 16
M12Mix8PannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Panned8BitOffsetTable+BX]
M12Mix8PannedNext 0
RetN
M12Mix8Panned 0
M12Mix8Panned 1
M12Mix8Panned 2
M12Mix8Panned 3
M12Mix8Panned 4
M12Mix8Panned 5
M12Mix8Panned 6
M12Mix8Panned 7
M12Mix8Panned 8
M12Mix8Panned 9
M12Mix8Panned 10
M12Mix8Panned 11
M12Mix8Panned 12
M12Mix8Panned 13
M12Mix8Panned 14
M12Mix8Panned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix8Panned0
Ret
EndP Mix12Panned8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned8Bit
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12PannedMacro Macro Index
Mov Byte Ptr [CS:M12Mix8PannedVolume&Index&], AL
EndM
REPT 17
PreMix12PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Mov AL, [SI+0Ch]
Sub AL, [SI+0Eh]
Add AL, AL
IndexCounter = 0
PreMix12PannedMacro2 Macro Index
Mov Byte Ptr [CS:M12Mix8PannedRightVolumeOffset&Index&], AL
EndM
REPT 16
PreMix12PannedMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned8Bit
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix12Single16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16SingleOffset Macro Index
DW Offset M12Mix16Single&Index&
EndM
REPT 16
M12Mix16SingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Single16Bit
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Single16BitOffsetTable+BX]
M12Single16BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix16Single 0
M12Mix16Single 1
M12Mix16Single 2
M12Mix16Single 3
M12Mix16Single 4
M12Mix16Single 5
M12Mix16Single 6
M12Mix16Single 7
M12Mix16Single 8
M12Mix16Single 9
M12Mix16Single 10
M12Mix16Single 11
M12Mix16Single 12
M12Mix16Single 13
M12Mix16Single 14
M12Mix16Single 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16Single0
Ret
EndP Mix12Single16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Left16Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Single16BitVolume], AL
Ret
EndP PreMix12Left16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Right16Bit
Add MixBufferOffset, MixResolution/8
Mov AL, [SI+0Ch]
Mov Byte Ptr [CS:M12Single16BitVolume], AL
Ret
EndP PreMix12Right16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Central16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16CentralOffset Macro Index
DW Offset M12Mix16Central&Index&
EndM
REPT 16
M12Mix16CentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Central16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Central16BitOffsetTable+BX]
M12Central16BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix16Central 0
M12Mix16Central 1
M12Mix16Central 2
M12Mix16Central 3
M12Mix16Central 4
M12Mix16Central 5
M12Mix16Central 6
M12Mix16Central 7
M12Mix16Central 8
M12Mix16Central 9
M12Mix16Central 10
M12Mix16Central 11
M12Mix16Central 12
M12Mix16Central 13
M12Mix16Central 14
M12Mix16Central 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16Central0
Ret
EndP Mix12Central16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Central16Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Central16BitVolume], AL
Ret
EndP PreMix12Central16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Surround16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16SurroundOffset Macro Index
DW Offset M12Mix16Surround&Index&
EndM
REPT 16
M12Mix16SurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Surround16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Surround16BitOffsetTable+BX]
M12Surround16BitVolume EQU $+3
Mov EBX, 0 ; Set BH = volume
RetN
M12Mix16Surround 0
M12Mix16Surround 1
M12Mix16Surround 2
M12Mix16Surround 3
M12Mix16Surround 4
M12Mix16Surround 5
M12Mix16Surround 6
M12Mix16Surround 7
M12Mix16Surround 8
M12Mix16Surround 9
M12Mix16Surround 10
M12Mix16Surround 11
M12Mix16Surround 12
M12Mix16Surround 13
M12Mix16Surround 14
M12Mix16Surround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M12Mix16Surround0
Ret
EndP Mix12Surround16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Surround16Bit
Mov AL, [SI+0Eh]
Mov Byte Ptr [CS:M12Surround16BitVolume], AL
Ret
EndP PreMix12Surround16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix12Panned16BitOffsetTable Label Word
IndexCounter = 15
M12Mix16PannedOffset Macro Index
DW Offset M12Mix16Panned&Index&
EndM
REPT 16
M12Mix16PannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix12Panned16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Push [CS:Mix12Panned16BitOffsetTable+BX]
M12Mix16PannedNext 0
RetN
Pan12Bit16Loop:
M12Mix16PannedNext 16
M12Mix16Panned 0
M12Mix16Panned 1
M12Mix16Panned 2
M12Mix16Panned 3
M12Mix16Panned 4
M12Mix16Panned 5
M12Mix16Panned 6
M12Mix16Panned 7
M12Mix16Panned 8
M12Mix16Panned 9
M12Mix16Panned 10
M12Mix16Panned 11
M12Mix16Panned 12
M12Mix16Panned 13
M12Mix16Panned 14
M12Mix16Panned15:
Add BX, BX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov AX, [BX]
Sub [SI+EXTRAOFFSET], AX
M12Mix16PannedRightVolumeOffset15 EQU $+3
Mov AX, [BX+1200h]
Sub [SI+MixResolution/8+EXTRAOFFSET], AX
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ Pan12Bit16Loop
Ret
EndP Mix12Panned16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix12Panned16Bit
Mov AL, [SI+0Eh]
IndexCounter = 0
PreMix12PannedMacro Macro Index
Mov Byte Ptr [CS:M12Mix16PannedVolume&Index&], AL
EndM
REPT 17
PreMix12PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Mov AL, [SI+0Ch]
Sub AL, [SI+0Eh]
Add AL, AL
IndexCounter = 0
PreMix12PannedMacro2 Macro Index
Mov Byte Ptr [CS:M12Mix16PannedRightVolumeOffset&Index&], AL
EndM
REPT 16
PreMix12PannedMacro2 %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix12Panned16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

2275
SoundDrivers/M16.ASM Executable file

File diff suppressed because it is too large Load Diff

5
SoundDrivers/M16.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 m16
tlink /3 m16
execom m16 itmaes16.drv
copy itmaes16.drv ..

2271
SoundDrivers/M32.ASM Executable file

File diff suppressed because it is too large Load Diff

5
SoundDrivers/M32.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 m32
tlink /3 m32
execom m32 itmaes32.drv
copy itmaes32.drv ..

49
SoundDrivers/M32BIT.INC Executable file
View File

@ -0,0 +1,49 @@
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix32Left8Bit, MFS8Bit, MBS8Bit, Mix32Single8Bit
DW Offset MixForwardsLoop, PreMix32Left8Bit, MFS8Bit, MBS8Bit, Mix32Single8Bit
DW Offset MixPingPongLoop, PreMix32Left8Bit, MFS8Bit, MBS8Bit, Mix32Single8Bit
; Right only
DW Offset MixNoLoop, PreMix32Right8Bit, MFS8Bit, MBS8Bit, Mix32Single8Bit
DW Offset MixForwardsLoop, PreMix32Right8Bit, MFS8Bit, MBS8Bit, Mix32Single8Bit
DW Offset MixPingPongLoop, PreMix32Right8Bit, MFS8Bit, MBS8Bit, Mix32Single8Bit
; Central
DW Offset MixNoLoop, PreMix32Central8Bit, MFS8Bit, MBS8Bit, Mix32Central8Bit
DW Offset MixForwardsLoop, PreMix32Central8Bit, MFS8Bit, MBS8Bit, Mix32Central8Bit
DW Offset MixPingPongLoop, PreMix32Central8Bit, MFS8Bit, MBS8Bit, Mix32Central8Bit
; Stereo
DW Offset MixNoLoop, PreMix32Panned8Bit, MFS8Bit, MBS8Bit, Mix32Panned8Bit
DW Offset MixForwardsLoop, PreMix32Panned8Bit, MFS8Bit, MBS8Bit, Mix32Panned8Bit
DW Offset MixPingPongLoop, PreMix32Panned8Bit, MFS8Bit, MBS8Bit, Mix32Panned8Bit
; Surround
DW Offset MixNoLoop, PreMix32Surround8Bit, MFS8Bit, MBS8Bit, Mix32Surround8Bit
DW Offset MixForwardsLoop, PreMix32Surround8Bit, MFS8Bit, MBS8Bit, Mix32Surround8Bit
DW Offset MixPingPongLoop, PreMix32Surround8Bit, MFS8Bit, MBS8Bit, Mix32Surround8Bit
; 16 bit tables
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix32Left16Bit, MFS16Bit, MBS16Bit, Mix32Single16Bit
DW Offset MixForwardsLoop, PreMix32Left16Bit, MFS16Bit, MBS16Bit, Mix32Single16Bit
DW Offset MixPingPongLoop, PreMix32Left16Bit, MFS16Bit, MBS16Bit, Mix32Single16Bit
; Right only
DW Offset MixNoLoop, PreMix32Right16Bit, MFS16Bit, MBS16Bit, Mix32Single16Bit
DW Offset MixForwardsLoop, PreMix32Right16Bit, MFS16Bit, MBS16Bit, Mix32Single16Bit
DW Offset MixPingPongLoop, PreMix32Right16Bit, MFS16Bit, MBS16Bit, Mix32Single16Bit
; Central
DW Offset MixNoLoop, PreMix32Central16Bit, MFS16Bit, MBS16Bit, Mix32Central16Bit
DW Offset MixForwardsLoop, PreMix32Central16Bit, MFS16Bit, MBS16Bit, Mix32Central16Bit
DW Offset MixPingPongLoop, PreMix32Central16Bit, MFS16Bit, MBS16Bit, Mix32Central16Bit
; Stereo
DW Offset MixNoLoop, PreMix32Panned16Bit, MFS16Bit, MBS16Bit, Mix32Panned16Bit
DW Offset MixForwardsLoop, PreMix32Panned16Bit, MFS16Bit, MBS16Bit, Mix32Panned16Bit
DW Offset MixPingPongLoop, PreMix32Panned16Bit, MFS16Bit, MBS16Bit, Mix32Panned16Bit
; Surround
DW Offset MixNoLoop, PreMix32Surround16Bit, MFS16Bit, MBS16Bit, Mix32Surround16Bit
DW Offset MixForwardsLoop, PreMix32Surround16Bit, MFS16Bit, MBS16Bit, Mix32Surround16Bit
DW Offset MixPingPongLoop, PreMix32Surround16Bit, MFS16Bit, MBS16Bit, Mix32Surround16Bit

803
SoundDrivers/M32BIT.MIX Executable file
View File

@ -0,0 +1,803 @@
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
M32Mix8Single Macro Index
M32Mix8Single&Index&:
MovSX EBX, Byte Ptr [ES:DI]
M32Mix8SingleVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
ShL EAX, 8
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
EndM
M32Mix8Central Macro Index
M32Mix8Central&Index&:
MovSX EBX, Byte Ptr [ES:DI] ;; 4
M32Mix8CentralVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
ShL EAX, 8 ;; 4
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 4
Sub [SI+(Index-15)*8+4], EAX ;; 4
EndM
M32Mix8Surround Macro Index
M32Mix8Surround&Index&:
MovSX EBX, Byte Ptr [ES:DI] ;; 4
M32Mix8SurroundVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
ShL EAX, 8 ;; 4
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 4
Add [SI+(Index-15)*8+4], EAX ;; 4
EndM
; Panned output
M32Mix8Panned Macro Index
M32Mix8Panned&Index&:
MovSX EBX, Byte Ptr [ES:DI] ;; 4
M32Mix8LeftVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
M32Mix8RightVolume&Index& EQU $+3
IMul EBX, EBX, 8000h
ShL EAX, 8 ;; 4
ShL EBX, 8 ;; 4
Sub [SI+(Index-15)*8], EAX ;; 4
Sub [SI+(Index-15)*8+4], EBX ;; 4
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
EndM
M32Mix16Single Macro Index
M32Mix16Single&Index&:
MovSX EBX, Word Ptr [ES:EDI+EDI]
M32Mix16SingleVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
EndM
M32Mix16Central Macro Index
M32Mix16Central&Index&:
MovSX EBX, Word Ptr [ES:EDI+EDI]
M32Mix16CentralVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
Sub [SI+(Index-15)*8+4], EAX ;; 3
EndM
M32Mix16Surround Macro Index
M32Mix16Surround&Index&:
MovSX EBX, Word Ptr [ES:EDI+EDI]
M32Mix16SurroundVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
Add [SI+(Index-15)*8+4], EAX ;; 3
EndM
; Panned output
M32Mix16Panned Macro Index
M32Mix16Panned&Index&:
MovSX EBX, Word Ptr [ES:EDI+EDI]
M32Mix16LeftVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
M32Mix16RightVolume&Index& EQU $+3
IMul EBX, EBX, 8000h
Sub [SI+(Index-15)*8], EAX
Sub [SI+(Index-15)*8+4], EBX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix32Single8BitOffsetTable Label Word
IndexCounter = 15
M32Mix8SingleOffset Macro Index
DW Offset M32Mix8Single&Index&
EndM
REPT 16
M32Mix8SingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Single8Bit
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Single8BitOffsetTable+BX]
M32Mix8Single 0
M32Mix8Single 1
M32Mix8Single 2
M32Mix8Single 3
M32Mix8Single 4
M32Mix8Single 5
M32Mix8Single 6
M32Mix8Single 7
M32Mix8Single 8
M32Mix8Single 9
M32Mix8Single 10
M32Mix8Single 11
M32Mix8Single 12
M32Mix8Single 13
M32Mix8Single 14
M32Mix8Single 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8Single0
Ret
EndP Mix32Single8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Left8Bit
Mov AX, [SI+0Eh]
PreMix32Left8Bit1:
IndexCounter = 0
PreMix32SingleMacro Macro Index
Mov Word Ptr [CS:M32Mix8SingleVolume&Index&], AX
EndM
REPT 16
PreMix32SingleMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Left8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Right8Bit
Add MixBufferOffset, MixResolution/8
Mov AX, [SI+0Ch]
Jmp PreMix32Left8Bit1
EndP PreMix32Right8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Central8BitOffsetTable Label Word
IndexCounter = 15
M32Mix8CentralOffset Macro Index
DW Offset M32Mix8Central&Index&
EndM
REPT 16
M32Mix8CentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Central8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Central8BitOffsetTable+BX]
M32Mix8Central 0
M32Mix8Central 1
M32Mix8Central 2
M32Mix8Central 3
M32Mix8Central 4
M32Mix8Central 5
M32Mix8Central 6
M32Mix8Central 7
M32Mix8Central 8
M32Mix8Central 9
M32Mix8Central 10
M32Mix8Central 11
M32Mix8Central 12
M32Mix8Central 13
M32Mix8Central 14
M32Mix8Central 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8Central0
Ret
EndP Mix32Central8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Central8Bit
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32CentralMacro Macro Index
Mov Word Ptr [CS:M32Mix8CentralVolume&Index&], AX
EndM
REPT 16
PreMix32CentralMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Central8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Surround8BitOffsetTable Label Word
IndexCounter = 15
M32Mix8SurroundOffset Macro Index
DW Offset M32Mix8Surround&Index&
EndM
REPT 16
M32Mix8SurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Surround8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Surround8BitOffsetTable+BX]
M32Mix8Surround 0
M32Mix8Surround 1
M32Mix8Surround 2
M32Mix8Surround 3
M32Mix8Surround 4
M32Mix8Surround 5
M32Mix8Surround 6
M32Mix8Surround 7
M32Mix8Surround 8
M32Mix8Surround 9
M32Mix8Surround 10
M32Mix8Surround 11
M32Mix8Surround 12
M32Mix8Surround 13
M32Mix8Surround 14
M32Mix8Surround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8Surround0
Ret
EndP Mix32Surround8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Surround8Bit
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32SurroundMacro Macro Index
Mov Word Ptr [CS:M32Mix8SurroundVolume&Index&], AX
EndM
REPT 16
PreMix32SurroundMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Surround8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Panned8BitOffsetTable Label Word
IndexCounter = 15
M32Mix8PannedOffset Macro Index
DW Offset M32Mix8Panned&Index&
EndM
REPT 16
M32Mix8PannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Panned8Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Panned8BitOffsetTable+BX]
M32Mix8Panned 0
M32Mix8Panned 1
M32Mix8Panned 2
M32Mix8Panned 3
M32Mix8Panned 4
M32Mix8Panned 5
M32Mix8Panned 6
M32Mix8Panned 7
M32Mix8Panned 8
M32Mix8Panned 9
M32Mix8Panned 10
M32Mix8Panned 11
M32Mix8Panned 12
M32Mix8Panned 13
M32Mix8Panned 14
M32Mix8Panned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8Panned0
Ret
EndP Mix32Panned8Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Panned8Bit
Mov AX, [SI+0Eh] ; Left
Mov BX, [SI+0Ch] ; Right
IndexCounter = 0
PreMix32PannedMacro Macro Index
Mov Word Ptr [CS:M32Mix8LeftVolume&Index&], AX
Mov Word Ptr [CS:M32Mix8RightVolume&Index&], BX
EndM
REPT 16
PreMix32PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Panned8Bit
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix32Single16BitOffsetTable Label Word
IndexCounter = 15
M32Mix16SingleOffset Macro Index
DW Offset M32Mix16Single&Index&
EndM
REPT 16
M32Mix16SingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Single16Bit
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Single16BitOffsetTable+BX]
M32Mix16Single 0
M32Mix16Single 1
M32Mix16Single 2
M32Mix16Single 3
M32Mix16Single 4
M32Mix16Single 5
M32Mix16Single 6
M32Mix16Single 7
M32Mix16Single 8
M32Mix16Single 9
M32Mix16Single 10
M32Mix16Single 11
M32Mix16Single 12
M32Mix16Single 13
M32Mix16Single 14
M32Mix16Single 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix16Single0
Ret
EndP Mix32Single16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Left16Bit
Mov AX, [SI+0Eh] ; Left
PreMix32Left16Bit1:
IndexCounter = 0
PreMix32SingleMacro Macro Index
Mov Word Ptr [CS:M32Mix16SingleVolume&Index&], AX
EndM
REPT 16
PreMix32SingleMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Left16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Right16Bit
Add MixBufferOffset, MixResolution/8
Mov AX, [SI+0Ch]
Jmp PreMix32Left16Bit1
Ret
EndP PreMix32Right16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Central16BitOffsetTable Label Word
IndexCounter = 15
M32Mix16CentralOffset Macro Index
DW Offset M32Mix16Central&Index&
EndM
REPT 16
M32Mix16CentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Central16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Central16BitOffsetTable+BX]
M32Mix16Central 0
M32Mix16Central 1
M32Mix16Central 2
M32Mix16Central 3
M32Mix16Central 4
M32Mix16Central 5
M32Mix16Central 6
M32Mix16Central 7
M32Mix16Central 8
M32Mix16Central 9
M32Mix16Central 10
M32Mix16Central 11
M32Mix16Central 12
M32Mix16Central 13
M32Mix16Central 14
M32Mix16Central 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix16Central0
Ret
EndP Mix32Central16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Central16Bit
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32CentralMacro Macro Index
Mov Word Ptr [CS:M32Mix16CentralVolume&Index&], AX
EndM
REPT 16
PreMix32CentralMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Central16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Surround16BitOffsetTable Label Word
IndexCounter = 15
M32Mix16SurroundOffset Macro Index
DW Offset M32Mix16Surround&Index&
EndM
REPT 16
M32Mix16SurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Surround16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Surround16BitOffsetTable+BX]
M32Mix16Surround 0
M32Mix16Surround 1
M32Mix16Surround 2
M32Mix16Surround 3
M32Mix16Surround 4
M32Mix16Surround 5
M32Mix16Surround 6
M32Mix16Surround 7
M32Mix16Surround 8
M32Mix16Surround 9
M32Mix16Surround 10
M32Mix16Surround 11
M32Mix16Surround 12
M32Mix16Surround 13
M32Mix16Surround 14
M32Mix16Surround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix16Surround0
Ret
EndP Mix32Surround16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Surround16Bit
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32SurroundMacro Macro Index
Mov Word Ptr [CS:M32Mix16SurroundVolume&Index&], AX
EndM
REPT 16
PreMix32SurroundMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Surround16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Panned16BitOffsetTable Label Word
IndexCounter = 15
M32Mix16PannedOffset Macro Index
DW Offset M32Mix16Panned&Index&
EndM
REPT 16
M32Mix16PannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Panned16Bit
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Panned16BitOffsetTable+BX]
Pan32Bit16Loop:
M32Mix16Panned 0
M32Mix16Panned 1
M32Mix16Panned 2
M32Mix16Panned 3
M32Mix16Panned 4
M32Mix16Panned 5
M32Mix16Panned 6
M32Mix16Panned 7
M32Mix16Panned 8
M32Mix16Panned 9
M32Mix16Panned 10
M32Mix16Panned 11
M32Mix16Panned 12
M32Mix16Panned 13
M32Mix16Panned 14
M32Mix16Panned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ Pan32Bit16Loop
Ret
EndP Mix32Panned16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Panned16Bit
Mov AX, [SI+0Eh] ; Left
Mov BX, [SI+0Ch] ; Right
IndexCounter = 0
PreMix32PannedMacro Macro Index
Mov Word Ptr [CS:M32Mix16LeftVolume&Index&], AX
Mov Word Ptr [CS:M32Mix16RightVolume&Index&], BX
EndM
REPT 16
PreMix32PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Panned16Bit
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

6
SoundDrivers/M32BITFF.MIX Executable file
View File

@ -0,0 +1,6 @@
;
; Floating point mixing routines
; DS:0 = a, DS:4 = b, DS:8 = c
; DS:10h = os1, DS:18h = OS2
;

49
SoundDrivers/M32BITI.INC Executable file
View File

@ -0,0 +1,49 @@
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix32Left8BitI, MFS8Bit, MBS8Bit, Mix32Single8BitI
DW Offset MixForwardsLoop, PreMix32Left8BitI, MFS8Bit, MBS8Bit, Mix32Single8BitI
DW Offset MixPingPongLoop, PreMix32Left8BitI, MFS8Bit, MBS8Bit, Mix32Single8BitI
; Right only
DW Offset MixNoLoop, PreMix32Right8BitI, MFS8Bit, MBS8Bit, Mix32Single8BitI
DW Offset MixForwardsLoop, PreMix32Right8BitI, MFS8Bit, MBS8Bit, Mix32Single8BitI
DW Offset MixPingPongLoop, PreMix32Right8BitI, MFS8Bit, MBS8Bit, Mix32Single8BitI
; Central
DW Offset MixNoLoop, PreMix32Central8BitI, MFS8Bit, MBS8Bit, Mix32Central8BitI
DW Offset MixForwardsLoop, PreMix32Central8BitI, MFS8Bit, MBS8Bit, Mix32Central8BitI
DW Offset MixPingPongLoop, PreMix32Central8BitI, MFS8Bit, MBS8Bit, Mix32Central8BitI
; Stereo
DW Offset MixNoLoop, PreMix32Panned8BitI, MFS8Bit, MBS8Bit, Mix32Panned8BitI
DW Offset MixForwardsLoop, PreMix32Panned8BitI, MFS8Bit, MBS8Bit, Mix32Panned8BitI
DW Offset MixPingPongLoop, PreMix32Panned8BitI, MFS8Bit, MBS8Bit, Mix32Panned8BitI
; Surround
DW Offset MixNoLoop, PreMix32Surround8BitI, MFS8Bit, MBS8Bit, Mix32Surround8BitI
DW Offset MixForwardsLoop, PreMix32Surround8BitI, MFS8Bit, MBS8Bit, Mix32Surround8BitI
DW Offset MixPingPongLoop, PreMix32Surround8BitI, MFS8Bit, MBS8Bit, Mix32Surround8BitI
; 16 bit tables
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMix32Left16BitI, MFS16Bit, MBS16Bit, Mix32Single16BitI
DW Offset MixForwardsLoop, PreMix32Left16BitI, MFS16Bit, MBS16Bit, Mix32Single16BitI
DW Offset MixPingPongLoop, PreMix32Left16BitI, MFS16Bit, MBS16Bit, Mix32Single16BitI
; Right only
DW Offset MixNoLoop, PreMix32Right16BitI, MFS16Bit, MBS16Bit, Mix32Single16BitI
DW Offset MixForwardsLoop, PreMix32Right16BitI, MFS16Bit, MBS16Bit, Mix32Single16BitI
DW Offset MixPingPongLoop, PreMix32Right16BitI, MFS16Bit, MBS16Bit, Mix32Single16BitI
; Central
DW Offset MixNoLoop, PreMix32Central16BitI, MFS16Bit, MBS16Bit, Mix32Central16BitI
DW Offset MixForwardsLoop, PreMix32Central16BitI, MFS16Bit, MBS16Bit, Mix32Central16BitI
DW Offset MixPingPongLoop, PreMix32Central16BitI, MFS16Bit, MBS16Bit, Mix32Central16BitI
; Stereo
DW Offset MixNoLoop, PreMix32Panned16BitI, MFS16Bit, MBS16Bit, Mix32Panned16BitI
DW Offset MixForwardsLoop, PreMix32Panned16BitI, MFS16Bit, MBS16Bit, Mix32Panned16BitI
DW Offset MixPingPongLoop, PreMix32Panned16BitI, MFS16Bit, MBS16Bit, Mix32Panned16BitI
; Surround
DW Offset MixNoLoop, PreMix32Surround16BitI, MFS16Bit, MBS16Bit, Mix32Surround16BitI
DW Offset MixForwardsLoop, PreMix32Surround16BitI, MFS16Bit, MBS16Bit, Mix32Surround16BitI
DW Offset MixPingPongLoop, PreMix32Surround16BitI, MFS16Bit, MBS16Bit, Mix32Surround16BitI

818
SoundDrivers/M32BITI.MIX Executable file
View File

@ -0,0 +1,818 @@
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
Get32Bit8Waveform Macro
MovSX EBX, Byte Ptr [ES:DI+1]
MovSX EAX, Byte Ptr [ES:DI]
Sub EBX, EAX
IMul EBX, ECX
SAR EBX, 8
ShL EAX, 8
Add EBX, EAX
EndM
Get32Bit16Waveform Macro
MovSX EBX, Word Ptr [ES:EDI+EDI+2]
MovSX EAX, Word Ptr [ES:EDI+EDI]
Sub EBX, EAX
SAR EBX, 1
IMul EBX, ECX
SAR EBX, 15
Add EBX, EAX
EndM
M32Mix8ISingle Macro Index
M32Mix8ISingle&Index&:
Get32Bit8WaveForm
M32Mix8ISingleVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
EndM
M32Mix8ICentral Macro Index
M32Mix8ICentral&Index&:
Get32Bit8WaveForm
M32Mix8ICentralVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 4
Sub [SI+(Index-15)*8+4], EAX ;; 4
EndM
M32Mix8ISurround Macro Index
M32Mix8ISurround&Index&:
Get32Bit8WaveForm
M32Mix8ISurroundVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 4
Add [SI+(Index-15)*8+4], EAX ;; 4
EndM
; Panned output
M32Mix8IPanned Macro Index
M32Mix8IPanned&Index&:
Get32Bit8WaveForm
M32Mix8ILeftVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
M32Mix8IRightVolume&Index& EQU $+3
IMul EBX, EBX, 8000h
Sub [SI+(Index-15)*8], EAX ;; 4
Sub [SI+(Index-15)*8+4], EBX ;; 4
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
EndM
M32Mix16ISingle Macro Index
M32Mix16ISingle&Index&:
Get32Bit16WaveForm
M32Mix16ISingleVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
EndM
M32Mix16ICentral Macro Index
M32Mix16ICentral&Index&:
Get32Bit16WaveForm
M32Mix16ICentralVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
Sub [SI+(Index-15)*8+4], EAX ;; 3
EndM
M32Mix16ISurround Macro Index
M32Mix16ISurround&Index&:
Get32Bit16WaveForm
M32Mix16ISurroundVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-15)*8], EAX ;; 3
Add [SI+(Index-15)*8+4], EAX ;; 3
EndM
; Panned output
M32Mix16IPanned Macro Index
M32Mix16IPanned&Index&:
Get32Bit16WaveForm
M32Mix16ILeftVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
M32Mix16IRightVolume&Index& EQU $+3
IMul EBX, EBX, 8000h
Sub [SI+(Index-15)*8], EAX
Sub [SI+(Index-15)*8+4], EBX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix32Single8BitIOffsetTable Label Word
IndexCounter = 15
M32Mix8ISingleOffset Macro Index
DW Offset M32Mix8ISingle&Index&
EndM
REPT 16
M32Mix8ISingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Single8BitI
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Single8BitIOffsetTable+BX]
M32Mix8ISingle 0
M32Mix8ISingle 1
M32Mix8ISingle 2
M32Mix8ISingle 3
M32Mix8ISingle 4
M32Mix8ISingle 5
M32Mix8ISingle 6
M32Mix8ISingle 7
M32Mix8ISingle 8
M32Mix8ISingle 9
M32Mix8ISingle 10
M32Mix8ISingle 11
M32Mix8ISingle 12
M32Mix8ISingle 13
M32Mix8ISingle 14
M32Mix8ISingle 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8ISingle0
Ret
EndP Mix32Single8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Left8BitI
Mov AX, [SI+0Eh]
PreMix32Left8BitI1:
IndexCounter = 0
PreMix32SingleMacro Macro Index
Mov Word Ptr [CS:M32Mix8ISingleVolume&Index&], AX
EndM
REPT 16
PreMix32SingleMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Left8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Right8BitI
Add MixBufferOffset, MixResolution/8
Mov AX, [SI+0Ch]
Jmp PreMix32Left8BitI1
EndP PreMix32Right8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Central8BitIOffsetTable Label Word
IndexCounter = 15
M32Mix8ICentralOffset Macro Index
DW Offset M32Mix8ICentral&Index&
EndM
REPT 16
M32Mix8ICentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Central8BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Central8BitIOffsetTable+BX]
M32Mix8ICentral 0
M32Mix8ICentral 1
M32Mix8ICentral 2
M32Mix8ICentral 3
M32Mix8ICentral 4
M32Mix8ICentral 5
M32Mix8ICentral 6
M32Mix8ICentral 7
M32Mix8ICentral 8
M32Mix8ICentral 9
M32Mix8ICentral 10
M32Mix8ICentral 11
M32Mix8ICentral 12
M32Mix8ICentral 13
M32Mix8ICentral 14
M32Mix8ICentral 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8ICentral0
Ret
EndP Mix32Central8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Central8BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32CentralMacro Macro Index
Mov Word Ptr [CS:M32Mix8ICentralVolume&Index&], AX
EndM
REPT 16
PreMix32CentralMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Central8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Surround8BitIOffsetTable Label Word
IndexCounter = 15
M32Mix8ISurroundOffset Macro Index
DW Offset M32Mix8ISurround&Index&
EndM
REPT 16
M32Mix8ISurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Surround8BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Surround8BitIOffsetTable+BX]
M32Mix8ISurround 0
M32Mix8ISurround 1
M32Mix8ISurround 2
M32Mix8ISurround 3
M32Mix8ISurround 4
M32Mix8ISurround 5
M32Mix8ISurround 6
M32Mix8ISurround 7
M32Mix8ISurround 8
M32Mix8ISurround 9
M32Mix8ISurround 10
M32Mix8ISurround 11
M32Mix8ISurround 12
M32Mix8ISurround 13
M32Mix8ISurround 14
M32Mix8ISurround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8ISurround0
Ret
EndP Mix32Surround8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Surround8BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32SurroundMacro Macro Index
Mov Word Ptr [CS:M32Mix8ISurroundVolume&Index&], AX
EndM
REPT 16
PreMix32SurroundMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Surround8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Panned8BitIOffsetTable Label Word
IndexCounter = 15
M32Mix8IPannedOffset Macro Index
DW Offset M32Mix8IPanned&Index&
EndM
REPT 16
M32Mix8IPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Panned8BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Panned8BitIOffsetTable+BX]
M32Mix8IPanned 0
M32Mix8IPanned 1
M32Mix8IPanned 2
M32Mix8IPanned 3
M32Mix8IPanned 4
M32Mix8IPanned 5
M32Mix8IPanned 6
M32Mix8IPanned 7
M32Mix8IPanned 8
M32Mix8IPanned 9
M32Mix8IPanned 10
M32Mix8IPanned 11
M32Mix8IPanned 12
M32Mix8IPanned 13
M32Mix8IPanned 14
M32Mix8IPanned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix8IPanned0
Ret
EndP Mix32Panned8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Panned8BitI
Mov AX, [SI+0Eh] ; Left
Mov BX, [SI+0Ch] ; Right
IndexCounter = 0
PreMix32PannedMacro Macro Index
Mov Word Ptr [CS:M32Mix8ILeftVolume&Index&], AX
Mov Word Ptr [CS:M32Mix8IRightVolume&Index&], BX
EndM
REPT 16
PreMix32PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Panned8BitI
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
Mix32Single16BitIOffsetTable Label Word
IndexCounter = 15
M32Mix16ISingleOffset Macro Index
DW Offset M32Mix16ISingle&Index&
EndM
REPT 16
M32Mix16ISingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Single16BitI
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Single16BitIOffsetTable+BX]
M32Mix16ISingle 0
M32Mix16ISingle 1
M32Mix16ISingle 2
M32Mix16ISingle 3
M32Mix16ISingle 4
M32Mix16ISingle 5
M32Mix16ISingle 6
M32Mix16ISingle 7
M32Mix16ISingle 8
M32Mix16ISingle 9
M32Mix16ISingle 10
M32Mix16ISingle 11
M32Mix16ISingle 12
M32Mix16ISingle 13
M32Mix16ISingle 14
M32Mix16ISingle 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix16ISingle0
Ret
EndP Mix32Single16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Left16BitI
Mov AX, [SI+0Eh] ; Left
PreMix32Left16BitI1:
IndexCounter = 0
PreMix32SingleMacro Macro Index
Mov Word Ptr [CS:M32Mix16ISingleVolume&Index&], AX
EndM
REPT 16
PreMix32SingleMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Left16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Right16BitI
Add MixBufferOffset, MixResolution/8
Mov AX, [SI+0Ch]
Jmp PreMix32Left16BitI1
Ret
EndP PreMix32Right16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Central16BitIOffsetTable Label Word
IndexCounter = 15
M32Mix16ICentralOffset Macro Index
DW Offset M32Mix16ICentral&Index&
EndM
REPT 16
M32Mix16ICentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Central16BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Central16BitIOffsetTable+BX]
M32Mix16ICentral 0
M32Mix16ICentral 1
M32Mix16ICentral 2
M32Mix16ICentral 3
M32Mix16ICentral 4
M32Mix16ICentral 5
M32Mix16ICentral 6
M32Mix16ICentral 7
M32Mix16ICentral 8
M32Mix16ICentral 9
M32Mix16ICentral 10
M32Mix16ICentral 11
M32Mix16ICentral 12
M32Mix16ICentral 13
M32Mix16ICentral 14
M32Mix16ICentral 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix16ICentral0
Ret
EndP Mix32Central16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Central16BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32CentralMacro Macro Index
Mov Word Ptr [CS:M32Mix16ICentralVolume&Index&], AX
EndM
REPT 16
PreMix32CentralMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Central16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Surround16BitIOffsetTable Label Word
IndexCounter = 15
M32Mix16ISurroundOffset Macro Index
DW Offset M32Mix16ISurround&Index&
EndM
REPT 16
M32Mix16ISurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Surround16BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Surround16BitIOffsetTable+BX]
M32Mix16ISurround 0
M32Mix16ISurround 1
M32Mix16ISurround 2
M32Mix16ISurround 3
M32Mix16ISurround 4
M32Mix16ISurround 5
M32Mix16ISurround 6
M32Mix16ISurround 7
M32Mix16ISurround 8
M32Mix16ISurround 9
M32Mix16ISurround 10
M32Mix16ISurround 11
M32Mix16ISurround 12
M32Mix16ISurround 13
M32Mix16ISurround 14
M32Mix16ISurround 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ M32Mix16ISurround0
Ret
EndP Mix32Surround16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Surround16BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMix32SurroundMacro Macro Index
Mov Word Ptr [CS:M32Mix16ISurroundVolume&Index&], AX
EndM
REPT 16
PreMix32SurroundMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Surround16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Mix32Panned16BitIOffsetTable Label Word
IndexCounter = 15
M32Mix16IPannedOffset Macro Index
DW Offset M32Mix16IPanned&Index&
EndM
REPT 16
M32Mix16IPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc Mix32Panned16BitI
Dec AX
Mov BX, AX
And AX, 0Fh
ShR BX, 4
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:Mix32Panned16BitIOffsetTable+BX]
Pan32Bit16ILoop:
M32Mix16IPanned 0
M32Mix16IPanned 1
M32Mix16IPanned 2
M32Mix16IPanned 3
M32Mix16IPanned 4
M32Mix16IPanned 5
M32Mix16IPanned 6
M32Mix16IPanned 7
M32Mix16IPanned 8
M32Mix16IPanned 9
M32Mix16IPanned 10
M32Mix16IPanned 11
M32Mix16IPanned 12
M32Mix16IPanned 13
M32Mix16IPanned 14
M32Mix16IPanned 15
Add SI, 16*MIXRESOLUTION/4
Dec LoopCounter
JNZ Pan32Bit16ILoop
Ret
EndP Mix32Panned16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMix32Panned16BitI
Mov AX, [SI+0Eh] ; Left
Mov BX, [SI+0Ch] ; Right
IndexCounter = 0
PreMix32PannedMacro Macro Index
Mov Word Ptr [CS:M32Mix16ILeftVolume&Index&], AX
Mov Word Ptr [CS:M32Mix16IRightVolume&Index&], BX
EndM
REPT 16
PreMix32PannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMix32Panned16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

11
SoundDrivers/M32BITM.INC Executable file
View File

@ -0,0 +1,11 @@
; 8 bit tables
DW Offset MixNoLoop, PreM32BitMPanned, MFS8Bit, MBS8Bit, M32Bit8MPanned
DW Offset MixForwardsLoop, PreM32BitMPanned, MFS8Bit, MBS8Bit, M32Bit8MPanned
DW Offset MixPingPongLoop, PreM32BitMPanned, MFS8Bit, MBS8Bit, M32Bit8MPanned
; 16 bit
DW Offset MixNoLoop, PreM32BitMPanned, MFS16Bit, MBS16Bit, M32Bit16MPanned
DW Offset MixForwardsLoop, PreM32BitMPanned, MFS16Bit, MBS16Bit, M32Bit16MPanned
DW Offset MixPingPongLoop, PreM32BitMPanned, MFS16Bit, MBS16Bit, M32Bit16MPanned

502
SoundDrivers/M32BITM.MIX Executable file
View File

@ -0,0 +1,502 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MONITORPERFORMANCE = 0
ALIGN 16
M32BitMVolumeData DW 0, 0, 0, 0
IF MONITORPERFORMANCE
M32BitMCounter8BitTicksLow DD 0
M32BitMCounter8BitTicksHigh DD 0
M32BitMCounter16BitTicksLow DD 0
M32BitMCounter16BitTicksHigh DD 0
M32BitMCounter8BitLow DW 0
M32BitMCounter8BitHigh DW 0
M32BitMCounter16BitLow DW 0
M32BitMCounter16BitHigh DW 0
ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit16MPanned
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:EDI+EDI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMCounter16BitLow, AX
AdC CS:M32BitMCounter16BitHigh, 0
RdTSC
Sub CS:M32BitMCounter16BitTicksLow, EAX
SBB CS:M32BitMCounter16BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
Mov BX, DI
Add BX, BX
M32Bit16MPanned1: ; Mix 1 sample
Test AL, 1
JZ M32Bit16MPanned2
Push AX
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:0], AX
Mov BX, DI
MovQ MM0, [DS:0]
Add BX, BX
PUnpckLWD MM0, MM0
MovQ MM2, MM6
PMulLW MM2, MM0
PMulHW MM0, MM6
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
MovQM [SI], MM2
Add SI, 8
Pop AX
M32Bit16MPanned2: ; Mix 2 samples
Test AL, 2
JZ M32Bit16MPanned3
Push AX
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:0], AX
Mov BX, DI
Add BX, BX
Add CX, BP
AdC DI, DX
Mov AX, [ES:BX]
Mov BX, DI
Mov [DS:2], AX
Add BX, BX
MovQ MM0, [DS:0]
PUnpckLWD MM0, MM0
MovQ MM2, MM6
PMulLW MM2, MM0
PMulHW MM0, MM6
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PAddD MM4, [SI+8]
MovQM [SI], MM2
MovQM [SI+8], MM4
Add SI, 10h
Pop AX
M32Bit16MPanned3:
ShR AX, 2
JZ M32Bit16MPannedEnd
Mov Word Ptr [DS:20h], AX
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:0], AX
Mov BX, DI
Add BX, BX
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:2], AX
Mov BX, DI
Add BX, BX
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:0Ch], AX
Mov BX, DI
Add BX, BX
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:0Eh], AX
Mov BX, DI
Add BX, BX
Dec Word Ptr [DS:20h]
JZ M32Bit16MPanned5
M32Bit16MPanned4:
MovQ MM0, [DS:0]
MovQ MM2, MM6
MovQ MM1, [DS:8]
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PUnpckHWD MM1, MM1
PMulHW MM0, MM6
MovQ MM3, MM6
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:0], AX
Mov BX, DI
Add BX, BX
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PUnpckHWD MM4, MM0
PAddD MM4, [SI+8]
PMulLW MM3, MM1
MovQM [SI], MM2
PMulHW MM1, MM6
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:2], AX
Mov BX, DI
Add BX, BX
MovQM [SI+8], MM4
MovQ MM5, MM3
MovQ MM0, [SI+18h]
PUnpckLWD MM3, MM1
PAddD MM3, [SI+10h]
PUnpckHWD MM5, MM1
MovQM [SI+10h], MM3
PAddD MM5, MM0
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:0Ch], AX
Mov BX, DI
Add BX, BX
MovQM [SI+18h], MM5
Mov AX, [ES:BX]
Add CX, BP
AdC DI, DX
Mov [DS:0Eh], AX
Mov BX, DI
Add BX, BX
Add SI, 20h
Dec Word Ptr [DS:20h]
JNZ M32Bit16MPanned4
M32Bit16MPanned5:
MovQ MM0, [DS:0]
MovQ MM2, MM6
MovQ MM1, [DS:8]
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
MovQ MM3, MM6
PMulHW MM0, MM6
PUnpckHWD MM1, MM1
MovQ MM4, MM2
PMulLW MM3, MM1
PUnpckLWD MM2, MM0
PMulHW MM1, MM6
PAddD MM2, [SI]
PUnpckHWD MM4, MM0
PAddD MM4, [SI+8]
MovQ MM5, MM3
MovQM [SI], MM2
PUnpckLWD MM3, MM1
MovQM [SI+8], MM4
PUnpckHWD MM5, MM1
PAddD MM3, [SI+10h]
PAddD MM5, [SI+18h]
MovQM [SI+10h], MM3
MovQM [SI+18h], MM5
M32Bit16MPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMCounter16BitTicksLow, EAX
AdC CS:M32BitMCounter16BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit16MPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit8MPanned
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:DI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMCounter8BitLow, AX
AdC CS:M32BitMCounter8BitHigh, 0
RdTSC
Sub CS:M32BitMCounter8BitTicksLow, EAX
SBB CS:M32BitMCounter8BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
Mov BX, AX
And AX, 3
JZ M32Bit8MPanned3
M32Bit8MPanned1: ; Mix 1 sample
Test AL, 1
JZ M32Bit8MPanned2
Xor AX, AX
Add ERROR, DELTAERROR
Mov AH, [ES:DI]
AdC DI, DELTAOFFSET
Mov [DS:0], AX
MovQ MM0, [DS:0]
PUnpckLWD MM0, MM0
MovQ MM2, MM6
PMulLW MM2, MM0
PMulHW MM0, MM6
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
MovQM [SI], MM2
Add SI, 8
M32Bit8MPanned2: ; Mix 2 samples
Test BL, 2
JZ M32Bit8MPanned3
Xor AX, AX
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0], AX
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:2], AX
MovQ MM0, [DS:0]
PUnpckLWD MM0, MM0
MovQ MM2, MM6
PMulLW MM2, MM0
PMulHW MM0, MM6
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PAddD MM4, [SI+8]
MovQM [SI], MM2
MovQM [SI+8], MM4
Add SI, 10h
M32Bit8MPanned3:
Xor AX, AX
ShR BX, 2
JZ M32Bit8MPannedEnd
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0], AX
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:2], AX
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0Ch], AX
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0Eh], AX
Dec BX
JZ M32Bit8MPanned5
M32Bit8MPanned4:
MovQ MM0, [DS:0]
MovQ MM2, MM6
MovQ MM1, [DS:8]
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PUnpckHWD MM1, MM1
PMulHW MM0, MM6
MovQ MM3, MM6
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0], AX
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PUnpckHWD MM4, MM0
PAddD MM4, [SI+8]
PMulLW MM3, MM1
MovQM [SI], MM2
PMulHW MM1, MM6
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:2], AX
MovQM [SI+8], MM4
MovQ MM5, MM3
MovQ MM0, [SI+18h]
PUnpckLWD MM3, MM1
PAddD MM3, [SI+10h]
PUnpckHWD MM5, MM1
MovQM [SI+10h], MM3
PAddD MM5, MM0
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0Ch], AX
MovQM [SI+18h], MM5
Mov AH, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0Eh], AX
Add SI, 20h
Dec BX
JNZ M32Bit8MPanned4
M32Bit8MPanned5:
MovQ MM0, [DS:0]
MovQ MM2, MM6
MovQ MM1, [DS:8]
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
MovQ MM3, MM6
PMulHW MM0, MM6
PUnpckHWD MM1, MM1
MovQ MM4, MM2
PMulLW MM3, MM1
PUnpckLWD MM2, MM0
PMulHW MM1, MM6
PAddD MM2, [SI]
PUnpckHWD MM4, MM0
PAddD MM4, [SI+8]
MovQ MM5, MM3
MovQM [SI], MM2
PUnpckLWD MM3, MM1
MovQM [SI+8], MM4
PUnpckHWD MM5, MM1
PAddD MM3, [SI+10h]
PAddD MM5, [SI+18h]
MovQM [SI+10h], MM3
MovQM [SI+18h], MM5
M32Bit8MPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMCounter8BitTicksLow, EAX
AdC CS:M32BitMCounter8BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit8MPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreM32BitMPanned
Assume DS:Driver
Mov EAX, [SI+0Ch] ; LEAX = left vol, HEAX = right vol
Mov [DWord Ptr CS:M32BitMVolumeData], EAX
Mov [DWord Ptr CS:M32BitMVolumeData+4], EAX
SegCS MovQ MM6, M32BitMVolumeData
Ret
EndP PreM32BitMPanned
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

12
SoundDrivers/M32BITMF.INC Executable file
View File

@ -0,0 +1,12 @@
; 8 bit tables
DW Offset MixNoLoop, PreM32BitMFPanned, MFS8Bit, MBS8Bit, M32Bit8MFPanned
DW Offset MixForwardsLoop, PreM32BitMFPanned, MFS8Bit, MBS8Bit, M32Bit8MFPanned
DW Offset MixPingPongLoop, PreM32BitMFPanned, MFS8Bit, MBS8Bit, M32Bit8MFPanned
; 16 bit tables
DW Offset MixNoLoop, PreM32BitMFPanned, MFS16Bit, MBS16Bit, M32Bit16MFPanned
DW Offset MixForwardsLoop, PreM32BitMFPanned, MFS16Bit, MBS16Bit, M32Bit16MFPanned
DW Offset MixPingPongLoop, PreM32BitMFPanned, MFS16Bit, MBS16Bit, M32Bit16MFPanned

708
SoundDrivers/M32BITMF.MIX Executable file
View File

@ -0,0 +1,708 @@
;
; Resonant filter mixing routines
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MONITORPERFORMANCE = 0
RAMPSPEED = 7
RAMPCOMPENSATE = 63
IF MONITORPERFORMANCE
ALIGN 16
M32BitMICounter8BitTicksLow DD 0
M32BitMICounter8BitTicksHigh DD 0
M32BitMICounter16BitTicksLow DD 0
M32BitMICounter16BitTicksHigh DD 0
M32BitMICounter8BitLow DW 0
M32BitMICounter8BitHigh DW 0
M32BitMICounter16BitLow DW 0
M32BitMICounter16BitHigh DW 0
ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit16MFPanned
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:EDI+EDI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMICounter16BitLow, AX
AdC CS:M32BitMICounter16BitHigh, 0
RdTSC
Sub CS:M32BitMICounter16BitTicksLow, EAX
SBB CS:M32BitMICounter16BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
; 16 bit code here
Assume DS:Driver
SegCS MovQ MM2, M32BitMIPNotMask ; = FFFF0000FFFF0000h
Assume DS:Nothing
Test AX, 1
JZ M32Bit16MFPanned1
Push AX
MovD MM1, CX
Mov EBX, [ES:EDI+EDI]
Add CX, BP
AdC DI, DX
PUnpckLWD MM1, MM1
MovD MM0, BX
PXor MM1, MM2
MovQ MM3, [DS:10h]
PSRLWI MM1, 1
PMAddWD MM0, MM1
PMAddWD MM3, [DS:8]
PSRADI MM0, 16
MovQ MM1, MM3
PMAddWD MM0, [DS:0]
PSRLQI MM3, 32
PAddD MM3, MM1
PAddD MM0, MM3
PSRADI MM0, 14
PUnpckLDQ MM0, MM0
PackSSDW MM0, MM0
MovDR AX, MM0
MovQ MM1, MM6
PMulLW MM1, MM0
PMulHW MM0, MM6
Mov BX, [DS:10h]
Mov [DS:10h], AX
Mov [DS:14h], BX
MovQ MM3, [DS:18h] ; VR
PUnpckLWD MM1, MM0
PSubW MM3, MM6 ; VR
PAddD MM1, [SI]
PSRAWI MM3, RAMPSPEED ; VR
MovQM [SI], MM1
PAddW MM6, MM3 ; VR
Add SI, 8
Pop AX
M32Bit16MFPanned1:
ShR AX, 1
JZ M32Bit16MFPannedEnd
Mov [DS:38h], CX
Mov EBX, [ES:EDI+EDI]
Mov [DS:3Ah], CX
Add CX, BP
AdC DI, DX
Mov [DS:30h], EBX
Mov [DS:3Ch], CX
Mov EBX, [ES:EDI+EDI]
Mov [DS:3Eh], CX
Add CX, BP
AdC DI, DX
Mov [DS:34h], EBX
MovQ MM5, [DS:38h]
Mov [DS:38h], BP
Mov [DS:3Ch], BP
Mov [DS:3Ah], BP
Mov [DS:3Eh], BP
MovQ MM7, [DS:38h]
PXor MM5, MM2 ; MM5 = offsets.
PAddW MM7, MM7
PXor MM7, MM2
PSubW MM7, MM2 ; MM7 = offset step
Dec AX
JZ M32Bit16MFPanned3
Mov [DS:20h], AX
M32Bit16MFPanned2:
MovQ MM2, [DS:10h]
MovQ MM0, MM5
PMAddWD MM2, [DS:8]
PSRLWI MM0, 1
PMAddWD MM0, [DS:30h]
PAddW MM5, MM7
PSRADI MM0, 16
MovQ MM1, MM2
PMAddWD MM0, [DS:0]
PSRLQI MM2, 32
Mov EBX, [ES:EDI+EDI]
Add CX, BP
AdC DI, DX
Mov [DS:30h], EBX
PAddD MM2, MM1
MovQ MM3, MM0
PAddD MM0, MM2
PSRADI MM0, 14
MovQ MM1, MM0
PackSSDW MM0, MM0
MovDR AX, MM0
Mov BX, [DS:10h]
Mov [DS:14h], BX
Mov [DS:10h], AX
MovQ MM2, [DS:8]
PUnpckLDQ MM1, MM1
PMAddWD MM2, [DS:10h]
Mov EBX, [ES:EDI+EDI]
Add CX, BP
AdC DI, DX
Mov [DS:34h], EBX
PAddD MM3, MM2
PSLLQI MM2, 32
PAddD MM3, MM2 ; MM3 = FS2, x
PSRADI MM3, 14
PUnpckHDQ MM3, MM3
MovQ MM0, MM6
PackSSDW MM3, MM1 ; MM3 = FS1, FS1, FS2, FS2
PMulLW MM0, MM3
MovDR AX, MM3
PMulHW MM3, MM6
MovQ MM1, MM0
MovQ MM2, [DS:18h] ; VR
PUnpckHWD MM0, MM3
PAddD MM0, [SI]
PUnpckLWD MM1, MM3
PAddD MM1, [SI+8]
PSubW MM2, MM6 ; VR
MovQM [SI], MM0
PSRAWI MM2, RAMPSPEED-1 ; VR
MovQM [SI+8], MM1
PAddW MM6, MM2 ; VR
Mov BX, [DS:10h]
Add SI, 10h
Mov [DS:10h], AX
Mov [DS:14h], BX
Dec Word Ptr [DS:20h]
JNZ M32Bit16MFPanned2
M32Bit16MFPanned3:
MovQ MM0, [DS:30h]
PSRLWI MM5, 1
MovQ MM2, [DS:10h]
PMAddWD MM0, MM5
PMAddWD MM2, [DS:8]
PSRADI MM0, 16
MovQ MM1, MM2
PMAddWD MM0, [DS:0]
PSRLQI MM2, 32
PAddD MM2, MM1
MovQ MM3, MM0
PAddD MM0, MM2
PSRADI MM0, 14
MovQ MM1, MM0
PackSSDW MM0, MM0
MovDR AX, MM0
Mov BX, [DS:10h]
Mov [DS:10h], AX
Mov [DS:14h], BX
MovQ MM2, [DS:8]
PUnpckLDQ MM1, MM1
PMAddWD MM2, [DS:10h]
PAddD MM3, MM2
PSLLQI MM2, 32
PAddD MM3, MM2 ; MM3 = FS2, x
PSRADI MM3, 14
PUnpckHDQ MM3, MM3
MovQ MM0, MM6
PackSSDW MM3, MM1 ; MM3 = FS1, FS1, FS2, FS2
PMulLW MM0, MM3
MovDR AX, MM3
PMulHW MM3, MM6
MovQ MM1, MM0
MovQ MM2, [DS:18h] ; VR
PUnpckHWD MM0, MM3
PAddD MM0, [SI]
PUnpckLWD MM1, MM3
PAddD MM1, [SI+8]
PSubW MM2, MM6 ; VR
MovQM [SI], MM0
PSRAWI MM2, RAMPSPEED-1 ; VR
MovQM [SI+8], MM1
PAddW MM6, MM2 ; VR
Mov BX, [DS:10h]
Add SI, 10h
Mov [DS:10h], AX
Mov [DS:14h], BX
M32Bit16MFPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMICounter16BitTicksLow, EAX
AdC CS:M32BitMICounter16BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit16MFPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit8MFPanned
; Layout of data in data segment
; DS:0 = destination volume
; DS:10h->1Fh = samples
; DS:20h = SS, SP storage
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:DI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMICounter8BitLow, AX
AdC CS:M32BitMICounter8BitHigh, 0
RdTSC
Sub CS:M32BitMICounter8BitTicksLow, EAX
SBB CS:M32BitMICounter8BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
; AX = number of samples to mix.
; MM6 = current volume.
; DS:0 = filtera
; DS:8 = filterb, filterc
; DS:10h = oldsamples.
; DS:18h = destination volume.
; DS:20h = Count
; DS:24h = ...
; DS:30h = sample area, 38h = offset area
Assume DS:Driver
SegCS MovQ MM2, M32BitMIPNotMask ; = FFFF0000FFFF0000h
Assume DS:Nothing
Test AX, 1
JZ M32Bit8MFPanned1
MovD MM1, CX
Push AX
Mov BX, [ES:DI]
Add CX, BP
AdC DI, DX
MovD MM0, BX
PUnpckLWD MM1, MM1
PUnpckLBW MM0, MM0
PXor MM1, MM2
MovQ MM3, [DS:10h]
PSRLWI MM1, 1
PMAddWD MM0, MM1
PMAddWD MM3, [DS:8]
PSRADI MM0, 16
MovQ MM1, MM3
PMAddWD MM0, [DS:0]
PSRLQI MM3, 32
PAddD MM3, MM1
PAddD MM0, MM3
PSRADI MM0, 14
PUnpckLDQ MM0, MM0
PackSSDW MM0, MM0
MovDR AX, MM0
MovQ MM1, MM6
PMulLW MM1, MM0
PMulHW MM0, MM6
Mov BX, [DS:10h]
Mov [DS:14h], BX
Mov [DS:10h], AX
MovQ MM3, [DS:18h] ; VR
PUnpckLWD MM1, MM0
PSubW MM3, MM6 ; VR
PAddD MM1, [SI]
PSRAWI MM3, RAMPSPEED ; VR
MovQM [SI], MM1
PAddW MM6, MM3 ; VR
Pop AX
Add SI, 8
M32Bit8MFPanned1:
ShR AX, 1
JZ M32Bit8MFPannedEnd
Mov [DS:38h], CX
Mov BX, [ES:DI]
Mov [DS:3Ah], CX
Add CX, BP
AdC DI, DX
Mov [DS:30h], BX
Mov [DS:3Ch], CX
Mov BX, [ES:DI]
Mov [DS:3Eh], CX
Add CX, BP
AdC DI, DX
Mov [DS:32h], BX
MovD MM7, BP
MovQ MM5, [DS:38h]
PUnpckLWD MM7, MM7
PXor MM5, MM2 ; MM5 = offsets.
PUnpckLDQ MM7, MM7
PAddW MM7, MM7
PXor MM7, MM2
PSubW MM7, MM2 ; MM7 = offset step
Dec AX
JZ M32Bit8MFPanned3
Mov [DS:20h], AX
M32Bit8MFPanned2:
MovD MM0, [DS:30h]
MovQ MM1, MM5
PUnpckLBW MM0, MM0
PSRLWI MM1, 1
MovQ MM2, [DS:10h]
PMAddWD MM0, MM1
PMAddWD MM2, [DS:8]
PAddW MM5, MM7
MovQ MM1, MM2
PSRADI MM0, 16
PMAddWD MM0, [DS:0]
PSRLQI MM2, 32
Mov BX, [ES:DI]
Add CX, BP
AdC DI, DX
Mov [DS:30h], BX
PAddD MM2, MM1
MovQ MM3, MM0
PAddD MM0, MM2
PSRADI MM0, 14
MovQ MM1, MM0
PackSSDW MM0, MM0
MovDR AX, MM0
Mov BX, [DS:10h]
Mov [DS:10h], AX
Mov [DS:14h], BX
MovQ MM2, [DS:8]
PUnpckLDQ MM1, MM1
PMAddWD MM2, [DS:10h]
Mov BX, [ES:DI]
Add CX, BP
AdC DI, DX
Mov [DS:32h], BX
PAddD MM3, MM2
PSLLQI MM2, 32
PAddD MM3, MM2 ; MM3 = FS2, x
PSRADI MM3, 14
PUnpckHDQ MM3, MM3
MovQ MM0, MM6
PackSSDW MM3, MM1 ; MM3 = FS1, FS1, FS2, FS2
PMulLW MM0, MM3
MovDR AX, MM3
PMulHW MM3, MM6
MovQ MM1, MM0
MovQ MM2, [DS:18h] ; VR
PUnpckHWD MM0, MM3
PAddD MM0, [SI]
PUnpckLWD MM1, MM3
PAddD MM1, [SI+8]
PSubW MM2, MM6 ; VR
MovQM [SI], MM0
PSRAWI MM2, RAMPSPEED-1 ; VR
MovQM [SI+8], MM1
PAddW MM6, MM2 ; VR
Mov BX, [DS:10h]
Add SI, 10h
Mov [DS:10h], AX
Mov [DS:14h], BX
Dec Word Ptr [DS:20h]
JNZ M32Bit8MFPanned2
M32Bit8MFPanned3:
MovD MM0, [DS:30h]
PSRLWI MM5, 1
MovQ MM2, [DS:10h]
PUnpckLBW MM0, MM0
PMAddWD MM0, MM5
PMAddWD MM2, [DS:8]
PSRADI MM0, 16
MovQ MM1, MM2
PMAddWD MM0, [DS:0]
PSRLQI MM2, 32
PAddD MM2, MM1
MovQ MM3, MM0
PAddD MM0, MM2
PSRADI MM0, 14
MovQ MM1, MM0
PackSSDW MM0, MM0
MovDR AX, MM0
Mov BX, [DS:10h]
Mov [DS:14h], BX
Mov [DS:10h], AX
MovQ MM2, [DS:8]
PUnpckLDQ MM1, MM1
PMAddWD MM2, [DS:10h]
PAddD MM3, MM2
PSLLQI MM2, 32
PAddD MM3, MM2 ; MM3 = FS2, x
PSRADI MM3, 14
PUnpckHDQ MM3, MM3
MovQ MM0, MM6
PackSSDW MM3, MM1 ; MM3 = FS1, FS1, FS2, FS2
PMulLW MM0, MM3
MovDR AX, MM3
PMulHW MM3, MM6
MovQ MM1, MM0
MovQ MM2, [DS:18h] ; VR
PUnpckHWD MM0, MM3
PAddD MM0, [SI]
PUnpckLWD MM1, MM3
PAddD MM1, [SI+8]
PSubW MM2, MM6 ; VR
MovQM [SI], MM0
PSRAWI MM2, RAMPSPEED-1 ; VR
MovQM [SI+8], MM1
PAddW MM6, MM2 ; VR
Mov BX, [DS:10h]
Add SI, 10h
Mov [DS:10h], AX
Mov [DS:14h], BX
M32Bit8MFPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMICounter8BitTicksLow, EAX
AdC CS:M32BitMICounter8BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit8MFPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreM32BitMFPanned
Assume DS:Driver
Mov ES, CS:MixSegment
Mov AX, [SI+0Ch] ; AX = destination left
Mov BX, [SI+1Ch] ; BX = current left
Mov CX, [SI+0Eh] ; CX = destination right
Mov DX, [SI+1Eh] ; DX = current right.
Test Word Ptr [SI], 8540h
JZ PreM32BitMFPannedV4
Add CX, CX
Add AX, AX
PreM32BitMFPannedV4:
Test AX, AX
JNZ PreM32BitMFPannedV3
Test CX, CX
JNZ PreM32BitMFPannedV3
Add Word Ptr [SI+8], 60
PreM32BitMFPannedV3:
Cmp AX, BX
JL PreM32BitMFPannedV1
Add AX, RAMPCOMPENSATE
PreM32BitMFPannedV1:
Cmp CX, DX
JL PreM32BitMFPannedV2
Add CX, RAMPCOMPENSATE
PreM32BitMFPannedV2:
Mov [ES:18h], AX
Mov [ES:1Ch], AX
Mov [ES:1Ah], CX
Mov [ES:1Eh], CX ; MixSegment:18h = destination volume
Mov [CS:M32BitMIVolumeData], BX
Mov [CS:M32BitMIVolumeData+2], DX
Sub AX, BX
Sub CX, DX
SAR AX, RAMPSPEED
SAR CX, RAMPSPEED
Add BX, AX
Add DX, CX
Mov [CS:M32BitMIVolumeData+4], BX
Mov [CS:M32BitMIVolumeData+6], DX
SegCS MovQ MM6, M32BitMIVolumeData ; MM6 = current volume
Xor EAX, EAX
Mov AX, [SI+5Eh]
Sub AX, 1
AdC AX, 1
Mov [ES:0], EAX
Mov [ES:4], EAX ; MixSegment:0 = filtera
Mov AX, [SI+6Eh]
Mov [ES:8], EAX
Mov AX, [SI+7Eh]
Mov [ES:0Ch], EAX ; MixSegment:8 = filterb, filterc
Mov AX, [SI+3Ch]
Mov [ES:10h], EAX
Mov AX, [SI+6]
Mov [ES:14h], EAX ; MixSegment:10h = old samples.
Ret
EndP PreM32BitMFPanned
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

11
SoundDrivers/M32BITMI.INC Executable file
View File

@ -0,0 +1,11 @@
; 8 bit tables
DW Offset MixNoLoop, PreM32BitMIPanned, MFS8Bit, MBS8Bit, M32Bit8MIPanned
DW Offset MixForwardsLoop, PreM32BitMIPanned, MFS8Bit, MBS8Bit, M32Bit8MIPanned
DW Offset MixPingPongLoop, PreM32BitMIPanned, MFS8Bit, MBS8Bit, M32Bit8MIPanned
; 16 bit tables
DW Offset MixNoLoop, PreM32BitMIPanned, MFS16Bit, MBS16Bit, M32Bit16MIPanned
DW Offset MixForwardsLoop, PreM32BitMIPanned, MFS16Bit, MBS16Bit, M32Bit16MIPanned
DW Offset MixPingPongLoop, PreM32BitMIPanned, MFS16Bit, MBS16Bit, M32Bit16MIPanned

686
SoundDrivers/M32BITMI.MIX Executable file
View File

@ -0,0 +1,686 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MONITORPERFORMANCE = 0
ALIGN 16
M32BitMIVolumeData DW 0, 0, 0, 0
M32BitMIPXorMask DW 07FFFh, 0, 07FFFh, 0
M32BitMIPNotMask DW 0FFFFh, 0, 0FFFFh, 0
IF MONITORPERFORMANCE
M32BitMICounter8BitTicksLow DD 0
M32BitMICounter8BitTicksHigh DD 0
M32BitMICounter16BitTicksLow DD 0
M32BitMICounter16BitTicksHigh DD 0
M32BitMICounter8BitLow DW 0
M32BitMICounter8BitHigh DW 0
M32BitMICounter16BitLow DW 0
M32BitMICounter16BitHigh DW 0
ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit16MIPanned
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:EDI+EDI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMICounter16BitLow, AX
AdC CS:M32BitMICounter16BitHigh, 0
RdTSC
Sub CS:M32BitMICounter16BitTicksLow, EAX
SBB CS:M32BitMICounter16BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
Mov BX, DI
Add BX, BX
Assume DS:Driver
SegCS MovQ MM3, M32BitMIPXorMask
Assume DS:Nothing
M32Bit16MIPanned1:
Test AL, 1
JZ M32Bit16MIPanned2
Push AX
Mov [DS:10h], CX
Mov AX, [ES:BX]
Mov [DS:12h], CX
Add CX, BP
AdC DI, DX
Mov [DS:0], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:2], AX
Add BX, BX
MovQ MM4, [DS:10h]
MovQ MM2, MM6
MovQ MM0, [DS:0]
PSRLWI MM4, 1
PXor MM4, MM3
PMAddWD MM0, MM4
PSRADI MM0, 15
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PMulHW MM0, MM6
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
MovQM [SI], MM2
Add SI, 8
Pop AX
M32Bit16MIPanned2:
Test AL, 2
JZ M32Bit16MIPanned3
Push AX
Mov [DS:10h], CX
Mov AX, [ES:BX]
Mov [DS:12h], CX
Add CX, BP
AdC DI, DX
Mov [DS:0], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:2], AX
Add BX, BX
Mov [DS:14h], CX
Mov AX, [ES:BX]
Mov [DS:16h], CX
Add CX, BP
AdC DI, DX
Mov [DS:4], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:6], AX
Add BX, BX
MovQ MM4, [DS:10h]
MovQ MM2, MM6
MovQ MM0, [DS:0]
PSRLWI MM4, 1
PXor MM4, MM3
PMAddWD MM0, MM4
PSRADI MM0, 15
PackSSDW MM0, MM0
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PMulHW MM0, MM6
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PUnpckHWD MM4, MM0
PAddD MM4, [SI+8]
MovQM [SI], MM2
MovQM [SI+8], MM4
Add SI, 10h
Pop AX
M32Bit16MIPanned3:
ShR AX, 2
JZ M32Bit16MIPannedEnd
Mov [DS:20h], AX
Mov [DS:10h], CX ; AGIs everywhere!
Mov AX, [ES:BX]
Mov [DS:12h], CX
Add CX, BP
AdC DI, DX
Mov [DS:0], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:2], AX
Add BX, BX
Mov [DS:14h], CX
Mov AX, [ES:BX]
Mov [DS:16h], CX
Add CX, BP
AdC DI, DX
Mov [DS:4], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:6], AX
Add BX, BX
MovQ MM5, [DS:10h]
Mov [DS:10h], BP
Mov [DS:14h], BP
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:8], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:0Ah], AX
Add BX, BX
Mov [DS:12h], BP
Mov [DS:16h], BP
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:0Ch], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:0Eh], AX
Add BX, BX
Assume DS:Driver
SegCS MovQ MM4, M32BitMIPNotMask
Assume DS:Nothing
MovQ MM7, [DS:10h]
PXor MM5, MM4
PAddW MM7, MM7
MovQ MM2, MM5
PXor MM7, MM4
PSRLWI MM2, 1
PSubW MM7, MM4
PAddW MM5, MM7
MovQ MM3, MM5
Dec Word Ptr [DS:20h]
JZ M32Bit16MIPanned5
M32Bit16MIPanned4: ; MM7 = delta offsets.
PMAddWD MM2, [DS:0]
PSRLWI MM3, 1
; Stall (2)
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:0], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:2], AX
Add BX, BX
PMAddWD MM3, [DS:8]
PSRADI MM2, 15
PackSSDW MM2, MM2
PAddW MM5, MM7
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PSRADI MM3, 15
PMulLW MM2, MM6
PackSSDW MM3, MM3
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:4], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:6], AX
Add BX, BX
; Stall (1)
MovQ MM4, MM2
PUnpckLWD MM3, MM3
PUnpckLWD MM2, MM0
MovQ MM1, MM6
PMulHW MM1, MM3
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PMulLW MM3, MM6
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:8], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:0Ah], AX
Add BX, BX
; Stall (1)
PAddD MM4, [SI+8]
MovQ MM0, MM3 ;
MovQM [SI], MM2
PUnpckLWD MM3, MM1
MovQM [SI+8], MM4
PUnpckHWD MM0, MM1
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:0Ch], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:0Eh], AX
Add BX, BX
PAddD MM3, [SI+10h]
MovQ MM2, MM5
PAddD MM0, [SI+18h]
PAddW MM5, MM7
MovQM [SI+10h], MM3
MovQ MM3, MM5
MovQM [SI+18h], MM0
PSRLWI MM2, 1
Add SI, 20h
Dec Word Ptr [DS:20h]
JNZ M32Bit16MIPanned4
M32Bit16MIPanned5:
PMAddWD MM2, [DS:0]
PSRLWI MM3, 1
PMAddWD MM3, [DS:8]
PSRADI MM2, 15
PackSSDW MM2, MM2
PAddW MM5, MM7
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PSRADI MM3, 15
PMulLW MM2, MM6
PackSSDW MM3, MM3
MovQ MM4, MM2
PUnpckLWD MM3, MM3
PUnpckLWD MM2, MM0
MovQ MM1, MM6
PMulHW MM1, MM3
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PMulLW MM3, MM6
PAddD MM4, [SI+8]
MovQ MM0, MM3
MovQM [SI], MM2
PUnpckLWD MM3, MM1
MovQM [SI+8], MM4
PUnpckHWD MM0, MM1
PAddD MM3, [SI+10h]
PAddD MM0, [SI+18h]
MovQM [SI+10h], MM3
MovQM [SI+18h], MM0
M32Bit16MIPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMICounter16BitTicksLow, EAX
AdC CS:M32BitMICounter16BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit16MIPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit8MIPanned
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:DI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMICounter8BitLow, AX
AdC CS:M32BitMICounter8BitHigh, 0
RdTSC
Sub CS:M32BitMICounter8BitTicksLow, EAX
SBB CS:M32BitMICounter8BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
Mov BX, AX
And AX, 3
JZ M32Bit8MIPanned3
Assume DS:Driver
SegCS MovQ MM3, M32BitMIPXorMask
Assume DS:Nothing
M32Bit8MIPanned1:
Test AL, 1
JZ M32Bit8MIPanned2
Mov AX, [ES:DI]
Mov [DS:10h], CX
Mov [DS:12h], CX
Add CX, BP
AdC DI, DX
MovQ MM4, [DS:10h]
MovQ MM2, MM6
MovD MM0, AX
PSRLWI MM4, 1
PXor MM4, MM3
PUnpckLBW MM0, MM0
PMAddWD MM0, MM4
PSRADI MM0, 15
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PMulHW MM0, MM6
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
MovQM [SI], MM2
Add SI, 8
M32Bit8MIPanned2: ; Mix 2 samples
Test BL, 2
JZ M32Bit8MIPanned3
Mov AX, [ES:DI]
Mov [DS:10h], CX
Mov [DS:12h], CX
Add CX, BP
AdC DI, DX
Mov [DS:0], AX
Mov AX, [ES:DI]
Mov [DS:14h], CX
Mov [DS:16h], CX
Add CX, BP
AdC DI, DX
Mov [DS:2], AX
MovQ MM4, [DS:10h]
MovQ MM2, MM6
MovQ MM0, [DS:0]
PSRLWI MM4, 1
PUnpckLBW MM0, MM0
PXor MM4, MM3
PMAddWD MM0, MM4
PSRADI MM0, 15
PackSSDW MM0, MM0
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PMulHW MM0, MM6
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PUnpckHWD MM4, MM0
PAddD MM4, [SI+8]
MovQM [SI], MM2
MovQM [SI+8], MM4
Add SI, 10h
M32Bit8MIPanned3:
ShR BX, 2
JZ M32Bit8MIPannedEnd
; Have to setup offset register and delta-offset register.
Mov AX, [ES:DI]
Mov [DS:10h], ERROR
Mov [DS:12h], ERROR
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0], AX
Mov AX, [ES:DI]
Mov [DS:14h], ERROR
Mov [DS:16h], ERROR
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:2], AX
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:18h], DELTAERROR
Mov [DS:8h], AX
Mov [DS:1Ah], DELTAERROR
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:1Ch], DELTAERROR
Mov [DS:0Ah], AX
Mov [DS:1Eh], DELTAERROR
Assume DS:Driver
SegCS MovQ MM4, M32BitMIPNotMask
Assume DS:Nothing
MovQ MM7, [DS:18h]
MovQ MM5, [DS:10h]
PAddW MM7, MM7
PXor MM7, MM4
PXor MM5, MM4
PSubW MM7, MM4
Dec BX
JZ M32Bit8MIPanned5
M32Bit8MIPanned4:
MovQ MM0, [DS:0]
MovQ MM2, MM5
MovQ MM1, [DS:8]
PUnpckLBW MM0, MM0
PAddW MM5, MM7
PSRLWI MM2, 1
PMAddWD MM0, MM2
PUnpckLBW MM1, MM1
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0], AX
PSRADI MM0, 15
MovQ MM3, MM5
PAddW MM5, MM7
PSRLWI MM3, 1
PMAddWD MM1, MM3
PackSSDW MM0, MM0
MovQ MM2, MM6
PUnpckLWD MM0, MM0
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:2], AX
PMulLW MM2, MM0
PSRADI MM1, 15
PMulHW MM0, MM6
PackSSDW MM1, MM1
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
MovQ MM4, MM2
PUnpckLWD MM1, MM1
AdC DI, DELTAOFFSET
Mov [DS:8], AX
MovQ MM3, MM6
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PMulLW MM3, MM1
PMulHW MM1, MM6
PUnpckHWD MM4, MM0
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:0Ah], AX
PAddD MM4, [SI+8]
MovQ MM0, MM3
MovQM [SI], MM2
PUnpckLWD MM3, MM1
MovQM [SI+8], MM4
PUnpckHWD MM0, MM1
PAddD MM3, [SI+10h]
PAddD MM0, [SI+18h]
MovQM [SI+10h], MM3
MovQM [SI+18h], MM0
Add SI, 20h
Dec BX
JNZ M32Bit8MIPanned4
M32Bit8MIPanned5:
MovQ MM0, [DS:0]
MovQ MM2, MM5
MovQ MM1, [DS:8]
PUnpckLBW MM0, MM0
PAddW MM5, MM7
PSRLWI MM2, 1
PMAddWD MM0, MM2
PUnpckLBW MM1, MM1
PSRLWI MM5, 1
PMAddWD MM1, MM5
PSRADI MM0, 15
MovQ MM2, MM6
PackSSDW MM0, MM0
MovQ MM3, MM6
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
PSRADI MM1, 15
PMulHW MM0, MM6
PackSSDW MM1, MM1
PUnpckLWD MM1, MM1
MovQ MM4, MM2
PMulLW MM3, MM1
PUnpckLWD MM2, MM0
PMulHW MM1, MM6
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
MovQ MM5, MM3
PAddD MM4, [SI+8]
PUnpckLWD MM3, MM1
MovQM [SI], MM2
PUnpckHWD MM5, MM1
PAddD MM3, [SI+10h]
PAddD MM5, [SI+18h]
MovQM [SI+8], MM4
MovQM [SI+10h], MM3
MovQM [SI+18h], MM5
M32Bit8MIPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMICounter8BitTicksLow, EAX
AdC CS:M32BitMICounter8BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit8MIPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreM32BitMIPanned
Assume DS:Driver
Mov EAX, [SI+0Ch] ; LEAX = left vol, HEAX = right vol
Mov [DWord Ptr CS:M32BitMIVolumeData], EAX
Mov [DWord Ptr CS:M32BitMIVolumeData+4], EAX
SegCS MovQ MM6, M32BitMIVolumeData
Ret
EndP PreM32BitMIPanned
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

12
SoundDrivers/M32BITMV.INC Executable file
View File

@ -0,0 +1,12 @@
; 8 bit tables
DW Offset MixNoLoop, PreM32BitMVPanned, MFS8Bit, MBS8Bit, M32Bit8MVPanned
DW Offset MixForwardsLoop, PreM32BitMVPanned, MFS8Bit, MBS8Bit, M32Bit8MVPanned
DW Offset MixPingPongLoop, PreM32BitMVPanned, MFS8Bit, MBS8Bit, M32Bit8MVPanned
; 16 bit tables
DW Offset MixNoLoop, PreM32BitMVPanned, MFS16Bit, MBS16Bit, M32Bit16MVPanned
DW Offset MixForwardsLoop, PreM32BitMVPanned, MFS16Bit, MBS16Bit, M32Bit16MVPanned
DW Offset MixPingPongLoop, PreM32BitMVPanned, MFS16Bit, MBS16Bit, M32Bit16MVPanned

798
SoundDrivers/M32BITMV.MIX Executable file
View File

@ -0,0 +1,798 @@
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MONITORPERFORMANCE = 0
RAMPSPEED = 7
RAMPCOMPENSATE = 63
IF MONITORPERFORMANCE
ALIGN 16
M32BitMICounter8BitTicksLow DD 0
M32BitMICounter8BitTicksHigh DD 0
M32BitMICounter16BitTicksLow DD 0
M32BitMICounter16BitTicksHigh DD 0
M32BitMICounter8BitLow DW 0
M32BitMICounter8BitHigh DW 0
M32BitMICounter16BitLow DW 0
M32BitMICounter16BitHigh DW 0
ENDIF
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit16MVPanned
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:EDI+EDI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMICounter16BitLow, AX
AdC CS:M32BitMICounter16BitHigh, 0
RdTSC
Sub CS:M32BitMICounter16BitTicksLow, EAX
SBB CS:M32BitMICounter16BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
; 16 bit code here
Mov BX, DI
Assume DS:Driver
SegCS MovQ MM1, M32BitMIPNotMask ; = FFFF0000FFFF0000h
Assume DS:Nothing
Add BX, BX
Test AL, 1
JZ M32Bit16MVPanned2
Push AX
Mov [DS:8h], CX ; AGIs everywhere!
Mov AX, [ES:BX]
Mov [DS:0Ah], CX
Add CX, BP
AdC DI, DX
Mov [DS:10h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:12h], AX
Add BX, BX
MovQ MM0, [DS:8h]
MovQ MM2, MM6
PXor MM0, MM1
PSRLWI MM0, 1
PMAddWD MM0, [DS:10h]
PSRADI MM0, 15
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
MovQ MM4, [DS:0] ; VR
PMulHW MM0, MM6
PSubW MM4, MM6 ; VR
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PSRAWI MM4, RAMPSPEED ; VR
MovQM [SI], MM2
PAddW MM6, MM4 ; VR
Add SI, 8
Pop AX
M32Bit16MVPanned2:
Test AX, 2
JZ M32Bit16MVPanned3
Push AX
Mov [DS:8h], CX ; AGIs everywhere!
Mov AX, [ES:BX]
Mov [DS:0Ah], CX
Add CX, BP
AdC DI, DX
Mov [DS:10h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:12h], AX
Add BX, BX
Mov [DS:0Ch], CX
Mov AX, [ES:BX]
Mov [DS:0Eh], CX
Add CX, BP
AdC DI, DX
Mov [DS:14h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:16h], AX
Add BX, BX
MovQ MM2, [DS:8]
PXor MM2, MM1
PSRLWI MM2, 1
PMAddWD MM2, [DS:10h]
PSRADI MM2, 15
PackSSDW MM2, MM2
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PMulLW MM2, MM6
MovQ MM4, MM2
PUnpckLWD MM2, MM0
MovQ MM5, [DS:0] ; VR
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PSubW MM5, MM6 ; VR
PAddD MM4, [SI+8]
MovQM [SI], MM2
PSRAWI MM5, RAMPSPEED-1 ; VR
MovQM [SI+8], MM4
PAddW MM6, MM5 ; VR
Pop AX
Add SI, 10h
M32Bit16MVPanned3:
ShR AX, 2
JZ M32Bit16MVPannedEnd
Mov Word Ptr [DS:20h], AX
Mov [DS:8h], CX ; AGIs everywhere!
Mov AX, [ES:BX]
Mov [DS:0Ah], CX
Add CX, BP
AdC DI, DX
Mov [DS:10h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:12h], AX
Add BX, BX
Mov [DS:0Ch], CX
Mov AX, [ES:BX]
Mov [DS:0Eh], CX
Add CX, BP
AdC DI, DX
Mov [DS:14h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:16h], AX
Add BX, BX
Mov [DS:28h], BP
Mov [DS:2Ch], BP
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:18h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:1Ah], AX
Add BX, BX
Mov [DS:2Ah], BP
Mov [DS:2Eh], BP
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:1Ch], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:1Eh], AX
Add BX, BX
MovQ MM7, [DS:28h]
MovQ MM5, [DS:8]
PAddW MM7, MM7
PXor MM7, MM1
PXor MM5, MM1
PSubW MM7, MM1
Dec Word Ptr [DS:20h]
JZ M32Bit16MVPanned5
M32Bit16MVPanned4:
; DS:0 = destination volume
; DS:10h = samples
; DS:18h = samples
; MM5 = offsets
; MM6 = current volume
; MM7 = delta offsets
MovQ MM2, MM5
PAddW MM5, MM7
PSRLWI MM2, 1
MovQ MM3, MM5
PMAddWD MM2, [DS:10h]
PSRLWI MM3, 1
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:10h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:12h], AX
Add BX, BX
PSRADI MM2, 15
PAddW MM5, MM7
PMAddWD MM3, [DS:18h]
PackSSDW MM2, MM2
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:14h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:16h], AX
Add BX, BX
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PSRADI MM3, 15
PMulLW MM2, MM6
PackSSDW MM3, MM3
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:18h], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:1Ah], AX
Add BX, BX
MovQ MM1, [DS:0] ; Destination volume
PUnpckLWD MM3, MM3
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PSubW MM1, MM6
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PSRAWI MM1, RAMPSPEED-1
PAddD MM4, [SI+8]
PAddW MM6, MM1 ; MM6 = new volume (ramped)
MovQM [SI], MM2
MovQ MM1, MM6
MovQ MM2, [DS:0]
PMulHW MM1, MM3
MovQM [SI+8], MM4
PMulLW MM3, MM6
Add CX, BP
Mov AX, [ES:BX]
AdC DI, DX
Mov [DS:1Ch], AX
Mov AX, [ES:BX+2]
Mov BX, DI
Mov [DS:1Eh], AX
Add BX, BX
MovQ MM0, MM3
PUnpckLWD MM3, MM1
PAddD MM3, [SI+10h]
PUnpckHWD MM0, MM1
MovQM [SI+10h], MM3
PSubW MM2, MM6
PAddD MM0, [SI+18h]
PSRAWI MM2, RAMPSPEED-1
MovQM [SI+18h], MM0
PAddW MM6, MM2
Add SI, 20h
Dec Word Ptr [DS:20h]
JNZ M32Bit16MVPanned4
M32Bit16MVPanned5:
MovQ MM2, MM5
PAddW MM5, MM7
PSRLWI MM2, 1
MovQ MM3, MM5
PMAddWD MM2, [DS:10h]
PSRLWI MM3, 1
PSRADI MM2, 15
PAddW MM5, MM7
PMAddWD MM3, [DS:18h]
PackSSDW MM2, MM2
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PSRADI MM3, 15
PMulLW MM2, MM6
PackSSDW MM3, MM3
MovQ MM1, [DS:0] ; Destination volume
PUnpckLWD MM3, MM3
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PSubW MM1, MM6
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PSRAWI MM1, RAMPSPEED-1
PAddD MM4, [SI+8]
PAddW MM6, MM1 ; MM6 = new volume (ramped)
MovQM [SI], MM2
MovQ MM1, MM6
MovQ MM2, [DS:0]
PMulHW MM1, MM3
MovQM [SI+8], MM4
PMulLW MM3, MM6
MovQ MM0, MM3
PUnpckLWD MM3, MM1
PAddD MM3, [SI+10h]
PUnpckHWD MM0, MM1
MovQM [SI+10h], MM3
PSubW MM2, MM6
PAddD MM0, [SI+18h]
PSRAWI MM2, RAMPSPEED-1
MovQM [SI+18h], MM0
PAddW MM6, MM2
M32Bit16MVPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMICounter16BitTicksLow, EAX
AdC CS:M32BitMICounter16BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit16MVPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc M32Bit8MVPanned
; Layout of data in data segment
; DS:0 = destination volume
; DS:10h->1Fh = samples
; AX = number to mix
; CX = error
; DX = deltaoffset
; BP = deltaerror
; DS:SI = 32-bit output buffer
; ES:DI = sample location
; MM6 = L/R volumes
; MM7 = PXor mask
IF MONITORPERFORMANCE
Push EAX
Push EDX
Add CS:M32BitMICounter8BitLow, AX
AdC CS:M32BitMICounter8BitHigh, 0
RdTSC
Sub CS:M32BitMICounter8BitTicksLow, EAX
SBB CS:M32BitMICounter8BitTicksHigh, EDX
Pop EDX
Pop EAX
ENDIF
; AX = number of samples to mix.
; DS:0 = destination volume
; DS:8 = SS
; DS:0Ch = SP
; DS:10h = sample setup
; MM6 = current volume.
Mov BX, AX
Assume DS:Driver
SegCS MovQ MM1, M32BitMIPNotMask ; = FFFF0000FFFF0000h
Assume DS:Nothing
And AX, 3
JZ M32Bit8MVPanned3
M32Bit8MVPanned1:
Test AL, 1
JZ M32Bit8MVPanned2
Mov AX, [ES:DI]
Mov [DS:8h], CX
Mov [DS:0Ah], CX
Add CX, BP
AdC DI, DX
MovQ MM4, [DS:8h]
MovQ MM2, MM6
MovD MM0, AX
PXor MM4, MM1
PSRLWI MM4, 1
PUnpckLBW MM0, MM0
PMAddWD MM0, MM4
PSRADI MM0, 15
PUnpckLWD MM0, MM0
PMulLW MM2, MM0
MovQ MM4, [DS:0] ; VR
PMulHW MM0, MM6
PSubW MM4, MM6 ; VR
PUnpckLWD MM2, MM0
PAddD MM2, [SI]
PSRAWI MM4, RAMPSPEED ; VR
MovQM [SI], MM2
PAddW MM6, MM4 ; VR
Add SI, 8
M32Bit8MVPanned2:
Test BL, 2
JZ M32Bit8MVPanned3
Mov AX, [ES:DI]
Mov [DS:8h], CX
Mov [DS:0Ah], CX
Add CX, BP
AdC DI, DX
Mov [DS:10h], AX
Mov AX, [ES:DI]
Mov [DS:0Ch], CX
Mov [DS:0Eh], CX
Add CX, BP
AdC DI, DX
Mov [DS:12h], AX
MovQ MM0, [DS:10h]
MovQ MM2, [DS:8]
PXor MM2, MM1
PUnpckLBW MM0, MM0
PSRLWI MM2, 1
PMAddWD MM2, MM0
PSRADI MM2, 15
PackSSDW MM2, MM2
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PMulLW MM2, MM6
MovQ MM4, MM2
PUnpckLWD MM2, MM0
MovQ MM5, [DS:0] ; VR
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PSubW MM5, MM6 ; VR
PAddD MM4, [SI+8]
MovQM [SI], MM2
PSRAWI MM5, RAMPSPEED-1 ; VR
MovQM [SI+8], MM4
PAddW MM6, MM5 ; VR
Add SI, 10h
M32Bit8MVPanned3:
ShR BX, 2
JZ M32Bit8MVPannedEnd
Mov AX, [ES:DI]
Mov [DS:8h], ERROR
Mov [DS:0Ah], ERROR
Add ERROR, BP
AdC DI, DELTAOFFSET
Mov [DS:10h], AX
Mov AX, [ES:DI]
Mov [DS:0Ch], ERROR
Mov [DS:0Eh], ERROR
Add ERROR, BP
AdC DI, DELTAOFFSET
Mov [DS:12h], AX
Mov AX, [ES:DI]
Add ERROR, BP
AdC DI, DELTAOFFSET
Mov [DS:28h], BP
Mov [DS:18h], AX
Mov [DS:2Ah], BP
Mov AX, [ES:DI]
Add ERROR, BP
AdC DI, DELTAOFFSET
Mov [DS:2Ch], BP
Mov [DS:1Ah], AX
Mov [DS:2Eh], BP
MovQ MM7, [DS:28h]
MovQ MM5, [DS:8]
PAddW MM7, MM7
PXor MM7, MM1
PXor MM5, MM1
PSubW MM7, MM1
Dec BX
JZ M32Bit8MVPanned5
M32Bit8MVPanned4:
; DS:0 = destination volume
; DS:10h = samples
; DS:18h = samples
; MM5 = offsets
; MM6 = current volume
; MM7 = delta offsets
MovQ MM0, [DS:10h]
MovQ MM2, MM5
MovQ MM1, [DS:18h]
PUnpckLBW MM0, MM0
PSRLWI MM2, 1
PAddW MM5, MM7
PMAddWD MM2, MM0
PUnpckLBW MM1, MM1
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:10h], AX
PSRADI MM2, 15
MovQ MM3, MM5
PAddW MM5, MM7
PSRLWI MM3, 1
PMAddWD MM3, MM1
PackSSDW MM2, MM2
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:12h], AX
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PSRADI MM3, 15
PMulLW MM2, MM6
PackSSDW MM3, MM3
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:18h], AX
MovQ MM1, [DS:0] ; Destination volume
PUnpckLWD MM3, MM3
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PSubW MM1, MM6
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PSRAWI MM1, RAMPSPEED-1
PAddD MM4, [SI+8]
PAddW MM6, MM1 ; MM6 = new volume (ramped)
MovQM [SI], MM2
MovQ MM1, MM6
MovQ MM2, [DS:0]
PMulHW MM1, MM3
MovQM [SI+8], MM4
PMulLW MM3, MM6
Mov AX, [ES:DI]
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
Mov [DS:1Ah], AX
MovQ MM0, MM3
PUnpckLWD MM3, MM1
PAddD MM3, [SI+10h]
PUnpckHWD MM0, MM1
MovQM [SI+10h], MM3
PSubW MM2, MM6
PAddD MM0, [SI+18h]
PSRAWI MM2, RAMPSPEED-1
MovQM [SI+18h], MM0
PAddW MM6, MM2
Add SI, 20h
Dec BX
JNZ M32Bit8MVPanned4
M32Bit8MVPanned5:
MovQ MM0, [DS:10h]
MovQ MM2, MM5
MovQ MM1, [DS:18h]
PUnpckLBW MM0, MM0
PSRLWI MM2, 1
PAddW MM5, MM7
PMAddWD MM2, MM0
PUnpckLBW MM1, MM1
PSRADI MM2, 15
MovQ MM3, MM5
PAddW MM5, MM7
PSRLWI MM3, 1
PMAddWD MM3, MM1
PackSSDW MM2, MM2
PUnpckLWD MM2, MM2
MovQ MM0, MM6
PMulHW MM0, MM2
PSRADI MM3, 15
PMulLW MM2, MM6
PackSSDW MM3, MM3
MovQ MM1, [DS:0] ; Destination volume
PUnpckLWD MM3, MM3
MovQ MM4, MM2
PUnpckLWD MM2, MM0
PSubW MM1, MM6
PUnpckHWD MM4, MM0
PAddD MM2, [SI]
PSRAWI MM1, RAMPSPEED-1
PAddD MM4, [SI+8]
PAddW MM6, MM1 ; MM6 = new volume (ramped)
MovQM [SI], MM2
MovQ MM1, MM6
MovQ MM2, [DS:0]
PMulHW MM1, MM3
MovQM [SI+8], MM4
PMulLW MM3, MM6
MovQ MM0, MM3
PUnpckLWD MM3, MM1
PAddD MM3, [SI+10h]
PUnpckHWD MM0, MM1
MovQM [SI+10h], MM3
PSubW MM2, MM6
PAddD MM0, [SI+18h]
PSRAWI MM2, RAMPSPEED-1
MovQM [SI+18h], MM0
PAddW MM6, MM2
M32Bit8MVPannedEnd:
IF MONITORPERFORMANCE
RdTSC
Add CS:M32BitMICounter8BitTicksLow, EAX
AdC CS:M32BitMICounter8BitTicksHigh, EDX
ENDIF
Ret
EndP M32Bit8MVPanned
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreM32BitMVPanned
Assume DS:Driver
Mov ES, CS:MixSegment
Mov AX, [SI+0Ch] ; AX = destination left
Mov BX, [SI+1Ch] ; BX = current left
Mov CX, [SI+0Eh] ; CX = destination right
Mov DX, [SI+1Eh] ; DX = current right.
Cmp AX, BX
JL PreM32BitMVPannedV1
Add AX, RAMPCOMPENSATE
PreM32BitMVPannedV1:
Cmp CX, DX
JL PreM32BitMVPannedV2
Add CX, RAMPCOMPENSATE
PreM32BitMVPannedV2:
Sub Word Ptr [SI+8], 60
Mov [Word Ptr ES:0], AX
Mov [Word Ptr ES:4], AX
Mov [Word Ptr ES:2], CX
Mov [Word Ptr ES:6], CX
Mov [CS:M32BitMIVolumeData], BX
Mov [CS:M32BitMIVolumeData+2], DX
Sub AX, BX
Sub CX, DX
SAR AX, RAMPSPEED
SAR CX, RAMPSPEED
Add BX, AX
Add DX, CX
Mov [CS:M32BitMIVolumeData+4], BX
Mov [CS:M32BitMIVolumeData+6], DX
SegCS MovQ MM6, M32BitMIVolumeData
Ret
EndP PreM32BitMVPanned
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

49
SoundDrivers/M32ULTRA.INC Executable file
View File

@ -0,0 +1,49 @@
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMixUltraLeft8BitI, MFS8Bit, MBS8Bit, MixUltraSingle8BitI
DW Offset MixForwardsLoop, PreMixUltraLeft8BitI, MFS8Bit, MBS8Bit, MixUltraSingle8BitI
DW Offset MixPingPongLoop, PreMixUltraLeft8BitI, MFS8Bit, MBS8Bit, MixUltraSingle8BitI
; Right only
DW Offset MixNoLoop, PreMixUltraRight8BitI, MFS8Bit, MBS8Bit, MixUltraSingle8BitI
DW Offset MixForwardsLoop, PreMixUltraRight8BitI, MFS8Bit, MBS8Bit, MixUltraSingle8BitI
DW Offset MixPingPongLoop, PreMixUltraRight8BitI, MFS8Bit, MBS8Bit, MixUltraSingle8BitI
; Central
DW Offset MixNoLoop, PreMixUltraCentral8BitI, MFS8Bit, MBS8Bit, MixUltraCentral8BitI
DW Offset MixForwardsLoop, PreMixUltraCentral8BitI, MFS8Bit, MBS8Bit, MixUltraCentral8BitI
DW Offset MixPingPongLoop, PreMixUltraCentral8BitI, MFS8Bit, MBS8Bit, MixUltraCentral8BitI
; Stereo
DW Offset MixNoLoop, PreMixUltraPanned8BitI, MFS8Bit, MBS8Bit, MixUltraPanned8BitI
DW Offset MixForwardsLoop, PreMixUltraPanned8BitI, MFS8Bit, MBS8Bit, MixUltraPanned8BitI
DW Offset MixPingPongLoop, PreMixUltraPanned8BitI, MFS8Bit, MBS8Bit, MixUltraPanned8BitI
; Surround
DW Offset MixNoLoop, PreMixUltraSurround8BitI, MFS8Bit, MBS8Bit, MixUltraSurround8BitI
DW Offset MixForwardsLoop, PreMixUltraSurround8BitI, MFS8Bit, MBS8Bit, MixUltraSurround8BitI
DW Offset MixPingPongLoop, PreMixUltraSurround8BitI, MFS8Bit, MBS8Bit, MixUltraSurround8BitI
; 16 bit tables
DW Offset UpdateNoLoop, 0, 0, 0, 0 ; Update only
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
; Left only
DW Offset MixNoLoop, PreMixUltraLeft16BitI, MFS16Bit, MBS16Bit, MixUltraSingle16BitI
DW Offset MixForwardsLoop, PreMixUltraLeft16BitI, MFS16Bit, MBS16Bit, MixUltraSingle16BitI
DW Offset MixPingPongLoop, PreMixUltraLeft16BitI, MFS16Bit, MBS16Bit, MixUltraSingle16BitI
; Right only
DW Offset MixNoLoop, PreMixUltraRight16BitI, MFS16Bit, MBS16Bit, MixUltraSingle16BitI
DW Offset MixForwardsLoop, PreMixUltraRight16BitI, MFS16Bit, MBS16Bit, MixUltraSingle16BitI
DW Offset MixPingPongLoop, PreMixUltraRight16BitI, MFS16Bit, MBS16Bit, MixUltraSingle16BitI
; Central
DW Offset MixNoLoop, PreMixUltraCentral16BitI, MFS16Bit, MBS16Bit, MixUltraCentral16BitI
DW Offset MixForwardsLoop, PreMixUltraCentral16BitI, MFS16Bit, MBS16Bit, MixUltraCentral16BitI
DW Offset MixPingPongLoop, PreMixUltraCentral16BitI, MFS16Bit, MBS16Bit, MixUltraCentral16BitI
; Stereo
DW Offset MixNoLoop, PreMixUltraPanned16BitI, MFS16Bit, MBS16Bit, MixUltraPanned16BitI
DW Offset MixForwardsLoop, PreMixUltraPanned16BitI, MFS16Bit, MBS16Bit, MixUltraPanned16BitI
DW Offset MixPingPongLoop, PreMixUltraPanned16BitI, MFS16Bit, MBS16Bit, MixUltraPanned16BitI
; Surround
DW Offset MixNoLoop, PreMixUltraSurround16BitI, MFS16Bit, MBS16Bit, MixUltraSurround16BitI
DW Offset MixForwardsLoop, PreMixUltraSurround16BitI, MFS16Bit, MBS16Bit, MixUltraSurround16BitI
DW Offset MixPingPongLoop, PreMixUltraSurround16BitI, MFS16Bit, MBS16Bit, MixUltraSurround16BitI

770
SoundDrivers/M32ULTRA.MIX Executable file
View File

@ -0,0 +1,770 @@
; Different mixing routines required:
; Left } shared
; Right }
; Central
; Surround
; Panned ; Each requires 8 bit and 16 bit
; Single output - for Mono, pure left/pure right
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
GetUltra8BitWaveform Macro ; Puts waveform value in EBX, range -32k->+32k
Push EDX
Push EBP
MovSX EDX, Byte Ptr [ES:DI+2] ; v
MovSX EBX, Byte Ptr [ES:DI] ; t
MovSX EAX, Byte Ptr [ES:DI+1] ; u
LEA EBP, [EBX+EDX] ; v+t
SAR EBP, 1
Sub EBP, EAX ; (v+t)/2 - u
IMul EBP, ECX ; ax in 8.16 format
SAR EBP, 10 ; ax in 8.6 format
ShL EAX, 7 ; EBX = 2u<<6
Add EDX, EBX ; EDX = v+t
Add EBX, EBX ; EAX = 2t
Add EBP, EAX ; EBP = ax+2u
Add EDX, EBX ; 3t+v
ShL EDX, 5 ; (3t+v)/2 << 6
Sub EBP, EDX ; ax+b
ShL EBX, 7
IMul EBP, ECX ; ax^2+bx in 8.22 form
SAR EBP, 14 ; ax^2+bx in 8.8 form
Add EBX, EBP ; ax^2+bx+c
Pop EBP
Pop EDX
EndM
GetUltra16BitWaveform Macro ; Puts waveform value in EBX, range -32k->+32k
Push ECX
Push EDX
Push EBP
MovSX EDX, Word Ptr [ES:EDI+EDI+4] ; v
MovSX EBX, Word Ptr [ES:EDI+EDI] ; t
MovSX EAX, Word Ptr [ES:EDI+EDI+2] ; u
ShR ECX, 3 ; 0.13
LEA EBP, [EBX+EDX]
SAR EBP, 1
Sub EBP, EAX ; (v+t)/2 - u
IMul EBP, ECX ; 16.13
SAR EBP, 14 ; 15.0
Add EDX, EBX ; EDX = v+t
Add EBP, EAX ; EBP = ax+2u
LEA EDX, [EDX+EBX*2]
SAR EDX, 2 ; EDX = (3t+v)/2
Sub EBP, EDX ; ax + b, 15 form
IMul EBP, ECX ; ax^2+bx in 15.13 form
SAR EBP, 12 ; ax^2+bx in 16.0 form
Add EBX, EBP
Pop EBP
Pop EDX
Pop ECX
EndM
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MUltraMix8ISingle Macro Index
MUltraMix8ISingle&Index&:
GetUltra8BitWaveForm
MUltraMix8ISingleVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-3)*8], EAX ;; 3
EndM
MUltraMix8ICentral Macro Index
MUltraMix8ICentral&Index&:
GetUltra8BitWaveForm
MUltraMix8ICentralVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-3)*8], EAX ;; 4
Sub [SI+(Index-3)*8+4], EAX ;; 4
EndM
MUltraMix8ISurround Macro Index
MUltraMix8ISurround&Index&:
GetUltra8BitWaveForm
MUltraMix8ISurroundVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-3)*8], EAX ;; 4
Add [SI+(Index-3)*8+4], EAX ;; 4
EndM
; Panned output
MUltraMix8IPanned Macro Index
MUltraMix8IPanned&Index&:
Get32Bit8WaveForm
MUltraMix8ILeftVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
MUltraMix8IRightVolume&Index& EQU $+3
IMul EBX, EBX, 8000h
Sub [SI+(Index-3)*8], EAX ;; 4
Sub [SI+(Index-3)*8+4], EBX ;; 4
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
EndM
MUltraMix16ISingle Macro Index
MUltraMix16ISingle&Index&:
GetUltra16BitWaveForm
MUltraMix16ISingleVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-3)*8], EAX ;; 3
EndM
MUltraMix16ICentral Macro Index
MUltraMix16ICentral&Index&:
GetUltra16BitWaveForm
MUltraMix16ICentralVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-3)*8], EAX ;; 3
Sub [SI+(Index-3)*8+4], EAX ;; 3
EndM
MUltraMix16ISurround Macro Index
MUltraMix16ISurround&Index&:
GetUltra16BitWaveForm
MUltraMix16ISurroundVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
Add ERROR, DELTAERROR ;; 1
AdC DI, DELTAOFFSET ;; 1
Sub [SI+(Index-3)*8], EAX ;; 3
Add [SI+(Index-3)*8+4], EAX ;; 3
EndM
; Panned output
MUltraMix16IPanned Macro Index
MUltraMix16IPanned&Index&:
GetUltra16BitWaveForm
MUltraMix16ILeftVolume&Index& EQU $+3
IMul EAX, EBX, 8000h
MUltraMix16IRightVolume&Index& EQU $+3
IMul EBX, EBX, 8000h
Sub [SI+(Index-3)*8], EAX
Sub [SI+(Index-3)*8+4], EBX
Add ERROR, DELTAERROR
AdC DI, DELTAOFFSET
EndM
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
MixUltraSingle8BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix8ISingleOffset Macro Index
DW Offset MUltraMix8ISingle&Index&
EndM
REPT 4
MUltraMix8ISingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraSingle8BitI
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraSingle8BitIOffsetTable+BX]
MUltraMix8ISingle 0
MUltraMix8ISingle 1
MUltraMix8ISingle 2
MUltraMix8ISingle 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix8ISingle0
Ret
EndP MixUltraSingle8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraLeft8BitI
Mov AX, [SI+0Eh]
PreMixUltraLeft8BitI1:
IndexCounter = 0
PreMixUltraSingleMacro Macro Index
Mov Word Ptr [CS:MUltraMix8ISingleVolume&Index&], AX
EndM
REPT 4
PreMixUltraSingleMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraLeft8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraRight8BitI
Add MixBufferOffset, MixResolution/8
Mov AX, [SI+0Ch]
Jmp PreMixUltraLeft8BitI1
EndP PreMixUltraRight8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixUltraCentral8BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix8ICentralOffset Macro Index
DW Offset MUltraMix8ICentral&Index&
EndM
REPT 4
MUltraMix8ICentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraCentral8BitI
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraCentral8BitIOffsetTable+BX]
MUltraMix8ICentral 0
MUltraMix8ICentral 1
MUltraMix8ICentral 2
MUltraMix8ICentral 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix8ICentral0
Ret
EndP MixUltraCentral8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraCentral8BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMixUltraCentralMacro Macro Index
Mov Word Ptr [CS:MUltraMix8ICentralVolume&Index&], AX
EndM
REPT 4
PreMixUltraCentralMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraCentral8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixUltraSurround8BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix8ISurroundOffset Macro Index
DW Offset MUltraMix8ISurround&Index&
EndM
REPT 4
MUltraMix8ISurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraSurround8BitI
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraSurround8BitIOffsetTable+BX]
MUltraMix8ISurround 0
MUltraMix8ISurround 1
MUltraMix8ISurround 2
MUltraMix8ISurround 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix8ISurround0
Ret
EndP MixUltraSurround8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraSurround8BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMixUltraSurroundMacro Macro Index
Mov Word Ptr [CS:MUltraMix8ISurroundVolume&Index&], AX
EndM
REPT 4
PreMixUltraSurroundMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraSurround8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixUltraPanned8BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix8IPannedOffset Macro Index
DW Offset MUltraMix8IPanned&Index&
EndM
REPT 4
MUltraMix8IPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraPanned8BitI
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraPanned8BitIOffsetTable+BX]
MUltraMix8IPanned 0
MUltraMix8IPanned 1
MUltraMix8IPanned 2
MUltraMix8IPanned 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix8IPanned0
Ret
EndP MixUltraPanned8BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraPanned8BitI
Mov AX, [SI+0Eh] ; Left
Mov BX, [SI+0Ch] ; Right
IndexCounter = 0
PreMixUltraPannedMacro Macro Index
Mov Word Ptr [CS:MUltraMix8ILeftVolume&Index&], AX
Mov Word Ptr [CS:MUltraMix8IRightVolume&Index&], BX
EndM
REPT 4
PreMixUltraPannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraPanned8BitI
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
MixUltraSingle16BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix16ISingleOffset Macro Index
DW Offset MUltraMix16ISingle&Index&
EndM
REPT 4
MUltraMix16ISingleOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraSingle16BitI
; AX = count...
; Number of times to loop = (Count-1) / 16
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraSingle16BitIOffsetTable+BX]
MUltraMix16ISingle 0
MUltraMix16ISingle 1
MUltraMix16ISingle 2
MUltraMix16ISingle 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix16ISingle0
Ret
EndP MixUltraSingle16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraLeft16BitI
Mov AX, [SI+0Eh] ; Left
PreMixUltraLeft16BitI1:
IndexCounter = 0
PreMixUltraSingleMacro Macro Index
Mov Word Ptr [CS:MUltraMix16ISingleVolume&Index&], AX
EndM
REPT 4
PreMixUltraSingleMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraLeft16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraRight16BitI
Add MixBufferOffset, MixResolution/8
Mov AX, [SI+0Ch]
Jmp PreMixUltraLeft16BitI1
Ret
EndP PreMixUltraRight16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixUltraCentral16BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix16ICentralOffset Macro Index
DW Offset MUltraMix16ICentral&Index&
EndM
REPT 4
MUltraMix16ICentralOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraCentral16BitI
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraCentral16BitIOffsetTable+BX]
MUltraMix16ICentral 0
MUltraMix16ICentral 1
MUltraMix16ICentral 2
MUltraMix16ICentral 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix16ICentral0
Ret
EndP MixUltraCentral16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraCentral16BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMixUltraCentralMacro Macro Index
Mov Word Ptr [CS:MUltraMix16ICentralVolume&Index&], AX
EndM
REPT 4
PreMixUltraCentralMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraCentral16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixUltraSurround16BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix16ISurroundOffset Macro Index
DW Offset MUltraMix16ISurround&Index&
EndM
REPT 4
MUltraMix16ISurroundOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraSurround16BitI
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraSurround16BitIOffsetTable+BX]
MUltraMix16ISurround 0
MUltraMix16ISurround 1
MUltraMix16ISurround 2
MUltraMix16ISurround 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ MUltraMix16ISurround0
Ret
EndP MixUltraSurround16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraSurround16BitI
Mov AX, [SI+0Eh]
IndexCounter = 0
PreMixUltraSurroundMacro Macro Index
Mov Word Ptr [CS:MUltraMix16ISurroundVolume&Index&], AX
EndM
REPT 4
PreMixUltraSurroundMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraSurround16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MixUltraPanned16BitIOffsetTable Label Word
IndexCounter = 3
MUltraMix16IPannedOffset Macro Index
DW Offset MUltraMix16IPanned&Index&
EndM
REPT 4
MUltraMix16IPannedOffset %IndexCounter
IndexCounter = IndexCounter-1
EndM
Proc MixUltraPanned16BitI
Dec AX
Mov BX, AX
And AX, 3
ShR BX, 2
Add AX, AX
Inc BX
Mov LoopCounter, BX
Mov BX, AX
ShL AX, RESOLUTIONSHIFT-1
Add SI, AX
Jmp [CS:MixUltraPanned16BitIOffsetTable+BX]
PanMUltraBit16ILoop:
MUltraMix16IPanned 0
MUltraMix16IPanned 1
MUltraMix16IPanned 2
MUltraMix16IPanned 3
Add SI, 4*MIXRESOLUTION/4
Dec LoopCounter
JNZ PanMUltraBit16ILoop
Ret
EndP MixUltraPanned16BitI
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PreMixUltraPanned16BitI
Mov AX, [SI+0Eh] ; Left
Mov BX, [SI+0Ch] ; Right
IndexCounter = 0
PreMixUltraPannedMacro Macro Index
Mov Word Ptr [CS:MUltraMix16ILeftVolume&Index&], AX
Mov Word Ptr [CS:MUltraMix16IRightVolume&Index&], BX
EndM
REPT 4
PreMixUltraPannedMacro %IndexCounter
IndexCounter = IndexCounter+1
EndM
Ret
EndP PreMixUltraPanned16BitI

5
SoundDrivers/MAD.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 ad1816
tlink /3 ad1816
execom ad1816 itad1816.drv
copy itad1816.drv ..

4
SoundDrivers/MAWE.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /ut310 awe32drv
tlink /3 awe32drv
execom awe32drv itawe32.drv
copy itawe32.drv ..

4
SoundDrivers/MAWEB.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /ut310 awe32b
tlink /3 awe32b
execom awe32b itawe32b.drv
copy itawe32b.drv ..

6
SoundDrivers/MB.BAT Executable file
View File

@ -0,0 +1,6 @@
@rem Base1 Driver
tasm /m /ut310 base1
tlink /3 base1
execom base1 itbase1.drv
copy itbase1.drv ..

5
SoundDrivers/MES.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 es1868
tlink /3 es1868
execom es1868 ites1868.drv
copy ites1868.drv ..

5
SoundDrivers/MES1688.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 es1688
tlink /3 es1688
execom es1688 ites1688.drv
copy ites1688.drv ..

5
SoundDrivers/MES1688M.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm32 /m /ut310 es1688mx
tlink /3 es1688mx
execom es1688mx ites1688.mmx
copy ites1688.mmx ..

5
SoundDrivers/MES1788.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 es1788
tlink /3 es1788
execom es1788 ites1788.drv
copy ites1788.drv ..

5
SoundDrivers/MES1869.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 es1869
tlink /3 es1869
execom es1869 ites1869.drv
copy ites1869.drv ..

5
SoundDrivers/MES1869M.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm32 /m /ut310 es1869mx
tlink /3 es1869mx
execom es1869mx ites1869.mmx
copy ites1869.mmx ..

5
SoundDrivers/MESM.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm32 /m /ut310 es1868mx
tlink /3 es1868mx
execom es1868mx ites1868.mmx
copy ites1868.mmx ..

4
SoundDrivers/MEWS.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /ut310 ews64
tlink /3 ews64
execom ews64 itews64.drv
copy itews64.drv ..

5
SoundDrivers/MEWSC.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 ewscodec
tlink /3 ewscodec
execom ewscodec itewscod.drv
copy itewscod.drv ..

5
SoundDrivers/MEWSCM.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm32 /m /ut310 ewscodmx
tlink /3 ewscodmx
execom ewscodmx itewscod.mmx
copy itewscod.mmx ..

5
SoundDrivers/MG16.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 gold16
tlink /3 gold16
execom m16 itgold16.drv
copy itgold16.drv ..

4
SoundDrivers/MGP.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /ut310 guspnpm
tlink /3 guspnpm
execom guspnpm itguspnp.drv
copy itguspnp.drv ..

4
SoundDrivers/MGPM.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm32 /m /ut310 guspnpmx
tlink /3 guspnpmx
execom guspnpmx itguspnp.mmx
copy itguspnp.mmx ..

4
SoundDrivers/MGUS.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /uT310 /l gushiqdr
tlink /3 gushiqdr
execom gushiqdr itgus.drv
copy itgus.drv ..

4
SoundDrivers/MGUS2.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /uT310 gushiq2
tlink /3 gushiq2
execom gushiq2 itgus2.drv
copy itgus2.drv ..

4
SoundDrivers/MGUSLO.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /uT310 gusdrv2
tlink /3 gusdrv2
execom gusdrv2 itguslo.drv
copy itguslo.drv ..

5
SoundDrivers/MGUSMAX.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm /m /ut310 gusmax
tlink /3 gusmax
execom gusmax itgusmax.drv
copy itgusmax.drv ..

5
SoundDrivers/MGUSMAXM.BAT Executable file
View File

@ -0,0 +1,5 @@
tasm32 /m /ut310 gusmaxmx
tlink /3 gusmaxmx
execom gusmaxmx itgusmax.mmx
copy itgusmax.mmx ..

4
SoundDrivers/MGUSMIX.BAT Executable file
View File

@ -0,0 +1,4 @@
tasm /m /ut310 gusmixdr
tlink /3 gusmixdr
execom gusmixdr itgusmix.drv
copy itgusmix.drv ..

865
SoundDrivers/MIDDRV.ASM Executable file
View File

@ -0,0 +1,865 @@
;
; MID File generator
;
REPEATSTATUSBYTE EQU 0
.486P
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
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
include ..\wavswitc.inc
FileHandle DW 0
MIDOutputMsg DB "MIDI File Generator", 13
DB "Writing to disk", 0
MIDOutputError DB "Unable to create output file!", 0FFh, 29, " ", 0
WriteErrorMsg DB "Error writing to output file. Output file closed", 0FFh, 11, " ", 0
ClosedMsg DB "Closed output file", 0FFh, 42, " ", 0
CreateMsg DB "Creating file "
Filename DB " ", 0
OUTPUT DB "OUTPUT"
DriverName DB "ITMID.DRV", 0
CONFIGURATIONOFFSET EQU $+128
CONFIGSIZE EQU 80
MIDDirectory DB ".", 79 Dup (0)
AccumulatedTime DD 0
MIDIHEADERSIZE = 22+32+7
MIDIHeader DB "MThd", 0, 0, 0, 6, 0, 0, 0, 1
DB 0, 018h ; 24 ppqn
DB "MTrk"
MIDIFileSize DD 0
DB 0, 0FFh, 01, 28
DB "Created with Impulse Tracker"
DB 0, 0FFh, 51h, 3
InitialTempo DD 0
MTrkEnd DB 0, 0FFh, 2Fh, 0
MIDIBuffer DB 256 Dup (0)
MIDIBufferOffset DW Offset MIDIBuffer
MIDScreenList DW 6
DW IdleFunctionList
DW GlobalKeyLink
DW Near Ptr FullScreenBox ; 0
DW Near Ptr ScreenHeader
DW Near Ptr FillHeader
DW Near Ptr MIDHeader
DW Near Ptr DirectoryInputText
DW Near Ptr DirectoryInputBox
DW Near Ptr DirectoryInput ; 6
DW 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
MIDHeader DW 10
DB "MIDI File Export Driver", 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 MIDDirectory
DW 59
DD 0
DW 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
TRACEENABLED EQU 0
CREATENEWLOGFILE EQU 1
include debug.inc
; ÄÄ DetectCard ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Returns carry set if error, else carry clear. Has to setup internal vars
; (eg. appropriate IRQ/DMA whatever).
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc DetectCard Far
Mov EAX, 'Jeff'
ClC
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
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 MIDDirectory
Call SetDirectory
Mov SI, Offset MIDOutputMsg
ClC
Ret
EndP InitSound
;ÄÄ ReInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Reinitialises sound output
; Initiates sound output
;
; Parameters: AX = number of channels.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ReInitSound Far
Ret
EndP ReInitSound
;ÄÄ UnInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Stops sound output, releases any memory used by driver
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc CheckFileClosed
Push CS
Pop DS
Assume DS:Driver
Mov BX, FileHandle
Test BX, BX
JZ CheckFileClosedEnd
Mov AH, 40h
Mov CX, 4
Mov DX, Offset MTrkEnd
Int 21h
Mov FileHandle, 0
Mov AX, 4200h ; Move to start of file
Xor CX, CX
Xor DX, DX
Int 21h ; Start of file
Mov AX, Word Ptr [MIDIFileSize]
Mov DX, Word Ptr [MIDIFileSize+2]
XChg AL, DH
XChg AH, DL
Mov Word Ptr [MIDIFileSize], AX
Mov Word Ptr [MIDIFileSize+2], DX
Mov AH, 40h
Mov CX, MIDIHEADERSIZE
Mov DX, Offset MIDIHeader
Int 21h
Mov AH, 3Eh
Int 21h
Mov SI, Offset ClosedMsg
Mov BX, 40
Call SetInfoLine
CheckFileClosedEnd:
Ret
EndP CheckFileClosed
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc UnInitSound Far
Call GotoHomeDirectory
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 MIDDirectory
Int 21h
SaveConfig1:
Mov AH, 3Eh
Int 21h
SaveConfig2:
Call CheckFileClosed
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 WriteMIDIBlock
Assume DS:Driver
Xor ECX, ECX
Mov CX, MIDIBufferOffset
Mov DX, Offset MIDIBuffer
Mov AH, 40h
Mov BX, FileHandle
Sub CX, DX
JZ NoDataToWrite
Add MIDIFileSize, ECX
Trace "Writing MIDI block"
Int 21h
NoDataToWrite:
Mov MIDIBufferOffset, Offset MIDIBuffer
Ret
EndP WriteMIDIBlock
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Poll Far
Assume DS:Nothing
Mov CS:Countdown, 0
Mov CS:MIDIBufferOffset, Offset MIDIBuffer
Call Update ; Got DS:SI, CX
; Scan through channels and if any channels are samples, turn them off.
TurnOffSamples1:
Test Byte Ptr [SI], 1 ; Channel on?
JZ TurnOffSamples2
Mov Word Ptr [SI], 0
Test Byte Ptr [SI+3Ah], 80h
JNZ TurnOffSamples2
Mov BX, [SI+38h]
And Byte Ptr [BX], Not 4 ; Signify channel off
TurnOffSamples2:
Add SI, 128
Loop TurnOffSamples1
; OK.. check whether any MIDI data requires dumping... also whether file
; needs to be created.
Test AX, AX ; Currently not playing
JNZ Poll1
Call CheckFileClosed
Ret
Poll1:
Push CS
Pop DS
Assume DS:Driver
Cmp FileHandle, 0
JNE Poll2
Trace "New file to create"
Mov SI, Offset MIDDirectory
Call SetDirectory
Xor EAX, EAX
Mov AccumulatedTime, EAX
Mov AL, 4+32+7
Mov MIDIFileSize, EAX
; Have to create a file
Call GetFileName
Assume DS:Nothing ; Returns DS:SI
Push CS
Pop ES
Mov DI, Offset FileName
Push DI
Mov CX, 12
Mov AL, ' '
Rep StosB
Pop DI
Cmp Byte Ptr [DS:SI], 0
JE PollFileNameNone
Cmp Byte Ptr [DS:SI], '.'
JE PollFileNameNone
Mov CX, 8
PollFileName1:
LodsB
Cmp AL, 0
JE PollFileNameExt
Cmp AL, '.'
JE PollFileNameExt
StosB
Loop PollFileName1
Jmp PollFileNameExt
PollFileNameNone:
Push CS
Pop DS
Mov SI, Offset Output
Mov CX, 6
Rep MovsB
PollFileNameExt:
Mov EAX, 'DIM.'
StosD
Xor AL, AL
StosB
Push CS
Pop DS
Assume DS:Driver
Mov SI, Offset CreateMsg
Mov BX, 40
Call SetInfoLine
Mov AH, 3Ch
Xor CX, CX
Mov DX, Offset Filename
Int 21h
JC WriteError
Mov BX, AX
Mov FileHandle, BX
Trace "File opened"
; Write header once
Push BX
Call GetTempo
Mov EAX, 60000000
And EBX, 0FFFFh
Xor EDX, EDX
Div EBX ; EAX = microseconds per quarter note
ShL EAX, 8
BSwap EAX
Mov InitialTempo, EAX
Pop BX
Mov AH, 40h
Mov CX, MIDIHEADERSIZE
Mov DX, Offset MIDIHeader
Int 21h
JC WriteError
Trace "Header written"
Poll2:
Call WriteMIDIBlock
JC WriteError
; Update time counters
Inc AccumulatedTime
Ret
WriteError:
Call CheckFileClosed
Mov SI, Offset WriteErrorMsg
Mov BX, 40
Call SetInfoLine
Call StopPlayback
Ret
EndP Poll
Assume DS:Nothing
;ÄÄ SetTempo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: BX = tempo
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetTempo Far ; Frames per second = 0.4*BX
; -> Milliseconds per frame = 1000/(0.4/BX)
; = 2500/BX
PushAD
Push DS
; SetTempo: FF 51 03 tt tt tt
Push CS
Pop DS
Assume DS:Driver
Push BX
Mov SI, MIDIBufferOffset
Call WriteDeltaTime
Pop BX
Mov DWord Ptr [SI], 351FFh
Add SI, 3
Mov EAX, 60000000
And EBX, 0FFFFh
Xor EDX, EDX
Div EBX ; EAX = microseconds per quarter note
ShL EAX, 8
BSwap EAX
Mov DWord Ptr [SI], EAX
Add SI, 3
Mov MIDIBufferOffset, SI
Pop DS
PopAD
Ret
EndP SetTempo
;ÄÄ SetMixVolume ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AX = MixVolume
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetMixVolume Far
Ret
EndP SetMixVolume
;ÄÄ SetStereo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AL = Stereo on/off, 0 = off.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetStereo Far
Ret
EndP SetStereo
;ÄÄ LoadSample ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AX = sample to load (0 based)
; 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 (1 based)
; 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
Mov AX, 5
Mov SI, 1
Mov CX, CS
Mov DX, Offset MIDScreenList
ClC
Ret
Ret
EndP SoundCardScreen
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc GetVariable Far
Ret
EndP GetVariable
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetVariable Far
Ret
EndP SetVariable
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
StatusByte DB 0
CountDown DB 0
StatusByteLUT DB 2, 2, 2, 2, 1, 1, 2
InSysex DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc WriteDeltaTime ; Given DS:SI = buffer
Xor EDX, EDX
Mov EBX, AccumulatedTime
Mov CX, 4
Mov AccumulatedTime, EDX
WriteDeltaTime1:
ShL EDX, 8
Mov DL, BL
Or DL, 80h
ShR EBX, 7
LoopNZ WriteDeltaTime1
; EDX = output bytes, DL = most signif
WriteDeltaTime2:
Mov [SI], DL
Inc SI
ShR EDX, 8
JNZ WriteDeltaTime2
And Byte Ptr [SI-1], 7Fh
Ret
EndP WriteDeltaTime
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc BufferMIDIOutput ; AL = value.
PushAD
Push DS
Push CS
Pop DS
Assume DS:Driver
Mov BX, InSysex
Mov SI, MIDIBufferOffset
Test BX, BX
JZ BufferMIDINoSysex
Cmp AL, 0F7h
JNE BufferMIDIOutput1
Mov DX, SI
Sub DX, BX ; DX = count of sysex bytes
Mov [BX], DL
Mov InSysex, 0
Jmp BufferMIDIOutput1
BufferMIDINoSysex:
Cmp Countdown, 0
JNE BufferMIDIOutput1
Cmp AL, 0F0h
JA BufferMIDIOutput2
; Delta time required
Call WriteDeltaTime
Xor BX, BX
Xor DL, DL
Test AL, AL
JNS BufferMIDINoStatus
Cmp AL, 0F0h
JE BufferMIDISysex
Mov StatusByte, AL
Inc DX
Jmp BufferMIDINoStatus
BufferMIDISysex:
Mov [SI], AL
Inc SI
Mov InSysex, SI
Jmp BufferMIDIOutput1
BufferMIDINoStatus:
Mov BL, StatusByte
ShR BX, 4
Sub BL, 8
JC BufferMIDIOutput1
Add DL, [StatusByteLUT+BX]
Mov Countdown, DL
BufferMIDIOutput1:
Mov [SI], AL
Inc SI
Dec Countdown
Mov MIDIBufferOffset, SI
Cmp SI, Offset MIDIBuffer+200
JB BufferMIDIOutput2
Cmp InSysex, 0
JNE BufferMIDIOutput2
Call WriteMIDIBlock
BufferMIDIOutput2:
Pop DS
PopAD
Ret
EndP BufferMIDIOutput
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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
SendUARTOut4:
Mov CS:InterpretState, 0
Ret
SendUARTOut3:
Cmp AL, 2
JAE SendUARTOut4
Mov CS: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 BufferMIDIOutput
Pop AX
Mov CS:InterpretState, 0
SendUARTOutEnd:
Call BufferMIDIOutput
Ret
EndP SendUARTOut
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
EndDriver:
;******** Provided Variable Table *************
MaxNumberOfChannels DW 32 ; Maximum number of channels the
; driver can handle.
StopAfterPlay DW 1
DefaultChannels DW 32
DriverFlags DW 1 ; Supports MIDI Out.
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

828
SoundDrivers/MIDDRV2.ASM Executable file
View File

@ -0,0 +1,828 @@
;
; MID File generator
;
REPEATSTATUSBYTE EQU 0
.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
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
include wavswitc.inc
FileHandle DW 0
MIDOutputMsg DB "MIDI File Generator", 13
DB "Writing to disk", 0
MIDOutputError DB "Unable to create output file!", 0FFh, 29, " ", 0
WriteErrorMsg DB "Error writing to output file. Output file closed", 0FFh, 11, " ", 0
ClosedMsg DB "Closed output file", 0FFh, 42, " ", 0
CreateMsg DB "Creating file "
Filename DB " ", 0
OUTPUT DB "OUTPUT"
DriverName DB "ITMID.DRV", 0
CONFIGURATIONOFFSET EQU $+128
CONFIGSIZE EQU 80
MIDDirectory DB ".", 79 Dup (0)
AccumulatedTime DD 0
AccumulatedTimeError DD 0
FrameTime DD 0
FrameTimeError DD 0
MIDIHeader DB "MThd", 0, 0, 0, 6, 0, 0, 0, 1, 0E7h, 28h
DB "MTrk"
MIDIFileSize DD 0
DB 0, 0FFh, 01, 28
DB "Created with Impulse Tracker"
MTrkEnd DB 0, 0FFh, 2Fh, 0
MIDIBuffer DB 256 Dup (0)
MIDIBufferOffset DW Offset MIDIBuffer
MIDScreenList DW 6
DW IdleFunctionList
DW GlobalKeyLink
DW Near Ptr FullScreenBox ; 0
DW Near Ptr ScreenHeader
DW Near Ptr FillHeader
DW Near Ptr MIDHeader
DW Near Ptr DirectoryInputText
DW Near Ptr DirectoryInputBox
DW Near Ptr DirectoryInput ; 6
DW 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
MIDHeader DW 10
DB "MIDI File Export Driver", 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 MIDDirectory
DW 59
DD 0
DW 0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
TRACEENABLED EQU 0
CREATENEWLOGFILE EQU 1
include debug.inc
; ÄÄ DetectCard ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Returns carry set if error, else carry clear. Has to setup internal vars
; (eg. appropriate IRQ/DMA whatever).
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc DetectCard Far
Mov EAX, 'Jeff'
ClC
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
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 MIDDirectory
Call SetDirectory
Mov SI, Offset MIDOutputMsg
ClC
Ret
EndP InitSound
;ÄÄ ReInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Reinitialises sound output
; Initiates sound output
;
; Parameters: AX = number of channels.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc ReInitSound Far
Ret
EndP ReInitSound
;ÄÄ UnInitSound ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Stops sound output, releases any memory used by driver
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc CheckFileClosed
Push CS
Pop DS
Assume DS:Driver
Mov BX, FileHandle
Test BX, BX
JZ CheckFileClosedEnd
Mov AH, 40h
Mov CX, 4
Mov DX, Offset MTrkEnd
Int 21h
Mov FileHandle, 0
Mov AX, 4200h ; Move to start of file
Xor CX, CX
Xor DX, DX
Int 21h ; Start of file
Mov AX, Word Ptr [MIDIFileSize]
Mov DX, Word Ptr [MIDIFileSize+2]
XChg AL, DH
XChg AH, DL
Mov Word Ptr [MIDIFileSize], AX
Mov Word Ptr [MIDIFileSize+2], DX
Mov AH, 40h
Mov CX, 22+32
Mov DX, Offset MIDIHeader
Int 21h
Mov AH, 3Eh
Int 21h
Mov SI, Offset ClosedMsg
Mov BX, 40
Call SetInfoLine
CheckFileClosedEnd:
Ret
EndP CheckFileClosed
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc UnInitSound Far
Call GotoHomeDirectory
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 MIDDirectory
Int 21h
SaveConfig1:
Mov AH, 3Eh
Int 21h
SaveConfig2:
Call CheckFileClosed
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 WriteMIDIBlock
Assume DS:Driver
Xor ECX, ECX
Mov CX, MIDIBufferOffset
Mov DX, Offset MIDIBuffer
Mov AH, 40h
Mov BX, FileHandle
Sub CX, DX
JZ NoDataToWrite
Add MIDIFileSize, ECX
Trace "Writing MIDI block"
Int 21h
NoDataToWrite:
Mov MIDIBufferOffset, Offset MIDIBuffer
Ret
EndP WriteMIDIBlock
Assume DS:Nothing
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc Poll Far
Assume DS:Nothing
Mov CS:Countdown, 0
Mov CS:MIDIBufferOffset, Offset MIDIBuffer
Call Update ; Got DS:SI, CX
; Scan through channels and if any channels are samples, turn them off.
TurnOffSamples1:
Test Byte Ptr [SI], 1 ; Channel on?
JZ TurnOffSamples2
Mov Word Ptr [SI], 0
Test Byte Ptr [SI+3Ah], 80h
JNZ TurnOffSamples2
Mov BX, [SI+38h]
And Byte Ptr [BX], Not 4 ; Signify channel off
TurnOffSamples2:
Add SI, 128
Loop TurnOffSamples1
; OK.. check whether any MIDI data requires dumping... also whether file
; needs to be created.
Test AX, AX ; Currently not playing
JNZ Poll1
Call CheckFileClosed
Ret
Poll1:
Push CS
Pop DS
Assume DS:Driver
Cmp FileHandle, 0
JNE Poll2
Trace "New file to create"
Mov SI, Offset MIDDirectory
Call SetDirectory
Xor EAX, EAX
Mov AccumulatedTime, EAX
Mov AccumulatedTimeError, EAX
Mov AL, 4+32
Mov MIDIFileSize, EAX
; Have to create a file
Call GetFileName
Assume DS:Nothing ; Returns DS:SI
Push CS
Pop ES
Mov DI, Offset FileName
Push DI
Mov CX, 12
Mov AL, ' '
Rep StosB
Pop DI
Cmp Byte Ptr [DS:SI], 0
JE PollFileNameNone
Cmp Byte Ptr [DS:SI], '.'
JE PollFileNameNone
Mov CX, 8
PollFileName1:
LodsB
Cmp AL, 0
JE PollFileNameExt
Cmp AL, '.'
JE PollFileNameExt
StosB
Loop PollFileName1
Jmp PollFileNameExt
PollFileNameNone:
Push CS
Pop DS
Mov SI, Offset Output
Mov CX, 6
Rep MovsB
PollFileNameExt:
Mov EAX, 'DIM.'
StosD
Xor AL, AL
StosB
Push CS
Pop DS
Assume DS:Driver
Mov SI, Offset CreateMsg
Mov BX, 40
Call SetInfoLine
Mov AH, 3Ch
Xor CX, CX
Mov DX, Offset Filename
Int 21h
JC WriteError
Mov BX, AX
Mov FileHandle, BX
Trace "File opened"
; Write header once
Mov AH, 40h
Mov CX, 22+32
Mov DX, Offset MIDIHeader
Int 21h
JC WriteError
Trace "Header written"
Poll2:
Call WriteMIDIBlock
JC WriteError
; Update time counters
Mov EAX, FrameTimeError
Mov EBX, FrameTime
Add AccumulatedTimeError, EAX
AdC AccumulatedTime, EBX
Ret
WriteError:
Call CheckFileClosed
Mov SI, Offset WriteErrorMsg
Mov BX, 40
Call SetInfoLine
Call StopPlayback
Ret
EndP Poll
Assume DS:Nothing
;ÄÄ SetTempo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: BX = tempo
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetTempo Far ; Frames per second = 0.4*BX
; -> Milliseconds per frame = 1000/(0.4/BX)
; = 2500/BX
PushAD
Mov EAX, 2500
And EBX, 0FFFFh
Xor EDX, EDX
Div EBX ; EAX = milliseconds
Mov CS:FrameTime, EAX
Mov CS:FrameTimeError, EDX
PopAD
Ret
EndP SetTempo
;ÄÄ SetMixVolume ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AX = MixVolume
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetMixVolume Far
Ret
EndP SetMixVolume
;ÄÄ SetStereo ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AL = Stereo on/off, 0 = off.
;
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetStereo Far
Ret
EndP SetStereo
;ÄÄ LoadSample ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Parameters: AX = sample to load (0 based)
; 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 (1 based)
; 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
Mov AX, 5
Mov SI, 1
Mov CX, CS
Mov DX, Offset MIDScreenList
ClC
Ret
Ret
EndP SoundCardScreen
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc GetVariable Far
Ret
EndP GetVariable
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc SetVariable Far
Ret
EndP SetVariable
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
StatusByte DB 0
CountDown DB 0
StatusByteLUT DB 2, 2, 2, 2, 1, 1, 2
InSysex DW 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc BufferMIDIOutput
PushAD
Push DS
Push CS
Pop DS
Assume DS:Driver
Mov BX, InSysex
Mov SI, MIDIBufferOffset
Test BX, BX
JZ BufferMIDINoSysex
Cmp AL, 0F7h
JNE BufferMIDIOutput1
Mov DX, SI
Sub DX, BX ; DX = count of sysex bytes
Mov [BX], DL
Mov InSysex, 0
Jmp BufferMIDIOutput1
BufferMIDINoSysex:
Cmp Countdown, 0
JNE BufferMIDIOutput1
Cmp AL, 0F0h
JA BufferMIDIOutput2
; Delta time required
Xor EDX, EDX
Mov EBX, AccumulatedTime
Mov CX, 4
Mov AccumulatedTime, EDX
DeltaTimeOutput1:
ShL EDX, 8
Mov DL, BL
Or DL, 80h
ShR EBX, 7
LoopNZ DeltaTimeOutput1
; EDX = output bytes, DL = most signif
DeltaTimeOutput2:
Mov [SI], DL
Inc SI
ShR EDX, 8
JNZ DeltaTimeOutput2
And Byte Ptr [SI-1], 7Fh
Xor BX, BX
Xor DL, DL
Test AL, AL
JNS BufferMIDINoStatus
Cmp AL, 0F0h
JE BufferMIDISysex
Mov StatusByte, AL
Inc DX
Jmp BufferMIDINoStatus
BufferMIDISysex:
Mov [SI], AL
Inc SI
Mov InSysex, SI
Jmp BufferMIDIOutput1
BufferMIDINoStatus:
Mov BL, StatusByte
ShR BX, 4
Sub BL, 8
JC BufferMIDIOutput1
Add DL, [StatusByteLUT+BX]
Mov Countdown, DL
BufferMIDIOutput1:
Mov [SI], AL
Inc SI
Dec Countdown
Mov MIDIBufferOffset, SI
Cmp SI, Offset MIDIBuffer+200
JB BufferMIDIOutput2
Cmp InSysex, 0
JNE BufferMIDIOutput2
Call WriteMIDIBlock
BufferMIDIOutput2:
Pop DS
PopAD
Ret
EndP BufferMIDIOutput
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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
SendUARTOut4:
Mov CS:InterpretState, 0
Ret
SendUARTOut3:
Cmp AL, 2
JAE SendUARTOut4
Mov CS: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 BufferMIDIOutput
Pop AX
Mov CS:InterpretState, 0
SendUARTOutEnd:
Call BufferMIDIOutput
Ret
EndP SendUARTOut
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
EndDriver:
;******** Provided Variable Table *************
MaxNumberOfChannels DW 32 ; Maximum number of channels the
; driver can handle.
StopAfterPlay DW 1
DefaultChannels DW 32
DriverFlags DW 1 ; Supports MIDI Out.
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

Some files were not shown because too many files have changed in this diff Show More