Вопрос по портам и прерываниям:
В процедуре опроса клавиатуры имеется восьмикратное чтение портов. Влияет ли чтение портов на задержки прерываний?
Вид для печати
спасибо!
Обращение к портам у 48/128 не влияет на задержки, а тормозится задержками. Причем время задержки обращения к порту зависит от номера порта. Но чтение портов в процедуре обработки прерывания никак не тормозится, потому что происходит в начале кадра, когда до задержек ULA ещё далеко (они происходят во время вывода растра (основной картинки, закодированной пикселами/атрибутами), и вызваны чтением видеопамяти ULA-й).
У прерываний на Спектруме обычно нет никаких задержек. Пришел сигнал INT во время выполнения команды, и если прерывания разрешены, после выполнения этой команды идет вход в прерывание. Исключение для команд EI, префиксов #DD/#FD (и других префиксов (#CB и #ED) тоже, но другие префиксы не образуют цепочки, являются частью команд), и команд LD A,I/LD A,R на CMOS Z80 - после них подтверждения прерывания не происходит. (Поэтому если во время прихода INT выполнять цепочку из таких команд всё время активности INT, прерывание не произойдет, а обычно оно происходит после следующей за командой-исключением командой. Можно считать, что вход в прерывание задерживается командами-исключениями.)
- - - Добавлено - - -
Обычно есть. Стандартное время сигнала INT на 48м - 32 такта, на 128м - 36 тактов, за это время короткий обработчик прерывания, укладывающийся в это время с запасом, может выполниться дважды. Нормальные эмуляторы это эмулируют.
я говорю про длину инта 300+ тактов
когда срабатывает даже большой обработчик по 2 раза...
ну и да
19 тактов вход в им2 обработчик
10 тактов рет
даже если обработчик будет просто инкрементить регистр 4 такта
то на оригинальном 48-м он отработает вполне нормально свой один раз
и все будет в шоколаде
а если юзать рети то в шоколаде все и на 128-м
...
то есть такая длина не с проста :)
нормальный полезный обработчик гарантировано больше инта
...но в отечественных поделиях
какая либо длина инта не гарантирована...
и смысол вешать на инт один рет? (разве что он иногда заменяется нопом)
даже так
повторное срабатывание такого обработчика сдвинет разве что мультикороры...
код синхронизирующийся по халту (для которого обработчик как раз может быть и один рет)
летать от этого тоже не станет..
Один RET быть не может, т.к. вход в прерывание запрещает прерывания, минимум EI:RET. 19+4+10=33. Такой на 128м может отработать дважды. И такие короткие обработчики бывают не так уж редко - когда от прерываний нужна только синхронизация с началом кадра. Попадались и в играх, и в демах.
- - - Добавлено - - -
Повлиять двойное срабатывание прерывания может на потактовые видеоэффекты (гигаскрины-мультиколоры), на запись RZX, на тесты таймингов, на генерацию биперного звука.
- - - Добавлено - - -
Самый смак, если поставить EI первой командой в обработчике. Тогда и на 48м будут двойные срабатывания, независимо от длины обработчика.
до в случае с полезным обработчиком его пропустил
так что и на 128 полезный обработчик отработает правильно
а вот с тем когда синхронизация только по хальт
можно делать и
ei halt
которые затачиваются под конкретную машину с явно фиксированной длиной инта
разве что обработчик 31...35 тактов и когда вероятность двойного срабатывания не велика но есть
по идеи rzx должен крутиться на той же машине с той же длиной инта
тоесть зависит уэе от криворукости эмулятора писателя или качества самого формата
тут уже совсем мимо
часто биперные движки вообще без синхронизации с интом и все на своих счетчиках
и делают вообще di
разве что у specialfx какой то счетчик на инте? (вроде еще не копал)
и при 300+ тактов инта
получаем +600% к темпу
а там сколько кондер успеет пропустить столько и длина...
начет пентагон кривой клон (чего даже не требовалось доказывать :) )
а резиновом и не только спектруме
инт по людски прет из улы
тогда вопрос
че мешало в формате рзх заложить эту вашу длину инта...
...изначальная заточенность под резинки?
конечно продумать все сразу не всегда можно
но что мешает запилить новую версию формата с учетом уже накопленных граблей
а не продолжать грызть кактус
тем более больше подробностей в формате потребует только запись с пентагона
для эмулятора резинки можно вполне оставлять старый формат
а может получится даже притулить новую инфу в конец файла или еще кудато чтоб новый формат жрали старые эмуляторы
(спецификации рзх у меня нет... и не особо то мне нужна...)
да и по хорошему rzx должен содержать инфу об эмуляторе его версии
для воспроизведения именно на этом эмуляторе и версии (как обычно и делается)
или в случае детекции несовместимости версий
запиливание режимов совместимости для старого рзх силами самого эмулятора
...а не как всегда...
- - - Добавлено - - -
ну да 40 игор это же "гигантский" процент спектрумовского софта
ну и те что я запускал
вроде работало нормально
...хотя мало ли
может оно уже кем то было пофикшенно...
да и впервые я наткнулся на траблы явно с интом
на новодельных софтах...
А вот на одном Пентагоне демка с EI:RET будет работать нормально, а на другом - через жопу. Я в эмуле поставил 36 тактов - и нашлась дема, для которой это много.
Формат rzx на длину INT не смотрит, он к ней не привязан, и она в нём не кодируется, ибо не нужна. Но с длинным INT и коротким обработчиком в файле RZX будут короткие "фреймы" с парой-тройкой команд.
Что-то мне подсказывает, что любая сложная музыка на бипере без IM2 не обойдется. Разве что WHAM-овский двухголосый движок прерывания не использует, или совсем примитивные одноголосые. Навскидку потыкал сейчас игрушки с сложной музыкой - все сидят на IM2, кроме тех, что на WHAM-движке.
скорей это показатель что у аффтара была кривая машина
чем то что у всех пентагонов именно так
тут надо чтоб кто нить посчитал калькулятором
какая же длина задумывалась разработчиком
и замерять на нескольких реалах (с разными сериями микросхем в участке формирования инта но с правильным номиналом еще не дохлого кондера)
рука лицо :v2_dizzy_facepalm:
понашлись тут музыковеды...
конечно на им2 можно повесить плеер
но частоту тона это не спасет
и в турбе это будет пищать
мало того изза того что программно нельзя отличить какой набор регистров сейчас активный
плеер на прерываниях не может нормально узнать что же ему менять в некоторых случаях
можно конечно выделить регистр для ориентирования
например B которые используется для out (C),x
но это не дает 100% гарантии что прерывание определит текущий набор регистров
и собственно это занимает 1 рег
который вполне можно было использовать
...например как счетчик длины ноты чтоб играть без прерываний :)
.....конечно можно держать в каждом bc ххFE
но скорей всего по тактам это не рационально...
(тк отдавать целую регистровую пару...)
так же некоторые движки ВНЕЗАПНО используют регистр SP
что как бы повышает "сложность" движка
тк теперь можно делать add hl,bc add hl,de add hl,sp меняя только hl но не перегружая bc\de\sp
в качестве явного примера помоему tritone
нет помоему там счетчики лежат в обоих наборах регистров
но sp используется для инкремента таким же образом
у мя прекрасно звучала
и игра фигзнает сколько загружалась
чтоб только покрутить эту музычку (сама не плеябельная)
все со special fx?
бери качай 1трекер с 40+ движками
https://shiru.untergrund.net/files/1tracker.zip
и смотри в 1tracker\engines
как же часто используются прерывания
А что трекер, ты назови игры, в которых используется бипер-движки не WHAM и не на прерываниях. Я проверял - Savage, Golden Axe, Hysteria, Quazatron, Beyond the Ice Palace, Star Wars, Chase H.Q., Mikie, Saboteur 2, Target Renegade, Impossible Mission 2, Transmuter - все на IM2. На не IM2 и не WHAM нашел Chronos, Renegade, Manic Miner.
Многие движки уже в этом веке написаны, подозреваю.
- - - Добавлено - - -
Вполне плеябельная, я её даже прошел на своей Орельке когда-то.
а у меня на компе (с кривым int`ом) в Trantor`e кроме быстрой музыки ещё и время в игре быстро уменьшалось,
но я тогда правильных компов не видел и думал что так и надо
многие да
но там есть и старые движки прошлого века
при желании можно привести список и в обратном соотношении
Quazatron без им2
Hysteria
Beyond the Ice Palace
Star Wars
по моему на special fx
o_O
может умя тоже были траблы с таймером?
то да время летело жестко
даже не буду морочить себе голову
и сделаю по аналогии с "игры от probe"
Vectron
Subterranean Stryker
Star Firebirds
Raw Recruit
Future Games
Chronos - уже был
Agent X \ Agent X II
при желании знаю где найти еще...
Star Paws - даже ау плеер не на прерываниях :)
Peter Pack Rat - тоже ау дичь...
- - - Добавлено - - -
ткнул в унриале длину инта
320
3200
32000
77000
и нифига
...унриал не меняет? длину инта в таком диапазоне о_О
попробовал 3 унриала разных проивзодителей...
(ну частоту и количество тактов в фрейме тоже не все можно поставить)
чисто визуально
не то игровой процесс несколько медленней
счетчик ощутимо медленней вроде? не тикает или незначительно медленней...
хз я оно ниасилил
хотя у меня даже была карта в журнале...
Надо подкрепляться постоянно в типа автоматах, тогда времени может хватить. Но там можно и неприятный сюрприз поймать.
Да, тут я ошибся.
Только Hysteria.
Итого, на IM2 биперная музыка висит в очень многих играх. По крайней мере среди запомнившихся мне их большинство. Но и да, сложная музыка на бипере может воспроизводиться и без IM2.
- - - Добавлено - - -
Проверил в эмуле, есть такое. Правда, для trantor нужен серьезно более длинный INT для ускорения музыки. Где-то до 270 тактов INT музыка в нем играется нормально, потом вроде как зависает, а начиная с где-то 600 играет сильно ускоренно.
до я в курсе
но серавно меня или быстро киляли
или время выходило...
...щас уже играть в что либо вообще не получается... (не находиться на это времени)
чтоб еще пробовать...
я тоже помню что в унриале можно было...
но щас вообще результата 0
даже на"отборном" унриале которым пользуюсь много лет
о_О
Насчёт 128-го да, 36 тактов. Насчёт 48-го, насколько помню там были вопросы по длительности прерывания. В ZXMAK2 используется длительность взятая в fuse - 32 такта. Но подтверждения с реального железа, насколько помню, получить так и не удалось. Хотя возможно путаю, может вопрос был с early/late. Уже не помню деталей.
А откуда у вас информация про 32 такта на 48-ом?
Есть тест Яна Бобровского minfo.tap, раньше можно было посмотреть здесь: http://www.wizardae.tk/~jb/qaop/tests.html, сейчас тесты там недоступны, но можно скачать в вебархиве: https://web.archive.org/web/20171115...aop/tests.html .
Он меряет длину импульса прерывания, и подсвечивает её красным, если она нестандартная. Вот он считает стандартной длину 32 такта.
- - - Добавлено - - -
Да, опытным путем проверкой результатов другого теста с реала выяснилось, что для late длина импульса 33 такта. Так что в этом плане проверено на реале - на другом тесте, но тем не менее. Да и minfo не с потолка считает 32 такта стандартной длиной.
Я же прочитал, запускал из вебархива
Не знаю, у меня анриал чуть новее, всё работает. Только не автостартуют тесты почему-то, надо после открытия их загружать через тейп лоадер в меню 128го, или load"" .