;--------------------------------------------------------------------
; Описание: Проигрывающий модуль музыкального редактора E-Tracker
; портирован с компьютера Sam Coupe
; Автор порта: Тарасов М.Н.(Mick),2010
;--------------------------------------------------------------------
;-------------------------------------------------------------------
; описание: Инициализация проигрывателя
; параметры: нет
; возвращаемое значение: нет
;---------------------------------------------------------------------
;EPlayer_Init
;-------------------------------------------------------------------
; описание: Проигрывание текущей ноты
; параметры: нет
; возвращаемое значение: нет
;---------------------------------------------------------------------
EPlayer_Play:
;ld bc,0FFFDh ;разрешим работу SAA1099
;ld a,0f6h
;out (c),a
ld a,1 ;текущий канал
dec a
jr nz,loc_0_802A ;вывели информацию во все каналы?
ld ix,word_0_833A ;да,переходим к подготовки новых значений
ld b,6 ;число каналов
loc_0_8011:
push bc
call sub_0_81A4
ld bc,19h ;количество байт для одного канала
add ix,bc
pop bc
djnz loc_0_8011
ld hl,(word_0_83EA)
ld a,h
call sub_0_8157
or l
ld (loc_0_80E5+1),a
loc_0_8028:
ld a,6 ;установим текущий канал для обновления
loc_0_802A:
ld (EPlayer_Play+1),a ;установим новое значение текущего канала
ld ix,word_0_833A
call sub_0_826A
ld (EAmplitude_ch0),a ;Amplitude 0 right/left
ld (EFrequency_ch0),hl
push hl
ld hl,0
call sub_0_815C
ld (loc_0_8055+1),hl
ld (loc_0_80E3+1),a
ld ix,word_0_8353
call sub_0_826A
ld (EAmplitude_ch1),a ;Amplitude 1 right/left
ld (EFrequency_ch0+1),hl
push hl
loc_0_8055:
ld hl,0
call sub_0_815C
ld (loc_0_8073+1),hl
rl h
jr nc,loc_0_8065
ld (loc_0_80E3+1),a
loc_0_8065:
ld ix,word_0_836C
call sub_0_826A
ld (EAmplitude_ch2),a ;Amplitude 2 right/left
ld (EFrequency_ch2),hl
push hl
loc_0_8073:
ld hl,0
call sub_0_815C
ld (loc_0_8091+1),hl
rl h
jr nc,loc_0_8083
ld (loc_0_80E3+1),a
loc_0_8083:
ld ix,word_0_8385
call sub_0_826A
ld (EAmplitude_ch3),a ;Amplitude 3 right/left
ld (EFrequency_ch2+1),hl
push hl
loc_0_8091:
ld hl,0
call sub_0_815C
ld (loc_0_80AB+1),hl
ld (loc_0_80DD+1),a
ld ix,word_0_839E
call sub_0_826A
ld (EAmplitude_ch4),a ;Amplitude 4 right/left
ld (EFrequency_ch4),hl
push hl
loc_0_80AB:
ld hl,0
call sub_0_815C
ld (loc_0_80C9+1),hl
rl h
jr nc,loc_0_80BB
ld (loc_0_80DD+1),a
loc_0_80BB:
ld ix,word_0_83B7
call sub_0_826A
ld (EAmplitude_ch5),a ;Amplitude 5 right/left
ld (EFrequency_ch4+1),hl
push hl
loc_0_80C9:
ld hl,0
call sub_0_815C
rr l
rr l
rr h
rr h
ld (EFrequency_en),hl ;Freqency and Noise enable
rlca
jr c,loc_0_80E0
loc_0_80DD:
ld a,0
rlca
loc_0_80E0:
rlca
rlca
rlca
loc_0_80E3:
or 0
loc_0_80E5:
or 0
ld (ENoise_gen),a ;Noise generator 0 and 1
pop af
pop bc
call sub_0_8157
or b
ld h,a
pop af
pop bc
call sub_0_8157
or b
ld l,a
ld (EOctave_ch2),hl ;Octave 2 and 3 and 4 and 5
pop af
pop bc
call sub_0_8157
or b
ld (EOctave_ch0),a ;Octave 1 and 0
ld bc,0xfffd
ld de,1C01h ;регистр 1Сh,бит SE=1
out (c),d
ld b,0xbf
out (c),e ;разрешить все каналы
ld hl,EEnvelope_gen1 ;таблица данных звукового канала
ld d,19h ;размер данных для одного канала
loc_0_8114:
ld b,0xff
out (c),d ;загружаем номер регистра
ld b,0xbf
ld a,(hl) ;читаем значение из таблицы
out (c),a ;выводим в порт
dec d ;следующий байт
ret m ;выход по окончании записи
dec hl ;переходим к следующим значениям
jr loc_0_8114 ;продолжим запись в порт
db 5
db 21h
db 3Ch
db 55h
db 6Dh
db 84h
db 99h
db 0ADh
db 0C0h
db 0D2h
db 0E3h
db 0F3h
unk_0_812C: db 0FEh
db 1
db 0
db 0
db 0FCh
unk_0_8131: db 0
db 96h
db 9Eh
db 9Ah
db 86h
db 8Eh
db 8Ah
db 97h
db 9Fh
db 9Bh
db 87h
db 8Fh
db 8Bh
unk_0_813E: db 0FEh
db 0
unk_0_8140: db 0FFh
db 0D2h
db 57h
db 72h
db 0
db 52h
db 0ABh
db 51h
db 61h
db 50h
db 52h
db 30h
db 0C2h
db 2Eh
db 35h
db 21h
db 29h
db 11h
db 41h
db 0Fh
db 46h
db 0
db 3Ah
sub_0_8157:
rlca
rlca
rlca
rlca
ret
sub_0_815C:
ex af,af'
rrca
rr l
rrca
rr h
ret
sub_0_8164:
sla c
ld b,0
jr nc, loc_0_816B
inc b
loc_0_816B:
add hl,bc
sub_0_8169:
ld c,(hl) ;читаем младший байт адреса смещения
inc hl
ld b,(hl) ;читаем старший байт адреса смещения
inc hl ;переходим к следующему адресу
push hl
loc_0_816E:
ld hl,0 ;адрес музыки
add hl,bc ;получим адрес таблицы
ld c,l ;младший байт адреса
ld b,h ;старший байт адреса
pop hl
ret
loc_0_8176:
ld hl,0
call sub_0_8164
ld (ix++0Fh),c
ld (ix++10h),b
ld hl,unk_0_812C
ld (ix++4),l
ld (ix++5),h
jr loc_0_81D4
loc_0_818D:
ld hl,0
call sub_0_8164
ld (ix++11h),c
ld (ix++12h),b
ld hl,unk_0_813E
ld (ix++8),l
ld (ix++9),h
jr loc_0_81E0
sub_0_81A4:
dec (ix++13h)
ret p
ld a,b
cp 3
ld hl,EEnvelope_gen0
jr nc,loc_0_81B1
inc hl
loc_0_81B1:
ld (loc_0_81FB+1),hl
loc_0_81B4:
ld e,(ix++0)
ld d,(ix++1)
loc_0_81BA:
ld hl,unk_0_8140
loc_0_81BD:
ld a,(de)
inc hl
sub (hl)
inc hl
jr c,loc_0_81BD
inc de
ld c,a
ld a,(hl)
ld (loc_0_81C9+1),a
loc_0_81C9:
jr loc_0_81C9
loc_0_81CB:
ld (ix++0Eh),c
ld c,(ix++0Fh)
ld b,(ix++10h)
loc_0_81D4:
ld (ix++2),c
ld (ix++3),b
ld c,(ix++11h)
ld b,(ix++12h)
loc_0_81E0:
ld (ix++6),c
ld (ix++7),b
ld (ix++14h),1
ld (ix++15h),1
ld (ix++16h),1
jr loc_0_81BA
loc_0_81F4:
ld b,0
ld hl,unk_0_8131
add hl,bc
ld a,(hl)
loc_0_81FB:
ld (0),a
jr loc_0_81BA
loc_0_8200:
ld (ix++17h),c
jr loc_0_81BA
loc_0_8205:
ld a,c
inc a
ld (loc_0_8028+1),a
jr loc_0_81BA
loc_0_820C:
ld (ix++18h),c
jr loc_0_81BA
loc_0_8211:
jr z,loc_0_8215
ld c,3
loc_0_8215:
ld hl,(loc_0_81FB+1)
inc hl
inc hl
ld (hl),c
jr loc_0_81BA
loc_0_821D:
ld bc,unk_0_812C
jr loc_0_81D4
loc_0_8222:
ld (ix++13h),c
ld (ix++0),e
ld (ix++1),d
ret
loc_0_822C:
call sub_0_8461
jp loc_0_81B4
loc_0_8232:
cp 7Fh ; ''
jr z,loc_0_823F
cp 7Eh ; '~'
jr z,loc_0_8247
add a,2
ld c,a
jr loc_0_827D
loc_0_823F:
ld (ix++4),l
ld (ix++5),h
jr loc_0_827D
loc_0_8247:
ld l,(ix++4)
ld h,(ix++5)
jr loc_0_827D
loc_0_824F:
inc a
jr z,loc_0_825A
inc a
jr z,loc_0_8262
sub 60h ; '`'
ld c,a
jr loc_0_829F
loc_0_825A:
ld l,(ix++8)
ld h,(ix++9)
jr loc_0_829F
loc_0_8262:
ld (ix++8),l
ld (ix++9),h
jr loc_0_829F
sub_0_826A:
ld e,(ix++0Ah)
ld d,(ix++0Bh)
dec (ix++15h)
ld l,(ix++2)
ld h,(ix++3)
jr nz,loc_0_828E
ld c,1
loc_0_827D:
ld a,(hl)
inc hl
rrca
jr nc,loc_0_8232
ld (ix++15h),c
ld (ix++0Bh),a
ld e,(hl)
ld d,a
ld (ix++0Ah),e
inc hl
loc_0_828E:
push hl
ld a,(ix++0Dh)
dec (ix++14h)
jr nz,loc_0_82B1
ld c,1
ld l,(ix++6)
ld h,(ix++7)
loc_0_829F:
ld a,(hl)
inc hl
cp 60h ; '`'
jr nc,loc_0_824F
ld (ix++14h),c
ld (ix++0Dh),a
ld (ix++6),l
ld (ix++7),h
loc_0_82B1:
add a,(ix++0Eh)
cp 5Fh ; '_'
ld hl,7FFh
jr z,loc_0_82D1
loc_0_82BB:
add a,0
jr nc,loc_0_82C1
sub 60h ; '`'
loc_0_82C1:
ld hl,0FF0Ch
ld b,h
loc_0_82C5:
inc h
sub l
jr nc,loc_0_82C5
ld c,a
ld a,h
ld hl,unk_0_812C
add hl,bc
ld l,(hl)
ld h,a
loc_0_82D1:
add hl,de
ld a,h
and 7
ld h,a
ld a,d
rrca
rrca
rrca
and 0Fh
ex af,af'
ex de,hl
pop hl
ld a,(ix++0Ch)
dec (ix++16h)
jr nz,loc_0_82F4
ld a,(hl)
inc hl
loc_0_82E9:
cp 0
jr nz,loc_0_8322
ld c,(hl)
inc hl
loc_0_82EF:
ld a,(hl)
inc hl
loc_0_82F1:
ld (ix++16h),c
loc_0_82F4:
ld (ix++2),l
ld (ix++3),h
ld (ix++0Ch),a
ex de,hl
ld b,(ix++18h)
ld c,a
and 0Fh
sub b
jr nc,loc_0_8308
xor a
loc_0_8308:
ld e,a
ld a,c
and 0F0h ; 'Ё'
call sub_0_8157
sub b
jr nc,loc_0_8313
xor a
loc_0_8313:
ld d,a
ld a,(ix++17h)
or a
ld a,e
jr nz,loc_0_831D
ld a,d
ld d,e
loc_0_831D:
call sub_0_8157
or d
ret
loc_0_8322:
push hl
ld b,a
loc_0_8324:
ld hl,0
loc_0_8327:
ld a,(hl)
or a
jr z,loc_0_8334
inc hl
ld c,(hl)
inc hl
cp b
jr nz,loc_0_8327
pop hl
jr loc_0_82EF
loc_0_8334:
pop hl
ld c,1
ld a,b
jr loc_0_82F1
word_0_833A:
ds 25
word_0_8353:
ds 25
word_0_836C:
ds 25
word_0_8385:
ds 25
word_0_839E:
ds 25
word_0_83B7:
ds 25
EAmplitude_ch0: db 0 ;+00h - Amplitude 0 right/left
EAmplitude_ch1: db 0 ;+01h - Amplitude 1 right/left
EAmplitude_ch2: db 0 ;+02h - Amplitude 2 right/left
EAmplitude_ch3: db 0 ;+03h - Amplitude 3 right/left
EAmplitude_ch4: db 0 ;+04h - Amplitude 4 right/left
EAmplitude_ch5: db 0 ;+05h - Amplitude 5 right/left
db 0 ;+06h - XXXX
db 0 ;+07h - XXXX
EFrequency_ch0: db 0 ;+08h - Frequency of tone 0
db 0 ;+09h - Frequency of tone 1
EFrequency_ch2: db 0 ;+0Ah - Frequency of tone 2
db 0 ;+0Bh - Frequency of tone 3
EFrequency_ch4: db 0 ;+0Ch - Frequency of tone 4
db 0 ;+0Dh - Frequency of tone 5
db 0 ;+OEh - XXXX
db 0 ;+0Fh - XXXX
EOctave_ch0: db 0 ;+10h - Octave 1 and 0
EOctave_ch2: db 0 ;+11h - Octave 3 and 2
EOctave_ch4: db 0 ;+12h - Octave 5 and 4
db 0 ;+13h - XXXX
EFrequency_en: db 0 ;+14h - Frequency enable
db 0 ;+15h - Noise enable
ENoise_gen: db 0 ;+16h - Noise generator 0 and 1
db 0 ;+17h - XXXX
EEnvelope_gen0: db 0 ;+18h - Envelope generator 0
EEnvelope_gen1: db 0 ;+19h - Envelope generator 1
word_0_83EA: dw 0
EPlayer_Init:
ld bc,0FFFDh ;разрешим работу SAA1099
ld a,0f6h
out (c),a
ld a,6 ;добавил инициализацию первого канала
ld (loc_0_8028+1),a ;иначе некоректно стратуют некоторые модули
ld (loc_0_816E+1),hl ;сохраним адрес музыки
call sub_0_8169 ;получим адрес 1 таблицы
ld (sub_0_8461+1),bc ;сохраним адрес
call sub_0_8169 ;получим адрес 2 таблицы
ld (loc_0_8476+1),bc ;сохраним адрес
call sub_0_8169 ;получим адрес 3 таблицы
ld (loc_0_8176+1),bc ;сохраним адрес
call sub_0_8169 ;получим адрес 4 таблицы
ld (loc_0_818D+1),bc ;сохраним адрес
call sub_0_8169 ;получим адрес 5 таблицы
ld a,(bc)
inc bc
ld (loc_0_82E9+1),a ;сохраним адрес
ld (loc_0_8324+1),bc
ld hl,word_0_833A ;начальный адрес служебных данных
ld b,0B2h ;размер области служебных данных
xor a ;байт заполнения - 00h
loc_0_841D:
ld (hl),a ;очищаем служебную область
inc hl
djnz loc_0_841D
inc a
ld (EPlayer_Play+1),a ;установим номер текущего канала - 01h
ld ix,word_0_833A ;адрес служебных данных 1 канала
ld de,19h ;размер данных для одного канала
ld b,6
loc_0_842E:
ld (ix++14h),1
ld (ix++15h),1
ld (ix++16h),1
ld hl,unk_0_812C
ld (ix++0Fh),l
ld (ix++10h),h
ld (ix++2),l
ld (ix++3),h
ld hl,unk_0_813E
ld (ix++11h),l
ld (ix++12h),h
add ix,de ;переходим к следующему каналу
djnz loc_0_842E
ld de,1C02h ;регистр 1Сh SAA1099 - выключим звук
ld bc,0xfffd
out (c),d
ld b,0xbf
out (c),e ;иництализация микросхемы
sub_0_8461:
ld hl,0 ;адрес 1 таблицы
loc_0_8464:
ld c,(hl)
ld a,c
inc hl
inc a
jr z,loc_0_84A4
inc a
jr z,loc_0_84A9
sub 62h ; 'b'
jr nc,loc_0_84AE
ld (sub_0_8461+1),hl
sla c
loc_0_8476:
ld hl,0
call sub_0_8164
ld (word_0_833A),bc
call sub_0_8169
ld (word_0_8353),bc
call sub_0_8169
ld (word_0_836C),bc
call sub_0_8169
ld (word_0_8385),bc
call sub_0_8169
ld (word_0_839E),bc
call sub_0_8169
ld (word_0_83B7),bc
ret
loc_0_84A4:
ld hl,0
jr loc_0_8464
loc_0_84A9:
ld (loc_0_84A4+1),hl
jr loc_0_8464
loc_0_84AE:
ld (loc_0_82BB+1),a
jr loc_0_8464
; .end