impulsetracker/IT_D_RM.INC

2890 lines
81 KiB
Plaintext

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
;
; 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
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ