а это, тест под виндой, или досик в незащищенном режиме?
Вид для печати
а это, тест под виндой, или досик в незащищенном режиме?
Vitamin, можеш прикрутить поддержку виртуального/реального COM порта ?
Идея в следующем - слать в COM порт пакеты по 14 байт + 2 байта "терминатор" ($80$7F),
первые 13 байт - значения регистров, 14-й байт значение огибающей (если менялся, то реальное значение, если неменялся то 255)
Устройство у меня такое собрано и нормально играет под виндой.
Потестил, но увы - STACKER играется ровно так же, то есть проблема с огибающей видимо осталась. Фикшеный AYPLAYER ее играет гораздо четче (я уже давал ссылку).
AYPLAYER : https://soundcloud.com/tronix286/illusion-psg-normal
ZXTUNE: http://rghost.ru/51219767
---------- Post added at 19:00 ---------- Previous post was at 17:44 ----------
Смотрю вот схему http://ru.scribd.com/doc/103838815/L...taly-Mayatskih и вижу, что BDIR подключен к 1 пину LPT (Strobe). Но дальше авторы нигде его не контролируют. Или Strobe такой умный, что его сам контроллер выставляет? Не определюсь - BDIR на Strobe вешать или на 14 пин.
вот еще вариант подключенного AY (а точнее tsfm) через усб: http://dlcorp.nedopc.com/viewtopic.p...&t=732&start=0
Подключил к Strobe 1 пин LPT. И ничего не понимаю. Пишу в порт 37A значение 0xF6 (11110110) Должно быть на стробе высокий уровень (нулевой бит, сигнал инвертирован), а на 16 пине - низкий. У меня наоборот, на первом - низкий, на 16 - высокий . Что за?
---------- Post added at 20:58 ---------- Previous post was at 20:37 ----------
Хм, почему то первый пин LPT оказывается контролируется первым битом, а не нулевым. Заиграл так:
Но щаз получается, что на BDIR у меня всегда высокий уровень. То есть по-сути как и было раньше. Когда его делать низким? После того как все записал, и адрес и данные?Код:void AD(unsigned char b)
{
outp(0xF9 | b << 2,LPT_PORT+2);
}
void R(unsigned char b)
{
outp(0xF5 | b << 3, LPT_PORT+2);
}
void ResetYM2149()
{
R(1);
R(0);
R(1);
}
void sreg(char reg, unsigned char dat)
{
AD(1);
D(reg);
AD(0);
D(dat);
}
---------- Post added at 21:40 ---------- Previous post was at 20:58 ----------
Ага, кажется понял. Сделал так:
Выкинул после фрейма записьКод:void AD(_UC b,_UC c)
{
outb((0xF9 | b << 2) | c << 1,LPT_PORT+2); //FB
}
void R(_UC b)
{
outb(0xF5 | b << 3,LPT_PORT+2); //F7
}
void ResetYM2149()
{
R(1);
R(0);
R(1);
}
void sreg(char reg,_UC dat)
{
#ifdef LPT_PORT
AD(1,0); // BC1=1, BDIR=1
D(reg);
AD(0,0); //BC1=0, BDIR=1
D(dat);
AD(0,1); //BC1=0, BDIR=0
Результат - играет так же, как и вариант с записью после фрейма. Видимо, это максимальное качество :)Код:/* AD(1);
D(0);*/
Правильно было бы при BC1=BDIR=0 выставить данные на шину данных, после чего выставить одновременно BC1 и BDIR в соответсвии с тем что пишем (адрес/данные), после чего сного выставить BC1=BDIR=0 и только после этого снимать данные с шины данных.
Всмысле так?
AD(0,1); //BC1=0, BDIR=0
D(reg);
AD(1,0); // BC1=1, BDIR=1
D(reg);
AD(0,1); //BC1=0, BDIR=0
D(dat);
AD(0,0); //BC1=0, BDIR=1
D(dat);
AD(0,1); //BC1=0, BDIR=0