;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; Read module functions
;

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

IF TUTORIAL
ELSE

Proc            D_PreLoadModule                 ; Returns ES = song segment
                                                ; BX = file handle
                                                ; DS = Diskdata area
                                                ; AX = SaveFormat

;                Call    MouseUpdateEnable

IF DEFAULTFORMAT
                Test    AL, AL
                JNZ     D_PreLoadModuleTemp

                Mov     AL, DEFAULTFORMAT

D_PreLoadModuleTemp:
ENDIF
                Mov     SaveFormat, AL

                Call    I_ClearTables
                Call    Music_ReleaseAllPatterns
                Call    Music_ReleaseAllSamples
                Call    Music_ClearAllSampleNames
                Call    Music_ClearAllInstruments
                Call    Msg_ResetMessage
                Call    ReleaseTimerData

                Mov     DS, CS:DiskDataArea

                Mov     BX, CS:CurrentFile
                Add     BX, BX
                Mov     BX, [BX]
                Add     BX, 8

                Push    CS
                Pop     ES
                Mov     DI, Offset FileName             ; OK...
                Mov     SI, BX                          ; Data area no longer
                Mov     CX, 13                          ;  reqd
                Rep     MovsB

                Mov     AX, 3D00h
                Mov     DX, BX
                Int     21h
                JC      D_LoadFileOpenErrorMsg

                Mov     BX, AX                          ; BX = file handle.

                Call    Music_GetSongSegment
                Mov     ES, AX

                Ret

EndP            D_PreLoadModule

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_PostLoadModule Far

                Mov     AH, 3Eh                 ; Close file.
                Int     21h

                Push    CS
                Pop     DS
                        Assume DS:Disk

                Call    CheckTimerData
                Call    GetCurrentTime

                Mov     [TopTimerData], 0

                Call    GetTimerCounter
                Mov     [EditTimer], EAX

                Call    PE_ResetOrderPattern

;                Mov     AX, 1
                Ret

EndP            D_PostLoadModule
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_InsertOrder           ; DX = inserting pattern, BP = current
                                        ; ES = songdata
                PushA
                Push    DS

                Push    ES
                Pop     DS

                Mov     SI, 1FFh
                Mov     AX, BP

D_InsertOrder1:
                Cmp     AL, [SI]
                JE      D_InsertOrder2

D_InsertOrderResume:
                Dec     SI
                Cmp     SI, 100h
                JAE     D_InsertOrder1

                Pop     DS
                PopA
                Ret

D_InsertOrder2:
                Push    SI
                Mov     CX, 1FEh
                Mov     DI, 1FFh
                Sub     CX, SI
                JC      D_InsertOrder3

                Mov     SI, 1FEh

                StD
                Rep     MovsB
                ClD

                Mov     AL, DL
                StosB

D_InsertOrder3:
                Pop     SI
                Jmp     D_InsertOrderResume

EndP            D_InsertOrder

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadXM Far

                Xor     AX, AX
                Call    D_PreLoadModule
                        Assume DS:Nothing

                Mov     AH, 3Fh
                Mov     CX, 64                  ; Header length
                Mov     DX, 64000
                Int     21h

                Mov     AH, 3Fh                 ; Read rest of header.
                Mov     CX, [DS:64000+60]
                Sub     CX, 4
                Mov     DX, 64104
                Int     21h

                Mov     DI, 4
                Mov     CX, 20
                Mov     SI, 64000+17
                Rep     MovsB
                Xor     AX, AX
                Mov     CX, 5
                Rep     StosW           ; OK name transferred.

                ; Number of Instruments
                Mov     AX, [DS:64100+12]
                StosW                   ; Insnum

                Mov     AX, 1
                StosW

                ; Number of Patterns
                Mov     AX, [DS:64100+10]
                StosW
                Mov     [ES:0C0h], AX   ; Number of patterns.

                ; CWT/V, CMWT
                Add     DI, 4

                ; Flags
                Mov     AX, [DS:64100+14]
                And     AX, 1
                ShL     AX, 3
                Or      AX, 35h    ; XM Effects, Old effects, stereo, insts
                StosW

                ; Reserved
                Xor     AX, AX
                StosW

                ; GVolume. MVolume
                Mov     AX, 128+48*256
                StosW

                ; Initial Speed, Initial Tempo
                Mov     AL, [DS:64100+16]
                Test    AL, AL
                JNZ     InitialSpeedNot0

                Mov     AL, 6

InitialSpeedNot0:
                Mov     AH, [DS:64100+18]
                StosW

                ; Separation
                Mov     AX, 128
                StosW

                ; Message length, offset, timer
                Xor     AX, AX
                Mov     CX, 5
                Rep     StosW

                ; Channel Pan

                Mov     CX, [DS:64100+8]        ; Number of channels
                Mov     AL, 32
                Rep     StosB
                Mov     AL, 128+32
                Mov     CX, 64
                Sub     CX, [DS:64100+8]
                Rep     StosB

                ; Channel Volume

                Mov     AL, 64
                Mov     CX, 64
                Rep     StosB

                ; Orders
                Add     DI, 40h
                Mov     SI, 64100+20    ; Orders
                Mov     CX, [DS:64100+4]        ; Song legnth
                JCXZ    D_LoadXMNoPatterns2

D_FindMaximumPattern:
                LodsB
                Cmp     AL, 200
                JAE     D_FindMaximumPattern3

                Cmp     AL, [ES:0C0h]
                JB      D_FindMaximumPattern2

                Inc     AX
                Mov     [ES:0C0h], AX
                Dec     AX
                Jmp     D_FindMaximumPattern2

D_FindMaximumPattern3:
                Mov     AL, 0FFh

D_FindMaximumPattern2:
                StosB
                Loop    D_FindMaximumPattern

D_LoadXMNoPatterns2:
                Mov     CX, 256
                Sub     CX, [DS:64100+4]
                Mov     AL, 0FFh
                Rep     StosB

                                        ; OK.. now to load patterns.
                Cmp     Word Ptr [DS:64100+10], 0
                JE      D_LoadXMNoPatterns

                Xor     BP, BP

D_LoadXM1:
                Push    DS SI DI

                Push    CS
                Pop     DS
                        Assume DS:Disk

                Mov     SI, Offset PatternMsg
                Mov     AH, 5
                Mov     DI, (4+16*80)*2
                Push    BP
                Call    S_DrawString
                Pop     AX

                Pop     DI SI DS
                        Assume DS:Nothing

                Mov     AH, 3Fh
                Mov     CX, 4
                Xor     DX, DX
                Int     21h                     ; Read pattern length

                Mov     AH, 3Fh
                Mov     CX, [DS:0]
                Mov     DX, 4
                Sub     CX, DX
                Int     21h                     ; Read pattern header

                Cmp     Word Ptr [DS:7], 0
                JE      D_LoadXM3

                Mov     AH, 3Fh
                Mov     CX, [DS:7]
                Mov     DX, 100h
                Mov     SI, DX
                Int     21h                     ; DS:100h contains all the
                                                ; pattern data.

                Cmp     BP, 200                 ; Too many patterns?
                JAE     D_LoadXM3

                Mov     AX, [DS:5]              ; AX = number of rows
                Mov     CX, [DS:64100+8]        ; CX = number of channels
                Mov     DX, BP

                Cmp     AX, 200
                JA      D_LoadXM2

        ; TranslateXMPattern takes:
        ;   DS:SI points to pattern data
        ;   AX = rows
        ;   CX = channels
        ;   DX = pattern number


                Call    PE_TranslateXMPattern
                Jmp     D_LoadXM3

D_LoadXM2:
                ShR     AX, 1
                Call    PE_TranslateXMPattern

                Mov     DX, [ES:0C0h]           ; DX = pattern number
                Cmp     DX, 200
                JAE     D_LoadXM3

                Inc     Word Ptr [ES:0C0h]

                Call    D_InsertOrder

                Mov     AX, [DS:5]
                Inc     AX
                ShR     AX, 1                   ; AX = number of rows.
                Call    PE_TranslateXMPattern

D_LoadXM3:
                Inc     BP
                Cmp     BP, [DS:64100+10]
                JB      D_LoadXM1

D_LoadXMNoPatterns:
                                ; Now to load instruments
                Xor     BP, BP
                Cmp     BP, [DS:64100+12]
                JE      D_LoadXMInstrumentTooMany

D_LoadXM4:
                Push    DS SI

                Push    CS
                Pop     DS
                Mov     SI, Offset InstrumentMsg
                Mov     AX, BP
                Inc     AX
                Push    AX
                Mov     AH, 5
                Mov     DI, (4+17*80)*2
                Call    S_DrawString
                Pop     AX

                Pop     SI DS

                Mov     AH, 3Fh
                Mov     CX, 4
                Xor     DX, DX
                Int     21h

                Mov     AH, 3Fh
                Mov     CX, [DS:0]
                Mov     DX, 4
                Sub     CX, DX
                Int     21h

                                ; OK.. instrument loaded into DS:0..
                Mov     DI, BP
                Add     DI, DI
                Mov     DI, [ES:64712+DI]       ; ES:DI points to instrument
                Push    DI

                Mov     SI, 4
                Add     DI, 20h
                Mov     CX, 22
                Rep     MovsB
                Xor     AX, AX
                Mov     CX, 4
                Rep     StosW

                Pop     DI
                Cmp     Word Ptr [DS:27], 0
                JE      D_LoadXMInstrumentEnd

                Add     DI, 14h                 ; DI points to fadeout
                Mov     AX, [DS:239]
                Add     AX, 15
                ShR     AX, 5
                Cmp     AX, 256
                JBE     D_LoadXMInstrument1

                Mov     AX, 256

D_LoadXMInstrument1:
                StosW
                Add     DI, 40h-16h             ; Translation table

                Mov     CX, 12                  ; Kill first 12 entries.
                Xor     AX, AX

D_LoadXMInstrument2:                            ; First 12 entries cleared
                StosW
                Inc     AX
                Loop    D_LoadXMInstrument2

                Mov     CX, 96
                Mov     SI, 33                  ; Note translation

D_LoadXMInstrument3:
                Mov     AH, [SI]
                Add     AH, [ES:24h]
                Cmp     AH, 99
                JBE     D_LoadXMInstrument4

                Mov     AH, 99

D_LoadXMInstrument4:
                StosW
                Inc     SI
                Inc     AX
                Loop    D_LoadXMInstrument3

                Mov     CX, 12                  ; Kill first 12 entries.
                Xor     AH, AH

D_LoadXMInstrument5:                            ; First 12 entries cleared
                StosW
                Inc     AX
                Loop    D_LoadXMInstrument5

                                                ; Now for volume envelope
                Mov     AL, [DS:233]            ; Flags
                Test    AL, 1
                JNZ     D_LoadXMVolumeEnvelope

                Mov     AX, 205h
                StosW
                Xor     AX, AX
                StosW
                StosW

                Mov     AL, 64
                StosB
                Xor     AX, AX
                StosW

                StosB
                Mov     AX, 1
                StosW

                Mov     CX, 70
                Xor     AX, AX
                Rep     StosB

                Jmp     D_LoadXMInstrumentVolumeFinished

D_LoadXMVolumeEnvelope:
;                Mov     CL, AL
;                Mov     AH, AL
;                And     AX, 402h
;                ShR     AH, 1
;                ShL     AL, 1
;                Or      AL, AH
;                And     CL, 1
;                Or      AL, CL

                And     AL, 2
                ShL     AL, 1
                Or      AL, 2+1       ; Volume envelope on, Loop on (always)

                Mov     AH, [DS:225]      ; No of vol env nodes
                Cmp     AH, 12
                JB      D_NumXMVolNodes1

                Mov     AH, 12

D_NumXMVolNodes1:
                StosW
                Mov     AX, [DS:228]      ; Vol loop start+end
                Test    Byte Ptr [DS:233], 4 ; Volume loop?
                JNZ     VolumeLoopOK

                Mov     AL, [DS:225]
                Dec     AX
                Mov     AH, AL

VolumeLoopOK:
                StosW
                Mov     AL, [DS:227]      ; Vol Sustain point
                Mov     AH, AL
                StosW

                Cmp     Byte Ptr [DS:233], 7
                JNE     D_XMVolumeNoSustain

                Cmp     AL, [DS:229]        ; Compare sustain to endpoint
                JB      D_XMVolumeLoopOK

                And     Byte Ptr [ES:DI-6], Not 4
                Jmp     D_XMVolumeLoopOK

D_XMVolumeNoSustain:
                Test    Byte Ptr [DS:233], 2    ; Loop?
                JNZ     D_XMVolumeLoopOK

                Mov     AL, [DS:225]            ; Number of nodes
                Dec     AX
                Mov     AH, AL
                Mov     [ES:DI-2], AX
                Or      Byte Ptr [ES:DI-6], 4

D_XMVolumeLoopOK:
                                ; OK. now process volume env points
                Mov     CX, 12
                Mov     SI, 129

D_LoadXMInstrument6:
                Mov     AL, [SI+2]
                Cmp     AL, 64
                JB      D_LoadXMInstrument7

                Mov     AL, 64

D_LoadXMInstrument7:
                StosB
                MovsW
                LodsW
                Loop    D_LoadXMInstrument6

                Mov     CX, 13*3+1
                Xor     AX, AX
                Rep     StosB

                        ; Now for panning envelope
D_LoadXMInstrumentVolumeFinished:

                Mov     AL, [DS:234]      ; Flags
                Mov     CL, AL
                Mov     AH, AL
                And     AX, 402h
                ShR     AH, 1
                ShL     AL, 1
                Or      AL, AH
                And     CL, 1
                Or      AL, CL

                Mov     AH, [DS:226]      ; No of pan env nodes
                Cmp     AH, 12
                JB      D_NumXMPanNodes1

                Mov     AH, 12

D_NumXMPanNodes1:
                StosW
                Mov     AX, [DS:231]      ; Pan loop start+end
                StosW
                Mov     AL, [DS:230]      ; Pan Sustain point
                Mov     AH, AL
                StosW

                Test    Byte Ptr [DS:234], 2 ; Panning envelope flags
                JZ      D_XMPanningLoopOK

                Cmp     AL, [DS:232]         ; Compare sustain to endpoint
                JB      D_XMPanningLoopOK

                And     Byte Ptr [ES:DI-6], Not 4

D_XMPanningLoopOK:
                                ; OK. now process panning env points
                Mov     CX, 12
                Mov     SI, 177
                Xor     AH, AH

D_LoadXMInstrument8:
                Mov     AL, [SI+2]
                Cmp     AL, 64
                JB      D_LoadXMInstrument9

                Mov     AL, 64

D_LoadXMInstrument9:
                Sub     AL, 32
                StosB
                MovsW
                LodsW                   ; Add SI, 2
                Loop    D_LoadXMInstrument8

                Mov     AX, [DS:27]
                Mul     Word Ptr [DS:29]
                Mov     CX, AX
                Mov     AH, 3Fh
                Mov     DX, 1000h
                Mov     SI, DX
                Int     21h

                Mov     CX, [DS:27]     ; Update number of samples.
                Mov     AX, [ES:24h]
                Add     [ES:24h], CX

D_LoadXMSamples1:
                Cmp     AX, 99
                JA      D_LoadXMInstrumentTooMany
                Cmp     AX, [ES:24h]
                JAE     D_LoadXMInstrumentEnd

                Push    AX
                Push    SI

                Mov     DI, AX
                Add     DI, DI
                Mov     DI, [ES:64912+DI-2]
                Add     DI, 12h                 ; Skip filename, ID, GVL

                Mov     AH, [SI+12]     ; Default volume
                Mov     AL, 0
                Cmp     DWord Ptr [SI], 0       ; Length = 0?
                JE      D_LoadXMSamples3

                                        ; Grab the panning value

Comment ~
                Mov     AL, [SI+15]
                ShR     AL, 1
                Inc     AX
                ShR     AL, 1

                Push    DI
                Mov     DI, BP
                Add     DI, DI
                Mov     DI, [ES:64712+DI]
                Cmp     Byte Ptr [ES:DI+19h], 32+128
                JE      XMNoPan2

                Mov     AL, 32

XMNoPan2:
                Mov     [ES:DI+19h], AL

XMNoPan:
                Pop     DI
~
                                        ; Sample present flag
                Mov     AL, 1

                Mov     CL, [SI+14]
                Test    CL, 10h         ; 16 bit sample?
                JZ      D_LoadXMSamples2

                Or      AL, 2

D_LoadXMSamples2:
                And     CL, 3
                JZ      D_LoadXMSamples3 ; No loop
                                         ; CL = 1 or 2
                Cmp     DWord Ptr [SI+8], 1
                JBE     D_LoadXMSamples3

                Or      AL, 10h          ; Loop
                Dec     CX
                ShL     CL, 6
                Or      AL, CL

D_LoadXMSamples3:
                StosW

                Push    SI
                                        ; Copy sample name
                Add     SI, 18
                Mov     CX, 22/2
                Rep     MovsW
                Xor     AX, AX
                StosW
                StosW

                Pop     SI
                                        ; Conversion flags.
                Mov     AH, [SI+15]
                ShR     AH, 2
                AdC     AH, 80h
                Mov     AL, 5
                StosW

                Mov     EAX, [SI]
                Call    LoadXISample5
                Mov     EAX, [SI+4]
                Call    LoadXISample5
                Mov     EAX, [SI+4]
                Add     EAX, [SI+8]
                Call    LoadXISample5

                                        ; C5speed..
                Push    ES
                Push    DI

                Call    Music_GetPitchTable     ; Returns ES:DI
                Mov     AL, [SI+16]     ; Relative note number
                Add     AL, 60          ; AL = note multiplier
                And     AX, 0FFh
                ShL     AX, 2
                Add     DI, AX
                Mov     ECX, [ES:DI]

                Mov     AL, [SI+13]     ; Finetune, -128->+127
                SAR     AL, 4           ; Finetune = -8->+7
                And     AX, 0Fh
                Add     AX, AX
                Mov     DI, AX
                MovZX   EAX, [CS:FineTuneTable+DI]

                Pop     DI
                Pop     ES

                Push    EDX

                Mul     ECX
                ShRD    EAX, EDX, 16
                Pop     EDX
                StosD                   ; C5freq

                Xor     AX, AX
                StosW
                StosW
                StosW
                StosW

                                        ; Now for file position
                Mov     AX, 4201h
                Xor     CX, CX
                Xor     DX, DX
                Int     21h             ; Returns DX:AX

                StosW
                Mov     AX, DX
                StosW

                                        ; Vibrato information
                Mov     AX, [DS:237]
                XChg    AH, AL
                StosW

                Mov     DX, [DS:236]
                And     DX, 0FFh
                Mov     AX, 100h
                Sub     AX, DX
;                Cmp     AL, 64
;                JBE     VibratoLimit
;
;                Mov     AL, 64
;
; VibratoLimit:
                Mov     AH, [DS:235]
                StosW

                                        ; Move file pointer forwards
                Mov     AX, 4201h
                Mov     CX, [SI+2]
                Mov     DX, [SI]
                Int     21h

                Pop     SI
                Pop     AX
                Add     SI, [DS:29]     ; Next sample header
                Inc     AX
                Jmp     D_LoadXMSamples1

D_LoadXMInstrumentEnd:
                Inc     BP
                Cmp     BP, 99
                JA      D_LoadXMInstrumentTooMany
                Cmp     BP, [DS:64100+12]
                JB      D_LoadXM4

D_LoadXMInstrumentTooMany:
                Mov     CX, 1                   ; CX = sample number (base 1)
                                                ; DS = doesn't matter
                                                ; ES = songdata segment

D_LoadXMFinalSamples1:                          ; OK, now load the samples.
                Push    CX
                Push    ES

                Mov     SI, CX
                Dec     SI
                Add     SI, SI
                Mov     SI, [ES:64912+SI]
                Test    Byte Ptr [ES:SI+12h], 1
                JZ      D_LoadXMFinalSamples2

                Push    CS
                Pop     DS

                Push    SI
                Mov     SI, Offset SampleMsg
                Mov     DI, (4+18*80)*2
                Mov     AH, 5
                Push    CX
                Call    S_DrawString
                Pop     DI
                Pop     SI                      ; ES:SI points to sample header.
                                                ; DI = sample number+1
                Push    ES
                Pop     DS

                Mov     AX, 4200h
                Xor     CX, CX
                Xor     DX, DX
                XChg    CX, [DS:SI+4Ah]
                XChg    DX, [DS:SI+48h]
                Int     21h                     ; Move file pointer.

                Mov     AX, DI
                Dec     AX

                Call    D_LoadSampleData
                Jmp     D_LoadXMFinalSamplesPresent

D_LoadXMFinalSamples2:
                Mov     DWord Ptr [SI+48h], 0

D_LoadXMFinalSamplesPresent:
                Pop     ES
                Pop     CX
                Inc     CX
                Cmp     CX, 100
                JBE     D_LoadXMFinalSamples1

                Jmp     D_PostLoadModule

EndP            D_LoadXM

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadMTM Far

                Xor     AX, AX
                Call    D_PreLoadModule

                        Assume DS:Nothing

                Mov     AH, 3Fh
                Mov     CX, 66                          ; Song header length.
                Mov     DX, 60000
                Int     21h

                Mov     DI, 4
                Mov     CX, 20
                Mov     SI, 60004
                Rep     MovsB
                Xor     AX, AX
                Mov     CX, 8
                Rep     StosB                           ; Song name.
                Mov     AL, [DS:60027]
                StosW                                   ; Order num
                Xor     AL, AL
                StosW                                   ; Inst num
                Mov     AL, [DS:60030]
                StosW                                   ; Sample number.
                Mov     AL, [DS:60026]
                StosW                                   ; Pattern number

                Add     DI, 4
;                Mov     AX, 101h                        ; Cwt/v 1.0
;                StosW
;                Mov     AX, 100h                        ; Cmwt 1.0
;                StosW

                Mov     AX, 31h                         ; Stereo. No Vol0Opt
                StosW                                   ; Use samples, old eff
                Xor     AX, AX
                StosW
                Mov     AX, 3080h                       ; GlobalVol+MixVol
                StosW
                Mov     AX, 7D06h
                StosW
                Mov     AL, 128
                StosB
                Xor     AL, AL
                Mov     CX, 11
                Rep     StosB

                Mov     CX, 32
                Mov     DX, 0
                Xor     AH, AH
                                                        ; Panning positions
D_LoadMTM1:
                Mov     SI, 60034
                Add     SI, DX
                Mov     AL, [DS:SI]
                Mov     SI, AX
                Mov     AL, [CS:PanningPositions+SI]
                StosB

                Inc     DX
                Loop    D_LoadMTM1

                Mov     CX, 32
                Mov     AL, 160
                Rep     StosB
                Mov     AL, 64
                Mov     CX, 64
                Rep     StosB

                Push    DS

                Push    CS
                Pop     DS
                        Assume DS:Disk

                Mov     SI, Offset SampleHeaderMsg
                Mov     AH, 5
                Mov     DI, (4+16*80)*2
                Call    S_DrawString

                Pop     DS
                        Assume DS:Nothing

                Mov     AL, 37
                Mul     Byte Ptr [ES:24h]               ; AX = length of
                                                        ; sample headers
                Mov     CX, AX                  ; length..
                Mov     AH, 3Fh                 ; read file..
                Xor     DX, DX
                Int     21h


                Mov     DH, [ES:24h]
                Mov     DI, 55912               ; Start of samples.
                Xor     SI, SI                  ; DS:SI points to MTM header.

D_LoadMTM2:
                Mov     EAX, 'SPMI'
                StosD
                Xor     AX, AX
                Mov     CX, 6
                Rep     StosW                   ; Clear file name.
                StosB
                Mov     AL, 40h
                StosB


                Mov     AL, [DS:SI+36]
                And     AL, 1
                Add     AL, AL

                Cmp     DWord Ptr [DS:SI+22], 0
                JE      D_LoadMTM3              ; Sample length = 0.

                Or      AL, 1                   ; Else there's a sample.

D_LoadMTM3:
                Mov     ECX, [SI+30]             ; Sample loop end
                Sub     ECX, [SI+26]             ; Sample loop start
                Cmp     ECX, 2
                JBE     D_LoadMTM4

                Or      AL, 16

D_LoadMTM4:
                StosB
                Mov     DL, AL
                Mov     AL, [DS:SI+35]
                StosB

                Push    SI

                Mov     CX, 22

D_LoadMTMSampleName:
                LodsB
                StosB
                And     AL, AL
                LoopNZ  D_LoadMTMSampleName
                Pop     SI

                Xor     AL, AL
                Add     CX, 5
                Rep     StosB                   ; Filler.
                Mov     AL, 32
                StosB

                Mov     EAX, [DS:SI+22]
                StosD

                Test    DL, 1
                JNZ     D_LoadMTM5

                Xor     AX, AX
                Mov     CX, 4
                Rep     StosW                   ; Clear rest of sample field.
                Mov     AX, 8363                ; (no sample)
                StosW
                Xor     AX, AX
                Mov     CX, 9
                Rep     StosW

                Jmp     D_LoadMTM8

D_LoadMTM5:
                Test    DL, 16
                JZ      D_LoadMTM6

                Mov     EAX, [DS:SI+26]
                StosD
                Mov     EAX, [DS:SI+30]
                StosD
                Jmp     D_LoadMTM7

D_LoadMTM6:
                Xor     AX, AX
                Mov     CX, 4
                Rep     StosW

D_LoadMTM7:                                     ; C5 speed here...
                Push    SI
                Mov     AL, [DS:SI+34]
                And     AX, 0Fh
                Mov     SI, AX
                Add     SI, SI
                Mov     AX, [CS:FineTuneTable+SI]
                Pop     SI
                StosW
                Xor     AX, AX
                Mov     CX, 9
                Rep     StosW

D_LoadMTM8:
                Add     SI, 37
                Dec     DH
                JNZ     D_LoadMTM2              ; Finished with samples.

                Mov     AH, 3Fh
                Mov     CX, 128
                Xor     DX, DX
                Int     21h                     ; Order data.

                Mov     CL, [DS:60027]
                Inc     CX
                Xor     CH, CH
                Mov     DX, 256
                Sub     DX, CX
                Xor     SI, SI
                Mov     DI, 256
                Rep     MovsB
                Mov     CX, DX
                Mov     AL, 0FFh
                Rep     StosB                   ; Order list done.
                                                ; Now it's time to do the
                                                ; friggen pattern stuff.
                Mov     AL, 37
                Mul     Byte Ptr [DS:60030]
                Add     AX, 66+128
                Push    AX

                Mov     AX, 192
                Mul     Word Ptr [DS:60024]
                                                ; DX:AX = length of track data.
                Mov     BP, DX
                Mov     CX, AX
                Xor     DX, DX
                Pop     AX
                Add     CX, AX
                AdC     BP, 0
                                                ; BP:CX = offset to sequencer
D_LoadMTM9:                                     ; DX = pattern no.
                                                ; AX = offset to track data.
                Push    AX
                Push    CX
                Push    DX

                Push    AX

                Push    DS
                Push    SI
                Push    DI

                Push    CS
                Pop     DS
                        Assume DS:Disk

                Mov     SI, Offset PatternMsg
                Mov     AH, 5
                Mov     DI, (4+17*80)*2
                Push    DX
                Call    S_DrawString
                Pop     AX

                Pop     DI
                Pop     SI
                Pop     DS
                        Assume DS:Nothing


                Mov     AX, 4200h
                Mov     DX, CX
                Mov     CX, BP
                Int     21h                     ; Move to offset.

                Mov     AH, 3Fh
                Mov     CX, 64
                Xor     DX, DX
                Int     21h                     ; Read seq data.

                Pop     AX

                Mov     CX, 32
                Xor     SI, SI
                Mov     DX, AX                  ; DX = posn of track data.
                Mov     DI, 10000

D_LoadMTM10:
                Push    CX
                Push    DX

                LodsW
                And     AX, AX
                JZ      D_LoadMTM11

                Push    DS
                Push    SI
                Push    DI
                Mov     SI, 33
                Sub     SI, CX
                Push    AX
                Push    SI

                Push    CS
                Pop     DS
                        Assume DS:Disk

                Mov     SI, Offset TrackMsg
                Mov     DI, (5+18*80)*2
                Mov     AH, 5
                Call    S_DrawString

                Pop     SI
                Pop     AX
                Pop     DI
                Pop     SI
                Pop     DS
                        Assume DS:Nothing

                Push    DX

                Dec     AX
                Mov     CX, 192
                Mul     CX

                Pop     CX
                Add     AX, CX
                AdC     DX, 0
                Mov     CX, DX
                Mov     DX, AX
                Mov     AX, 4200h
                Int     21h                     ; Move ptr.

                Mov     AH, 3Fh
                Mov     CX, 192
                Mov     DX, DI
                Int     21h

                Add     DI, 192
                Jmp     D_LoadMTM12

D_LoadMTM11:
                Push    ES

                Push    DS
                Pop     ES

                Mov     CX, 192
                Xor     AL, AL
                Rep     StosB

                Pop     ES

D_LoadMTM12:
                Pop     DX
                Pop     CX
                Loop    D_LoadMTM10

                Mov     SI, 10000
                        ; DS:SI points to pattern data.

                Pop     DX
                                                ; DX = pattern number
                                                ; DS:SI = pattern data.
                Call    PE_TranslateMTMPattern

                Pop     CX
                Pop     AX
                Add     CX, 64
                AdC     BP, 0
                Inc     DX
                Cmp     DL, [DS:60026]
                JBE     D_LoadMTM9

                                                ; BP:CX points to comment

                Comment &

                Mov     AL, 37
                Mul     Byte Ptr [DS:60030]
                                                ; AX = 37*NOS
                Add     AX, 194
                Add     AX, Word Ptr [DS:60028] ; AX = 194+NOS*37+length_comment
                Mov     CX, AX
                Mov     AX, 192
                Mul     Word Ptr [DS:60024]     ; DX:AX = trcks*192
                Mov     BP, DX
                Add     CX, AX
                AdC     BP, 0                   ; BP:CX = 194+NOS*37+trcks*192+
                                                ;         length(comment)
                Mov     AL, 64
                Mov     AH, Byte Ptr [DS:60026]
                Inc     AH
                Mul     AH
                Add     CX, AX
                AdC     BP, 0                   ; BP:CX = 194+NOS*37+trcks*192+
                                                ;         64*patterns+length(comment)

                &

;                Add     CX, [DS:60028]          ; Skip past comment -> samples.
;                AdC     BP, 0
;
                Mov     AX, 4200h
                Mov     DX, CX
                Mov     CX, BP
                Int     21h                     ; File is at pointers to samps.

                Mov     CX, [DS:60028]          ; Length of message
                Call    Msg_GetMessageOffset    ; Sets up DS:DX
                Mov     AH, 3Fh
                Int     21h
                                                ; Now to 'process' the message.

                Mov     SI, DX
                Mov     CX, AX

                Xor     DX, DX                  ; DX = character count.

D_LoadMTMMessage1:
                Mov     AL, [SI]
                And     AL, AL
                JNZ     D_LoadMTMMessage2

                Mov     Byte Ptr [SI], 32       ; spacebar.

D_LoadMTMMessage2:
                Inc     DX
                Cmp     DX, 40
                JB      D_LoadMTMMessage3

                Xor     DX, DX
                Mov     Byte Ptr [SI], 13       ; Enter!

D_LoadMTMMessage3:
                Inc     SI
                Loop    D_LoadMTMMessage1

                Push    ES
                Pop     DS
                Mov     SI, 55912               ; DS:SI points to sample headers
                Xor     CX, CX

D_LoadMTM13:
                Push    CX
                Push    SI
                Test    Byte Ptr [DS:SI+12h], 1
                JZ      D_LoadMTM14
                                                ; OK.. have a sample to load.
                Push    DS
                Push    SI

                Push    CS
                Pop     DS
                Mov     SI, Offset SampleMsg
                Mov     DI, (4+20*80)*2
                Mov     AX, CX
                Inc     AX
                Push    AX
                Mov     AH, 5
                Call    S_DrawString
                Pop     AX
                Dec     AX

                Pop     SI
                Pop     DS

                Call    D_LoadSampleData

D_LoadMTM14:
                Pop     SI
                Pop     CX
                Inc     CX
                Add     SI, 80
                Cmp     CX, 100
                JB      D_LoadMTM13

                Jmp     D_PostLoadModule

EndP            D_LoadMTM
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadS3M Far

                Mov     AL, 1
                Call    D_PreLoadModule

                Mov     AH, 3Fh
                Mov     CX, 60h
                Mov     DX, 60000
                Int     21h

                Mov     DI, 4
                Mov     CX, 25
                Mov     SI, 60000
                Rep     MovsB
                Xor     AL, AL
                StosB
                Add     DI, 14

                Mov     AX, 10h         ; Old Effects

                Test    Byte Ptr [DS:60000+33h], 80h
                JZ      D_LoadS3M1

                Inc     AX

D_LoadS3M1:
                Test    Byte Ptr [DS:60000+26h], 8
                JZ      D_LoadS3M2

                Or      AL, 2

D_LoadS3M2:
                StosW
                Xor     AX, AX
                StosW
                Mov     AL, [DS:60000+30h]
                ShL     AL, 1
                StosB
                Mov     AL, [DS:60000+33h]
                And     AL, 127
                StosB
                Mov     AX, [DS:60000+31h]
                StosW
                Mov     AL, 128
                StosB
                Add     DI, 7

                Mov     EAX, [DS:60000+38h]
                Cmp     Word Ptr [DS:60000+28h], 3208h
                JB      D_ConvertS3MTimer

                Xor     EAX, 'ITRK'
                RoR     EAX, 7
                Neg     EAX
                RoL     EAX, 4
                Xor     EAX, 'JTHL'

D_ConvertS3MTimer:
                StosD
                                        ; OK, panning now...
                Mov     SI, 60000+40h
                Mov     CX, 32

D_LoadS3M3:
                LodsB

                Mov     DL, 32+128
                Cmp     AL, 128
                JAE     D_LoadS3M4

                Mov     AH, AL

;                Test    Byte Ptr [DS:60000+33h], 128
;                JZ      D_LoadS3M5

                And     AL, 127

                Mov     DL, 0
                Cmp     AL, 7
                JBE     D_LoadS3M4

                Mov     DL, 64
                Cmp     AL, 15
                JBE     D_LoadS3M4

                Mov     DL, 32

D_LoadS3M4:
                Mov     AL, DL
                And     AH, 80h

                StosB
                Loop    D_LoadS3M3

                Mov     CX, 32
                Mov     AL, 32+128
                Rep     StosB

                Mov     CX, 64
                Mov     AL, 64
                Rep     StosB

                Mov     DI, 100h
                Mov     CX, 256
                Mov     AL, 255
                Rep     StosB

                Push    DS

                Mov     CX, [DS:60000+20h]
                Push    ES
                Pop     DS
                Mov     DX, 100h
                Mov     AH, 3Fh
                Int     21h

                Pop     DS                      ; Order list loaded.

                Mov     AH, 3Fh
                Mov     CX, [DS:60000+22h]
                Add     CX, [DS:60000+24h]
                Add     CX, CX
                Xor     DX, DX
                Int     21h

                Cmp     Byte Ptr [DS:60000+35h], 252
                JNE     D_LoadS3M15

                Mov     AH, 3Fh
                Mov     CX, 32
                Mov     DX, 1024
                Int     21h

                Mov     CX, 32
                Mov     SI, 1024
                Mov     DI, 64

D_LoadS3M14:
                LodsB
                Test    AL, 32
                JZ      D_LoadS3M16

                Mov     AH, [ES:DI]
                And     AX, 800Fh
                ShL     AL, 1
                ShL     AL, 1
                Add     AL, 2
                Or      AL, AH
                Mov     [ES:DI], AL

D_LoadS3M16:
                Inc     DI

                Loop    D_LoadS3M14

D_LoadS3M15:
                Mov     CX, 1                   ; Load instruments
                Mov     DI, 55912

D_LoadS3M7:
                Push    CX
                Push    DI

                Push    DI
                Push    DS

                Mov     SI, CX
                Dec     SI
                Add     SI, SI
                Mov     DX, [SI]

                Push    CS
                Pop     DS
                Push    CX                      ; For Drawstring.

                Mov     AX, 4200h
                Xor     CX, CX
                ShLD    CX, DX, 4
                ShL     DX, 4
                Int     21h

                Mov     SI, Offset SHLoadMsg
                Mov     DI, (4+16*80)*2
                Mov     AH, 5
                Call    S_DrawString
                Pop     AX

                Pop     DS
                Pop     DI

                Mov     DX, 1024                        ; Load inst. header.
                Mov     CX, 80
                Mov     AH, 3Fh
                Int     21h

                Mov     EAX, 'SPMI'
                StosD

                Mov     SI, 1025
                Mov     CX, 12
                Rep     MovsB
                Xor     AL, AL
                StosB
                Mov     AL, 64
                StosB

                Xor     AL, AL

                Cmp     Byte Ptr [DS:1024], 1
                JNE     D_LoadS3M8

                Mov     AL, [DS:1024+1Fh]
                ShR     AL, 1
                And     AL, 2

                Cmp     Word Ptr [DS:1024+10h], 0
                JE      D_LoadS3M8

                Inc     AX

D_LoadS3M8:
                Mov     CL, [DS:1024+1Fh]
                Mov     CH, CL                  ; CL = 1 -> loop
                And     CL, 1
                ShL     CL, 4
                Or      AL, CL                  ; Loop...

                And     CH, 4
                ShR     CH, 1
                Or      AL, CH                  ; 16 bit.

D_LoadS3M9:
                StosB
                Mov     AL, [DS:1024+1Ch]
                StosB
                Mov     SI, 1024+30h
                Mov     CX, 25
                Rep     MovsB
                Xor     AX, AX
                StosW
                Mov     AL, 32
                StosB

                Mov     EAX, [DS:1024+10h]
                StosD                   ; Length

                Mov     EAX, [DS:1024+14h]
                StosD                   ; LoopBeg

                Mov     EAX, [DS:1024+18h]
                StosD                   ; LoopEnd

                Mov     EAX, [DS:1024+20h]
                StosD                   ; C5Spd

                Xor     AX, AX
                StosW
                StosW                   ; Susloopbegin

                StosW
                StosW                   ; SusLoopEnd

                Cmp     Byte Ptr [DS:1024], 1
                JE      D_LoadS3M22

                Xor     AX, AX
                StosW
                StosW
                Jmp     D_LoadS3M23

D_LoadS3M22:
                Mov     CL, 4
                Mov     AX, [DS:1024+0Eh]
                Mov     DL, [DS:1024+0Fh]
                Mov     DH, [DS:1024+0Dh]
                ShL     AX, CL
                ShR     DX, CL
                StosW                   ; Sample pointer in file.
                Mov     AX, DX
                StosW

                Xor     AX, AX

D_LoadS3M23:
                StosW                   ; Vibrato info...
                StosW

                Pop     DI
                Pop     CX
                Add     DI, 80
                Inc     CX

                Cmp     CX, 100
                JAE     D_LoadS3M10

                Cmp     CX, [DS:60000+22h]
                JBE     D_LoadS3M7

D_LoadS3M10:
                Push    DS

                Mov     CX, 1                   ; CX = sample number (base 1)
                                                ; DS = doesn't matter
                                                ; ES = songdata segment

D_LoadS3M17:                                    ; OK, now load the samples.
                Push    CX
                Push    ES

                Mov     SI, CX
                Dec     SI
                Add     SI, SI
                Mov     SI, [ES:64912+SI]
                Test    Byte Ptr [ES:SI+12h], 1
                JZ      D_LoadS3M18

                Push    CS
                Pop     DS

                Push    SI
                Mov     SI, Offset SampleMsg
                Mov     DI, (4+17*80)*2
                Mov     AH, 5
                Push    CX
                Call    S_DrawString
                Pop     DI
                Pop     SI                      ; ES:SI points to sample header.
                                                ; DI = sample number+1
                Push    ES
                Pop     DS

                Mov     AX, 4200h
                Xor     CX, CX
                Xor     DX, DX
                XChg    CX, [DS:SI+4Ah]
                XChg    DX, [DS:SI+48h]
                Int     21h                     ; Move file pointer.

                Mov     AX, DI
                Dec     AX

                Call    D_LoadSampleData
                Jmp     D_LoadS3MSamplePresent

D_LoadS3M18:
                Mov     DWord Ptr [SI+48h], 0

D_LoadS3MSamplePresent:
                Pop     ES
                Pop     CX
                Inc     CX
                Cmp     CX, 100
                JBE     D_LoadS3M17

                Pop     DS

                Mov     CX, 0                   ; CX = pattern number
                                                ; DS = disktransfer

D_LoadS3M11:
                Push    CX                      ; Load patterns....

                Push    DS

                Push    CS
                Pop     DS

                Mov     DI, (4+18*80)*2
                Mov     SI, Offset PatternMsg
                Mov     AH, 5
                Push    CX
                Call    S_DrawString
                Pop     SI              ; SI = Pattern Number

                Pop     DS

                Add     SI, [DS:60000+22h]
                Add     SI, SI
                Mov     DX, [SI]                ; DX = offset of pattern / 16
                And     DX, DX
                JZ      D_LoadS3M13

                Push    CX

                Xor     CX, CX
                ShLD    CX, DX, 4
                ShL     DX, 4
                Mov     AX, 4200h
                Int     21h

                Mov     AH, 3Fh                 ; Load data.
                Mov     CX, 2
                Mov     DX, 1024
                Int     21h
                Mov     AH, 3Fh
                Mov     CX, [DS:1024]
                Mov     DX, 1024
                Int     21h                     ; Pattern data at DS:1024

                Pop     DX                      ; DX = Pattern number
                Mov     SI, 1024
                Call    PE_TranslateS3MPattern

D_LoadS3M13:
                Pop     CX
                Inc     CX
                Cmp     CX, 100
                JA      D_LoadS3M12

                Cmp     CX, [DS:60000+24h]
                JB      D_LoadS3M11

D_LoadS3M12:
                Jmp     D_PostLoadModule

                Ret

EndP            D_LoadS3M
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_Load669 Far

                Xor     AX, AX
                Call    D_PreLoadModule

                Mov     AH, 3Fh
                Mov     CX, 1F1h
                Mov     DX, 60000
                Int     21h

                Mov     SI, 60000+2
                Mov     DI, 4
                Mov     CX, 25
                Rep     MovsB

                Xor     AX, AX
                Mov     CX, 7
                Rep     StosB
                Mov     SI, 60000+6Eh
                LodsB
                StosW
                LodsB
                StosW

                Add     DI, 4
                Mov     AX, 19h         ; Stereo control, sample controlled,
                StosW                   ; Linear, Old EFX
                Xor     AX, AX
                StosW                   ; Song message attached.

                Mov     AX, 3080h       ; GV/MV
                StosW

                Mov     AX, 78*100h+6h      ; 78 BPM, speed 6
                StosW

                Mov     AX, 64              ; Separation of 64
                StosW
                Xor     AX, AX
                Mov     CX, 5
                Rep     StosW

                Mov     AX, 4000h
                StosW
                StosW
                StosW
                StosW
                Mov     AL, 32+128
                Mov     CX, 56
                Rep     StosB           ; Channel pan
                Mov     AL, 64
                Mov     CL, AL
                Rep     StosB           ; Channel volume

                Mov     SI, 60000+71h
                Mov     DI, 100h        ; Orders
                Mov     CL, 80h
                Rep     MovsB
                Mov     CL, 80h
                Mov     AL, 0FFh
                Rep     StosB           ; Orders done.

                Xor     BP, BP          ; Sample time

                Mov     DI, 512+55400
                Mov     AL, 25
                Mul     Byte Ptr [DS:60000+6Eh]
                Mov     CX, AX          ; CX = bytes to read
                Mov     AH, 3Fh
                Xor     DX, DX
                Int     21h
                Xor     SI, SI

D_Load669_1:
                Cmp     BP, [ES:24h]
                JAE     D_Load669_2

                Mov     EAX, 'SPMI'
                StosD
                Mov     CX, 6
                Rep     MovsW
                Mov     AX, 4000h
                StosW

                ; Flag, volume
                Mov     AH, 60
                Inc     SI
                Mov     ECX, [SI]
                Test    ECX, ECX
                JZ      D_Load669_3

                Xor     EAX, EAX
                Mov     [ES:DI+22h], EAX
                Mov     [ES:DI+26h], EAX

                Mov     AX, 3C01h       ; Sample present

                Mov     ECX, [SI+8]     ; End loop

                Cmp     ECX, [SI]
                JA      D_Load669_3

                Sub     ECX, [SI+4]     ; Start loop
                JC      D_Load669_3
                Cmp     ECX, 2
                JB      D_Load669_3

                Mov     ECX, [SI+4]
                Mov     [ES:DI+22h], ECX
                Mov     ECX, [SI+8]
                Mov     [ES:DI+26h], ECX

                Mov     AX, 3C11h       ; Sample present, forwards loop

D_Load669_3:
                StosW
                Mov     CX, 13
                Sub     SI, CX
                Rep     MovsB
                Xor     AL, AL
                Mov     CX, 13
                Rep     StosB
                Mov     AH, 32
                StosW                   ; Convert, DfP
                MovsW
                MovsW
                Add     SI, 8
                Add     DI, 8

                Mov     AX, 8363
                StosW

                Xor     AX, AX
                Mov     CX, 9
                Rep     StosW

                Inc     BP
                Jmp     D_Load669_1

D_Load669_2:                            ; OK.. patterns..
                Xor     BP, BP          ; BP = pattern number

D_Load669_4:
                Cmp     BP, [ES:26h]
                JAE     D_Load669_5

                Mov     AH, 3Fh
                Mov     CX, 600h
                Xor     DX, DX
                Int     21h             ; Patterns at DS:0

                Mov     AH, [DS:60000+0F1h+BP]
                Mov     CL, [DS:60000+171h+BP]
                Call    PE_Translate669Pattern

                Inc     BP
                Jmp     D_Load669_4

D_Load669_5:                            ; Samples

                Xor     BP, BP
                Push    ES
                Pop     DS

D_Load669Samples:
                Inc     BP
                Cmp     BP, [DS:24h]
                JA      D_Load669End

                Mov     SI, BP
                Add     SI, SI
                Mov     SI, [DS:64910+SI]
                Test    Byte Ptr [DS:SI+12h], 1    ; Sample present?
                JZ      D_Load669Samples

                Push    DS
                Push    SI

                Push    CS
                Pop     DS

                Push    BP
                Mov     SI, Offset SampleMsg
                Mov     DI, (4+16*80)*2
                Mov     AH, 5
                Call    S_DrawString

                Pop     AX
                Pop     SI
                Pop     DS

                Dec     AX
                Call    D_LoadSampleData

                Jmp     D_Load669Samples

D_Load669End:
                Jmp     D_PostLoadModule

EndP            D_Load669

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadMOD Far

                Xor     AX, AX
                Call    D_PreLoadModule

                Mov     AH, 3Fh
                Mov     CX, 2048
                Mov     DX, 60000
                Int     21h

                Mov     SI, 60000
                Mov     DI, 4
                Mov     CX, 20
                Rep     MovsB           ; Song name
                Xor     AX, AX
                Mov     CX, 8
                Rep     StosW
                Add     DI, 4
                Mov     AX, 31h         ; Old effects, stereo, sample control
                StosW
                Xor     AX, AX
                StosW
                Mov     AX, 3080h       ; GV/MV
                StosW

                Mov     AX, 07D06h      ; 125 BPM, speed 6
                StosW

                Mov     AX, 64          ; Separation of 64
                StosW

                Xor     AX, AX
                Mov     CX, 5
                Rep     StosW

                Mov     DL, CS:MODNumberOfChannels
                Mov     CX, 64
                Cmp     DL, 8
                JBE     D_LoadMOD13

                Mov     CL, DL
                Mov     AL, 32
                Rep     StosB
                Mov     CL, 64
                Sub     CL, DL
                Jmp     D_LoadMOD14

D_LoadMOD13:
                Mov     AX, 4000h               ; Panning.
                StosW
                Mov     AX, 40h
                StosW
                Sub     CX, 4

                Cmp     DL, 4
                JBE     D_LoadMOD14

                Mov     AX, 4000h
                StosW
                Sub     CX, 2
                Cmp     DL, 6
                JBE     D_LoadMOD14

                Mov     AX, 40h
                StosW
                Sub     CX, 2

D_LoadMOD14:
                Mov     AL, 32+128
                Rep     StosB                   ; Clear Panning

                Mov     AL, 64
                Mov     CX, 64
                Rep     StosB                   ; Channel Volume

                Mov     DI, 256
                Mov     CX, 256
                Mov     AL, 0FFh
                Rep     StosB                   ; Orders.

                Mov     DI, 256
                Xor     CH, CH
                Mov     CL, CS:MODNumberOfOrders
                Mov     SI, CS:MODOrderOffset
                Mov     DX, SI
                Rep     MovsB                   ; copy orders...

                                                ; Get number of patterns to load
                Xor     CX, CX
                Mov     SI, DX
                Mov     AX, 07F00h

D_LoadMOD1:
                LodsB
                Cmp     CL, AL
                JAE     D_LoadMOD2

                Mov     CL, AL

D_LoadMOD2:
                Dec     AH
                JNZ     D_LoadMOD1

                Inc     CX                      ; CX = number of patterns to
                                                ;      load
                Push    CX

                Push    BX
                                                ; setup inst. headers
                Xor     CH, CH
                Mov     CL, CS:MODNumberOfInstruments
                Mov     SI, 60000+20
                Mov     DI, 512+55400

D_LoadMOD3:
                Push    CX

                Mov     EAX, 'SPMI'
                StosD

                Mov     CX, 6
                Xor     AX, AX
                Rep     StosW
                StosB
                Mov     AL, 64
                StosB
                Xor     AL, AL
                Mov     CX, [DS:SI+28]
                XChg    CH, CL
                Cmp     CX, 1
                JBE     D_LoadMOD4

                Or      AL, 16

D_LoadMOD4:
                Mov     CX, [DS:SI+22]
                XChg    CH, CL
                Cmp     CX, 1
                JBE     D_LoadMOD5

                Or      AL, 1

D_LoadMOD5:
                StosB
                Mov     AL, [DS:SI+25]
                StosB
                Mov     CX, 22
                Rep     MovsB
                Xor     EAX, EAX
                StosD

                Mov     AX, 1+32*256            ; Convert signed->Unsigned
                StosW                           ; Default pan of 32

                LodsW
                XChg    AH, AL                  ; Sample length...
                Add     EAX, EAX
                StosD
                Mov     EDX, EAX                ; EDX = length

                MovZX   EAX, Word Ptr [DS:SI+2]         ; Loop begin
                XChg    AH, AL

                Cmp     CS:MODOrderOffset, 60472
                JE      D_LoadMOD15

                Add     EAX, EAX

D_LoadMOD15:
                Cmp     EAX, EDX
                JBE     D_LoadMODLengthCheck1

                Xor     EAX, EAX

D_LoadMODLengthCheck1:
                StosD
                Mov     ECX, EAX

                MovZX   EAX, Word Ptr [DS:SI+4]         ; Loop end
                XChg    AH, AL

                Cmp     CS:MODOrderOffset, 60472
                JE      D_LoadMOD16

                Add     EAX, EAX

D_LoadMOD16:
                Add     EAX, ECX
                Cmp     EAX, EDX
                JBE     D_LoadMODLengthCheck2

                Mov     EAX, EDX

D_LoadMODLengthCheck2:
                StosD

                LodsB                           ; C5Speed.
                And     AX, 15
                Mov     BX, AX
                Add     BX, BX
                Mov     AX, [CS:FineTuneTable+BX]
                StosW
                Xor     AX, AX
                Mov     CX, 9
                Rep     StosW

                Add     SI, 5

                Pop     CX
                Loop    D_LoadMOD3

                Pop     BX                      ; Now to load mod patterns.

                Mov     AX, 4200h
                Xor     CX, CX
                Mov     DX, CS:MODPatternOffset
                Int     21h                     ; set offset in file...

                Pop     CX
                Xor     AX, AX                  ; Start with pattern 0

D_LoadMOD6:
                Cmp     AX, CX
                JAE     D_LoadMOD7

                Push    AX
                Push    CX

                Push    DS

                Push    CS
                Pop     DS

                Push    AX                              ; AX = pattern num.
                Mov     SI, Offset PatternMsg
                Mov     DI, (4+16*80)*2
                Mov     AH, 5
                Call    S_DrawString

                Pop     DX                              ; DX = pattern num
                Pop     DS

                Push    DX

                Mov     AH, 3Fh
                Mov     CH, CS:MODNumberOfChannels
                Xor     CL, CL
                Xor     DX, DX
                Int     21h                             ; DS:0 contains pat data

                Pop     DX
                Xor     SI, SI
                Mov     AL, CS:MODNumberOfChannels
                Xor     AH, AH

                Call    PE_TranslateMODPattern

                Pop     CX
                Pop     AX
                Inc     AX
                Jmp     D_LoadMOD6


D_LoadMOD7:                                     ; Finished loading patterns
                Mov     CX, 1                   ; Time to load samples.

D_LoadMOD8:
                Push    CX
                Push    ES

                Mov     SI, CX
                Dec     SI
                Add     SI, SI
                Mov     SI, [ES:64912+SI]

                Test    Byte Ptr [ES:SI+12h], 1
                JZ      D_LoadMOD9

                Push    SI

                Push    CS
                Pop     DS

                Push    CX
                Mov     SI, Offset SampleMsg
                Mov     DI, (4+17*80)*2
                Mov     AH, 5
                Call    S_DrawString

;                Mov     AX, 4201h
;                Xor     CX, CX
;                Mov     DX, 4
;                Int     21h                     ; Progress pointer

                Pop     AX

                Pop     SI

                Push    ES
                Pop     DS

                Dec     AX                      ; AX = sample to load.
                Call    D_LoadSampleData

D_LoadMOD9:
                Pop     ES
                Pop     CX
                Inc     CX
                Cmp     CL, CS:MODNumberOfInstruments
                JBE     D_LoadMOD8

D_LoadMOD12:
                Jmp     D_PostLoadModule

                Ret

EndP            D_LoadMOD
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ENDIF

Proc            ConvertOldInstrument            ; DS:SI points to inst.

                PushAD
                Push    DS
                Push    ES

                Push    DS
                Pop     ES

                Mov     DI, SI

                Mov     AL, [SI+11h]            ; Old format Flg
                Mov     [SI+130h], AL

                Mov     EAX, [SI+12h]           ; VLS, VLE, SLS, SLE
                Mov     [SI+132h], EAX

                Mov     AX, [SI+18h]            ; Fadeout
                Add     AX, AX
                Mov     [SI+14h], AX

                Mov     AL, [SI+1Ah]
                Mov     [SI+11h], AL

                Xor     AX, AX
                Mov     AL, [SI+1Bh]
                Mov     [SI+12h], AX            ; DCT

                Mov     AX, 60*256              ; PPS, PPC
                Mov     [SI+16h], AX

                Mov     AX, 128+(32+128)*256          ; GbV+DfP
                Mov     [SI+18h], AX

                Xor     AX, AX
                Mov     [SI+1Ah], AX
                                                ; Now for envelope
                Push    SI
                Xor     CX, CX

                Add     SI, 1F8h
                Add     DI, 136h

D_LoadITInstrument2:
                LodsW
                Cmp     AX, 0FFFFh
                JE      D_LoadITInstrument3

                Mov     [DI], AH                ; Magintude
                Xor     AH, AH
                Mov     [DI+1], AX              ; Tick

                Add     DI, 3
                Inc     CX
                Cmp     CL, 25
                JAE     D_LoadITInstrument3

                Jmp     D_LoadITInstrument2

D_LoadITInstrument3:
                Pop     SI
                Mov     [SI+131h], CL

                Mov     CX, SI
                Add     CX, 554
                Sub     CX, DI
                Xor     AL, AL
                Rep     StosB

                Mov     Byte Ptr [SI+183h], 2 ; Num nodes for panning + pitch
                Mov     Byte Ptr [SI+1D5h], 2

                Mov     Byte Ptr [SI+18Ch], 99 ; Magn 0 at Tick 99
                Mov     Byte Ptr [SI+1DEh], 99 ; Magn 0 at Tick 99

                Pop     ES
                Pop     DS
                PopAD

                Ret

EndP            ConvertOldInstrument

IF TUTORIAL
ELSE

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadIT Far

                Xor     AX, AX
                Call    D_PreLoadModule

                Push    DS

                Push    CS
                Pop     DS
                Mov     SI, Offset HeaderMsg
                Mov     DI, (4+16*80)*2
                Mov     AH, 5
                Call    S_DrawString

                Pop     DS

                Mov     AH, 3Fh
                Mov     CX, 2048
                Xor     DX, DX
                Int     21h

                Cmp     Word Ptr [DS:28h], 208h
                JB      D_ConvertITTimer

                Mov     EAX, [DS:3Ch]
                Xor     EAX, 'ITRK'
                RoR     EAX, 7
                Neg     EAX
                RoL     EAX, 4
                Xor     EAX, 'JTHL'
                Mov     [DS:3Ch], EAX

D_ConvertITTimer:
                Test    Byte Ptr [DS:2Eh], 2    ; Time data?
                JZ      D_LoadTimeDataNone

                                                ; Seek to 0C0+Orders+
                                                ; (ins+samp+pat)*4
                Mov     DX, [DS:22h]
                Add     DX, [DS:24h]
                Add     DX, [DS:26h]
                ShL     DX, 2
                Add     DX, [DS:20h]
                Add     DX, 0C0h
                Xor     CX, CX
                Mov     AX, 4200h
                Int     21h

                Push    DS

                Push    CS
                Pop     DS

                Mov     AH, 3Fh
                Mov     CX, 2
                Mov     DX, Offset NumTimerData
                Int     21h

                Push    BX              ; Allocate data for timedata
                Mov     BX, NumTimerData
                Cmp     BX, 0FFFFh
                JNE     D_NoTimerDataOverFlow

                Dec     BX
                Mov     NumTimerData, BX

D_NoTimerDataOverFlow:
                Mov     CX, BX
                ShR     BX, 1
                Inc     BX
                Mov     AH, 48h
                Int     21h
                Pop     BX
                JC      D_LoadTimeDataEnd

                Mov     TimerData, AX
                Mov     DS, AX
                ShL     CX, 3
                Xor     DX, DX
                Mov     AH, 3Fh
                Int     21h

D_LoadTimeDataEnd:
                Pop     DS

D_LoadTimeDataNone:
                Test    Byte Ptr [DS:2Eh], 8
                JZ      D_LoadMIDIConfigDataNone

                PushA
                Push    DS

                Call    Music_GetMIDIDataArea
                Xor     DX, DX
                Mov     CX, 4896
                Mov     AH, 3Fh
                Int     21h

                Pop     DS
                PopA

D_LoadMIDIConfigDataNone:
                Test    Byte Ptr [DS:2Eh], 1
                JZ      D_LoadITMsg1
                                                ; Load the message
                                ; Move to offset first.
                Mov     AX, 4200h
                Mov     CX, [DS:3Ah]
                Mov     DX, [DS:38h]
                Int     21h             ; Seek to position

                Push    DS

                Mov     CX, [DS:36h]
                Call    Msg_GetMessageOffset
                Mov     AH, 3Fh
                Int     21h

                Pop     DS

D_LoadITMsg1:
                        ; Actually, load row hilights first...
                Test    Byte Ptr [DS:2Eh], 4
                JZ      D_LoadITNoHilight

                Mov     AX, [DS:1Eh]
                Push    DS

                Push    Pattern
                Pop     DS
                        Assume DS:Pattern
                Mov     Word Ptr [RowHilight1], AX

                Pop     DS
                        Assume DS:Nothing

D_LoadITNoHilight:
                Xor     SI, SI
                Xor     DI, DI
                Mov     CX, 192
                Rep     MovsB                           ; Header

                Mov     DI, 256
                Mov     CX, [DS:20h]

                Mov     DX, DI
                Dec     CX
                Sub     DX, CX
                Rep     MovsB                           ; Orders
                Mov     AL, 0FFh
                Mov     CX, DX
                Rep     StosB

                Inc     SI                              ; SI points to first
                                                        ; pointer

                Xor     BP, BP                          ; Instrument time.

D_LoadIT1:
                Cmp     BP, [DS:22h]
                JAE     D_LoadIT2

                Push    DS
                Push    SI

                Push    CS
                Pop     DS
                Mov     SI, Offset InstrumentMsg
                Mov     AX, BP
                Inc     AX
                Push    AX
                Mov     AH, 5
                Mov     DI, (4+17*80)*2
                Call    S_DrawString
                Pop     AX

                Pop     SI
                Pop     DS
                                                ; Move to offset..
                LodsW
                Mov     DX, AX
                LodsW
                Mov     CX, AX
                Mov     AX, 4200h
                Int     21h

                Mov     DI, [DS:2Ah]            ; Format version

                Push    DS
                Push    SI

                Push    ES
                Pop     DS
                Mov     SI, BP
                Add     SI, SI
                Mov     DX, [DS:64712+SI]
                Mov     CX, 554
                Mov     AH, 3Fh
                Int     21h

                Cmp     DI, 200h
                JAE     D_LoadITInstrument1

                Mov     SI, DX
                Call    ConvertOldInstrument

D_LoadITInstrument1:
                Pop     SI
                Pop     DS
                Inc     BP
                Jmp     D_LoadIT1

D_LoadIT2:
                Xor     BP, BP                          ; Sample header time.

D_LoadIT3:
                Cmp     BP, [DS:24h]
                JAE     D_LoadIT4

                Push    DS
                Push    SI

                Push    CS
                Pop     DS
                Mov     SI, Offset SHLoadMsg
                Mov     AX, BP
                Inc     AX
                Push    AX
                Mov     AH, 5
                Mov     DI, (4+18*80)*2
                Call    S_DrawString
                Pop     AX

                Pop     SI
                Pop     DS
                                                ; Move to offset..
                LodsW
                Mov     DX, AX
                LodsW
                Mov     CX, AX
                Mov     AX, 4200h
                Int     21h

                Push    DS
                Push    SI

                Push    ES
                Pop     DS

                Mov     SI, BP
                Add     SI, SI
                Mov     DX, [DS:64912+SI]
                Mov     CX, 80
                Mov     AH, 3Fh
                Int     21h

                Pop     SI
                Pop     DS
                Inc     BP
                Jmp     D_LoadIT3

D_LoadIT4:
                Xor     BP, BP

                Push    DS
                Push    SI


                Push    ES
                Pop     DS                      ; DS now points to song data.

D_LoadIT7:
                Mov     SI, BP
                Add     SI, SI
                Mov     SI, [64912+SI]

                Test    Byte Ptr [DS:SI+12h], 1
                JZ      D_LoadIT8

                Push    DS
                Push    SI

                Push    CS
                Pop     DS
                Mov     SI, Offset SampleMsg
                Mov     AX, BP
                Inc     AX
                Push    AX
                Mov     AH, 5
                Mov     DI, (4+19*80)*2
                Call    S_DrawString
                Pop     AX

                Pop     SI
                Pop     DS

                Mov     AX, 4200h
                Xor     CX, CX
                Xor     DX, DX
                XChg    DX, [DS:SI+48h]
                XChg    CX, [DS:SI+4Ah]
                Int     21h                     ; Move file pointer.

                Mov     AX, BP
                Call    D_LoadSampleData
                Jmp     D_LoadITSamplePresent

D_LoadIT8:
                Mov     DWord Ptr [SI+48h], 0

D_LoadITSamplePresent:
                Inc     BP
                Cmp     BP, 99
                JB      D_LoadIT7

                Pop     SI
                Pop     DS

                Xor     BP, BP

D_LoadIT5:
                Cmp     BP, [DS:26h]            ; Pattern time.
                JAE     D_LoadIT6

                Push    ES

                Push    DS
                Push    SI

                Push    CS
                Pop     DS
                Mov     SI, Offset PatternMsg
                Push    BP
                Mov     AH, 5
                Mov     DI, (4+20*80)*2
                Call    S_DrawString
                Pop     AX

                Pop     SI
                Pop     DS
                                                ; Move to offset..
                LodsW
                Mov     DX, AX
                LodsW
                Mov     CX, AX
                And     DX, DX
                JNZ     D_LoadIT12
                And     CX, CX
                JZ      D_LoadIT13

D_LoadIT12:
                Mov     AX, 4200h
                Int     21h

                Push    DS
                Push    SI

                Mov     AH, 3Fh
                Mov     DX, 60000
                Mov     CX, 8
                Int     21h                     ; DS:DX = pattern header.

                Mov     DX, [DS:60000]          ; DX = length
                Push    DX
                Add     DX, 8
                Mov     SI, BP

                Push    BX
                Call    Music_AllocatePattern
                                                ; ES:DI = location.
                Pop     BX

                Mov     AX, ES
                And     AX, AX
                JZ      D_LoadIT10

                Mov     SI, 60000
                Mov     CX, 8
                Rep     MovsB

                Push    ES
                Pop     DS
                Mov     DX, DI
                Mov     AH, 3Fh
                Pop     CX                      ; CX = length.
                Int     21h

                Jmp     D_LoadIT11

D_LoadIT10:
                Pop     CX
                Push    BX


                Call    PEFunction_OutOfMemoryMessage

                Pop     BX

D_LoadIT11:
                Pop     SI
                Pop     DS

D_LoadIT13:
                Pop     ES

                Inc     BP
                Jmp     D_LoadIT5

D_LoadIT6:
                Jmp     D_PostLoadModule

                Ret

EndP            D_LoadIT

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadFileImpulseModule Far

                Mov     SI, 1
                Mov     CX, Object1
                Mov     DX, Offset O1_LoadITList

                Mov     AX, 5
                Ret

EndP            D_LoadFileImpulseModule

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadFileS3MModule Far

                Mov     SI, 1
                Mov     CX, Object1
                Mov     DX, Offset O1_LoadS3MList

                Mov     AX, 5
                Ret

EndP            D_LoadFileS3MModule

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadFile669Module Far

                Mov     SI, 1
                Mov     CX, Object1
                Mov     DX, Offset O1_Load669List

                Mov     AX, 5
                Ret

EndP            D_LoadFile669Module

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadFileXMModule Far

                Mov     SI, 1
                Mov     CX, Object1
                Mov     DX, Offset O1_LoadXMList

                Mov     AX, 5
                Ret

EndP            D_LoadFileXMModule

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadFileMTMModule Far

                Mov     SI, 1
                Mov     CX, Object1
                Mov     DX, Offset O1_LoadMTMList

                Mov     AX, 5
                Ret

EndP            D_LoadFileMTMModule

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            D_LoadFileMODModule Far

                Mov     AL, 31
                Mov     CL, [DS:60000+950]
                Mov     DX, 60952
                Mov     SI, 1084

                Cmp     Word Ptr [BX+23], 16
                JNE     D_LoadFileMODModule1

                Mov     AL, 15
                Mov     CL, [DS:60000+470]
                Mov     DX, 60472
                Mov     SI, 600

D_LoadFileMODModule1:
                Mov     CS:MODNumberOfInstruments, AL
                Mov     CS:MODNumberOfOrders, CL
                Mov     CS:MODOrderOffset, DX
                Mov     CS:MODPatternOffset, SI

                Mov     SI, [BX+23]
                Cmp     SI, 17
                JNE     D_LoadFileMODModule2

                Mov     AL, [BX+22]
                Jmp     D_LoadFileMODModule3

D_LoadFileMODModule2:
                Sub     SI, 9
                Mov     AL, [CS:MODChannelTable+SI]

D_LoadFileMODModule3:
                Mov     CS:MODNumberOfChannels, AL

                Mov     SI, 1
                Mov     CX, Object1
                Mov     DX, Offset O1_LoadMODList

                Mov     AX, 5
                Ret

EndP            D_LoadFileMODModule

ENDIF

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

