Added sound drivers to repository
This commit is contained in:
parent
d743c5dd04
commit
94c80b2514
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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:
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,5 @@
|
|||
|
||||
RAMP EQU 1
|
||||
|
||||
include gus.inc
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
include gus.inc
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
RIC EQU 1
|
||||
|
||||
include gus.inc
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
RAMP EQU 1
|
||||
RIC EQU 1
|
||||
|
||||
include gus.inc
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 m16
|
||||
tlink /3 m16
|
||||
execom m16 itmaes16.drv
|
||||
copy itmaes16.drv ..
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 m32
|
||||
tlink /3 m32
|
||||
execom m32 itmaes32.drv
|
||||
copy itmaes32.drv ..
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
;
|
||||
; Floating point mixing routines
|
||||
; DS:0 = a, DS:4 = b, DS:8 = c
|
||||
; DS:10h = os1, DS:18h = OS2
|
||||
;
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 ad1816
|
||||
tlink /3 ad1816
|
||||
execom ad1816 itad1816.drv
|
||||
copy itad1816.drv ..
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /ut310 awe32drv
|
||||
tlink /3 awe32drv
|
||||
execom awe32drv itawe32.drv
|
||||
copy itawe32.drv ..
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /ut310 awe32b
|
||||
tlink /3 awe32b
|
||||
execom awe32b itawe32b.drv
|
||||
copy itawe32b.drv ..
|
|
@ -0,0 +1,6 @@
|
|||
@rem Base1 Driver
|
||||
tasm /m /ut310 base1
|
||||
tlink /3 base1
|
||||
execom base1 itbase1.drv
|
||||
copy itbase1.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 es1868
|
||||
tlink /3 es1868
|
||||
execom es1868 ites1868.drv
|
||||
copy ites1868.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 es1688
|
||||
tlink /3 es1688
|
||||
execom es1688 ites1688.drv
|
||||
copy ites1688.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm32 /m /ut310 es1688mx
|
||||
tlink /3 es1688mx
|
||||
execom es1688mx ites1688.mmx
|
||||
copy ites1688.mmx ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 es1788
|
||||
tlink /3 es1788
|
||||
execom es1788 ites1788.drv
|
||||
copy ites1788.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 es1869
|
||||
tlink /3 es1869
|
||||
execom es1869 ites1869.drv
|
||||
copy ites1869.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm32 /m /ut310 es1869mx
|
||||
tlink /3 es1869mx
|
||||
execom es1869mx ites1869.mmx
|
||||
copy ites1869.mmx ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm32 /m /ut310 es1868mx
|
||||
tlink /3 es1868mx
|
||||
execom es1868mx ites1868.mmx
|
||||
copy ites1868.mmx ..
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /ut310 ews64
|
||||
tlink /3 ews64
|
||||
execom ews64 itews64.drv
|
||||
copy itews64.drv ..
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 ewscodec
|
||||
tlink /3 ewscodec
|
||||
execom ewscodec itewscod.drv
|
||||
copy itewscod.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm32 /m /ut310 ewscodmx
|
||||
tlink /3 ewscodmx
|
||||
execom ewscodmx itewscod.mmx
|
||||
copy itewscod.mmx ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 gold16
|
||||
tlink /3 gold16
|
||||
execom m16 itgold16.drv
|
||||
copy itgold16.drv ..
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /ut310 guspnpm
|
||||
tlink /3 guspnpm
|
||||
execom guspnpm itguspnp.drv
|
||||
copy itguspnp.drv ..
|
|
@ -0,0 +1,4 @@
|
|||
tasm32 /m /ut310 guspnpmx
|
||||
tlink /3 guspnpmx
|
||||
execom guspnpmx itguspnp.mmx
|
||||
copy itguspnp.mmx ..
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /uT310 /l gushiqdr
|
||||
tlink /3 gushiqdr
|
||||
execom gushiqdr itgus.drv
|
||||
copy itgus.drv ..
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /uT310 gushiq2
|
||||
tlink /3 gushiq2
|
||||
execom gushiq2 itgus2.drv
|
||||
copy itgus2.drv ..
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /uT310 gusdrv2
|
||||
tlink /3 gusdrv2
|
||||
execom gusdrv2 itguslo.drv
|
||||
copy itguslo.drv ..
|
|
@ -0,0 +1,5 @@
|
|||
tasm /m /ut310 gusmax
|
||||
tlink /3 gusmax
|
||||
execom gusmax itgusmax.drv
|
||||
copy itgusmax.drv ..
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
tasm32 /m /ut310 gusmaxmx
|
||||
tlink /3 gusmaxmx
|
||||
execom gusmaxmx itgusmax.mmx
|
||||
copy itgusmax.mmx ..
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
tasm /m /ut310 gusmixdr
|
||||
tlink /3 gusmixdr
|
||||
execom gusmixdr itgusmix.drv
|
||||
copy itgusmix.drv ..
|
|
@ -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
|
|
@ -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
Loading…
Reference in New Issue