Re: Разбор архитектуры софта ЯЗС
Я сам слегка озадачен, что она нормально работает. Подозреваю, что я пропустил какую-то неявную особенность работы клавиатуры (а может, самой ЯЗС).
Буду разбираться.
Персональный компьютер "Агат" - технические беседы (является частью agatcomp.su / agatcomp.ru) Как зарегистрироваться?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
ПЭВМ "Агат" 7-9: Форум → Звуковой синтез, анализ звука, MIDI → Разбор архитектуры софта ЯЗС
Я сам слегка озадачен, что она нормально работает. Подозреваю, что я пропустил какую-то неявную особенность работы клавиатуры (а может, самой ЯЗС).
Буду разбираться.
Боюсь, книжку в 300 страниц они забесплатно не захотят сканировать. А бумажный экземпляр я бы купил.
Я уже купил.
Я сам слегка озадачен, что она нормально работает. Подозреваю, что я пропустил какую-то неявную особенность работы клавиатуры (а может, самой ЯЗС).
Буду разбираться.
Могу снять видео работы с контрапунктом (не очень быстро), могу прислать исходник программы контроллера адаптера. Наверное, больше ничего не могу сделать...
Еще раз проверил сигналы на выходе клавиатуры, потом посмотрел на схему ЯЗС и наконец-то картинка сложилась :)
Клавиатура работает ровно так, как написано в описании, ничего нового я не увидел. В любой момент времени с ее разъема можно узнать номер текущей сканируемой клавиши (инвертированный) и ее состояние в старшем бите (0 - не нажата, 1 - нажата).
Но в ЯЗС-то порт с инверсией. Поэтому при чтении из порта инверсный номер клавиши становится прямым. А состояние старшего бита меняется на противоположное: 0 - нажата, 1 - не нажата. Поэтому код опроса клавиатуры в "гномах" и в других программах считает, что если число положительное (старший бит = 0), значит, клавишу нажали.
Если программа "Гномы" нормально работает с штатной музыкальной клавиатурой, а у меня с её эмулятором не работает, значит, ошибки у меня. Но, в то же время, мой эмулятор нормально работает с "Контрапунктом". Где я что пропустил?
В примере тут написано:
При нажатии первой клавиши выводится 0x80, при отпускании 0x00. Для второй клавиши, соответственно, 0x81 и 0x01.
А должно быть наоборот, при нажатии первой клавиши должно выводиться 0x00, а при отпускании 0x80.
И еще, в "Гномах" номера клавиш прописаны в коде. Допустимы номера от $13 (до) до $1E (си). Те же ноты в других октавах игнорируются.
Я уже купил.
Фу! Отлегло. А то я такой полез за книжкой, а все, единственный экземпляр продан.
Еще раз проверил сигналы на выходе клавиатуры, потом посмотрел на схему ЯЗС и наконец-то картинка сложилась :)
Клавиатура работает ровно так, как написано в описании, ничего нового я не увидел. В любой момент времени с ее разъема можно узнать номер текущей сканируемой клавиши (инвертированный) и ее состояние в старшем бите (0 - не нажата, 1 - нажата).
Но в ЯЗС-то порт с инверсией. Поэтому при чтении из порта инверсный номер клавиши становится прямым. А состояние старшего бита меняется на противоположное: 0 - нажата, 1 - не нажата. Поэтому код опроса клавиатуры в "гномах" и в других программах считает, что если число положительное (старший бит = 0), значит, клавишу нажали.
AlexBel пишет:Если программа "Гномы" нормально работает с штатной музыкальной клавиатурой, а у меня с её эмулятором не работает, значит, ошибки у меня. Но, в то же время, мой эмулятор нормально работает с "Контрапунктом". Где я что пропустил?
В примере тут написано:
При нажатии первой клавиши выводится 0x80, при отпускании 0x00. Для второй клавиши, соответственно, 0x81 и 0x01.
А должно быть наоборот, при нажатии первой клавиши должно выводиться 0x00, а при отпускании 0x80.
И еще, в "Гномах" номера клавиш прописаны в коде. Допустимы номера от $13 (до) до $1E (си). Те же ноты в других октавах игнорируются.
В примере указаны "чистые" данные, без инверсий. Вот так у меня формируется выходной код для портя ЯЗС:
ПОРТ_КЛАВИАТУРЫ = ~( НОМЕР_НОТЫ | 0x80 ); - нажатие клавиши
ПОРТ_КЛАВИАТУРЫ = ~( НОМЕР_НОТЫ & 0x7F ); - отпускание клавиши
И, кроме того, если бы данные выводились неправильно, как "Контрапункт" могла бы их корректно воспринимать?
Думаю, мне нужно ещё раз проверить работу "Гномов", самой правильной и самой совместимой версии, той, что точно работает со штатной клавиатурой. Если будет образ с такой версией, я смогу проверить ещё раз.
В примере указаны "чистые" данные, без инверсий.
Так и я говорю про "чистые", которые уже процессор из порта ЯЗС читает. При нажатии первой клавиши из порта $C094 должен читаться $0, а при отпускании - $80.
И, кроме того, если бы данные выводились неправильно, как "Контрапункт" могла бы их корректно воспринимать?
Если просто бит нажатия инвертирован, то легко: нота будет рисоваться на стане не в момент нажатия, а в момент отпускания клавиши.
На самом деле, возможных причин две:
1) не те номера клавиш. "Гномы" считают, что "до" это клавиша с номером $13 и никак иначе.
2) в той версии, которая была раньше выложена, проверка клавиш выглядит так:
LDA DATA_C094 ; прочитали код клавиши
BPL CODE_3083
JMP CODE_306B
CODE_3083
STY DATA_3184
STA ZP_FF
CMP #$15 ; это "ре"?
BNE CODE_3098
LDA DATA_C094 ; да, читаем еще раз
CMP #$15 ; это точно "ре"?
BNE CODE_3098
LDA #$01
JMP CODE_30FB
CODE_3098
CMP #$17
BNE CODE_30A8
LDA DATA_C094
CMP #$17
BNE CODE_30A8
Непонятно зачем, но код клавиши читается второй раз и проверка делается второй раз.
То ли разработчики какую-то защиту от дребезга хотели сделать, то ли защиту от эмулятора :)
Я в описание клавиатуры вставлял текст, что код клавиши после выдачи сигнала !DREQ сохраняется еще примерно 120 мкс. Эмулятор клавиатуры так делает?
Потому что если он сразу после чтения данные сбрасывает, то второе чтение и проверка обломятся.
Кстати, из-за этого места в коде я никак не мог выбрать, какие версии NAZKL и SIMKL включить в окончательный образ. Версий этих программ две.
Во второй версии опрос клавиатуры выглядит нормально, без повторной проверки. НО! Там зато есть очень подозрительный обработчик прерывания.
Он делает какие странные действия. Если прерывание пришло от таймера, то переставляет его на следующее срабатывание через 8 секунд. Если было прерывание от клавиатуры, то читает ее порт, и если была отпущена клавиша, то инкрементит ячейку, которая нигде больше в коде не используется. Короче, выглядит как какие-то наброски, вообще не связанные с остальным кодом.
Хуже того, этот вектор IRQ дальше перезаписывает другой модуль (DISPL).
В первой версии текст этого обработчика сохранен (то есть, исходник у авторов обеих версий был), однако ссылок на него уже нет. При установке обработчика вектор IRQ ставится на одинокую команду RTI, а прерывания запрещаются. (Во второй версии прерывания не запрещены.)
Мне кажется, что первая версия - все таки более новая. Возможно, разработчики осознали, что обработчик прерываний не будет работать так, как они хотели, и запатчили его. Может быть, возникали какие-то сбои с клавиатурой и поэтому появилась вторая проверка. Как было на самом деле - теперь уже, наверно, не узнать.
Так что вот новая сборка, там обновлено описание и добавлена пропущенная картинка, кроме того, с него можно непосредственно грузиться. Но версии NAZKL и SIMKL оставлены те, что были, поскольку штатная клавиатура с ними нормально работает.
Вот, кстати, возможная причина добавления второй проверки кода клавиш.
У клавиатуры длина кабеля 1 м 40 см. Провода данных не экранированы и сами по себе легко могут собирать наводки.
Но, кроме этого, в ЯЗС чтение порта совмещено с посылкой сигнала !DREQ. Это приводит к тому, что спустя несколько сотен нс (не позже, чем 660 - задержка двух ЛН2 и ТМ2), то есть, близко к моменту защелкивания данных в процессоре, происходит сброс сигнала IRQ. Вполне может быть, что это генерирует наводку на линиях данных.
При повторном же чтении сигнал IRQ уже сброшен и дополнительных наводок не генерирует.
Внёс коррективы в программу клавиатурного адаптера. Теперь клавиши работают правильно - и в "Контрапункте" и в "Гномах". "Гномов" использовал из сообщения 81. Большое спасибо avivanov76 за помощь!
Постараюсь в ближайшее время сделать видео с демонстрацией работы программы "Гномы" и клавиатурой.
Маленькое видео с частичной демонстрацией работы программы "Семь гномов": https://disk.yandex.ru/d/IiZtLJLtT89j_Q
Поскольку экспромт - не мой конёк, получилось не очень :)
Вопрос по программе MUSAGED. Когда я её запускаю (на Агат-9), она начинает грузиться, появляется "звёздочка", потом раздаётся звуковой сигнал и возврат в отладчик. В то же время, программа MIDIGED запускается и работает нормально. Если я правильно понимаю то, что писалось в этой теме, MUSAGED работает, значит, какие-то проблемы у меня. Возможно, версия неправильная. Дайте, пожалуйста, работоспособную версию MUSAGED, если таковая есть.
Маленькое видео с частичной демонстрацией работы программы "Семь гномов": https://disk.yandex.ru/d/IiZtLJLtT89j_Q
Поскольку экспромт - не мой конёк, получилось не очень :)
Да нормально получилось, переживать не о чем. Можно было бы еще таблицу оценок показать и процесс нажимания клавиш, но это уже так, придирки.
Вопрос по программе MUSAGED. Когда я её запускаю (на Агат-9), она начинает грузиться, появляется "звёздочка", потом раздаётся звуковой сигнал и возврат в отладчик.
MUSAGED полностью рабочая. Звездочек она должна вывести три, по числу файлов. Видимо, какие-то файлы не грузятся или отсутствуют. Позже выложу образ.
MUSAGED и MIDIGED в одном флаконе.
Спасибо! MUSAGED работает, я, даже, ввёл с музыкальной клавиатуры небольшую мелодию и проиграл её. Жаль, что во время ввода ноты не воспроизводятся.
Позже сделаю видео с работой программ "7 гномов" и MUSAGED.
ПЭВМ "Агат" 7-9: Форум → Звуковой синтез, анализ звука, MIDI → Разбор архитектуры софта ЯЗС
Форум работает на PunBB, при поддержке Informer Technologies, Inc