PDA

Просмотр полной версии : Вопрос по таймеру БК0011м



Jarik65535
19.10.2024, 14:42
Решил я доработать эмулятор БК0010/11 для платформы "мурмулятор" (https://murmulator.ru/). А именно, реализовать прерывание по вектору 0100 от таймера 50Гц. В документации говорится, что прерывание разрешается записью бита 14 в регистр клавиатуры 0177662. У меня заработали демки с AY-музыкой только после того, как я инвертировал данный бит, т.е. 0 - прерывание разрешено, 1 - запрещено. Вопрос: на реальном железе также, или просто где-то в коде эмулятора происходит инверсия?

Ссылка на мой форк репозитория: https://github.com/y-salnikov/PICO-BK

SuperMax
20.10.2024, 07:39
Решил я доработать эмулятор БК0010/11 для платформы "мурмулятор" (https://murmulator.ru/). А именно, реализовать прерывание по вектору 0100 от таймера 50Гц. В документации говорится, что прерывание разрешается записью бита 14 в регистр клавиатуры 0177662. У меня заработали демки с AY-музыкой только после того, как я инвертировал данный бит, т.е. 0 - прерывание разрешено, 1 - запрещено. Вопрос: на реальном железе также, или просто где-то в коде эмулятора происходит инверсия?


см документация
https://forum.maxiol.com/index.php?s=&showtopic=5068&view=findpost&p=51663
читайте БК-0011М - Руководство системного программиста - там все правильно написано

shattered
20.10.2024, 12:43
В документации говорится, что прерывание разрешается записью бита 14 в регистр клавиатуры 0177662. У меня заработали демки с AY-музыкой только после того, как я инвертировал данный бит, т.е. 0 - прерывание разрешено, 1 - запрещено.

все верно, 0 = разрешено

дайте ссылку на документацию, которую вы читали, чтобы не пользоваться ей :)

Jarik65535
20.10.2024, 14:12
там все правильно написано

Различная документация
...
содержит ошибку
Разряд 14 - управляет включением системного таймера. При значении 0 таймер выключен, при 1 - включен.

правильно

Разряд 14 - управляет включением системного таймера. При значении 0 таймер включен, при 1 - выключен.

Понял, ошибка в документации. Все версии "БК-0011М - Руководство системного программиста" что я видел, содержат ошибку.

jerri
20.10.2024, 14:29
а там даже по ссылке



Различная документация
Прикрепленный файл BK_0011_technical_guide.htm ( 137.61 килобайт ) Кол-во скачиваний: 1482


содержит ошибку
Разряд 14 - управляет включением системного таймера. При значении 0 таймер выключен, при 1 - включен.

правильно

Разряд 14 - управляет включением системного таймера. При значении 0 таймер включен, при 1 - выключен.

Вот тут БК-0011М - Руководство системного программиста

все корректно

Jarik65535
22.10.2024, 13:12
А может кто знает, сколько тактов это прерывание должно занимать?

gid
22.10.2024, 16:06
Никто, кажись, не знает.
Посчитаем.
Прерывание вырабатывается от кадрового синхроимпульса, он возникает каждый раз при формировании экрана.
Экран БК состоит из 256 отображаемых строк + 64 неотображаемых служебных
каждая строка состоит из 32 отображаемых слов + 16 неотображаемых служебных
Итого (256+64)*(32+16) = 320*48 = 15360 слов.
В каждом слове - 8 цветных точек. Итого 122880 точек. Хоть не все их видно, но счётчики внутри микросхемы считают всё.
На каждую точку тратится 8 тактов 6МГц.
Итого получается 983040 тактов 6МГц между каждым синхроимпульсом.

reddie
22.10.2024, 18:35
Никто, кажись, не знает.
Посчитаем.
Прерывание вырабатывается от кадрового синхроимпульса, он возникает каждый раз при формировании экрана.
Экран БК состоит из 256 отображаемых строк + 64 неотображаемых служебных
каждая строка состоит из 32 отображаемых слов + 16 неотображаемых служебных
Итого (256+64)*(32+16) = 320*48 = 15360 слов.
В каждом слове - 8 цветных точек. Итого 122880 точек. Хоть не все их видно, но счётчики внутри микросхемы считают всё.
На каждую точку тратится 8 тактов 6МГц.
Итого получается 983040 тактов 6МГц между каждым синхроимпульсом.

Знают, просто редко уже заходят на форум)) сам пришел лишь после цитирования цитаты выше в БК-канале Телеграма.
"Что ж, давайте посчитаем": в одной экранной строке 192 такта процессора для БК0010 (3МГц) или 256 тактов процессора для 11М (4МГц). Но у десятки кадрового прерывания нет, поэтому сразу переходим к расчетам для 4МГц-версии. Перемножив 256 (тактов в строке) на 320 (строк в кадре), получаем 81920 тактов в кадре.
Предвижу вопросы вида "а откуда взяты цифры 256 и 320"? Что ж, давайте посчитаем (с) Тактовая частота генератора БК известна, 12МГц. Количество ПОЛНЫХ тв-строк в кадре (а не доступных программно и отображаемых графически) - 320. Частота кадров БК тоже известна - 48.82, проверяется любым конвертером типа ГБСЦ или ОССЦ. Подставив в уравнение 256 тактов на строку (при частоте проца 4МГц) и перемножив на 320 строк, получаем 81920. Разделив 12МГц на три (4МГЦ же) и еще раз разделив на 48.82, получим _почти_ 81920 (погрешность тут неизбежна, поскольку 48.82 - округленное значение)

gid
23.10.2024, 08:05
Предыдущий оратор назвал цифры, которые я уже где-то видел, и даже куда-то записал. Только забыл, куда. Поэтому приходится каждый раз вычислять всё заново.
С моими расчётами чё-то совсем не сходится, поэтому пошёл я думать и искать, где у меня косяк.
Оказалось, что сигнал WTI - это не строб сдвига в сдвиговом регистре, а строб загрузки нового слова. Так что до точек можно было не доходить, остановиться на словах.
Итого (256+64)*(32+16) = 320*48 = 15360 слов в кадре.
Каждое слово загружается в регистр сдвига через каждые 8 тактов 6МГц.
Итого, значит, получается 122880 тактов 6МГц между каждым синхроимпульсом кадровой развёртки.

122880/6000000 = 0,02048 секунд. 1/0,02048 = 48,828125 Гц
Вот теперь всё сходится. Без привязки к ТЧ процессора, которая может быть не только 3 или 4 МГц, но и 5, и 6, и вообще любое число.

Jarik65535
23.10.2024, 15:00
Спасибо.
Я хотел сделать 2 режима работы: 60Гц синхронно с кадровой разверткой VGA и 48.82 Гц для AY-музыки. Может стоит добавить режим привязанный к тактам процессора?

BlaireCas
24.10.2024, 12:48
Подключил к БК0011М логический анализатор, синхронизация от генератора БК 12МГц. Итого получились такие размеры экранных элементов (в пиксельклоках 12МГц)
Весь экран: 0x3C000 (245760)
Количество строк: 0x140 (320)
Одна строка: 0x300 (768), в ней (внутри) горизонтальная синхронизация: 0x38 (56)
Верт. синхронизация: тут сложнее, она прерывистая, занимает 3 строки

Полный видеосигнал выглядит как-то так (удвоено по вертикали для красоты). Подсвечен бит синхросмеси.
https://pic.maxiol.com/thumbs2/1729840420.787614286.bkfullscr.png (https://pic.maxiol.com/?v=1729840420.787614286.bkfullscr.png&dp=2)

reddie
25.10.2024, 19:58
Без привязки к ТЧ процессора, которая может быть не только 3 или 4 МГц, но и 5, и 6, и вообще любое число
Верно. Просто ТС не говорил конкретно про пиксельклок, а про некие такты =)
По тактам процессора - 81920 на фрейм при 4МГц, по пиксельклоку - 122880


Я хотел сделать 2 режима работы: 60Гц синхронно с кадровой разверткой VGA и 48.82 Гц для AY-музыки. Может стоит добавить режим привязанный к тактам процессора?
К тактам привязывать не стоит. Точнее, кол-во тактов процессора в одном кадре, разумеется, в идеале должно совпадать с реалом эмулируемой модели (чтобы не косячил софт, привязанный к таймеру, а не к кадровому прерыванию). А вот видеовывод с неродной частотой это извечная проблема... если для большинства игр 60гц вга при 48.8 прерываний не страшно, то для абсолютного большинства демок это будет фатально. Если прям никак не реализовать родную кадровую (или повысить ее до 50гц, пересчитав и все остальное), то компромиссом будет кадровое прерывание 60гц. Главный минус - явное ускорение AY-музыки

shattered
27.10.2024, 15:21
если считать первую видимую строку изображения за 0, то прерывание начинается в конце ССИ, замыкающего строку 256, и запрос удерживается до первого видимого пикселя строки 0. Итого 62.66 строки, или примерно 4010 мкс.

via http://bk10.pdp-11.ru/forum/?id=37018