
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


