;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; ; In-Module sample loaders have to place the information at Sample*96 bytes ; in ITS format into DiskDataArea. Provided with: ; BX = file handle, File at header section. ; DS, ES = DiskDataArea ; ; Variables to update: ; NumSamples (initialised to 1 before the call) ; ; Variables to use: ; InSampleDateTime (DWord) ; CS:InSampleFileName (13 bytes) ; ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc SoftBSWAP ; EAX, returns EAX Push EDX SHLD EDX, EAX, 16 ; DX:AX contains value. XChg DH, AL XChg DL, AH ; DX:AX in proper order now ShL EAX, 16 SHRD EAX, EDX, 16 Pop EDX Ret EndP SoftBSWAP ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc TransferFileName Mov EAX, 'SPMI' StosD Push DS Push CS Pop DS Assume DS:Disk Mov EAX, InSampleDateTime Mov SI, Offset InSampleFileName Mov CX, 13 Rep MovsB Pop DS Assume DS:Nothing Mov [DI+54h-11h], EAX ; Date. Ret EndP TransferFileName ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadMODSamplesInModule Mov AH, 3Fh Mov CX, 1084 Mov DX, 63000 Int 21h Xor CX, CX Mov SI, 63952 Mov AX, 07F00h LoadMODSamplesInModule1: LodsB Cmp CL, AL JAE LoadMODSamplesInModule2 Mov CL, AL LoadMODSamplesInModule2: Dec AH JNZ LoadMODSamplesInModule1 Inc CX ; CX = number of patterns to ; load Mov AL, CS:InSampleChannels Mul CL ; AX = Chan * patterns And EAX, 0FFFFh ShL EAX, 8 Add EAX, 1084 Mov EBP, EAX ; EBP = location of first sample Mov SI, 63020 ; First sample Mov CX, 31 LoadMODSamplesInModule3: Push CX Push SI Mov CX, [SI+22] XChg CH, CL Cmp CX, 1 JBE LoadMODSamplesInModule4 ; OK.. have a sample Mov AX, 96 Mul CS:NumSamples Mov DI, AX Inc CS:NumSamples Mov Byte Ptr [DI+88], 14 Push SI Call TransferFileName Pop SI Mov AL, 64 StosB Mov AH, [SI+25] ; Default volume Mov AL, 1 Mov CX, [DS:SI+28] XChg CH, CL Cmp CX, 1 JBE LoadMODSamplesInModule5 Or AL, 16 LoadMODSamplesInModule5: StosW Mov CX, 22 Rep MovsB Xor EAX, EAX StosD Mov AX, 32*256+1 ; Convert signed->Unsigned StosW ; Default pan of 32 Mov AX, [SI] XChg AH, AL Add EAX, EAX Mov [DI+20h], EAX ; File size StosD ; Sample length Push EAX MovZX EAX, Word Ptr [SI+4] XChg AH, AL Add EAX, EAX StosD ; Loop begin MovZX ECX, Word Ptr [SI+6] XChg CH, CL Add ECX, ECX Add EAX, ECX StosD ; Loop end Mov AL, [SI+2] And AX, 15 Mov SI, AX Add SI, SI Mov AX, [CS:FineTuneTable+SI] StosW Xor AX, AX Mov CX, 5 Rep StosW Mov EAX, EBP StosD Xor EAX, EAX StosD Pop EAX Add EBP, EAX LoadMODSamplesInModule4: Pop SI Pop CX Add SI, 30 Loop LoadMODSamplesInModule3 Ret EndP LoadMODSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadS3MSamplesInModule Mov AH, 3Fh Mov CX, 2000 Mov DX, 63000 Int 21h Xor BP, BP LoadS3MSamplesInModule1: Cmp BP, [DS:63000+22h] JB LoadS3MSamplesInModule2 Ret LoadS3MSamplesInModule2: Mov SI, BP Add SI, SI Add SI, [DS:63000+20h] Inc BP Mov DX, [DS:63000+SI+60h] Mov CX, DX ShR CX, 12 ShL DX, 4 Mov AX, 4200h Int 21h ; Move to location Mov DX, 62000 Mov AH, 3Fh Mov CX, 80h Int 21h Cmp Byte Ptr [DS:62000], 1 JNE LoadS3MSamplesInModule1 Cmp DWord Ptr [DS:62000+10h], 0 JE LoadS3MSamplesInModule1 Mov AX, 96 Mul CS:NumSamples Mov DI, AX Mov Byte Ptr [DI+88], 3 Call TransferFileName Mov AL, 64 StosB Mov AL, [DS:62000+1Fh] ; Flag Mov AH, AL And AX, 401h ShR AH, 1 ShL AL, 4 Or AL, AH Or AL, 1 Mov AH, [DS:62000+1Ch] ; Default volume StosW Mov SI, 62000+30h Mov CX, 25 Rep MovsB Xor AX, AX StosW Mov AL, 32 StosB ; Length Mov EAX, [DS:62000+10h] StosD Test Byte Ptr [DS:62000+1Fh], 4 JZ LoadS3MSamplesInModule3 Add EAX, EAX LoadS3MSamplesInModule3: Mov [DI+20h-4], EAX ; File size Mov EAX, [DS:62000+14h] StosD Mov EAX, [DS:62000+18h] StosD Mov EAX, [DS:62000+20h] StosD Xor AX, AX StosW StosW StosW StosW ; Sample pointer.. Mov AL, [DS:62000+0Dh] ShL EAX, 16 Mov AX, [DS:62000+0Eh] ShL EAX, 4 StosD Xor AX, AX StosW StosW Inc CS:NumSamples Jmp LoadS3MSamplesInModule1 EndP LoadS3MSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadFARSamplesInModule Mov AH, 3Fh Mov CX, 98 Mov DX, 63000 Int 21h Mov AX, 4201h Xor CX, CX Mov DX, [DS:63000+96] Int 21h ; Removes song message Mov AH, 3Fh Mov CX, 869-98 Mov DX, 63000+98 Int 21h ; Xor CX, CX ; Mov CL, [DS:63000+354] ; CX = number of patterns Mov CX, 256 Comment ~ Xor CX, CX Mov CL, [DS:63000+355] Mov SI, 63000+98 Xor AH, AH ; Have to find CX from order list, apparently... LoadFARSamplesInModule7: LodsB Cmp AL, 0FFh JE LoadFARSamplesInModule8 Cmp AL, AH JB LoadFARSamplesInModule8 Mov AH, AL LoadFARSamplesInModule8: Loop LoadFARSamplesInModule7 Mov CL, AH Inc CX ~ Mov SI, 63000+357 Xor AX, AX Xor DX, DX LoadFARSamplesInModule1: Add AX, [SI] AdC DX, 0 Add SI, 2 Loop LoadFARSamplesInModule1 ; DX:AX = length of patterns. Mov CX, DX Mov DX, AX Mov AX, 4201h Int 21h ; OK.. skipped past patterns. Mov AH, 3Fh Mov CX, 8 Mov DX, 64000 Int 21h ; Read sample map. ; Determine number of samples... Xor SI, SI ; SI = number of samples Mov EDX, [DS:64004] Mov EAX, [DS:64000] Mov CX, 64 LoadFARSamplesInModule2: Test AL, 1 JZ LoadFARSamplesInModule3 Inc SI LoadFARSamplesInModule3: ShR EDX, 1 RCR EAX, 1 Loop LoadFARSamplesInModule2 ; OK.. SI = number of samples.. Mov [DS:65000], SI Mov AX, 48 Mul SI Mov SI, AX ; SI = number of bytes for sample header Mov AX, 4201h Xor CX, CX Xor DX, DX Int 21h ; DX:AX = position in file. Add AX, SI AdC DX, 0 ; DX:AX = position in file of first sam Xor BP, BP LoadFARSamplesInModule4: Cmp BP, [DS:65000] JB LoadFARSamplesInModule5 Ret LoadFARSamplesInModule5: Inc BP Mov DX, 62000 Mov AH, 3Fh Mov CX, 48 Int 21h Cmp DWord Ptr [DS:62000+32], 0 JE LoadFARSamplesInModule4 Mov AX, 96 Mul CS:NumSamples Mov DI, AX Mov Byte Ptr [DI+88], 12 ; FAR sample Call TransferFileName Mov AL, 64 StosB ; Global volume Mov AX, [DS:62000+46] ; 8/16 bit in bit 0 ; loop in bit 3 of AH And AX, 801h ShL AX, 1 Or AL, AH Or AL, 1 Mov DL, AL Mov AH, 64 StosW Mov SI, 62000 Mov CX, 25 LoadFARSamplesInModule6: LodsB StosB Test AL, AL LoopNZ LoadFarSamplesInModule6 Xor AL, AL Inc CX Rep StosB Mov AX, 1+32*256 StosW Mov EAX, [DS:62000+32] Mov [DI+20h], EAX ; File size Call LoadPTMSamplesInModule4 Mov EAX, [DS:62000+38] ; Begin Call LoadPTMSamplesInModule4 Mov EAX, [DS:62000+42] ; End Call LoadPTMSamplesInModule4 Mov AX, 8363 StosW Xor AX, AX Mov CX, 5 Rep StosW ; Get current position in file Mov AX, 4201h Xor CX, CX Xor DX, DX Int 21h StosW Mov AX, DX StosW Xor AX, AX StosW StosW Mov AX, 4201h Mov CX, [DS:62000+34] Mov DX, [DS:62000+32] Int 21h Cmp DWord Ptr [DS:62000+32], 1 JBE LoadFARSamplesInModule4 Inc CS:NumSamples Jmp LoadFARSamplesInModule4 EndP LoadFARSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadMTMSamplesInModule Mov AH, 3Fh Mov CX, 66 ; Read header Mov DX, 63000 Int 21h ; Sample pos = LastsamplePos+Length ; So.. setup first sample with no length Mov AH, 64 Mov AL, [DS:63000+26] Inc AX Mul AH Mov CX, AX ; CX = 64*(LastPatternSaved+1) Mov AL, 37 Mul Byte Ptr [DS:63000+30] ; NOS Add CX, AX ; CX = NOS*37+64*(LastPatternSaved+1) Add CX, [DS:63000+28] Add CX, 194 ; CX = 194+NOS*37+Lngth of comment+... Mov AX, 192 Mul Word Ptr [DS:63000+24] ; Tracks saved Add AX, CX AdC DX, 0 Mov [DS:48h], AX Mov [DS:4Ah], DX Mov DWord Ptr [DS:30h], 0 Mov Byte Ptr [DS:63000+31], 0 Xor BP, BP LoadMTMSamplesInModule1: Cmp BP, [DS:63000+30] JB LoadMTMSamplesInModule2 Ret LoadMTMSamplesInModule2: Inc BP Mov DX, 62000 Mov AH, 3Fh Mov CX, 37 Int 21h Cmp DWord Ptr [DS:62000+22], 0 JE LoadMTMSamplesInModule1 Mov AX, 96 Mul CS:NumSamples Mov DI, AX Mov Byte Ptr [DI+88], 10 ; MTM sample Call TransferFileName Mov AL, 64 StosB ; Global volume Mov AL, 1 Mov ECX, [DS:62000+30] Sub ECX, [DS:62000+26] Cmp ECX, 2 JLE LoadMTMSamplesInModule3 Mov AL, 11h ; Loop + sample. LoadMTMSamplesInModule3: Mov AH, [DS:62000+35] StosW ; Sample name now.. Mov SI, 62000 Mov CX, 22 LoadMTMSamplesInModule4: LodsB StosB Test AL, AL LoopNZ LoadMTMSamplesInModule4 Xor AX, AX Add CX, 4 Rep StosB Mov AH, 32 StosW Mov EAX, [DS:62000+22] Mov [DI+20h], EAX StosD Mov EAX, [DS:62000+26] StosD Mov EAX, [DS:62000+30] StosD Mov AL, [DS:62000+34] And AX, 0Fh Mov SI, AX Add SI, SI Mov AX, [CS:FineTuneTable+SI] StosW Xor AX, AX Mov CX, 5 Rep StosW ; Sample pointer... Mov EAX, [DI-96] ; Last sample pointer Add EAX, [DI-96-18h] ; Last sample length StosD Xor AX, AX StosW StosW Inc CS:NumSamples Jmp LoadMTMSamplesInModule1 EndP LoadMTMSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Comment ~ Proc LoadULTSamplesInModule Mov AH, 3Fh Mov CX, 48 ; Read 48 bytes. Mov DX, 63000 Int 21h Xor DH, DH Mov DL, [DS:63000+47] ShL DX, 5 ; CX = CX * 32 Xor CX, CX Mov AX, 4201h Int 21h ; Seek.. Mov AH, 3Fh Mov CX, 1 Mov DX, 63000+48 Int 21h ; Read 1 byte.. Mov Byte Ptr [DS:63000+49], 0 Ret EndP LoadULTSamplesInModule ~ ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc Load669SamplesInModule Mov AH, 3Fh Mov CX, 1F1h Mov DX, 63000 Int 21h Mov AL, 19h Mul Byte Ptr [DS:63000+6Eh] Mov CX, AX Add CX, 1F1h Mov AL, [DS:63000+6Fh] Xor AH, AH Mov DX, 600h Mul DX Add AX, CX AdC DX, 0 Mov [DS:48h], AX Mov [DS:4Ah], DX Mov DWord Ptr [DS:30h], 0 Mov Byte Ptr [DS:63000+6Fh], 0 Xor BP, BP Load669SamplesInModule1: Cmp BP, [DS:63000+6Eh] JB Load669SamplesInModule2 Ret Load669SamplesInModule2: Inc BP Mov AH, 3Fh Mov CX, 19h Mov DX, 62000 Int 21h Cmp DWord Ptr [DS:62000+13], 0 JE Load669SamplesInModule1 Mov AX, 96 Mul CS:NumSamples Mov DI, AX Mov Byte Ptr [DI+88], 11 ; 669 sample Call TransferFileName Mov AL, 64 StosB ; Global volume Mov AL, 1 Mov ECX, [DS:62000+21] Cmp ECX, [DS:62000+13] JA Load669SamplesInModule3 Mov AL, 11h ; Loop + sample. Load669SamplesInModule3: Mov DL, AL Mov AH, 64 StosW ; Sample name Mov SI, 62000 Mov CX, 13 Rep MovsB Xor AX, AX Mov CX, 13 Rep StosB Mov AH, 32 StosW Mov SI, 62000+13 LodsD Mov [DI+20h], EAX StosD MovsD Test DL, 10h JZ Load669SamplesInModule4 MovsD Jmp Load669SamplesInModule5 Load669SamplesInModule4: Xor AX, AX StosW StosW Load669SamplesInModule5: Mov AX, 8363 StosW Xor AX, AX Mov CX, 5 Rep StosW ; Sample pointer... Mov EAX, [DI-96] ; Last sample pointer Add EAX, [DI-96-18h] ; Last sample length StosD Xor AX, AX StosW StosW Inc CS:NumSamples Jmp Load669SamplesInModule1 EndP Load669SamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadPTMSamplesInModule Mov AH, 3Fh Mov CX, 608 ; Read 608 bytes. Mov DX, 63000 Int 21h Xor BP, BP LoadPTMSamplesInModule1: Cmp BP, [DS:63000+34] JB LoadPTMSamplesInModule2 Ret LoadPTMSamplesInModule2: Inc BP Mov DX, 62000 Mov AH, 3Fh Mov CX, 80 Int 21h Mov AL, [DS:62000] And AL, 3 Cmp AL, 1 JNE LoadPTMSamplesInModule1 Cmp DWord Ptr [DS:62000+22], 0 JE LoadPTMSamplesInModule1 Mov AX, 96 Mul CS:NumSamples Mov DI, AX Mov Byte Ptr [DI+88], 9 ; PTM sample Call TransferFileName Mov AL, 64 StosB ; Global volume Mov CL, [DS:62000] ; AL, Bit 0-1 = sample ; Bit 2 = loop ; Bit 3 = loop dirn ; Bit 4 = 8/16 bit Mov AL, CL Mov AH, CL And AX, 1004h ShL AL, 2 And CL, 8 ShR AH, 3 ShL CL, 3 Or AL, AH Or AL, CL Or AL, 1 Mov DL, AL Mov AH, [DS:62000+13] ; Default volume StosW ; Flag + default volume Mov SI, 62000+30h ; Sample name Mov CX, 25 Rep MovsB Xor AX, AX StosB Mov AX, 9+32*256 ; Conversion flag + default pan StosW ; Length Mov EAX, [DS:62000+22] Mov [DI+20h], EAX ; File size Call LoadPTMSamplesInModule4 Mov EAX, [DS:62000+26] ; Begin Call LoadPTMSamplesInModule4 Mov EAX, [DS:62000+30] ; End Call LoadPTMSamplesInModule4 Xor EAX, EAX Mov AX, [DS:62000+14] ; C5Freq StosD Xor AX, AX StosW StosW StosW StosW ; Sample pointer.. Mov EAX, [DS:62000+18] StosD Xor AX, AX StosW StosW Inc CS:NumSamples Jmp LoadPTMSamplesInModule1 LoadPTMSamplesInModule4: Test DL, 2 JZ LoadPTMSamplesInModule5 ShR EAX, 1 LoadPTMSamplesInModule5: StosD RetN EndP LoadPTMSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadITSamplesInModule ; DS, ES = DiskDataArea Mov AH, 3Fh Mov CX, 2000 Mov DX, 63000 Int 21h ; Loaded module Xor BP, BP ; DX = number of samples LoadITSamplesInModule1: Cmp BP, [DS:63000+24h] ; Num Samples JB LoadITSamplesInModule2 Ret LoadITSamplesInModule2: Mov SI, [DS:63000+22h] Add SI, BP ShL SI, 2 ; DX = (NumInstrument+NumSamples)*4 Add SI, [DS:63000+20h] Inc BP Mov DX, [DS:63000+SI+0C0h] Mov CX, [DS:63000+SI+0C0h+2] Mov AX, 4200h Int 21h ; OK. file pointer moved to sample header. ; Memory region to copy it to is BP*96 Mov AX, 96 Mul CS:NumSamples Mov DX, AX Mov DI, DX Mov AH, 3Fh Mov CX, 80 Int 21h Mov CL, [DI+12h] Test CL, 1 JZ LoadITSamplesInModule1 Mov EAX, [DI+30h] ; Length Test CL, 2 JZ LoadITSamplesInModule3 Add EAX, EAX LoadITSamplesInModule3: Mov [DI+50h], EAX Mov Byte Ptr [DI+88], 2 Call TransferFileName Inc CS:NumSamples Jmp LoadITSamplesInModule1 EndP LoadITSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadXMHeader Mov AH, 3Fh Mov CX, 74 Mov DX, 64000 Int 21h ; Loaded module Mov AX, 4200h ; Seek to position from start of module Mov DX, [DS:64000+60] Mov CX, [DS:64000+62] Add DX, 60 Int 21h Xor BP, BP ; BP = pattern counter ; At first pattern LoadXMSamplesInModule1: Cmp BP, [DS:64000+70] ; Number of patterns JAE LoadXMSamplesInModule2 ; Load 4 bytes. Mov AH, 3Fh Mov CX, 9 ; Read standard header Mov DX, 63000 Int 21h Mov AX, 4201h Xor CX, CX Mov DX, [DS:63000] Add DX, [DS:63000+7] Sub DX, 9 Int 21h Inc BP Jmp LoadXMSamplesInModule1 LoadXMSamplesInModule2: ; OK.. at first instrument Ret EndP LoadXMHeader ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadXMSamplesInModule Call LoadXMHeader Xor BP, BP LoadXMSamplesInModule3: Cmp BP, [DS:64000+72] JB LoadXMSamplesInModule4 Ret LoadXMSamplesInModule4: Inc BP Mov AH, 3Fh Mov CX, 4 Mov DX, 63000 Int 21h ; Read instrument size field Mov AH, 3Fh Mov CX, [DS:63000] Sub CX, 4 Mov DX, 63004 Int 21h Mov AX, [DS:63000+27] ; Number of samples Test AX, AX JZ LoadXMSamplesInModule3 ; Bytes to read = AX*40 Mov CX, 40 Mul CX Mov CX, AX Mov AH, 3Fh Mov DX, 62000 Int 21h ; OK sample headers read ; into DS:62000 Push BP Xor BP, BP Xor EDX, EDX ; EDX = number of bytes to adv LoadXMSamplesInModule5: Cmp BP, [DS:63000+27] ; Number of samples JB LoadXMSamplesInModule6 SHLD ECX, EDX, 16 Mov AX, 4201h Int 21h ; Advance file pointer Pop BP Jmp LoadXMSamplesInModule3 LoadXMSamplesInModule6: Push EDX Mov AX, 40 Mul BP Mov SI, AX Add SI, 62000 Pop EDX Inc BP Cmp DWord Ptr [DS:SI], 0 ; Sample length = 0?? JE LoadXMSamplesInModule5 Push EDX Mov AX, 96 Mul CS:NumSamples Mov DI, AX Push SI Mov Byte Ptr [DI+88], 8 Call TransferFileName Mov AL, 64 StosB Pop SI Mov AH, [SI+12] ; Default volume Mov AL, 1 Mov CL, [SI+14] Test CL, 10h JZ LoadXMSamplesInModule7 Or AL, 2 ; 16-bit sample LoadXMSamplesInModule7: And CL, 3 JZ LoadXMSamplesInModule8 ; No loop ; CL = 1 or 2 Cmp DWord Ptr [SI+8], 1 JBE LoadXMSamplesInModule8 Or AL, 10h ; Loop Dec CX ShL CL, 6 Or AL, CL LoadXMSamplesInModule8: StosW Push SI ; Sample name Add SI, 18 Mov CX, 22/2 Rep MovsW Pop SI Xor AX, AX ; Cleanup + conversion flags StosW StosW Mov AH, [SI+15] ; Default pan ShR AH, 2 AdC AH, 80h Mov AL, 5 ; Delta values, signed StosW Mov EAX, [SI] Mov [DI+20h], EAX ; File size 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 Mul ECX ShRD EAX, EDX, 16 StosD ; C5freq Xor AX, AX StosW StosW StosW StosW ; Now position Mov AX, 4201h Xor CX, CX Xor DX, DX Int 21h ; Returns file position in DX:AX Push AX ShRD EAX, EDX, 16 Pop AX Pop EDX Add EAX, EDX StosD Xor AX, AX StosW StosW Add EDX, [DS:SI] Inc CS:NumSamples Jmp LoadXMSamplesInModule5 EndP LoadXMSamplesInModule ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ KRZSampleOffset DD 0 KRZSampleStartingOffset DD 0 KRZFileOffset DD 0 Proc LoadKRZSamples Mov AH, 3Fh Mov CX, 32 Mov DX, 64000 Int 21h Mov CS:KRZFileOffset, 32 Mov EAX, [DS:64000+4] ; Sample start offset Call SoftBSWAP Mov CS:KRZSampleOffset, EAX Mov CS:KRZSampleStartingOffset, EAX LoadKRZSamples1: Mov EDX, CS:KRZFileOffset Cmp EDX, CS:KRZSampleStartingOffset JB LoadKRZSamples2 Ret LoadKRZSamples2: Mov AX, 4200h ; Move to location in file SHLD ECX, EDX, 16 Int 21h Mov AH, 3Fh Mov CX, 1000 Mov DX, 64000 Int 21h ; Load .KRZ object Mov AX, [DS:64000+6] ; Block size XChg AH, AL Add AX, 7 And EAX, 0FFFCh Add CS:KRZFileOffset, EAX Mov AX, [DS:64000+4] ; Sample object? Cmp AL, 98h JB LoadKRZSamples1 Cmp AL, 9Bh JA LoadKRZSamples1 Push BX Mov AX, 96 Mul CS:NumSamples Mov DI, AX Mov Byte Ptr [DI+88], 15 ; KRZ sample. Call TransferFileName Mov AL, 64 ; Global volume StosB Mov BX, [DS:64000+8] XChg BH, BL Add BX, 64000+20 ; BX points to start of ; KRZSampleHdr Mov AX, 4003h ; Flags + Default volume ; sample present, 16-bit Mov DL, [BX+1] Test DL, 2 ; Bidir loop? JZ LoadKRZSamples5 Or AL, 0C0h ; Ping pong LoadKRZSamples5: Test DL, 80h ; Loop off? JNZ LoadKRZSamples6 Mov ECX, [BX+16] Cmp ECX, [BX+20] JE LoadKRZSamples6 Or AL, 10h ; Loop on. LoadKRZSamples6: StosW ; Flags + DFV done. ; Sample name. Mov SI, 64000+10 Mov CX, 26 LoadKRZSamples3: LodsB Test AL, AL JZ LoadKRZSamples4 StosB Loop LoadKRZSamples3 Xor AL, AL LoadKRZSamples4: Rep StosB Mov AX, 1+2+32*256 StosW ; Signed sample, default pan = 32 ; Length Mov EAX, [BX+8] Call SoftBSWAP Mov EBP, EAX Mov EAX, [BX+20] Call SoftBSWAP Sub EAX, EBP StosD Add EAX, EAX Mov [DI+20h-4], EAX ; File size Mov EAX, [BX+16] ; start of loop Call SoftBSWAP Sub EAX, EBP StosD Mov EAX, [BX+20] Call SoftBSWAP Sub EAX, EBP Cmp EAX, [ES:DI-4] JB NextKRZ StosD Mov EAX, [BX+28] Call SoftBSWAP Mov ECX, EAX Mov EAX, 22000 Test ECX, ECX JZ LoadKRZSamples7 Xor EDX, EDX Mov EAX, 1000000000 Div ECX Test EAX, EAX JNZ LoadKRZSamples7 Mov EAX, 44100 LoadKRZSamples7: StosD ; C5Speed Xor EAX, EAX StosD StosD Mov EAX, CS:KRZSampleOffset Add EAX, EBP Add EAX, EBP StosD Xor EAX, EAX StoSD Inc CS:NumSamples NextKRZ: Pop BX Jmp LoadKRZSamples1 EndP LoadKRZSamples ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc StorePATLength Test DL, 1 ; 16-bit? JZ StorePATLength1 ShR EAX, 1 StorePATLength1: StosD Ret EndP StorePATLength ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc LoadPATSamples Mov AH, 3Fh Mov CX, 129+63+47 ; 129 bytes for file header, 63 for ; instrument header, 47 for layer Mov DX, 65000 Int 21h Mov BP, [DS:65000+129+63+6] And BP, 0FFh ; BP = number of waves. LoadPATSamples1: Mov AH, 3Fh Mov DX, 64000 Mov CX, 96 Int 21h ; Read data in Mov AX, 96 Mul CS:NumSamples Mov DI, AX Inc CS:NumSamples Mov Byte Ptr [DI+88], 16 ; GUS Patch Call TransferFileName Mov AL, 64 ; Global volume StosB Mov AX, 4001h ; sample present Mov DL, [DS:64000+55] ; modes Test DL, 1 ; 8/16 bit JZ LoadPATSamples2 Or AL, 2 LoadPATSamples2: Test DL, 4 ; Looping enabled? JZ LoadPATSamples3 Or AL, 10h LoadPATSamples3: Test DL, 8 ; Ping pong loops? JZ LoadPATSamples4 Or AL, 40h LoadPATSamples4: StosW ; OK.. now for name. Mov SI, 65000+129+2 Mov CX, 16 LoadPATSamples5: LodsB Test AL, AL JZ LoadPATSamples6 StosB Loop LoadPATSamples5 LoadPATSamples6: Add CX, 9 Mov AL, ':' StosB Mov SI, 64000 LoadPATSamples7: LodsB Test AL, AL JZ LoadPATSamples8 StosB Loop LoadPATSamples7 LoadPATSamples8: Xor AL, AL Rep StosB ; Convert, default pan Mov AH, 32 Mov AL, [DS:64000+55] And AL, 2 ShR AL, 1 Xor AL, 1 StosW ; Length. Mov DL, [DS:64000+55] Mov EAX, [DS:64000+16] ; ->Length Mov [DI+20h], EAX ; File size Call StorePATLength Mov EAX, [DS:64000+12] ; LoopBeg Call StorePATLength Mov EAX, [DS:64000+16] ; LoopEnd Call StorePATLength Mov AX, [DS:64000+20] And EAX, 0FFFFh StosD ; C5Spd Xor EAX, EAX StosD StosD Mov AX, 4201h Xor CX, CX Xor DX, DX Int 21h ; Current position. StosW Mov AX, DX StosW Xor AX, AX StosW StosW Mov AX, 4201h Mov CX, [DS:64000+10] Mov DX, [DS:64000+8] Int 21h Dec BP JNZ LoadPATSamples1 Ret EndP LoadPATSamples ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ