.data
stereo_mod:
.byte 0x00
.byte 0x62
.byte 0x80
.byte 0x3f
main_tune:
.byte 0x00
.byte 0x65
.byte 0x42
.byte 0x3a
pw:
.byte 0x00
.byte 0x00
.byte 0xc0
.byte 0x3f
oct_semitones:
.byte 12
.byte 0
end_mod_add_ch:
.byte 0
.byte 0
.byte 160
.byte 50
end_mod_add:
.byte 0
.byte 0
.byte 128
.byte 54
end_mod:
.byte 0
.byte 0
.byte 88
.byte 63
patterns:
.byte 48
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 168
.byte 168
.byte 168
.byte 168
.byte 168
.byte 168
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 37
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 55
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 56
.byte 55
.byte 48
.byte 56
.byte 55
.byte 51
.byte 42
.byte 55
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 56
.byte 55
.byte 48
.byte 56
.byte 55
.byte 51
.byte 42
.byte 16
.byte 144
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 144
.byte 0
.byte 0
.byte 0
.byte 136
.byte 8
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 136
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.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 48
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 40
.byte 168
.byte 168
.byte 168
.byte 168
.byte 168
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 37
.byte 37
.byte 37
.byte 37
.byte 37
.byte 37
.byte 55
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 56
.byte 55
.byte 48
.byte 56
.byte 55
.byte 51
.byte 42
.byte 55
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 56
.byte 55
.byte 48
.byte 56
.byte 55
.byte 51
.byte 42
.byte 10
.byte 154
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 146
.byte 0
.byte 0
.byte 0
.byte 136
.byte 8
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 149
.byte 5
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 176
.byte 0
.byte 32
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 32
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 160
.byte 144
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 56
.byte 55
.byte 48
.byte 56
.byte 55
.byte 154
.byte 42
.byte 160
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 56
.byte 55
.byte 48
.byte 147
.byte 55
.byte 51
.byte 42
.byte 16
.byte 199
.byte 0
.byte 195
.byte 0
.byte 194
.byte 0
.byte 186
.byte 0
.byte 183
.byte 0
.byte 179
.byte 178
.byte 16
.byte 186
.byte 0
.byte 183
.byte 0
.byte 181
.byte 0
.byte 179
.byte 0
.byte 178
.byte 0
.byte 170
.byte 167
.byte 16
.byte 16
.byte 0
.byte 16
.byte 0
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.byte 179
.byte 0
.byte 26
.byte 10
.byte 10
.byte 0
.byte 16
.byte 0
.byte 0
.byte 0
.byte 183
.byte 183
.byte 183
.byte 183
.byte 183
.byte 35
.byte 23
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 151
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 154
.byte 55
.byte 151
.byte 55
.byte 57
.byte 58
.byte 50
.byte 57
.byte 55
.byte 50
.byte 64
.byte 58
.byte 50
.byte 57
.byte 55
.byte 154
.byte 55
.byte 57
.byte 58
.byte 50
.byte 57
.byte 55
.byte 50
.byte 64
.byte 58
.byte 50
.byte 57
.byte 23
.byte 0
.byte 178
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 42
.byte 10
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 167
.byte 0
.byte 165
.byte 0
.byte 162
.byte 0
.byte 178
.byte 7
.byte 7
.byte 170
.byte 170
.byte 170
.byte 7
.byte 23
.byte 0
.byte 23
.byte 0
.byte 21
.byte 23
.byte 7
.byte 10
.byte 10
.byte 162
.byte 162
.byte 162
.byte 10
.byte 162
.byte 162
.byte 10
.byte 0
.byte 32
.byte 26
.byte 10
.byte 39
.byte 167
.byte 167
.byte 167
.byte 167
.byte 167
.byte 167
.byte 167
.byte 167
.byte 183
.byte 167
.byte 167
.byte 167
.byte 168
.byte 168
.byte 168
.byte 168
.byte 168
.byte 168
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 165
.byte 151
.byte 50
.byte 55
.byte 56
.byte 58
.byte 50
.byte 56
.byte 55
.byte 50
.byte 56
.byte 55
.byte 50
.byte 42
.byte 152
.byte 48
.byte 55
.byte 56
.byte 58
.byte 48
.byte 149
.byte 55
.byte 48
.byte 165
.byte 55
.byte 51
.byte 50
.byte 7
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 178
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 8
.byte 0
.byte 0
.byte 179
.byte 178
.byte 176
.byte 5
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 23
.byte 39
.byte 0
.byte 23
.byte 0
.byte 0
.byte 186
.byte 0
.byte 186
.byte 186
.byte 186
.byte 186
.byte 23
.byte 24
.byte 24
.byte 0
.byte 24
.byte 176
.byte 176
.byte 21
.byte 176
.byte 21
.byte 37
.byte 21
.byte 176
.byte 176
.byte 36
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 164
.byte 163
.byte 163
.byte 163
.byte 163
.byte 35
.byte 163
.byte 163
.byte 163
.byte 163
.byte 163
.byte 165
.byte 165
.byte 165
.byte 148
.byte 52
.byte 55
.byte 57
.byte 59
.byte 52
.byte 57
.byte 55
.byte 148
.byte 68
.byte 66
.byte 55
.byte 59
.byte 147
.byte 35
.byte 42
.byte 48
.byte 50
.byte 35
.byte 42
.byte 41
.byte 35
.byte 39
.byte 37
.byte 48
.byte 37
.byte 20
.byte 183
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 0
.byte 180
.byte 0
.byte 170
.byte 19
.byte 0
.byte 0
.byte 0
.byte 186
.byte 0
.byte 185
.byte 35
.byte 183
.byte 0
.byte 37
.byte 181
.byte 0
.byte 20
.byte 4
.byte 0
.byte 0
.byte 0
.byte 0
.byte 4
.byte 0
.byte 0
.byte 4
.byte 0
.byte 0
.byte 23
.byte 19
.byte 3
.byte 0
.byte 0
.byte 0
.byte 19
.byte 0
.byte 0
.byte 19
.byte 0
.byte 21
.byte 37
.byte 21
order:
.byte 0
.byte 0
.byte 0
.byte 1
.byte 0
.byte 1
.byte 2
.byte 4
.byte 2
.byte 4
.byte 5
.byte 3
.byte 5
.byte 2
.byte 3
modules:
.byte 128
.byte 59
.byte 1
.byte 41
.byte 0
.byte 40
.byte 130
.byte 58
.byte 5
.byte 4
.byte 3
.byte 2
.byte 130
.byte 60
.byte 7
.byte 6
.byte 58
.byte 42
.byte 129
.byte 61
.byte 41
.byte 8
.byte 60
.byte 59
.byte 131
.byte 0
.byte 11
.byte 10
.byte 9
.byte 61
.byte 130
.byte 62
.byte 14
.byte 13
.byte 12
.byte 43
.byte 128
.byte 63
.byte 16
.byte 62
.byte 15
.byte 44
.byte 130
.byte 64
.byte 18
.byte 17
.byte 3
.byte 45
.byte 129
.byte 0
.byte 41
.byte 8
.byte 64
.byte 63
.byte 130
.byte 65
.byte 21
.byte 20
.byte 19
.byte 46
.byte 128
.byte 66
.byte 1
.byte 41
.byte 65
.byte 47
.byte 130
.byte 67
.byte 24
.byte 23
.byte 22
.byte 48
.byte 193
.byte 0
.byte 41
.byte 12
.byte 67
.byte 66
.byte 130
.byte 68
.byte 27
.byte 26
.byte 25
.byte 49
.byte 0
.byte 69
.byte 28
.byte 41
.byte 68
.byte 50
.byte 130
.byte 70
.byte 30
.byte 29
.byte 25
.byte 51
.byte 130
.byte 71
.byte 5
.byte 32
.byte 12
.byte 31
.byte 129
.byte 0
.byte 41
.byte 71
.byte 70
.byte 69
workbuf:
workbuf:
.byte 0
.byte 0
.byte 128
.byte 63
.byte 0
.byte 71
.byte 129
.byte 63
.byte 0
.byte 0
.byte 128
.byte 63
.byte 0
.byte 204
.byte 76
.byte 63
.byte 0
.byte 55
.byte 134
.byte 53
.byte 0
.byte 0
.byte 128
.byte 63
.byte 0
.byte 197
.byte 39
.byte 55
.byte 0
.byte 252
.byte 127
.byte 63
.byte 0
.byte 204
.byte 204
.byte 63
.byte 0
.byte 81
.byte 56
.byte 61
.byte 0
.byte 51
.byte 115
.byte 63
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 0
.byte 32
.byte 64
.byte 0
.byte 215
.byte 35
.byte 60
.byte 0
.byte 59
.byte 127
.byte 63
.byte 0
.byte 153
.byte 153
.byte 62
.byte 0
.byte 163
.byte 0
.byte 64
.byte 0
.byte 116
.byte 19
.byte 60
.byte 0
.byte 236
.byte 127
.byte 63
.byte 0
.byte 0
.byte 128
.byte 62
.byte 0
.byte 83
.byte 201
.byte 54
.byte 0
.byte 255
.byte 127
.byte 63
.byte 0
.byte 0
.byte 0
.byte 63
.byte 0
.byte 197
.byte 39
.byte 55
.byte 0
.byte 249
.byte 127
.byte 63
.byte 0
.byte 153
.byte 153
.byte 62
.byte 0
.byte 183
.byte 81
.byte 57
.byte 0
.byte 219
.byte 127
.byte 63
.byte 0
.byte 163
.byte 192
.byte 63
.byte 0
.byte 231
.byte 59
.byte 54
.byte 0
.byte 255
.byte 127
.byte 63
.byte 0
.byte 0
.byte 128
.byte 63
.byte 0
.byte 55
.byte 6
.byte 54
.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 50
.byte 49
.byte 51
.byte 51
.byte 50
.byte 49
.byte 49
.byte 49
.byte 40
.byte 42
.byte 42
.byte 42
.byte 47
.byte 48
.byte 46
.byte 46
.byte 40
.byte 42
.byte 42
.byte 42
.byte 47
.byte 48
.byte 46
.byte 46
.byte 44
.byte 45
.byte 43
.byte 43
.byte 50
.byte 49
.byte 51
.byte 51
.text
module_oscillator:
pusha
fld1
fadd %st(3)
fmuls _ZL14g_audio_buffer+8
fmul %st(1)
fld1
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
fmul %st(2)
popa
osc_end:
ret
module_filter_v2:
pusha
fld %st(1)
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
module_compressor:
pusha
fld %st
fmuls 0(%ebp)
fld %st
fabs
fld %st(3)
fcomip %st(1)
fstp %st
flds 0(%ebp)
jnc do_release
fmul %st(4)
jmp skip_release
do_release:
fld1
fcomip %st(1)
jc skip_release
fadd %st(5)
skip_release:
fstps 0(%ebp)
popa
compressor_done:
ret
synth:
pusha
movl %eax,%edi
movl %edx,%ecx
pusha
leal _ZL14g_audio_buffer+16,%edi
movl $4,%ecx
setup_loop:
pushl %ecx
leal modules,%esi
movl $(6*18+72*4),%ecx
rep
movsb
popl %ecx
loop setup_loop
popa
xorl %edx,%edx
synth_loop:
pushl %ecx
cmpl $0x60000,%ecx
jns no_end_mod
flds end_mod_add
fadds end_mod_add_ch
fsts end_mod_add
fadds end_mod
fstps end_mod
no_end_mod:
pusha
leal _ZL14g_audio_buffer+356,%edi
xorl %eax,%eax
movl $4,%ecx
zero_loop:
pushl %ecx
movl $(72-58),%ecx
rep
stosl
addl $(18*6+58*4),%edi
popl %ecx
loop zero_loop
popa
leal _ZL14g_audio_buffer+16,%esi
leal _ZL14g_audio_buffer+1600,%ebp
pushl %edi
fldz
movl $4,%ecx
tracks_loop:
pushl %ecx
leal 6*18(%esi),%edi
break2:
testl %edx,%edx
jnz notick
movl _ZL14g_audio_buffer+0,%ebx
movb order(%ebx),%bl
imull $4*26,%ebx
addl _ZL14g_audio_buffer+4,%ebx
movb patterns(%ebx),%al
cmpb $0,%al
je notrig
pusha
movb %al,%cl
shrb $4,%cl
andb $0x07,%cl
andb $0x0f,%al
movb %al,_ZL14g_audio_buffer+12
fildl _ZL14g_audio_buffer+12
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 $4,%ecx
sall $3,%ecx
testb $0x80,%al
jz no_alt_instr
addl $4,%ecx
no_alt_instr:
andb $0x7f,%al
leal trigger_points(%ecx),%edx
movl $4,%ecx
trigger_loop:
xorl %ebx,%ebx
movb (%edx),%bl
fsts 6*18(%esi,%ebx,4)
trig_done:
incl %edx
loop trigger_loop
popa
fstp %st
notrig:
movl _ZL14g_audio_buffer+4,%eax
addl $26,%eax
cmpl $4*26+26-1,%eax
jne no_advance
movl _ZL14g_audio_buffer+0,%eax
incl %eax
movl %eax,_ZL14g_audio_buffer+0
xorl %eax,%eax
no_advance:
cmpl $4*26,%eax
jb no_nexttrack
subl $4*26,%eax
incl %eax
no_nexttrack:
movl %eax,_ZL14g_audio_buffer+4
notick:
movl $18,%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 _ZL14g_audio_buffer+8
andb $0x3f,%al
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:
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:
cmpb $0x03,%al
jne no_compressor
call module_compressor
no_compressor:
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 $72*4,%esi
popl %ecx
decl %ecx
jnz tracks_loop
popl %edi
decl %edx
jns not_to_master.no_newtick
movl $21000,%edx
not_to_master.no_newtick:
fmuls pw
flds end_mod
fcos
fmulp
write_master_out:
fstps (%edi)
addl $4,%edi
popl %ecx
decl %ecx
jnz synth_loop
popa
ret
