
Сообщение от
JV-Soft
Пересмотрел весь код плеера на который Goodboy выше давал ссыль , чтения YM2612 в нем нет.
Если он использовал драйвер из BT/BT&DD то там тайминг достигается за счет "длинной" команды Z80 (2 префикса).
Код:
; Вольный перевод с буржуйского, здесь цикл = такт.
;53203424 / 7 = 7600489 = Такты YM/68K
;53203424 / 15 = 3546895 = Такты Z80
;53203424 / 3420 = 15556.55 : Строк в секунду
;53203424 / (3420 * 313) = 49.70Hz : Кадров в секунду @50Гц
;53203424 / (3420 * 262) = 59.38Hz : Кадров в секунду @60Гц
;313 - 240 = 73 * 3420 = 249660 / 15 = 16644 : Циклов Z80 на каждый VBL @50Гц
;262 - 224 = 38 * 3420 = 129960 / 15 = 8664 : Циклов Z80 на каждый VBL @60Гц
;(313 * 3420) / 15 = 71364 : Циклов Z80 на каждый кадр @50Гц
;(262 * 3420) / 15 = 59736 : Циклов Z80 на каждый кадр @60Гц
;17 * 7 = 119 / 15 = 7.93 : Ожидать циклов Z80 после записи индекса регистра
;83 * 7 = 581 / 15 = 38.73 : Ожидать циклов Z80 после записи данных в регистры $21...$9E
;47 * 7 = 329 / 15 = 21.93 : Ожидать циклов Z80 после записи данных в регистры $A0...$B6
;53203424 / (7 * 144) = 52781.1746 : Дискретизация YM
;144 * 7 = 1008 / 15 = 67.2 : Циклов Z80 на один сэмпл YM 52.781 КГц
;288 * 7 = 2016 / 15 = 134.4 26.391
;432 * 7 = 3024 / 15 = 201.6 17.594
;576 * 7 = 4032 / 15 = 268.8 13.195
;720 * 7 = 5040 / 15 = 336.0 10.556
;864 * 7 = 6048 / 15 = 403.2 8.797
WriteYM0: ;C=Индекс, A=Данные
LD (IY+0), C ;19
LD (IY+1), A ;19 ~19 циклов между записью Индекса и Данных
NOP ;4
NOP ;4
RET ;10 18+ циклов между записью Данных и следующей записью
WriteYM1: ;C=Индекс, A=Данные
LD (IY+2), C ;19
LD (IY+3), A ;19 ~19 циклов между записью Индекса и Данных
NOP ;4
NOP ;4
RET ;10 18+ циклов между записью Данных и следующей записью
Это выведено на форуме, ссылку на тему в котором я уже давал. Быстрее нельзя - YM2612 будет пропускать данные и мелодия испортится.