171 lines
4.8 KiB
NASM
171 lines
4.8 KiB
NASM
|
;*****************************************************************
|
||
|
;
|
||
|
; Light Speed Player v1.20
|
||
|
; Fastest Amiga MOD player ever :)
|
||
|
; Written By Arnaud Carré (aka Leonard / OXYGENE)
|
||
|
; Adapted to demo framework (and optimized) by platon42.
|
||
|
; https://github.com/arnaud-carre/LSPlayer
|
||
|
; twitter: @leonard_coder
|
||
|
;
|
||
|
; "nano mode" player version (average time: 1-2 scanlines)
|
||
|
; This mode focus on music data compression ratio. Suited for 4KiB or small intros
|
||
|
; Only supports VBL timing, 32 KB max stream data, no portamentos/slides,
|
||
|
; no support for music getPos/setPos and sample without a note
|
||
|
;
|
||
|
; You can also use classic "standard" player to support all features
|
||
|
; Or you can use generated "ultra fast" player code for half scanline replayer ("-insane" option)
|
||
|
;
|
||
|
; LSP_MusicInitNano Initialize a LSP driver + relocate score&bank music data
|
||
|
; LSP_MusicPlayTickNano Play a LSP music (call it per frame)
|
||
|
;
|
||
|
;*****************************************************************
|
||
|
|
||
|
;------------------------------------------------------------------
|
||
|
;
|
||
|
; LSP_MusicInitNano
|
||
|
;
|
||
|
; In: a0: LSP music data(any memory)
|
||
|
; a1: LSP sound bank(chip memory)
|
||
|
;
|
||
|
;------------------------------------------------------------------
|
||
|
|
||
|
LSP_MusicInitNano:
|
||
|
lea fw_LspPeriodTable(a6),a2
|
||
|
IF 0
|
||
|
move.w #$e2b3,d0
|
||
|
move.l #$0fc0fd20,d2
|
||
|
moveq.l #0,d3
|
||
|
moveq.l #36-1,d7
|
||
|
.ploop mulu #61865,d0
|
||
|
swap d0
|
||
|
move.w d0,d1
|
||
|
lsr.w #6,d1
|
||
|
add.l d2,d2
|
||
|
subx.w d3,d1
|
||
|
move.w d1,(a2)+
|
||
|
dbra d7,.ploop
|
||
|
ELSE
|
||
|
move.w #$e2b3,d0
|
||
|
moveq.l #36-1,d7
|
||
|
.ploop mulu #61865,d0
|
||
|
swap.w d0
|
||
|
move.w d0,d1
|
||
|
lsr.w #6,d1
|
||
|
move.w d1,(a2)+
|
||
|
dbra d7,.ploop
|
||
|
ENDC
|
||
|
|
||
|
clr.w (a2)+ ; fw_LspLastDmaCon
|
||
|
move.w (a0)+,d7 ; instrument count-1
|
||
|
move.l a0,(a2)+ ; fw_LspInstruments, instrument tab addr
|
||
|
move.l a1,d0
|
||
|
.relocloop
|
||
|
add.l d0,(a0)
|
||
|
addq.l #6,a0
|
||
|
add.l d0,(a0)
|
||
|
addq.l #6,a0
|
||
|
dbra d7,.relocloop
|
||
|
|
||
|
; do not stress about this rept, your exe packer will enjoy it
|
||
|
REPT 16
|
||
|
move.l a0,a1
|
||
|
adda.w (a0)+,a1
|
||
|
move.l a1,fw_LspLoopStreams-fw_LspStreams(a2) ; set loopStreams at 0 by default
|
||
|
move.l a1,(a2)+
|
||
|
ENDR
|
||
|
bset.b #1,$bfe001 ; disabling this fucking Low pass filter!!
|
||
|
|
||
|
rts
|
||
|
|
||
|
;------------------------------------------------------------------
|
||
|
;
|
||
|
; LSP_MusicPlayTickNano
|
||
|
;
|
||
|
; In: a5: should be $dff000
|
||
|
; Out:None
|
||
|
;
|
||
|
;------------------------------------------------------------------
|
||
|
LSP_MusicPlayTickNano:
|
||
|
move.w fw_LspLastDmaCon(a6),d0
|
||
|
beq.s .skip
|
||
|
lea fw_LspResetv(a6),a3
|
||
|
lea aud+4*ac_SIZEOF(a5),a2
|
||
|
moveq.l #4-1,d7
|
||
|
.rloop lea -ac_SIZEOF(a2),a2
|
||
|
btst d7,d0
|
||
|
beq.s .norst
|
||
|
move.l (a3)+,ac_ptr(a2)
|
||
|
move.w (a3)+,ac_len(a2)
|
||
|
.norst dbra d7,.rloop
|
||
|
|
||
|
.skip lea fw_LspStreams(a6),a1
|
||
|
moveq.l #0,d3
|
||
|
lea fw_LspPeriodTable(a6),a4
|
||
|
lea fw_LspResetv(a6),a3
|
||
|
lea aud+4*ac_SIZEOF(a5),a2
|
||
|
moveq.l #4-1,d7
|
||
|
.vloop lea -ac_SIZEOF(a2),a2
|
||
|
move.l (a1),a0
|
||
|
move.b (a0)+,d1 ; cmd for current voice
|
||
|
move.l a0,(a1) ; update cmd stream ptr
|
||
|
move.w d1,d0
|
||
|
addq.l #4,a1
|
||
|
add.b d0,d0
|
||
|
bcc.s .novol
|
||
|
move.l (a1),a0
|
||
|
moveq.l #0,d1
|
||
|
move.b (a0)+,d1
|
||
|
move.l a0,(a1)
|
||
|
move.w d1,ac_vol(a2)
|
||
|
.novol addq.l #4,a1
|
||
|
add.b d0,d0
|
||
|
bcc.s .noper
|
||
|
move.l (a1),a0
|
||
|
moveq.l #0,d1
|
||
|
move.b (a0)+,d1
|
||
|
move.l a0,(a1)
|
||
|
move.w (a4,d1.w),ac_per(a2)
|
||
|
.noper addq.l #4,a1
|
||
|
add.b d0,d0
|
||
|
bcc.s .noinstr
|
||
|
move.l (a1),a0
|
||
|
moveq.l #0,d1
|
||
|
move.b (a0)+,d1
|
||
|
move.l a0,(a1)
|
||
|
|
||
|
; prepare instrument
|
||
|
move.l fw_LspInstruments(a6),a0
|
||
|
mulu #12,d1
|
||
|
adda.w d1,a0
|
||
|
bset d7,d3
|
||
|
move.l (a0)+,ac_ptr(a2)
|
||
|
move.w (a0)+,ac_len(a2)
|
||
|
move.l (a0)+,(a3)+
|
||
|
move.w (a0)+,(a3)+
|
||
|
|
||
|
.noinstr
|
||
|
addq.l #4,a1
|
||
|
dbra d7,.vloop
|
||
|
|
||
|
move.w d3,dmacon(a5)
|
||
|
move.w d3,fw_LspLastDmaCon(a6)
|
||
|
move.l fw_LspDmaConPatch(a6),a0
|
||
|
move.b d3,(a0)
|
||
|
|
||
|
add.b d0,d0
|
||
|
bcc.s .noloopcmd
|
||
|
|
||
|
; backup or restore current song position
|
||
|
lea fw_LspStreams(a6),a0
|
||
|
lea fw_LspLoopStreams(a6),a1
|
||
|
add.b d0,d0
|
||
|
bcc.s .skiprestore
|
||
|
exg a0,a1
|
||
|
.skiprestore
|
||
|
; do not stress about this rept, your exe packer will enjoy it
|
||
|
REPT 16
|
||
|
move.l (a0)+,(a1)+
|
||
|
ENDR
|
||
|
.noloopcmd
|
||
|
rts
|