dpvm/it/PE_TRANS.INC

1704 lines
46 KiB
Plaintext

XMVolume DB 0
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc TranslateXMNote
Cmp AL, 96
JBE TranslateXMNote1
Mov AL, 0FFh-11 ; Note off
TranslateXMNote1:
Add AL, 11
StosB
Ret
EndP TranslateXMNote
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
XMEffectG DB 193, 193+4, 193+5, 193+6, 193+6, 193+7, 193+7, 193+8
DB 193+8, 193+9
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc TranslateXMInstrument
Cmp AL, 99
JBE TranslateXMInstrument1
Xor AL, AL
Cmp Byte Ptr [ES:DI-1], 0FFh ; note off?
JE TranslateXMInstrument2
Mov Byte Ptr [ES:DI-1], 0FDh
Jmp TranslateXMInstrument2
TranslateXMInstrument1:
Cmp Byte Ptr [ES:DI-1], 0FFh ; note off?
JNE TranslateXMInstrument2
Xor AL, AL
TranslateXMInstrument2:
StosB
Ret
EndP TranslateXMInstrument
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc TranslateXMVolume
Push AX
Mov AH, AL
Mov DX, AX
Mov AL, 0FFh
Cmp AH, 10h ; Nothing
JB TranslateXMVolume1
Mov AL, AH
Sub AL, 10h
Cmp AH, 50h ; Volume
JBE TranslateXMVolume1
Mov AL, 0FFh
Cmp AH, 60h ; Nothing
JB TranslateXMVolume1
Mov AL, AH
And AX, 0F00Fh
Cmp AL, 9
JBE TranslateXMVolume2
Mov AL, 9
TranslateXMVolume2:
Cmp AH, 70h
JAE TranslateXMVolume3
Add AL, 95 ; Volume down
Jmp TranslateXMVolume1
TranslateXMVolume3:
Cmp AH, 80h
JAE TranslateXMVolume4
Add AL, 85 ; volume up
Jmp TranslateXMVolume1
TranslateXMVolume4:
Cmp AH, 90h
JAE TranslateXMVolume5
Add AL, 75 ; Fine volume down
Jmp TranslateXMVolume1
TranslateXMVolume5:
Cmp AH, 0A0h
JAE TranslateXMVolume6
Add AL, 65 ; fine volume up
Jmp TranslateXMVolume1
TranslateXMVolume6:
Cmp AH, 0B0h
JAE TranslateXMVolume7
Mov AL, 0FFh ; Vibrato speed
Jmp TranslateXMVolume1
TranslateXMVolume7:
Cmp AH, 0C0h
JAE TranslateXMVolume8
Cmp AL, 3
JBE TranslateXMVolumeH
Dec AX
TranslateXMVolumeH:
Add AL, 203 ; Vibrato
Jmp TranslateXMVolume1
TranslateXMVolume8:
Cmp AH, 0D0h
JAE TranslateXMVolume9
Mov AL, DL
Sub AL, 0C0h
Mov AH, AL
ShL AL, 2
Or AL, AH ;Panning
Add AL, 128
Jmp TranslateXMVolume1
TranslateXMVolume9:
Cmp AH, 0F0h
JAE TranslateXMVolume10
Mov AL, 0FFh ; Pan slide left/right
Jmp TranslateXMVolume1
TranslateXMVolume10: ; Porta
Push BX
Mov BX, AX
And BX, 0FFh
Mov AL, [CS:XMEffectG+BX]
Pop BX
TranslateXMVolume1:
StosB
Pop AX
Ret
EndP TranslateXMVolume
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc TranslateXMEffect ; Given AX = data
Test AX, AX
JNZ TranslateXMEffect1
TranslateXMEffectVol:
Xor AX, AX
Cmp CS:XMVolume, 60h
JB TranslateXMEffectEnd
Mov DH, 0FFh
Jmp TranslateXMEffectVolume
TranslateXMEffect1:
Cmp AL, 'K'-'A'+0Ah
JNE TranslateXMEffect24
Mov AL, [ES:DI-3]
Cmp AL, 0FDh
JNE TranslateXMEffectVol
Mov Word Ptr [ES:DI-3], 0FFh
Jmp TranslateXMEffectVol
TranslateXMEffect24:
Cmp AL, 0
JNE TranslateXMEffect2
Mov AL, 'J'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect2:
Cmp AL, 1
JNE TranslateXMEffect3
Mov AL, 'F'-'@'
Test AH, AH
JNZ TranslateXMEffectEnd
Cmp CS:XMVolume, 60h
JB TranslateXMEffectEnd
Mov DH, 105
Jmp TranslateXMEffectVolume
TranslateXMEffect3:
Cmp AL, 2
JNE TranslateXMEffect4
Mov AL, 'E'-'@'
Test AH, AH
JNZ TranslateXMEffectEnd
Cmp CS:XMVolume, 60h
JB TranslateXMEffectEnd
Mov DH, 115
Jmp TranslateXMEffectVolume
TranslateXMEffect4:
Cmp AL, 3
JNE TranslateXMEffect5
Mov AL, 'G'-'@'
Test AH, AH
JNZ TranslateXMEffectEnd
Cmp CS:XMVolume, 60h
JB TranslateXMEffectEnd
Mov DH, 193
Jmp TranslateXMEffectVolume
TranslateXMEffect5:
Cmp AL, 4
JNE TranslateXMEffect6
Mov AL, AH
And AX, 0FF0h
Cmp AH, 4
JBE TranslateXMEffectH1
Dec AH
TranslateXMEffectH1:
Or AH, AL
Mov AL, 'H'-'@'
Test AH, AH
JNZ TranslateXMEffectEnd
Cmp CS:XMVolume, 60h
JB TranslateXMEffectEnd
Mov DH, 203
Jmp TranslateXMEffectVolume
TranslateXMEffect6:
Cmp AL, 5
JNE TranslateXMEffect7
Mov AL, 'L'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect7:
Cmp AL, 6
JNE TranslateXMEffect8
Mov AL, 'K'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect8:
Cmp AL, 7
JNE TranslateXMEffect9
Mov AL, 'R'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect9:
Cmp AL, 8
JNE TranslateXMEffect10
Mov AL, 'X'-'@'
Cmp CS:XMVolume, 60h
JB TranslateXMEffectEnd
Mov DH, AH
ShR DH, 2
AdC DH, 128
Jmp TranslateXMEffectVolume
TranslateXMEffect10:
Cmp AL, 9
JNE TranslateXMEffect11
Mov AL, 'O'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect11:
Cmp AL, 0Ah
JNE TranslateXMEffect12
Mov AL, 'D'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect12:
Cmp AL, 0Bh
JNE TranslateXMEffect13
Mov AL, 'B'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect13:
Cmp AL, 0Ch
JNE TranslateXMEffect14
Mov DH, AH
Cmp DH, 64
JB TranslateXMEffectVolume
Mov DH, 64
TranslateXMEffectVolume:
Mov AL, CS:XMVolume
Mov AH, AL
And AH, 0Fh
Cmp AL, 60h
JAE TranslateXMEffectVolume1
Xor AX, AX
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume1:
Cmp AL, 70h
JAE TranslateXMEffectVolume2
Mov AL, 'D'-'@'
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume2:
Cmp AL, 80h
JAE TranslateXMEffectVolume3
Mov AL, 'D'-'@'
ShL AH, 4
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume3:
Cmp AL, 90h
JAE TranslateXMEffectVolume4
Mov AL, 'D'-'@'
Test AH, AH
JZ TranslateXMEffect3Memory
Or AH, 0F0h
Cmp AH, 0FFh
JNE TranslateXMEffect3Memory
Dec AH
TranslateXMEffect3Memory:
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume4:
Cmp AL, 0A0h
JAE TranslateXMEffectVolume5
Mov AL, 'D'-'@'
Test AH, AH
JZ TranslateXMEffect4Memory
ShL AH, 4
Or AH, 0Fh
TranslateXMEffect4Memory:
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume5:
Cmp AL, 0B0h
JAE TranslateXMEffectVolume6
Mov AL, 'H'-'@'
ShL AH, 4
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume6:
Cmp AL, 0C0h
JAE TranslateXMEffectVolume7
Cmp AH, 4
JBE TranslateXMEffectVolumeH6
Dec AH
TranslateXMEffectVolumeH6:
Mov AL, 'H'-'@'
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume7:
Cmp AL, 0D0h
JAE TranslateXMEffectVolume8
Mov AL, 'S'-'@'
Or AH, 80h
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume8:
Cmp AL, 0E0h
JAE TranslateXMEffectVolume9
Mov AL, 'P'-'@'
ShL AH, 4
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume9:
Cmp AL, 0F0h
JAE TranslateXMEffectVolume10
Mov AL, 'P'-'@'
Jmp TranslateXMEffectVolumeEnd
TranslateXMEffectVolume10:
Mov AL, 'G'-'@'
ShL AH, 4
TranslateXMEffectVolumeEnd:
Mov [ES:DI-1], DH
StosW
Ret
TranslateXMEffect14:
Cmp AL, 0Dh
JNE TranslateXMEffect15
Mov AL, AH
And AX, 0F00Fh
ShR AH, 1
Add AL, AH
ShR AH, 2
Add AH, AL
Mov AL, 'C'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect15:
Cmp AL, 0Eh
JNE TranslateXMEffect16
; 'Multiplex' effect
Mov AL, AH
And AX, 0FF0h
Test AL, AL
JNZ TranslateXMEffectE1
Xor AX, AX
Jmp TranslateXMEffectEnd
TranslateXMEffectE1:
Cmp AL, 10h
JNE TranslateXMEffectE2
Test AH, AH
JZ TranslateE1Memory
Or AH, 0F0h
TranslateE1Memory:
Mov AL, 'F'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectE2:
Cmp AL, 20h
JNE TranslateXMEffectE3
Test AH, AH
JZ TranslateE2Memory
Or AH, 0F0h
TranslateE2Memory:
Mov AL, 'E'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectE3:
Cmp AL, 30h
JNE TranslateXMEffectE4
Xor AX, AX
Jmp TranslateXMEffectEnd
TranslateXMEffectE4:
Cmp AL, 40h
JNE TranslateXMEffectE5
Or AH, 30h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectE5:
Cmp AL, 50h
JNE TranslateXMEffectE6
Xor AX, AX
Jmp TranslateXMEffectEnd
TranslateXMEffectE6:
Cmp AL, 60h
JNE TranslateXMEffectE7
Or AH, 0B0h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectE7:
Cmp AL, 70h
JNE TranslateXMEffectE8
Or AH, 040h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectE8:
Cmp AL, 80h
JNE TranslateXMEffectE9
Or AH, 80h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectE9:
Cmp AL, 90h
JNE TranslateXMEffectEA
Mov AL, 'Q'-'@'
Test AH, AH
JNZ TranslateXMEffectEnd
Jmp TranslateXMEffectVol
TranslateXMEffectEA:
Cmp AL, 0A0h
JNE TranslateXMEffectEB
Test AH, AH
JZ TranslateXMEAMemory
ShL AH, 4
Or AH, 0Fh
TranslateXMEAMemory:
Mov AL, 'D'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectEB:
Cmp AL, 0B0h
JNE TranslateXMEffectEC
Test AH, AH
JZ TranslateXMEBMemory
Or AH, 0F0h
Cmp AH, 0FFh
JNE TranslateXMEBMemory
Dec AH
TranslateXMEBMemory:
Mov AL, 'D'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectEC:
Cmp AL, 0C0h
JNE TranslateXMEffectED
Or AH, 0C0h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectED:
Cmp AL, 0D0h
JNE TranslateXMEffectEE
Or AH, 0D0h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectEE:
Cmp AL, 0E0h
JNE TranslateXMEffectEF
Or AH, 0E0h
Mov AL, 'S'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectEF:
Xor AX, AX
Jmp TranslateXMEffectEnd
TranslateXMEffect16:
Cmp AL, 0Fh
JNE TranslateXMEffect18
Mov AL, 'T'-'@'
Cmp AH, 20h
JAE TranslateXMTempo1
Mov AL, 'A'-'@'
TranslateXMTempo1:
Jmp TranslateXMEffectEnd
TranslateXMEffect18:
Cmp AL, 10h ; 'G'lobal volume
JNE TranslateXMEffect19
Mov AL, 'V'-'@'
Cmp AH, 40h
JB TranslateXMEffectV
Mov AH, 80h
Jmp TranslateXMEffectEnd
TranslateXMEffectV:
ShL AH, 1
Jmp TranslateXMEffectEnd
TranslateXMEffect19:
Cmp AL, 11h ; 'H'
JNE TranslateXMEffect20
Mov AL, AH
And AX, 0FF0h
ShL AH, 1
Cmp AH, 0Fh
JBE TranslateGlobalVolSlide2
Mov AH, 0Fh
TranslateGlobalVolSlide2:
ShL AL, 1
JNC TranslateGlobalVolSlide1
Mov AL, 0F0h
TranslateGlobalVolSlide1:
Or AH, AL
Mov AL, 'W'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect20:
Cmp AL, 'R'-'A'+0Ah
JNE TranslateXMEffect21
Mov AL, 'Q'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect21:
Cmp AL, 'T'-'A'+0Ah
JNE TranslateXMEffect22
Mov AL, AH
And AX, 0FF0h
Test AH, AH
JNZ Tremor1
Inc AH
Tremor1:
Test AL, AL
JNZ Tremor2
Inc AX
Tremor2:
Or AH, AL
Mov AL, 'I'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect22:
Cmp AL, 'X'-'A'+0Ah
JNE TranslateXMEffect23
Mov AL, AH
And AX, 0FF0h
Or AH, 0E0h
Cmp AL, 10h
JE TranslateXMEffectX1
Cmp AL, 20h
JE TranslateXMEffectX2
Xor AX, AX
Jmp TranslateXMEffectEnd
TranslateXMEffectX1:
Mov AL, 'F'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffectX2:
Mov AL, 'E'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEffect23:
Cmp AL, 'Z'-'A'+0Ah
JNE TranslateXMEffect25
Mov AL, 'Z'-'@'
Jmp TranslateXMEffectEnd
TranslateXMEFfect25:
Jmp TranslateXMEffectVol
; Xor AX, AX
TranslateXMEffectEnd:
StosW
Ret
EndP TranslateXMEffect
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PE_TranslateXMPattern Far ; DS:SI points to
; data, AX = rows
; CX = channels
; DX = pattern num
; Has to return DS:SI
PushA
Push DS
Push ES
Dec AX
Mov CS:TempVariableArea3, AX
Cmp AX, 31
JAE PE_XMLimitRows
Mov AX, 31
PE_XMLimitRows:
Mov CS:MaxRow, AX
Mov CS:PatternNumber, DX ; Pattern number
Mov CS:TempVariableArea2, CX ; Channels
Call PE_ClearPatternData
Mov ES, CS:PatternDataArea
Xor DI, DI
Xor AX, AX ; AX = row number
PE_TranslateXMPattern1:
Push AX
Push DI
Mov CX, CS:TempVariableArea2 ; CX = channels
PE_TranslateXMPattern2:
Push CX
LodsB ; AL = either note or compression
; control.
Test AL, AL
JS PE_TranslateXMPatternCompressed
Call TranslateXMNote
LodsB
Call TranslateXMInstrument
LodsB
Mov CS:XMVolume, AL
Call TranslateXMVolume
LodsW
Call TranslateXMEffect
Jmp PE_TranslateXMPattern3
PE_TranslateXMPatternCompressed:
Mov CS:XMVolume, 0
Mov AH, AL
Test AH, 1
JZ PE_TranslateXMPattern4
LodsB
Call TranslateXMNote
Dec DI
PE_TranslateXMPattern4:
Inc DI
Test AH, 2
JZ PE_TranslateXMPattern5
LodsB
Call TranslateXMInstrument
Dec DI
PE_TranslateXMPattern5:
Inc DI
Test AH, 4
JZ PE_TranslateXMPattern6
LodsB
Mov CS:XMVolume, AL
Call TranslateXMVolume
Dec DI
PE_TranslateXMPattern6:
Inc DI
Xor AL, AL
Test AH, 8
JZ PE_TranslateXMPattern7
LodsB
PE_TranslateXMPattern7:
Test AH, 10h
Mov AH, 0
JZ PE_TranslateXMPattern8
Mov AH, [SI]
Inc SI
PE_TranslateXMPattern8:
Call TranslateXMEffect
PE_TranslateXMPattern3:
Pop CX
Dec CX
JNZ PE_TranslateXMPattern2
Pop DI
Pop AX
Add DI, 320 ; Next row.
Inc AX
Cmp AX, CS:TempVariableArea3
JBE PE_TranslateXMPattern1
Mov CS:TempVariableArea, SI
Mov AX, CS:TempVariableArea3
Cmp AX, CS:MaxRow
JE PE_TranslateXMPatternNoBreak
Mov DX, 320
Mul DX
Mov DI, AX
Add DI, 3
PE_TranslateXMPatternBreak1:
Cmp Word Ptr [ES:DI], 0
JE PE_TranslateXMPatternBreak2
Add DI, 5
Jmp PE_TranslateXMPatternBreak1
PE_TranslateXMPatternBreak2:
Mov Word Ptr [ES:DI], 'C'-'@' ; Break.
PE_TranslateXMPatternNoBreak:
Push CS
Pop DS
Call Far Ptr PE_TranslateS3MPointer8
Pop ES
Pop DS
PopA
Mov SI, CS:TempVariableArea
Ret
EndP PE_TranslateXMPattern
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc TranslateMODCommand ; AL = command
; AH = command value
; ES:DI points to
; command destination
Test AX, AX
JNZ TranslateMODCommand7
StosW
Ret
TranslateMODCommand7:
Cmp AL, 0
JNE TranslateMODCommand8
Mov AL, 'J'-'@'
StosW
Ret
TranslateMODCommand8:
Cmp AL, 1
JNE TranslateMODCommand9
Mov AL, 'F'-'@'
Jmp TranslateMODCommand36
TranslateMODCommand9:
Cmp AL, 2
JNE TranslateMODCommand10
Mov AL, 'E'-'@'
Jmp TranslateMODCommand36
TranslateMODCommand10:
Cmp AL, 3
JNE TranslateMODCommand11
Mov AL, 'G'-'@'
StosW
Ret
TranslateMODCommand11:
Cmp AL, 4
JNE TranslateMODCommand12
Mov AL, 'H'-'@'
StosW
Ret
TranslateMODCommand12:
Cmp AL, 5
JNE TranslateMODCommand13
Mov AL, 'L'-'@'
Test AH, AH
JNZ TranslateMODCommand40
Mov AX, 'G'-'@'
TranslateMODCommand40:
StosW
Ret
TranslateMODCommand13:
Cmp AL, 6
JNE TranslateMODCommand14
Mov AL, 'K'-'@'
Test AH, AH
JNZ TranslateMODCommand39
Mov AX, 'H'-'@'
TranslateMODCommand39:
StosW
Ret
TranslateMODCommand14:
Cmp AL, 7
JNE TranslateMODCommand15
Mov AL, 'R'-'@'
StosW
Ret
TranslateMODCommand15:
Cmp AL, 8
JNE TranslateMODCommand16
Mov AL, 'X'-'@'
Cmp AH, 0A4h
JNE TranslateMODNoSurround
Mov AX, 'S'-'@'+9100h
TranslateMODNoSurround:
StosW
Ret
TranslateMODCommand16:
Cmp AL, 9
JNE TranslateMODCommand17
Mov AL, 'O'-'@'
StosW
Ret
TranslateMODCommand17:
Cmp AL, 10
JNE TranslateMODCommand18
Mov AL, 'D'-'@'
Test AH, 0Fh
JZ TranslateMODVolumeSlide1
Test AH, 0F0h
JZ TranslateMODVolumeSlide1
And AH, 0F0h
TranslateMODVolumeSlide1:
Jmp TranslateMODCommand36
TranslateMODCommand18:
Cmp AL, 11
JNE TranslateMODCommand19
Mov AL, 'B'-'@'
StosW
Ret
TranslateMODCommand19:
Cmp AL, 12
JNE TranslateMODCommand20
Cmp AH, 64
JBE TranslateMODCommand37
Mov AH, 64
TranslateMODCommand37:
Mov [ES:DI-1], AH
Add DI, 2
Ret
TranslateMODCommand20:
Cmp AL, 13
JNE TranslateMODCommand21
Mov AL, AH
And AX, 0F00Fh
ShR AH, 1 ; AH = highnibble*8
Add AL, AH
ShR AH, 2 ; AH = highnibble*2
Add AH, AL
Mov AL, 'C'-'@'
StosW
Ret
TranslateMODCommand21:
Cmp AL, 14
JNE TranslateMODCommand34
Mov AL, AH
And AX, 0FF0h
Cmp AL, 0
JNE TranslateMODCommand22
Test AH, AH
JZ TranslateMODCommand36
Mov AL, 'S'-'@'
StosW
Ret
TranslateMODCommand22:
Cmp AL, 10h
JNE TranslateMODCommand23
Test AH, AH
JZ TranslateMODCommand36
Mov AL, 'F'-'@'
Or AH, 0F0h
StosW
Ret
TranslateMODCommand23:
Cmp AL, 20h
JNE TranslateMODCommand24
Test AH, AH
JZ TranslateMODCommand36
Mov AL, 'E'-'@'
Or AH, 0F0h
StosW
Ret
TranslateMODCommand24:
Cmp AL, 30h
JNE TranslateMODCommand25
Mov AL, 'S'-'@'
Or AH, 010h
StosW
Ret
TranslateMODCommand25:
Cmp AL, 40h
JNE TranslateMODCommand26
Mov AL, 'S'-'@'
Or AH, 030h
StosW
Ret
TranslateMODCommand26:
Cmp AL, 50h
JNE TranslateMODCommand27
Mov AL, 'S'-'@'
Or AH, 020h
StosW
Ret
TranslateMODCommand27:
Cmp AL, 60h
JNE TranslateMODCommand28
Mov AL, 'S'-'@'
Or AH, 0B0h
StosW
Ret
TranslateMODCommand28:
Cmp AL, 70h
JNE TranslateMODCommand29
Mov AL, 'S'-'@'
Or AH, 40h
StosW
Ret
TranslateMODCommand29:
Cmp AL, 80h
JNE TranslateMODCommand30
Or AH, AL
Mov AL, 'S'-'@'
StosW
Ret
TranslateMODCommand30:
Cmp AL, 90h
JNE TranslateMODCommand31
Test AH, AH
JZ TranslateMODCommand36
Mov AL, 'Q'-'@'
Jmp TranslateMODCommand36
TranslateMODCommand31:
Cmp AL, 0A0h
JNE TranslateMODCommand32
And AH, 0Fh
JZ TranslateMODCommand36
Mov AL, 'D'-'@'
ShL AH, 4
Or AH, 0Fh
StosW
Ret
TranslateMODCommand32:
Cmp AL, 0B0h
JNE TranslateMODCommand33
And AH, 0Fh
JZ TranslateMODCommand36
Mov AL, 'D'-'@'
Or AH, 0F0h
StosW
Ret
TranslateMODCommand33:
Or AH, AL
Mov AL, 'S'-'@'
StosW
Ret
TranslateMODCommand34: ; Set speed.
Cmp AH, 20h
JA TranslateMODCommand35
Mov AL, 'A'-'@'
Jmp TranslateMODCommand36
TranslateMODCommand35:
Mov AL, 'T'-'@'
StosW
Ret
TranslateMODCommand36:
Test AH, AH
JNZ TranslateMODCommand38
Xor AX, AX
TranslateMODCommand38:
StosW
Ret
EndP TranslateMODCommand
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PE_TranslateMTMPattern Far ; DS:SI points to data
; DX = pattern no.
PushA
Push DS
Push ES
Mov CS:MaxRow, 63
Mov CS:PatternNumber, DX
Call PE_ClearPatternData
Mov ES, CS:PatternDataArea
Xor DI, DI
Mov CX, 32
PE_TranslateMTMPattern1:
Push CX
Push DI
Mov CX, 64
PE_TranslateMTMPattern2:
LodsW ; Layout of AX
XChg AH, AL
; ppppppiiiiiieeee
; p = pitch val
; i = ins
; e = effect
Mov DL, AL
And DL, 0Fh ; DL = effect.
ShR AX, 2 ; AX = 00pppppp iiiiiixx
ShR AL, 2 ; AH = pitch, AL = ins.
XChg AH, AL ; AH = ins. AL =pitch
Test AL, AL
JZ PE_TranslateMTMPattern3
Add AL, 36 ; Middle octave C-5
Jmp PE_TranslateMTMPattern4
PE_TranslateMTMPattern3:
Mov AL, NONOTE
PE_TranslateMTMPattern4:
StosB ; Pitch.
Mov AL, AH ; Instrument
Mov AH, 0FFh ; volume
StosW
LodsB ; DL = effect, AL = effectval.
Mov AH, AL ; AH = AL = effectval. DL = eff.
Mov AL, DL
Call TranslateMODCommand
Add DI, 315
Loop PE_TranslateMTMPattern2
Pop DI
Pop CX
Add DI, 5
Loop PE_TranslateMTMPattern1
Push CS
Pop DS
Call Far Ptr PE_TranslateMODPattern1
Pop ES
Pop DS
PopA
Ret
EndP PE_TranslateMTMPattern
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PE_TranslateMODPattern Far ; DS:SI points to data
; DX = pattern no.
; AX = number of channels
PushA
Push DS
Push ES
Mov CS:MaxRow, 63
Mov CS:PatternNumber, DX
Call PE_ClearPatternData
Mov ES, CS:PatternDataArea
Xor DI, DI
Mov CX, 64
PE_TranslateMODPattern2:
Push AX
Push CX
Push DI
Mov CX, AX
PE_TranslateMODPattern3:
Mov AL, [DS:SI+1]
Mov AH, [DS:SI]
And AX, 0FFFh ; AX = period of note.
Mov DX, 72
Xor BX, BX
PE_TranslateMODPattern4:
Cmp AX, [CS:MODPeriodTable+BX]
JAE PE_TranslateMODPattern5
Add BX, 2
Dec DX
JNZ PE_TranslateMODPattern4
Inc DI
Jmp PE_TranslateMODPattern6
PE_TranslateMODPattern5:
ShR BX, 1 ; BL = note.
Mov AL, BL
Add AL, 36 ; For C5 as central note.
StosB
PE_TranslateMODPattern6:
Mov AL, [DS:SI]
Mov AH, [DS:SI+2]
ShR AH, 4
And AL, 0F0h
Or AL, AH
StosB ; Sample stored.
Inc DI ; Points to effect/commandvalue
Mov AH, [DS:SI+3]
Mov AL, [DS:SI+2]
And AL, 0Fh ; AL = effect, AH = param.
Call TranslateMODCommand
Add SI, 4
Loop PE_TranslateMODPattern3
Pop DI
Pop CX
Pop AX
Add DI, 320
Loop PE_TranslateMODPattern2
Push CS
Pop DS
Call Far Ptr PE_TranslateMODPattern1
Pop ES
Pop DS
PopA
Ret
PE_TranslateMODPattern1:
Call PEFunction_StorePattern
RetF
EndP PE_TranslateMODPattern
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PE_Translate669Pattern Far
PushA ; DS:0 points to data
Push DS ; CL = Maxrow
Push ES ; AH = Starting tempo
; BP = PatternNumber
Mov Byte Ptr [CS:MaxRow], CL
Mov [CS:PatternNumber], BP
Call PE_ClearPatternData
Mov ES, CS:PatternDataArea
Cmp CL, 31
JAE Pattern669Rows
Mov [CS:MaxRow], 31
Mov AL, 5
Mul CL
Mov DI, AX
ShL DI, 6
Mov Word Ptr [ES:DI+8*5+3], 'C'-'@'
Pattern669Rows:
Xor DI, DI
Mov AL, 'A'-'@'
Mov [ES:DI+8*5+3], AX ; Tempo setting
Inc CL
Xor SI, SI
Xor EAX, EAX
Mov BP, Offset EncodingInfo
Mov [CS:BP], EAX
Mov [CS:BP+4], EAX
Mov [CS:BP+8], EAX
Mov [CS:BP+12], EAX
Translate669Pattern1:
Mov CH, 8
Translate669Pattern2:
LodsW
Cmp AL, 0FEh
JB Translate669Pattern4
JE Translate669Pattern3
Add DI, 3
Jmp Translate669Pattern5
Translate669Pattern3:
Add DI, 2
ShR AX, 6
And AL, 3Ch
StosB
Jmp Translate669Pattern5
Translate669Pattern4:
Mov DX, AX ; Note
And AX, 0F003h
ShL AL, 4
ShR AH, 4
Or AH, AL
Inc AH
Mov AL, DL
ShR AL, 2
Add AL, 36
StosW
Mov AL, DH ; Volume
ShL AL, 2
And AL, 3Ch
StosB
Mov Word Ptr [CS:BP], 0
Translate669Pattern5:
LodsB
Cmp AL, 0FFh
JE Translate669NoEffect
Mov AH, AL
And AX, 00FF0h
Translate669EffectA: ; Portamento Up
Cmp AL, 0
JNE Translate669EffectB
Mov AL, 'F'-'@'
Mov [CS:BP], AX
Jmp Translate669EffectEnd
Translate669EffectB: ; Portamento down
Cmp AL, 10h
JNE Translate669EffectC
Mov AL, 'E'-'@'
Mov [CS:BP], AX
Jmp Translate669EffectEnd
Translate669EffectC: ; Portamento to
Cmp AL, 20h
JNE Translate669EffectD
Mov AL, 'G'-'@'
Mov [CS:BP], AX
Jmp Translate669EffectEnd
Translate669EffectD: ; Frequency Adjust
Cmp AL, 30h
JNE Translate669EffectE
Mov AX, ('E'-'@')+0F100h
Mov Word Ptr [CS:BP], 0
Jmp Translate669EffectEnd
Translate669EffectE: ; Vibrato
Cmp AL, 40h
JNE Translate669EffectF
Mov AL, 'H'-'@'
Or AH, 80h
Mov [CS:BP], AX
Jmp Translate669EffectEnd
Translate669EffectF:
Cmp AL, 50h
JNE Translate669NoEffect
Mov AL, 'A'-'@'
Mov Word Ptr [CS:BP], 0
Jmp Translate669EffectEnd
Translate669NoEffect:
Mov AX, [CS:BP]
Translate669EffectEnd:
StosW
Add BP, 2
Dec CH
JNZ Translate669Pattern2
Add DI, 320-8*5
Mov BP, Offset EncodingInfo
Dec CL
JNZ Translate669Pattern1
Push CS
Pop DS
Call Far Ptr PE_TranslateS3MPointer8
Pop ES
Pop DS
PopA
Ret
EndP PE_Translate669Pattern
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Proc PE_TranslateS3MPattern Far ; DS:SI points to data.
; DX = pattern no.
PushA
Push DS
Push ES
Mov CS:MaxRow, 63
Mov CS:PatternNumber, DX
Call PE_ClearPatternData
Mov ES, CS:PatternDataArea
Xor DI, DI
Mov CX, 64
PE_TranslateS3MPattern1:
Push DI
PE_TranslateS3MPattern2:
LodsB
Test AL, AL
JNZ PE_TranslateS3MPattern3
Pop DI
Add DI, 320
Loop PE_TranslateS3MPattern1
Push CS
Pop DS
Call Far Ptr PE_TranslateS3MPointer8
Pop ES
Pop DS
PopA
Ret
PE_TranslateS3MPointer8:
Call PEFunction_StorePattern
RetF
PE_TranslateS3MPattern3:
Push DI
Mov BH, AL
And AL, 31
Mov AH, 5
Mul AH ; DI+AX = offset.
Add DI, AX
Test BH, 32
JZ PE_TranslateS3MPattern6
LodsB
; Cmp AL, 0FFH
; JE PE_TranslateS3MPattern5
Cmp AL, 0FEh
JE PE_TranslateS3MPattern4
Cmp AL, 07Fh
JA PE_TranslateS3MPattern5
Mov BL, AL
And BL, 0Fh
ShR AL, 4
Mov AH, 12
Mul AH
Add AL, BL
Add AL, 12 ; C5 is now central octave
Mov [ES:DI], AL ; Note
Jmp PE_TranslateS3MPattern5
PE_TranslateS3MPattern4:
Mov Byte Ptr [ES:DI], 0FEh
PE_TranslateS3MPattern5:
LodsB ; Instrument
Cmp AL, 99
JBE PE_TranslateS3MPattern13
Xor AL, AL
PE_TranslateS3MPattern13:
Mov [ES:DI+1], AL
PE_TranslateS3MPattern6:
Test BH, 64
JZ PE_TranslateS3MPattern7
LodsB ; Volume
Cmp AL, 64
JBE PE_TranslateS3MPattern12
Cmp AL, 0FFh
JE PE_TranslateS3MPattern12
Mov AL, 64
PE_TranslateS3MPattern12:
Mov [ES:DI+2], AL
PE_TranslateS3MPattern7:
Test BH, 128
JZ PE_TranslateS3MPattern8
LodsW
Cmp AL, 'C'-'@'
JNE PE_TranslateS3MPattern9
Mov AL, AH
And AX, 0F00Fh
ShR AH, 1
Add AL, AH
ShR AH, 2
Add AH, AL
Mov AL, 'C'-'@'
Jmp PE_TranslateS3MPattern10
PE_TranslateS3MPattern9:
Cmp AL, 'V'-'@'
JNE PE_TranslateS3MPattern11
Jmp PE_TranslateS3MPattern14
PE_TranslateS3MPattern11:
Cmp AL, 'X'-'@'
JNE PE_TranslateS3MPattern15
Cmp AH, 0A4h
JNE PE_TranslateS3MPattern14
Mov AX, 'S'-'@'+9100h
Jmp PE_TranslateS3MPattern10
PE_TranslateS3MPattern14:
ShL AH, 1
JNC PE_TranslateS3MPattern10
Mov AH, 0FFh
Jmp PE_TranslateS3MPattern10
PE_TranslateS3MPattern15:
Cmp AL, 'D'-'@'
JNE PE_TranslateS3MPattern10
Test AL, 0Fh
JZ PE_TranslateS3MPattern10
Test AL, 0F0h
JZ PE_TranslateS3MPattern10
Mov BL, AH
Mov BH, AH
And BX, 0FF0h
Cmp BH, 0Fh
JE PE_TranslateS3MPattern10
Cmp BL, 0F0h
JE PE_TranslateS3MPattern10
And AH, 0Fh
PE_TranslateS3MPattern10:
Mov [ES:DI+3], AX
PE_TranslateS3MPattern8:
Pop DI
Jmp PE_TranslateS3MPattern2
EndP PE_TranslateS3MPattern