1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.151
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    AxXxB, оно так работать не будет.
     
    Bato-San нравится это.
  4. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    это называется плеер. И останавливать цпу низя, если предполагается использование плеера в других программах. Например в играх.

    И вообще, логичнее взять мануал по портам платы и программированию самой микрухи. А так же подробную документацию по формату SID. И сделать всё чисто и по уму. Копипаста с подменами непойми чего на непойми что до добра не доведёт в любом случае.
     
  5. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Кончай уже этот секс по переписке. Тут работы на полдня скорее всего и ты либо уж прошаривайся и делай сам, либо расшарь код с теми, кто сделает.
    Без обид :)
     
    Рыжий Тигра и Bato-San нравится это.
  6. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Я вообще не понимаю, в чём проблема. Наверняка точная частота нужна для одной цели — кидать с этой частотой байты в порт устройства. Ну вот и ставим этот OUT в наш обработчик прерывания, предварительно перепрограммировав таймер. Сотни игрушек так делали со спикером и/или саундбластером, сам такой код писал (на самом деле со спикером посложнее) — это элементарно же.
     
    Bato-San нравится это.
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Читать показания таймера?
    Если custom_counter - счётчик прерываний, тогда ОК. А если счётчик в аппаратном таймере, тогда не пойдёт - c hlt'а проц снимается только прерыванием, привет точности. :-(
    Скорее
    Код:
    custom_counter = 0; end_counter = delay;
    и всех троих беззнаковыми.
     
  8. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра, Ставим таймер на период, скажем, в 16 тиков вместо 65536. Заводим наш глобальный счетчик, который инкрементим каждый раз, и через каждые 4096 вызовов вызываем стандартный обработчик, чтобы шли досовские часы итд.
    Перед каждый OUT делаем задержку до ожидаемого времени, ожидая нужного значения счетчика в цикле с тем же __asm hlt внутри. Нужно разве что еще учесть, что на медленной машине при большом количестве "единомоментных" OUT-ов, таймер уже может немного убежать вперед, и поэтому ждать нужно в пределах некоторого "окна". Но это лишние 1-2 строчки кода.
    Cуммарное время, которое мы тут потратили, объясняя, намного больше, чем время, требуемое на реализацию :)
    А и да, Тигра, не надо обнулять счетчик, в который пишет обработчик прерывания, вариант от AxXxB чуть надежнее. просто прибавляем к нему время ожидания (с переполнением, если надо) и ждем до него.
     
    Последнее редактирование: 9 фев 2015
  9. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Нет, тут дело в другом. То, что ты описываешь - это вывод PCM-звука, он через SID тоже возможен, но это другой случай.

    Как я понимаю происходящее, библиотека читает файл *.SID (или другой понимаемый формат), эмулирует его обработку Коммодором, но без привязки ко времени. При этом постоянно учитывается количество циклов процессора C64, которое уходит на обработку. Всякий раз, когда Коммодор писал или читал бы из регистров SID, вызываются соответствующие функции модуля, отвечающего за SID. В моем случае этот модуль просто пишет требуемое в порты SSI-2001 (или читает). Но, так как таймер никак не используется, на выходе получается звук с той скоростью, с какой CPU успевает эмулировать Коммодор. А нужно сделать задержку, используя имеющееся количество циклов Коммодора, которое отдает библиотека при вызовах модуля для работы с SID.
     
    Последнее редактирование: 9 фев 2015
  10. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, модули SID содержат две части, насколько я мельком глянул:
    1. оригинальный проигрыватель мелодии в кодах C64.
    2. Саму мелодию в формате этого самого плеера (то есть вообще неведомо как).

    Что бы всё это послушать, нам надо эмулировать процессор C64, который будет выполнять код плеера и который и будет жрать мелодию и плевать в виртуальные порты, которые мы будем перехватывать и уже сами плевать в железную карту.

    По сути эмулируем фактически весь коммодор. Без экрана.

    Однако, что то подсказывает что HardSID умела это сама.

    Так вот, задача, как я понимаю сводится к тактированию виртуального C64.

    Частота у него была 1Mhz, смотрим на фотку и видим кварц в 1Mhz...
     
    Последнее редактирование: 9 фев 2015
  11. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Если я напишу тебе функцию synchronize(unsigned long current_cpu_ticks), тебе хватит? :)

    Кстати, интересный факт. частота_процессора_NTSC / частота_таймера_PC == 6/7 РОВНО
    Для PAL не работает, там кварцы разные :(
     
    Последнее редактирование: 9 фев 2015
  12. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Мне хватит, если будет аналог функции usleep(), то есть задержка в каких-то понятных единицах (в случае usleep это микросекунды), которые можно было бы пересчитать в циклы C64, в зависимости от требуемой конкретным SID-файлом модели (NTSC или PAL).

    Я наконец закоммитил исходники в github: https://github.com/bristlehog/libsidplayfp-innov. Да только не знаю, как их тестировать кто-то кроме меня будет. Тут Dosbox не поможет, потому что libsidplayfp слишком прожорлива до ресурсов. А обрабатывать надо ситуацию, когда процессор слишком быстрый, а не слишком медленный.

    ---------- Сообщение добавлено в 18:36 ---------- Предыдущее сообщение размещено в 18:30 ----------

    Нет, HardSID эмулировать Commodore наверняка не умела. Там тоже интерфейс к портам SID, только не такой прямой, как у SSI-2001, а через всего два порта, 300-301h. И, видимо, функция задержки. Больше я ничего не нашел, документации тоже не нашел.

    ---------- Сообщение добавлено в 18:41 ---------- Предыдущее сообщение размещено в 18:36 ----------

    Не знаю, что такое тактирование, но в остальном в libsidplayfp так и есть: эмулируются необходимые части Commodore. Эти части обращаются к виртуальному SID через методы sid::read() и sid::write(), а там уже то, что нужно: либо эмулятор SID, либо класс для работы с HardSID через порты или DLL, либо вот кидаются данные тупо в порты SSI-2001.
     
    Последнее редактирование: 9 фев 2015
  13. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    ТЬФУ 6/7
     
  14. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, а когда будет версия под Windows 98 - 10 ?

    каждая команда процессора исполняется определённое время, что должно эмулироваться для правильной работы. Это самое время определяется в тактах. Один такт в данном случае равен 1Mhz. Одна команда может использовать более 1 такта.
     
    Последнее редактирование: 9 фев 2015
    Geryon нравится это.
  15. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Это, кстати, идея. Что если собрать под Windows 98 с использованием QueryPerformanceCounter() хотя бы для проверки? Windows 98 ведь допускает прямую работу с портами?
     
    nop нравится это.
  16. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Да, допускает без проблем. Более того, есть драйвера для включения прямого доступа к портам в NT-виндах. Типа http://retired.beyondlogic.org/porttalk/porttalk.htm
     
    Последнее редактирование: 9 фев 2015
    Geryon и Bato-San нравится это.
  17. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
  18. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    У меня есть исходники VICE 2.4 для DOS, но там черт ногу сломит. Хотя VICE, скорее всего, существенно менее прожорливый.
     
  19. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Geryon, тебе надо взять токо модуль эмуляции процессора и разобраться как сделано тактирование.
     
    Geryon нравится это.
  20. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    У меня есть свой эмулятор 6502 на ассемблере(не релизился, но старый тест-билд могу закинуть), только он эмулирует Atari 2600, а не C64. Наверное подключать туда поддержку именно C64 (менять карту памяти как минимум, прерывания добавлять) - многовато возни..
     
    Последнее редактирование: 9 фев 2015
    Bato-San нравится это.
  21. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    nop, скорее всего основная возня с форматом SID будет. С другой стороны получится более чисто и менее глючно, да и кроссплатформу можно сразу заложить. Всё же это лучше, чем в чужих сорцах ковыряться.
     
  22. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    в проекте Vice, кстати, есть свой SID-плеер.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление