Hamazing/source/framework/musicplayers/lightspeedplayer_nano.asm
chrisly42 9c48c11cd1 Big "squashed" update to latest version of Framework.
- Bugfix: WaitForFrame was completely broken. Now also caters for race-condition that would have waited one extra frame.
- Bugfix: InitPart would overwrite innocent memory (reported by Gigabates and Losso)
- Bugfix: Palette LERP had wrong bias.
- Removed extra paths in include statement, use default include paths instead
- Added Raspberry Casket no-jitter background calc mode (FW_MUSIC_PLAYER_CHOICE = 6)
- Updated Raspberry Casket to V2.0 presto branch (WIP)
- Removed fw_FrameCounterLong, use fw_FrameCounter-2 for debug purposes
- Support for blue noise palette LERPing (like in Is Real). Provide your own blue noise table (4 KB), stuff it into fw_BlueNoiseTablePtr, set FW_PALETTE_LERP_SUPPORT to 2
- Music tick routine is now replaceable during runtime (fw_MusicTickRoutine)
- Support for softints and audio interrupts
- LMB exit can also be disabled dynamically when using FW_LMB_EXIT_SUPPORT = 2 and fw_DisableLMBExit != 0
- Added LSP Micro support and LSP Nano (custom format that uses note pitches instead of periods)
- Minor other things
2024-09-15 17:43:33 +02:00

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