mirror of
https://github.com/vsariola/sointu.git
synced 2025-06-04 01:28:45 -04:00
The stereo opcode variants have bit 1 of the command stream set. The polyphony is split into two parts: 1) polyphony, meaning that voices reuse the same opcodes; 2) multitrack voices, meaning that a track triggers more than voice. They both can be flexible defined in any combinations: for example voice 1 and 2 can be triggered by track 1 and use instrument 1, and voice 3 by track 2/instrument 2 and voice 4 by track 3/instrument 2. This is achieved through the use of bitmasks: in the aforementioned example, bit 1 of su_voicetrack_bitmask would be set, meaning "the voice after voice #1 will be triggered by the same track". On the other hand, bits 1 and 3 of su_polyphony_bitmask would be set to indicate that "the voices after #1 and #3 will reuse the same instruments".
155 lines
3.7 KiB
NASM
155 lines
3.7 KiB
NASM
SECT_TEXT(suarithm)
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_pop function: a -> (empty)
|
|
; stereo: a b -> (empty)
|
|
;-------------------------------------------------------------------------------
|
|
%if POP_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_pop,0)
|
|
%ifdef INCLUDE_STEREO_POP
|
|
jnc su_op_pop_mono
|
|
fstp st0
|
|
su_op_pop_mono:
|
|
%endif
|
|
fstp st0
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_add function: a b -> a+b b
|
|
; stereo: a b c d -> a+c b+d c d
|
|
;-------------------------------------------------------------------------------
|
|
%if ADD_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_add,0)
|
|
%ifdef INCLUDE_STEREO_ADD
|
|
jnc su_op_add_mono
|
|
fadd st0, st2
|
|
fxch
|
|
fadd st0, st3
|
|
fxch
|
|
ret
|
|
su_op_pop_mono:
|
|
%endif
|
|
fadd st1
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_addp function: a b -> a+b
|
|
; stereo: a b c d -> a+c b+d
|
|
;-------------------------------------------------------------------------------
|
|
%if ADDP_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_addp,0)
|
|
%ifdef INCLUDE_STEREO_ADDP
|
|
jnc su_op_addp_mono
|
|
faddp st2, st0
|
|
faddp st2, st0
|
|
ret
|
|
su_op_addp_mono:
|
|
%endif
|
|
faddp st1, st0
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_loadnote function: (empty) -> n
|
|
; stereo: (empty) -> n n
|
|
; ecx should point to the workspace (slightly offset)
|
|
;-------------------------------------------------------------------------------
|
|
%if LOADNOTE_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_loadnote,0)
|
|
%ifdef INCLUDE_STEREO_LOADNOTE
|
|
jnc su_op_loadnote_mono
|
|
call su_op_loadnote_mono
|
|
su_op_loadnote_mono:
|
|
%endif
|
|
fild dword [ecx+su_unit.size-su_voice.workspace+su_voice.note]
|
|
fmul dword [c_i128]
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_mul function: a b -> a*b a
|
|
; stereo: a b c d -> a*c b*d c d
|
|
;-------------------------------------------------------------------------------
|
|
%if MUL_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_mul,0)
|
|
%ifdef INCLUDE_STEREO_MUL
|
|
jnc su_op_mul_mono
|
|
fmul st0, st2
|
|
fxch
|
|
fadd st0, st3
|
|
fxch
|
|
ret
|
|
su_op_mul_mono:
|
|
%endif
|
|
fmul st1
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_mulp function: a b -> a*b
|
|
; stereo: a b c d -> a*c b*d
|
|
;-------------------------------------------------------------------------------
|
|
%if MULP_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_mulp,0)
|
|
%ifdef INCLUDE_STEREO_MULP
|
|
jnc su_op_mulp_mono
|
|
fmulp st2, st0
|
|
fmulp st2, st0
|
|
ret
|
|
su_op_mulp_mono:
|
|
%endif
|
|
fmulp st1
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_push function: a -> a a
|
|
; stereo: a b -> a b a b
|
|
;-------------------------------------------------------------------------------
|
|
%if PUSH_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_push,0)
|
|
%ifdef INCLUDE_STEREO_PUSH
|
|
jnc su_op_push_mono
|
|
fld st1
|
|
fld st1
|
|
ret
|
|
su_op_push_mono:
|
|
%endif
|
|
fld st0
|
|
ret
|
|
|
|
%endif
|
|
|
|
;-------------------------------------------------------------------------------
|
|
; op_xch function: a b -> b a
|
|
; stereo: a b c d -> c d a b
|
|
;-------------------------------------------------------------------------------
|
|
%if XCH_ID > -1
|
|
|
|
EXPORT MANGLE_FUNC(su_op_xch,0)
|
|
%ifdef INCLUDE_STEREO_XCH
|
|
jnc su_op_xch_mono
|
|
fxch st0, st2 ; c b a d
|
|
fxch st0, st1 ; b c a d
|
|
fxch st0, st2 ; d c a b
|
|
su_op_xch_mono:
|
|
%endif
|
|
fxch st0, st1
|
|
ret
|
|
|
|
%endif |