.global synth
.data
stereo_mod:
.byte 0x00
.byte 0x62
.byte 0x80
.byte 0x3f
main_tune:
.byte 0x00
.byte 0xa0
.byte 0x89
.byte 0x3b
pw:
.byte 0x00
.byte 0x00
.byte 0xc0
.byte 0x3f
oct_semitones:
.byte 12
.byte 0
.byte 0
.byte 0
patterns:
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 69
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 5
.byte 5
.byte 0
.byte 5
.byte 0
.byte 5
.byte 5
.byte 0
.byte 32
.byte 0
.byte 0
.byte 0
.byte 32
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 69
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 0
.byte 0
.byte 0
.byte 96
.byte 0
.byte 5
.byte 5
.byte 0
.byte 5
.byte 0
.byte 5
.byte 5
.byte 0
.byte 32
.byte 72
.byte 72
.byte 72
.byte 32
.byte 72
.byte 72
.byte 72
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 19
.byte 0
.byte 0
.byte 0
.byte 8
.byte 24
.byte 8
.byte 0
.byte 8
.byte 24
.byte 8
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 23
.byte 35
.byte 0
.byte 32
.byte 80
.byte 80
.byte 80
.byte 32
.byte 80
.byte 80
.byte 80
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 21
.byte 0
.byte 0
.byte 0
.byte 16
.byte 32
.byte 16
.byte 0
.byte 16
.byte 32
.byte 16
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 23
.byte 35
.byte 0
.byte 32
.byte 80
.byte 80
.byte 80
.byte 32
.byte 80
.byte 80
.byte 80
.byte 19
.byte 0
.byte 0
.byte 0
.byte 96
.byte 0
.byte 0
.byte 0
.byte 101
.byte 16
.byte 32
.byte 16
.byte 0
.byte 16
.byte 32
.byte 16
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 35
.byte 34
.byte 0
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 32
.byte 72
.byte 72
.byte 72
.byte 32
.byte 72
.byte 72
.byte 72
.byte 16
.byte 0
.byte 0
.byte 0
.byte 96
.byte 0
.byte 0
.byte 0
.byte 103
.byte 8
.byte 24
.byte 8
.byte 0
.byte 8
.byte 24
.byte 8
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 35
.byte 34
.byte 0
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 32
.byte 85
.byte 85
.byte 85
.byte 32
.byte 85
.byte 85
.byte 85
.byte 16
.byte 0
.byte 0
.byte 0
.byte 96
.byte 0
.byte 0
.byte 0
.byte 106
.byte 8
.byte 24
.byte 8
.byte 0
.byte 8
.byte 24
.byte 8
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 35
.byte 34
.byte 0
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 32
.byte 85
.byte 85
.byte 85
.byte 32
.byte 85
.byte 85
.byte 85
.byte 16
.byte 0
.byte 0
.byte 0
.byte 96
.byte 19
.byte 0
.byte 0
.byte 0
.byte 8
.byte 24
.byte 8
.byte 0
.byte 8
.byte 24
.byte 8
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 23
.byte 35
.byte 0
.byte 32
.byte 0
.byte 0
.byte 0
.byte 32
.byte 0
.byte 0
.byte 0
.byte 23
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 80
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 16
.byte 16
.byte 0
.byte 16
.byte 0
.byte 32
.byte 16
.byte 0
.byte 32
.byte 80
.byte 80
.byte 80
.byte 32
.byte 80
.byte 80
.byte 80
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 16
.byte 16
.byte 0
.byte 16
.byte 0
.byte 32
.byte 16
.byte 0
.byte 32
.byte 85
.byte 85
.byte 85
.byte 32
.byte 85
.byte 85
.byte 85
.byte 16
.byte 0
.byte 0
.byte 0
.byte 96
.byte 0
.byte 0
.byte 0
.byte 96
.byte 8
.byte 24
.byte 8
.byte 0
.byte 8
.byte 24
.byte 8
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 35
.byte 34
.byte 0
.byte 23
.byte 0
.byte 35
.byte 34
.byte 0
.byte 32
.byte 80
.byte 80
.byte 80
.byte 32
.byte 80
.byte 80
.byte 80
.byte 23
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 80
.byte 32
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 16
.byte 16
.byte 0
.byte 16
.byte 0
.byte 32
.byte 16
.byte 0
.byte 32
.byte 80
.byte 80
.byte 80
.byte 32
.byte 99
.byte 99
.byte 32
.byte 19
.byte 96
.byte 0
.byte 0
.byte 96
.byte 35
.byte 0
.byte 96
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 96
.byte 96
.byte 32
.byte 96
.byte 96
.byte 96
.byte 32
.byte 96
.byte 16
.byte 32
.byte 0
.byte 16
.byte 0
.byte 26
.byte 23
.byte 35
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
order:
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 1
.byte 1
.byte 1
.byte 1
.byte 1
.byte 1
.byte 1
.byte 1
.byte 8
.byte 8
.byte 8
.byte 8
.byte 8
.byte 8
.byte 8
.byte 12
.byte 6
.byte 7
.byte 6
.byte 7
.byte 6
.byte 7
.byte 6
.byte 7
.byte 5
.byte 2
.byte 5
.byte 2
.byte 5
.byte 2
.byte 5
.byte 2
.byte 4
.byte 3
.byte 4
.byte 3
.byte 4
.byte 3
.byte 4
.byte 5
.byte 10
.byte 7
.byte 10
.byte 7
.byte 10
.byte 7
.byte 5
.byte 4
.byte 6
.byte 7
.byte 6
.byte 7
.byte 6
.byte 7
.byte 4
.byte 12
.byte 5
.byte 2
.byte 5
.byte 2
.byte 5
.byte 2
.byte 5
.byte 2
.byte 10
.byte 2
.byte 5
.byte 2
.byte 10
.byte 5
.byte 2
.byte 5
.byte 11
.byte 11
.byte 11
.byte 9
.byte 9
.byte 9
.byte 9
.byte 9
.byte 9
.byte 9
.byte 13
.byte 13
.byte 13
.byte 13
.byte 13
.byte 13
.byte 13
modules:
.byte 130
.byte 88
.byte 2
.byte 1
.byte 0
.byte 56
.byte 130
.byte 89
.byte 2
.byte 4
.byte 3
.byte 57
.byte 64
.byte 0
.byte 58
.byte 58
.byte 89
.byte 88
.byte 130
.byte 90
.byte 7
.byte 6
.byte 5
.byte 59
.byte 0
.byte 91
.byte 58
.byte 58
.byte 9
.byte 8
.byte 130
.byte 90
.byte 11
.byte 10
.byte 5
.byte 60
.byte 64
.byte 0
.byte 12
.byte 91
.byte 90
.byte 61
.byte 128
.byte 92
.byte 58
.byte 58
.byte 13
.byte 62
.byte 130
.byte 93
.byte 16
.byte 15
.byte 14
.byte 63
.byte 129
.byte 0
.byte 58
.byte 17
.byte 93
.byte 92
.byte 128
.byte 95
.byte 58
.byte 58
.byte 19
.byte 18
.byte 130
.byte 94
.byte 22
.byte 21
.byte 20
.byte 64
.byte 128
.byte 96
.byte 58
.byte 95
.byte 94
.byte 65
.byte 129
.byte 0
.byte 58
.byte 17
.byte 23
.byte 96
.byte 130
.byte 97
.byte 26
.byte 25
.byte 24
.byte 66
.byte 128
.byte 99
.byte 28
.byte 27
.byte 97
.byte 67
.byte 192
.byte 98
.byte 31
.byte 58
.byte 30
.byte 29
.byte 130
.byte 100
.byte 26
.byte 32
.byte 98
.byte 68
.byte 129
.byte 0
.byte 58
.byte 17
.byte 100
.byte 99
.byte 130
.byte 101
.byte 35
.byte 34
.byte 33
.byte 69
.byte 128
.byte 102
.byte 36
.byte 27
.byte 101
.byte 70
.byte 129
.byte 0
.byte 58
.byte 17
.byte 23
.byte 102
.byte 128
.byte 103
.byte 39
.byte 38
.byte 37
.byte 71
.byte 130
.byte 104
.byte 41
.byte 40
.byte 3
.byte 72
.byte 192
.byte 104
.byte 17
.byte 58
.byte 43
.byte 42
.byte 129
.byte 105
.byte 58
.byte 12
.byte 104
.byte 103
.byte 193
.byte 0
.byte 58
.byte 58
.byte 8
.byte 105
workbuf:
workbuf:
.byte 0
.byte 215
.byte 163
.byte 60
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 190
.byte 127
.byte 63
.byte 0
.byte 153
.byte 153
.byte 62
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 215
.byte 35
.byte 61
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 242
.byte 127
.byte 63
.byte 0
.byte 204
.byte 204
.byte 61
.byte 0
.byte 0
.byte 32
.byte 65
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 59
.byte 127
.byte 63
.byte 0
.byte 0
.byte 0
.byte 64
.byte 0
.byte 92
.byte 15
.byte 61
.byte 0
.byte 204
.byte 76
.byte 62
.byte 0
.byte 215
.byte 163
.byte 59
.byte 0
.byte 216
.byte 127
.byte 63
.byte 0
.byte 0
.byte 192
.byte 63
.byte 0
.byte 204
.byte 76
.byte 61
.byte 0
.byte 0
.byte 240
.byte 65
.byte 0
.byte 92
.byte 15
.byte 61
.byte 0
.byte 18
.byte 131
.byte 58
.byte 0
.byte 236
.byte 127
.byte 63
.byte 0
.byte 204
.byte 204
.byte 62
.byte 0
.byte 194
.byte 245
.byte 60
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 249
.byte 127
.byte 63
.byte 0
.byte 0
.byte 128
.byte 63
.byte 0
.byte 163
.byte 0
.byte 64
.byte 0
.byte 135
.byte 162
.byte 57
.byte 0
.byte 204
.byte 76
.byte 63
.byte 0
.byte 204
.byte 140
.byte 63
.byte 0
.byte 215
.byte 163
.byte 61
.byte 0
.byte 57
.byte 180
.byte 60
.byte 0
.byte 204
.byte 171
.byte 51
.byte 0
.byte 255
.byte 127
.byte 63
.byte 0
.byte 6
.byte 129
.byte 63
.byte 0
.byte 194
.byte 117
.byte 60
.byte 0
.byte 0
.byte 64
.byte 64
.byte 0
.byte 190
.byte 191
.byte 63
.byte 0
.byte 191
.byte 86
.byte 52
.byte 0
.byte 255
.byte 127
.byte 63
.byte 0
.byte 9
.byte 80
.byte 54
.byte 0
.byte 92
.byte 15
.byte 61
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
trigger_points:
.byte 56
.byte 57
.byte 57
.byte 57
.byte 62
.byte 63
.byte 63
.byte 63
.byte 71
.byte 72
.byte 72
.byte 72
.byte 65
.byte 64
.byte 64
.byte 64
.byte 71
.byte 72
.byte 72
.byte 72
.byte 70
.byte 69
.byte 69
.byte 69
.byte 61
.byte 59
.byte 59
.byte 59
.byte 61
.byte 60
.byte 60
.byte 60
.byte 67
.byte 68
.byte 66
.byte 66
.byte 56
.byte 57
.byte 57
.byte 57
bss_order_pos:
.space 1*4
bss_pattern_pos:
.space 1*4
bss_stereo_factor:
.space 1*4
bss_temp1:
.space 1*4
bss_modules:
.space 162
.space 352
bss_workbuf_acc1:
.space 2416
bss_work:
.space 1080*4
.text
module_oscillator:
pusha
fld1
fadd %st(3)
fmuls bss_stereo_factor
fmul %st(1)
fldpi
fadd %st
flds 0(%ebp)
fadd %st(2)
fprem1
fsts 0(%ebp)
fxch %st(2)
fmul %st(6)
fadds 4(%ebp)
fprem1
fsts 4(%ebp)
fxch %st(1)
fstp %st
faddp
testb $0x40,%bl
jz osc_no_sin
fsin
osc_no_sin:
fmul %st(2)
popa
osc_end:
ret
module_filter_v2:
pusha
fld %st(1)
fsin
fabs
fld %st(3)
flds 0(%ebp)
fsubs 4(%ebp)
fmulp
fsin
fadd %st(2)
fmul %st(1)
fld1
fsub %st(2)
fmuls 0(%ebp)
faddp
fsts 0(%ebp)
addl $4,%ebp
fld %st(1)
fmuls pw
fstp %st(2)
fmul %st(1)
fld1
fsub %st(2)
fmuls 0(%ebp)
faddp
fsts 0(%ebp)
fxch %st(1)
fstp %st
movb (%esi),%al
testb $0x40,%al
jz module_filter_v2.no_hp
fsub %st(1)
module_filter_v2.no_hp:
popa
ret
module_envelope:
pusha
fldz
fcomip %st(1)
flds 0(%ebp)
jz module_envelope.no_attack
fadd %st(3)
jmp module_envelope.no_decay
module_envelope.no_attack:
fmul %st(4)
module_envelope.no_decay:
fsts 0(%ebp)
fld %st(2)
fcomip
jnc no_switch
decay_switch:
fldz
fxch %st(2)
fstp %st
no_switch:
popa
envelope_end:
ret
synth:
pusha
movl %eax,%edi
movl %edx,%ecx
pusha
leal bss_modules,%edi
movl $5,%ecx
setup_loop:
pushl %ecx
leal modules,%esi
movl $(6*27+106*4),%ecx
rep
movsb
popl %ecx
loop setup_loop
popa
xorl %edx,%edx
synth_loop:
pushl %ecx
pusha
leal bss_workbuf_acc1,%edi
xorl %eax,%eax
movl $5,%ecx
zero_loop:
pushl %ecx
movl $(106-88),%ecx
rep
stosl
addl $(27*6+88*4),%edi
popl %ecx
loop zero_loop
popa
leal bss_modules,%esi
leal bss_work,%ebp
pushl %edi
fldz
movl $5,%ecx
tracks_loop:
pushl %ecx
leal 6*27(%esi),%edi
break2:
testl %edx,%edx
jnz notick
movl bss_order_pos,%ebx
movb order(%ebx),%bl
imull $5*8,%ebx
addl bss_pattern_pos,%ebx
movb patterns(%ebx),%al
cmpb $0,%al
je notrig
pusha
movb %al,%cl
shrb $4,%cl
andb $0x03,%cl
andb $0x0f,%al
movb %al,bss_temp1
fildl bss_temp1
fidivl oct_semitones
f2xm1
fld1
faddp
xorl %ebx,%ebx
incl %ebx
shl %cl,%ebx
pushl %ebx
fimull (%esp)
popl %ebx
fmuls main_tune
popa
popl %ecx
pushl %ecx
pusha
negl %ecx
addl $5,%ecx
sall $3,%ecx
pushl %eax
andl $0x000000c0,%eax
shrb $4,%al
addl %eax,%ecx
popl %eax
leal trigger_points(%ecx),%edx
movl $4,%ecx
trigger_loop:
xorl %ebx,%ebx
movb (%edx),%bl
fsts 6*27(%esi,%ebx,4)
trig_done:
incl %edx
loop trigger_loop
popa
fstp %st
notrig:
movl bss_pattern_pos,%eax
addl $8,%eax
cmpl $5*8+8-1,%eax
jne no_advance
movl bss_order_pos,%eax
incl %eax
movl %eax,bss_order_pos
xorl %eax,%eax
no_advance:
cmpl $5*8,%eax
jb no_nexttrack
subl $5*8,%eax
incl %eax
no_nexttrack:
movl %eax,bss_pattern_pos
notick:
movl $27,%ecx
module_loop:
pushl %ecx
movl 8(%esp),%eax
testl $0x4,%eax
movl (%esi),%eax
pushl %ebp
fld1
jz ch_left
testb $0x80,%al
jz mono_only
fmuls stereo_mod
addl $2*4*2,%ebp
mono_only:
ch_left:
fstps bss_stereo_factor
breakx:
xorl %ebx,%ebx
movb 2(%esi),%bl
flds (%edi,%ebx,4)
xorl %ebx,%ebx
movb 3(%esi),%bl
flds (%edi,%ebx,4)
xorl %ebx,%ebx
movb 4(%esi),%bl
flds (%edi,%ebx,4)
xorl %ebx,%ebx
movb 5(%esi),%bl
flds (%edi,%ebx,4)
before_osc:
movb %al,%bl
andb $0x0f,%al
cmpb $0x00,%al
jne no_osc
call module_oscillator
no_osc:
cmpb $0x01,%al
jne no_filter
call module_filter_v2
no_filter:
cmpb $0x02,%al
jne no_envelope
call module_envelope
no_envelope:
elem_done:
movb 1(%esi),%bl
cmpb $0,%bl
jz to_master
fadds (%edi,%ebx,4)
store_module_out:
fstps (%edi,%ebx,4)
jmp not_to_master
to_master:
faddp %st,%st(5)
not_to_master:
xorl %ebx,%ebx
movb 5(%esi),%bl
fstps (%edi,%ebx,4)
xorl %ebx,%ebx
movb 4(%esi),%bl
fstps (%edi,%ebx,4)
xorl %ebx,%ebx
movb 3(%esi),%bl
fstps (%edi,%ebx,4)
xorl %ebx,%ebx
movb 2(%esi),%bl
fstps (%edi,%ebx,4)
addl $6,%esi
popl %ebp
addl $2*4*2*2,%ebp
popl %ecx
decl %ecx
jnz module_loop
addl $106*4,%esi
popl %ecx
decl %ecx
jnz tracks_loop
popl %edi
decl %edx
jns not_to_master.no_newtick
movl $11500,%edx
not_to_master.no_newtick:
write_master_out:
fadd %st
fstps (%edi)
addl $4,%edi
popl %ecx
decl %ecx
jnz synth_loop
popa
ret
