;****************************************************************************** ; 1ksbmod by Baudsurfer/rsi 2015 aka olivier.poudade.free.fr ; additional work by Peter "Qkumba" Ferrie aka pferrie.host22.com ; 1427 byte version of a standard 4 channel Amiga .mod module player ; Provided "as is" WTFPL v2 license as in "work in progress code" ; revision history : ; 18/07/2015 1427 bytes by Peter "Qkumba" Ferrie ; 14/06/2015 1492 bytes by Olivier "Baudsurfer/rsi" Poudade ; 10/03/2015 1736 bytes by Olivier "Baudsurfer/rsi" Poudade ; 01/10/2009 2048 bytes original version by Olivier "Baudsurfer/rsi" Poudade ;****************************************************************************** ; makefile to save as "_1ksbmod.bat" : ;@ECHO OFF ;cls ;bin2asm.exe /i:musicmod.mod /o:musicmod.asm ;pause ;fasm _1ksbmod.asm ;pause ;cls ;dir _1ksbmod.com ;apack _1ksbmod.com ;dir out.com ;del /Q _1ksbmod.com ;ren out.com _1ksbmod.com ;cd "C:\Program Files\DOSBox-0.74\" ;c: ;DOSBox.exe -userconf ;; !! NOTA BENE : This version will not work under XPSP3 but only DOSBox 0.74 ;; !! BY DEFAULT for DOSBox 0.74 : "Z:\>SET BLASTER=A220 I7 D1 H5 T6" ; under DOSBox, type "Mount a c:\[ENTER]" then "_1KSBM~2.COM[ENTER]" ;******************************************************************************* FOOTPRINT equ 1 ; <- turn this to 0 to test with "Pump up the jam" Amiga module ; dl from http://modarchive.org/index.php?request=view_by_moduleid&query=57109 ; and rename as "MUSICMOD.MOD" before launching makefile ;MUSICMOD equ MUSICMOD_ ;defb equ db ; required for bin2asm fasm notation compatibility SBDEFTEMPO EQU 6 SBDEFBPM EQU 125 SBMIDCRATE EQU 8448 _BP EQU 32767 SBVOLTABLE EQU _BP;SIZ=16640 ; db 16640 dup (?) SBDOUBLEBUFFER EQU _BP+16640;49407;SIZ=4096 ; db 4096 dup (?) SBPITCHTABLE EQU _BP+24832;57599;SIZ=1714 ; dw 857 dup (?) SBHEADER EQU _BP+26546;59313;SIZ=1084 ; db 1084 dup (?) SBMODINFO EQU _BP+27630;60397;SIZ=506 ; db 506 dup (?) SBPSP EQU _BP+28376;61143;SIZ=2 ; dw ? SBPROGSIZE EQU _BP+28378;61145;SIZ=2 ; dw ? SBMIXSPEED EQU _BP+28380;61147;SIZ=2 ; dw ? SBORDERPOS EQU _BP+28382;61149;SIZ=1 ; db ? SBTEMPO EQU _BP+28383;61150;SIZ=1 ; db ? SBTEMPOWAIT EQU _BP+28384;61151;SIZ=1 ; db ? SBBPM EQU _BP+28385;61152;SIZ=1 ; db ? SBROW EQU _BP+28386;61153;SIZ=1 ; db ? SBBREAKROW EQU _BP+28387;61154;SIZ=1 ; db ? SBBPMSAMPLES EQU _BP+28388;61155;SIZ=2 ; dw ? SBBUFPTR EQU _BP+28390;61157;SIZ=2 ; dw ? SBBUFLEN EQU _BP+28392;61159;SIZ=2 ; dw ? SBBUFREP EQU _BP+28394;61161;SIZ=2 ; dw ? SBNOTE EQU _BP+28396;61163;SIZ=4 ; dd ? SBADDR EQU _BP+28400;61167;SIZ=2 ; dw ? SBIRQ EQU _BP+28402;61169;SIZ=2 ; dw ? SBDMAFLAG EQU _BP+28404;61171;SIZ=2 ; dw ? SBDMABUFFER EQU _BP+28406;61173;SIZ=2 ; dw ? SBDMAHANDLER EQU _BP+28408;61175;SIZ=4 ; dd ? SBTIMERHANDLER EQU _BP+28412;61179;SIZ=4 ; dd ? SBLOADCOUNT EQU _BP+28416;61183;SIZ=2 ; dw ? SBMODINDEX EQU _BP+28418;61185;SIZ=2 ; dw ? SBSAMPLEBUFF EQU _BP+28420;61187;SIZ=4 ; dd ? SBSAMPLECOUNT EQU _BP+28424;61191;SIZ=2 ; dw ? SBMIXBUFFER EQU _BP+28426;61193;SIZ=4096 ; dw 4096/2 dup (0) SBTRACKS EQU _BP+32522;65289;SIZ=136 ; dw 136/2 dup (0) SBTRACKFUN EQU _BP+32658;65425;SIZ=2; AVAILABLE EQU _BP+32660;65427;SIZ=5520; ;SBVOLTABLE EQU 32767;SIZ=16640 ; db 16640 dup (?) ;SBDOUBLEBUFFER EQU 49407;SIZ=4096 ; db 4096 dup (?) ;SBPITCHTABLE EQU 57599;SIZ=1714 ; dw 857 dup (?) ;SBHEADER EQU 59313;SIZ=1084 ; db 1084 dup (?) ;SBMODINFO EQU 60397;SIZ=506 ; db 506 dup (?) ;SBPSP EQU 61143;SIZ=2 ; dw ? ;SBPROGSIZE EQU 61145;SIZ=2 ; dw ? ;SBMIXSPEED EQU 61147;SIZ=2 ; dw ? ;SBORDERPOS EQU 61149;SIZ=1 ; db ? ;SBTEMPO EQU 61150;SIZ=1 ; db ? ;SBTEMPOWAIT EQU 61151;SIZ=1 ; db ? ;SBBPM EQU 61152;SIZ=1 ; db ? ;SBROW EQU 61153;SIZ=1 ; db ? ;SBBREAKROW EQU 61154;SIZ=1 ; db ? ;SBBPMSAMPLES EQU 61155;SIZ=2 ; dw ? ;SBBUFPTR EQU 61157;SIZ=2 ; dw ? ;SBBUFLEN EQU 61159;SIZ=2 ; dw ? ;SBBUFREP EQU 61161;SIZ=2 ; dw ? ;SBNOTE EQU 61163;SIZ=4 ; dd ? ;SBADDR EQU 61167;SIZ=2 ; dw ? ;SBIRQ EQU 61169;SIZ=2 ; dw ? ;SBDMAFLAG EQU 61171;SIZ=2 ; dw ? ;SBDMABUFFER EQU 61173;SIZ=2 ; dw ? ;SBDMAHANDLER EQU 61175;SIZ=4 ; dd ? ;SBTIMERHANDLER EQU 61179;SIZ=4 ; dd ? ;SBLOADCOUNT EQU 61183;SIZ=2 ; dw ? ;SBMODINDEX EQU 61185;SIZ=2 ; dw ? ;SBSAMPLEBUFF EQU 61187;SIZ=4 ; dd ? ;SBSAMPLECOUNT EQU 61191;SIZ=2 ; dw ? ;SBMIXBUFFER EQU 61193;SIZ=4096 ; dw 4096/2 dup (0) ;SBTRACKS EQU 65289;SIZ=136 ; dw 136/2 dup (0) ;AVAILABLE EQU 65425 _SBADDR EQU 220H ; default DOSBox .74+ setting _SBIRQ EQU 007H ; default DOSBox .74+ setting ;=========================================== ;EQU ;=========================================== ;=========================================== ;DATA ;=========================================== org 100h ; mov al,13h ; int 10h mov bx,1000h ; Shrinks my Memory Block ; to get more core for ; the MODule data. ShrinkProg: mov ah,4Ah ; Shrink! int 21h ;mov bp,sp mov si, MUSICMOD mov di,SBHEADER mov cx,1084 mov word [SBLOADCOUNT],cx HeaderCopy: rep movsb push si mov si,SBHEADER+950 movsb ;mhOrderLen lodsb ;mhReStart cmp al,byte [si-2] ;mhOrderLen jb SetReStart mov al,7Fh SetReStart: stosb mov cl,128 cbw cwd CopyOrder: lodsb ;mhOrder+... stosb cmp dl,al jnb NextOrder xchg dx,ax NextOrder: loop CopyOrder pop si inc dx imul bx,dx,40h mov ah,48h int 21h scasw xchg cx,ax stosw xchg cx,ax stosw les di,dword [di-2] ;mov si, MUSICMOD ;add si,word [SBLOADCOUNT] imul cx,dx,400h add word [SBLOADCOUNT],cx rep movsb mov si,SBHEADER+20 ;lea mhSamples xor di,di CopySamples: mov ax,word [si+22] xchg al,ah add ax,ax; shl ax,1 mov word [SBMODINFO+258+di],ax shr ax, 4 je NextSample inc ax xchg bx,ax mov ah,48h int 21h mov word [SBMODINFO+196+di],ax mov es,ax movzx ax,byte [si+25] ; mov al,byte [si+25] ; xor ah,ah mov word [SBMODINFO+444+di],ax mov ax,word [si+26] xchg al,ah add ax,ax;shl ax,1 mov word [SBMODINFO+320+di],ax mov ax,word [si+28] xchg al,ah add ax,ax;shl ax,1 mov word [SBMODINFO+382+di],ax push si push di mov cx,word [SBMODINFO+258+di] mov di,word [SBMODINFO+134+di] mov si, MUSICMOD add si,word [SBLOADCOUNT] add word [SBLOADCOUNT],cx rep movsb pop di pop si NextSample: add si,30 ;add di,2 scasw cmp di,62 ; max number of samples jb CopySamples Failed: PlayNow: mov word [SBMIXSPEED],11025;10240;22050 ; Mixing at 22 kHz Sbinit: StartPlaying: SetModParms: mov byte [SBORDERPOS],0 mov byte [SBTEMPO],SBDEFTEMPO mov byte [SBTEMPOWAIT],SBDEFTEMPO mov byte [SBBPM],SBDEFBPM mov byte [SBROW],64 mov byte [SBBREAKROW],0 mov ax,word [SBMIXSPEED] cwd ; mov bx,24*SBDEFBPM/60 div bx mov word [SBBPMSAMPLES],ax ClearTracks: mov di, SBTRACKS ;mov ax,ds ; clic sound at start when commented ;mov es,ax ; clic sound at start when commented mov cx,136 ;NumTracks * (Size TrackInfo) MakePitch: mov ax,SBMIDCRATE mov bx,428 mul bx div word [SBMIXSPEED] cwd ;xor dh,dh mov dl,ah mov ah,al salc ;xor al,al mov cx,857 xor bx,bx mov di,SBPITCHTABLE PitchLoop: pusha ;push ax push dx cmp dx,bx jae NoDiv div bx NoDiv: mov word [di],ax popa ;pop dx,ax cmpsw ; ;add di,2 inc bx loop PitchLoop MakeVolume: mov cx,16640 mov bx,cx VolLoop: dec bx mov al,bl imul bh mov byte [SBVOLTABLE+bx],ah loop VolLoop in al,21h push ax mov al,11111111b ; salc ? out 21h,al SetBuffer: mov word [SBDMAFLAG],0 mov ax,SBDOUBLEBUFFER mov word [SBDMABUFFER],ax mov dx,ds mov bx,dx shr dh,4 ; get paragraph size shl bx,4 add ax,bx adc dh,0 lea cx,[bx+SBDOUBLEBUFFER] ; mov cx,ax neg cx test ch,11111000b; cmp cx,2048 jnz SetDma ; jae SetDma add word [SBDMABUFFER],cx add ax,cx adc dh,0 SetDma: mov bx,ax mov cx,2047 ; mov cx,2048 , dec cx dma-1 mov al,05h out 0ah,al setalc ; out 0ch,al mov al,bl out 02h,al mov al,bh out 02h,al mov al,dh out 83h,al mov al,cl out 03h,al mov al,ch out 03h,al mov al,59h out 0bh,al mov al,01h out 0ah,al ClearBuffer: ; mov di,word [SBDMABUFFER] ; mov cx,2048 ; mov al,80h ; rep stosb SetIrq: fld dword [gs:3ch+0] ;(_SBIRQ+8)*4 ; GS assumed 0 fstp dword [SBDMAHANDLER+0] SetTimer: fld dword [gs:70h+0] fstp dword [SBTIMERHANDLER+0] mov dx,SbPoll mov ax,251ch ; ivt 70h int 21h mov dx,226h ;[SBADDR] mov al,1 out dx,al mov cl,4 rep in al,dx salc ;xor al,al out dx,al SbOk: mov dx,22ch mov al,0d1h out dx,al mov ax,1000 mul ax div word [SBMIXSPEED] neg al mov ah,al mov dx,22ch mov al,40h out dx,al ; TODO all mul and div aboce only for hardcoded AH value below mov al,ah out dx,al mov al,14h out dx,al salc ; mov al,0ffh out dx,al out dx,al ; mov al,0ffh Exit: pop ax ; mov cx,_SBIRQ ; mov ah,1 ; shl ah,cl ; not ah ; and al,ah and al,7 out 21h,al DEMOLOOP: in al,60h ; was wrongly in ax,60h dec al ; was dec ax jnz DEMOLOOP ;SbDone: in al,21h ; push ax ; mov al,11111111b ; out 21h,al ; lds dx,[cs:SBTIMERHANDLER] ; mov ax,251ch ; ivt 70h ; int 21h ; mov dx,22ch ; [SBADDR] ; mov al,0d0h ; out dx,al ; mov al,0d3h ; out dx,al ; pop ax ; or al,10000000b ; out 21h,al ; ; mov al,3 ; ; int 10h ; ret ;_________________________________ END BeatTrack: ; add di,34 mov dx,word [di+18] test dx,dx je noVolSlide cmp dh,00h je Arpeggio cmp dh,01h je PortUp cmp dh,02h je PortDown cmp dh,03h je TonePort cmp dh,04h jne noVibrato jmp Vibrato noVibrato: cmp dh,05h jne noPortSlide PortSlide: call VolSlide mov dl,byte [di+22] jmp TonePort VibSlide: call VolSlide mov dl,byte [di+24] jmp Vibrato VolSlide: mov dh,dl and dl,0Fh shr dh,4 mov al,byte [di+12] sub al,dl jge NoLoVol salc; NoLoVol: add al,dh cmp al,64 jbe NoHiVol mov al,64 NoHiVol: mov byte [di+12],al noPortSlide: cmp dh,06h jne noVibSlide jmp VibSlide noVibSlide: cmp dh,0Ah jne noVolSlide jmp VolSlide ; add di,34 noVolSlide: ret Arpeggio: mov bx,word [di+32] mov ax,word [di+26+bx] mov word [di+16],ax inc bx inc bx;add bx,2 cmp bx,6 jb SetArpIndex xor bx,bx SetArpIndex: mov word [di+32],bx ret PortUp: xor dh,dh mov bx,word [di+14] sub bx,dx cmp bx,113 jge SetPort;NotSmall mov bx,113 ;NotSmall: mov word [di+14],bx ; add bx,bx ; mov ax,word [SBPITCHTABLE+bx] ; mov word [di+16],ax ; ret jmp SetPort PortDown: xor dh,dh mov bx,word [di+14] add bx,dx cmp bx,856 jle SetPort;NotBig mov bx,856 ;NotBig: mov word [di+14],bx ; add bx,bx ; mov ax,word [SBPITCHTABLE+bx] ; mov word [di+16],ax ; ret jmp SetPort TonePort: xor dh,dh mov ax,word [di+20] mov bx,word [di+14] cmp bx,ax je NoPort jg PortToUp PortToDown: add bx,dx cmp bx,ax jle SetPort FixPort: mov bx,ax jmp SetPort PortToUp: sub bx,dx cmp bx,ax jl FixPort SetPort: mov word [di+14],bx SetPort2: add bx,bx mov ax,word [SBPITCHTABLE+bx] mov word [di+16],ax NoPort: ret Vibrato: mov dh,dl and dl,0Fh ;DOUCDOUC shr dh,4 shl dh,2 add byte [di+23],dh mov dh,byte [di+23] mov bl,dh shr bl,2 and bx,1Fh xlatb ; ;mov al,byte [SBSINTABLE+bx] mul dl add ax,ax;rol ax,1 and al,1 xchg al,ah ; and ah,1 test dh,dh jns VibUp neg ax VibUp: add ax,word [di+14] mov bx,ax cmp bx,113 jge NoLoVib mov bx,113 NoLoVib: cmp bx,856 jle NoHiVib mov bx,856 NoHiVib:jmp SetPort2 ;NoHiVib: add bx,bx ; mov ax,word [SBPITCHTABLE+bx] ; mov word [di+16],ax ; ret GetTrack: es lodsw xchg al,ah mov bl,ah and ah,0Fh mov cx,ax es lodsw xchg al,ah mov bh,ah and ah,0Fh mov dx,ax mov word [di+18],dx and bl,0F0h shr bh,4 or bl,bh je SetPeriod SetSample: xor bh,bh dec bx add bx,bx mov ax,word [SBMODINFO+444+bx] mov byte [di+12],al mov ax,word [SBMODINFO+134+bx] mov word [di],ax mov ax,word [SBMODINFO+196+bx] mov word [di+2],ax mov ax,word [SBMODINFO+258+bx] mov word [di+6],ax mov ax,word [SBMODINFO+320+bx] mov word [di+8],ax mov ax,word [SBMODINFO+382+bx] mov word [di+10],ax SetPeriod: test cx,cx je SetEffect ;test cx,cx ;jne SetEffect ; je OkPos mov word [di+20],cx cmp dh,03h je SetEffect mov bx,cx ; mov word [di+14],bx ; add bx,bx ; mov ax,word [SBPITCHTABLE+bx] ; mov word [di+16],ax call SetPort mov word [di+4],0 SetEffect: test dx,dx je InitNone cmp dh,00h jne noInitArpeggio jmp InitArpeggio noInitArpeggio: cmp dh,03h je InitTonePort cmp dh,04h je InitVibrato cmp dh,09h je SampleOfs cmp dh,0Bh je PosJump cmp dh,0Ch je SetVolume cmp dh,0Dh je Break_ cmp dh,0Fh je SetSpeed InitNone: ret InitTonePort: test dl,dl jne SetPortParm mov dl,byte [di+22] SetPortParm: mov byte [di+22],dl mov word [di+18],dx ret InitVibrato: mov al,byte [di+24] ; mov ah,al ; and al,0Fh ; and ah,0F0h mov ah,al and ax,0f00fh test dl,0Fh jne OkDepth or dl,al OkDepth: test dl,0F0h jne OkRate or dl,ah OkRate: mov byte [di+24],dl mov word [di+18],dx ;test cx,cx ;je OkPos dec cx ; test cx,cx jne OkPos ; je OkPos mov byte [di+23],0 OkPos: ret SampleOfs: test dl,dl jne SetSampleOfs mov dl,byte [di+25] SetSampleOfs: mov byte [di+25],dl ;mov dh,dl ;xor dl,dl shr dx,8 ;mov dh,dl ;xor dl,dl mov word [di+4],dx ret PosJump: mov byte [SBORDERPOS],dl mov byte [SBROW],64 ret SetVolume: cmp dl,64 jbe OkVol mov dl,64 OkVol: mov byte [di+12],dl ret Break_: mov dh,dl and dl,0Fh shr dh,4 add dh,dh add dl,dh shl dh,2 add dl,dh mov byte [SBBREAKROW],dl mov byte [SBROW],64 ret SetSpeed: test dl,dl je Skip test dl,11100000b ; cmp dl,31 jnz SetBpm ; ja SetBpm SetTempo: mov byte [SBTEMPO],dl mov byte [SBTEMPOWAIT],dl ret SetBpm: mov byte [SBBPM],dl mov al,103 mul dl mov bl,ah xor bh,bh mov ax,word [SBMIXSPEED] cwd ;xor dx,dx div bx mov word [SBBPMSAMPLES],ax Skip: ret InitArpeggio: mov dh,dl and dl,0Fh shr dh,4 mov cx,36 xor bx,bx mov ax,word [di+14] ScanPeriod2: cmp ax,word [SBPERIODTABLE+bx] jae SetArp inc bx inc bx ;add bx,2 loop ScanPeriod2 SetArp: add dx,dx add dh,bl add dl,bl mov di,26 call SetArp2 call SetArp2 SetArp2: mov bx,word [SBPERIODTABLE+bx] ; add bx,bx ; mov ax,word [SBPITCHTABLE+bx] ; mov word [di],ax ; ds stosw seg pref over = illegal call SetPort2 ; !! adds extra unwanted "mov word [di+16],ax" !! cmpsw ; add di,2 mov word [di],0 xor bh,bh mov bl,dh xchg dl,dh ret MixTrack: ; add si,34 mov si,word [SBBUFPTR] mov cx,word [SBBUFLEN] cmp word [di+10],2 ja MixLooped MixNonLooped: les dx,[di] mov bx,word [di+4] mov bp,word [di+6] push di add bx,dx add bp,dx mov dx,word [di+16] mov ax,word[di+12] ; mov al,byte [si+12] mov ah,byte [si+13] mov di,bx mov bh,al mov al,dl mov dl,dh xor dh,dh nlMixSamp: cmp di,bp jae nlMixBye mov bl,byte [es:di] mov bl,byte [SBVOLTABLE+bx] add byte [si],bl inc si add ah,al adc di,dx loop nlMixSamp nlMixBye: mov bx,di pop di sub bx,dx mov word [di+4],bx mov byte [di+13],ah ;add si,34 ret MixLooped: les dx,[di] mov bx,word [di+4] mov bp,word [di+10] mov word [SBBUFREP],bp add bp,word [di+8] push di add bx,dx add bp,dx mov dx,word [di+16] mov ax, word [di+12] ; ; mov al,byte [si+12] ; mov ah,byte [si+13] mov di,bx mov bh,al mov al,dl mov dl,dh xor dh,dh lpMixSamp: cmp di,bp jb lpMixNow sub di,word [SBBUFREP] lpMixNow: mov bl,byte [es:di] mov bl,byte [SBVOLTABLE+bx] add byte [si],bl inc si add ah,al adc di,dx loop lpMixSamp lpMixBye: call nlMixBye ; mov bx,di ; pop di ; sub bx,dx ; mov word [di+4],bx ; mov byte [di+13],ah ; ret SbPoll: ; pusha ; push ds mov ax,cs mov ds,ax GetDmaCount: in al,03h mov cl,al in al,03h mov ch,al mov ax,word [SBDMAFLAG-1] ; mov ax,word [SBDMAFLAG] sahf ; test ax,ax jc SecondHalf ; jne SecondHalf FirstHalf: test ch,4h ; cmp cx,1024 jnz Bye ; jae Bye mov si,word [SBDMABUFFER] mov cx,1024 jmp GetSamples ; call GetSamples SecondHalf: test ch,4h ;cmp cx,1024 jz Bye ;jb Bye mov si,word [SBDMABUFFER] mov cx,1024 add si,cx GetSamples: push ds; mov word [SBSAMPLEBUFF+2],ds push si ; mov word [SBSAMPLEBUFF+0],si pop dword [SBSAMPLEBUFF] mov word [SBSAMPLECOUNT],cx pusha les di,[SBSAMPLEBUFF] ; di=[SBSAMPLEBUFF] es=[SBSAMPLEBUFF+2] mov bx,cx;mov bx,word [SBSAMPLECOUNT] NextChunk: cmp word [SBBUFLEN],0 jne CopyChunk noCopyChunk: pusha ; bx,di push es MixChunk: mov di, SBMIXBUFFER mov cx,word [SBBPMSAMPLES] mov word [SBBUFPTR],di mov word [SBBUFLEN],cx mov al,80h rep stosb mov word [SBMODINDEX],bx ;lea si,[SBTRACKS-34] ;mov cl,4 ; ASSUMES SBBPMSAMPLES<256 ;rep call MixTrack mov word [SBTRACKFUN],MixTrack call ProcessTrack ; mov di,SBTRACKS ; mov cl,4 ; ASSUMES SBBPMSAMPLES<256 ;Mix1track: push cx ; push di ; call MixTrack ; pop di ; add di,34 ; pop cx ; loop Mix1track UpdateTracks: dec byte [SBTEMPOWAIT] je GetTracks ;BeatTracks: mov di,SBTRACKS ; mov cl,4 ; ASSUMES SBBPMSAMPLES<256 ;Beat1track: ;push cx ; ;push di ; rep call BeatTrack ; ;pop di ; ;add di,34 ; ;pop cx ; ;loop Beat1track mov word [SBTRACKFUN],BeatTrack call ProcessTrack jmp noUpdate GetTracks: mov al,byte [SBTEMPO] mov byte [SBTEMPOWAIT],al les si,dword [SBNOTE] cmp byte [SBROW],64 jb NoPattWrap les si,dword [SBMODINFO+130] mov bl,byte [SBORDERPOS] cmp bl,byte [SBMODINFO] jb NoOrderWrap mov bl,byte [SBMODINFO+1] mov byte [SBORDERPOS],bl cmp bl,byte [SBMODINFO] jae noUpdate NoOrderWrap: xor bh,bh mov bl,byte [SBMODINFO+2+bx] shl bx,10 add si,bx mov bl,byte [SBBREAKROW] mov byte [SBROW],bl xor bh,bh mov byte [SBBREAKROW],bh shl bx,4 add si,bx push es ; mov word [SBNOTE+2],es push si ; mov word [SBNOTE+0],si pop dword [SBNOTE] inc byte [SBORDERPOS] NoPattWrap: inc byte [SBROW] ; mov di, SBTRACKS ;NumTracks=4,Size TrackInfo=34 ; mov cl,4 ;Get1Track: push cx ; ;push di ; rep call GetTrack ; ;pop di ; add di,34 ; pop cx ; loop Get1Track mov word [SBTRACKFUN],GetTrack call ProcessTrack mov word [SBNOTE+0],si noUpdate: pop es popa ; di,bx CopyChunk: mov cx,word [SBBUFLEN] cmp cx,bx jbe MoveChunk mov cx,bx MoveChunk: mov si,word [SBBUFPTR] add word [SBBUFPTR],cx sub word [SBBUFLEN],cx sub bx,cx rep movsb test bx,bx jnz NextChunk noNextChunk: popa xor word [SBDMAFLAG],1 Bye: mov dx,22ch ; OPL DMA Sb control mov al,14h out dx,al ; pop ds ; popa iret ProcessTrack: mov di,SBTRACKS mov cl,4 ; ASSUMES SBBPMSAMPLES<256 Process1Track: push cx push di call word [SBTRACKFUN] pop di add di,34 pop cx loop Process1Track ret ;-------------------------------------------------------------------------- ;SBMIXBUFFER dw 4096/2 dup (0) ;SBTRACKS dw 136/2 dup (0) SBPERIODTABLE dw 856; ;SBPERIODTABLE dw 856,808,762,720,678,640,604,570,538,508,480,453 ; dw 428,404,381,360,339,320,302,285,269,254,240,226 ; dw 214,202,190,180,170,160,151,143,135,127,120,113 ;SBSINTABLE db 0,25,50,74,98,120,142,162,180,197,212,225 ; db 236,244,250,254,255,254,250,244,236,225 ; db 212,197,180,162,142,120,98,74,50,25 ;SBSINTABLE Db 128,152,176,198,218,234,245,253,255,253,245,234,218,198,176,152,128,103,79,57,37,21,10,2,0,2,10,21,37,57,79,103 ;SBSINTABLE db 0, 24*4, 32*4, 37*4, 40*4, 43*4, 45*4, 47*4, 48*4, 50*4, 51*4, 52*4, 53*4, 54*4, 55*4, 56*4, 56*4,55*4,54*4,53*4,52*4,51*4,50*4,49*4,47*4,45*4,43*4,40*4,37*4,32*4,24*4,1 ;if FOOTPRINT=0 ;MUSICMOD_: ;INCLUDE "MUSICMOD.ASM" ;else MUSICMOD db 0 ;end if