PC-01 Lviv

It is currently 28 Mar 2024, 13:48

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 58 posts ]  Go to page Previous 1 2 3 4 Next
Author Message
PostPosted: 29 Aug 2012, 22:33 
Offline

Joined: 29 Mar 2012, 21:35
Posts: 115
Quote:
Поделитесь секретом, как именно домогаетесь.
Можно управлять каждым битом порта С в отдельности. Для этого в управляющий порт ВВ55 выводится команда такого вида:
0000nnnx
где nnn - номер бита, а x - новое значение

Типа так:
Code:
mvi a,0
out 3

mvi a,1
out 3


Top
   
PostPosted: 29 Aug 2012, 22:43 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
Quote:
Можно управлять каждым битом порта С в отдельности. Для этого в управляющий порт ВВ55 выводится команда такого вида:
0000nnnx
где nnn - номер бита, а x - новое значение
Ага, понятно. Теперь нам не нужно беспокоиться об угрозе случайного изменения остальных битов порта C2. А никаких других скрытых возможностей такой способ не предоставляет?

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 30 Aug 2012, 05:47 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Quote:
Чё бы оно не работало. Вполне документированная для ВВ55 команда.
Это понятно, на векторе же такой вариант работает. А вот дешифрацию адресов портов ты по схеме делал (почти риторический вопрос)?
Quote:
А никаких других скрытых возможностей такой способ не предоставляет?
Он предоставляет явную возможность слегка повыпендриваться :)
Quote:
Quote:
3. Для (мизерного) ускорения и сокращения программы (а также просто для удовольствия) используется недокументированная команда.
Откроешь секрет? :)
Секрет Полишинеля. В оригинале используются оба набора регистров (основной и альтернативный) и еще IX. Чтобы после переноса на 580ВМ80 сохранить некое подобие быстродействия пришлось многое переделать на самомодифицирующийся код. В основном меняются аргументы, но в паре мест - команда. Есть два фрагмента типа такого:
mvi a, 20h ;Это и константа для сравнения и nop
cmp d
jc loc_21C
mvi a, 14h ;inc d
loc_21C:
sta loc_253
Сначала после cmp d я написал mvi a,0, а потом убрал, и ничего плохого не случилось. В итоге -4 байта и -14 (вероятно) тактов на ноту. Ерунда, но почему бы и нет. На z80 все равно лучше использовать оригинальный плеер.


Top
   
PostPosted: 30 Aug 2012, 08:34 
Offline

Joined: 29 Mar 2012, 21:35
Posts: 115
Quote:
А вот дешифрацию адресов портов ты по схеме делал (почти риторический вопрос)?
В стандартной конфигурации вроде по схеме (используется один бит для дешифрации одной из ВВ55 и два младших для номера регистра, т.е. по маске 13h).
При добавлении хамелеон-дос пришлось ещё пару бит добавить, но как там реально было, я не знаю.


Top
   
PostPosted: 30 Aug 2012, 08:58 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Еще раз изменил архив - добавил авторов композиций и полные названия (в Examples.src)


Top
   
PostPosted: 02 Sep 2012, 19:08 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
v1.1


Attachments:
MSPLAY.ZIP [10.93 KiB]
Downloaded 759 times
Top
   
PostPosted: 02 Sep 2012, 23:08 
Offline
User avatar

Joined: 11 Aug 2008, 17:05
Posts: 1405
Location: Украина
Quote:
v1.1
Спасибо! Добавлю здесь changelog, копию отправлю в файловый архив.
Quote:
v1.1 - 01.09.2012
Оптимизировнный по скорости и размеру вариант.
Теперь проигрывание можно прервать "Пробелом".
Адрес порта бипера изменен на стандартный.
Добавлен еще один музыкальный пример, теперь их четыре. Полные названия и авторов музыкальных композиций смотрите в папке Examples.src

_________________
Carthago delenda est, Carthaginem delendam esse


Top
   
PostPosted: 21 Nov 2012, 14:19 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Очередной приступ графомании.
Учитывая отсутствие полной ясности с торможением в ОЗУ, звук с предсказуемой частотой можно получить только используя подпрограммы из ПЗУ.
1. Штатная подпрограмма для SOUND, уже описанная в данной ветке - можно вызывать по адресу DE94. На входе длительность в D, полупериод (соответствующий требуемой звуковой частоте) в L. Диапазон извлекаемых частот от 85 Гц до 13387 Гц. Вроде бы неплохой охват звукового диапазона, но "шаги" в этом диапазоне слишком большие, в результате нельзя задать многие ноты большой октавы (с низкой стороны) и нельзя задать без фальши часть нот 3й и 4й октав (с высокой стороны) .
2. Для извлечения звука в некоторых случаях может лучше подойти фрагмент процедуры, используемый для записи пилот-сигнала - можно вызывать по адресу E28D. Длительность (число периодов звуковых колебаний) задается в BC (длительность нот здесь измеряется в целых периодах, а не в, условно говоря, "пакетах тактов", и может быть заметно больше, чем в процедуре DE94, но, с другой стороны, длительность будет зависеть от играемой ноты - IMHO это основной недостаток данной процедуры, т.к. обеспечение примерного равенства длительностей нот разной частоты потребует отдельного внимания). Период колебаний задается ячейками BE82-длительность "нулевой части" и BE83-длительность "единичной части". Возможность раздельного задания длительностей частей периода позволяет менять скважность в широких пределах, а значит можно получить не только разные частоты (определяемые суммой значений), но и тембры (определяемые отношением значений). Диапазон значений получаемых частот несколько уже, чем у предыдущей процедуры - от 284 Гц до 12415 Гц, т.е. в области НЧ даже малая октава не вся охватывается, но, с другой стороны дискретность задания частот в "оставшейся" части выше, чем в DE94. При использовании этой процедуры из бейсика надо не забывать сохранять (до) и восстанавливать (после) значения ячеек BE82-BE83, чтобы стандартно кликала клавиатура и записывался пилот.

UPD: Кстати, в процедуре DE94 для самых высоких частот, которые, правда, вряд ли кто-то будет использовать в музыке, получается не меандр.

UPD2: Сначала как-то стормозил - процедура DE94, если ее вызвать с адреса DE96, позволяет задать полупериод в регистровой паре HL, а не только в младшей части (в L). Это расширяет частотный диапазон вниз чуть ли не до 0, но, к сожалению, точности это не добавляет.


Top
   
PostPosted: 22 Nov 2012, 13:45 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Все заслушиваюсь музыкой. Это просто потрясающе! Наужно еще музыч нарыть и Jukebox под ПК-01 написать.


Top
   
PostPosted: 24 Nov 2012, 14:47 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Сделал нечто под названием Fine Tuned Beep. Идея была в том, чтобы добиться хорошей точности настройки нот в максимально широком частотном диапазоне, для чего пришлось вместо цикла использовать развернутый цикл. В принципе получилось, но:
1. Частоты нот расчитаны для тактовой частоты 2.222222 МГц при отсутствии торможения, т.е. для реала нужно их откорректировать.
2. Даже максимальная длительность ноты довольно мала.

Из непринципиальных вещей, связанных с тем, что я поленился считать - в исходнике нет готовых значений нот с бемолями/диезами. Досчитать их просто - Fноты=2222222/(Задержка*15+44)/2
Если вдруг захотите посчитать субконтроктаву (я опять же поленился) - не забудьте увеличить BeepDelayMax

UPD: Также приложил зачатки плеера с тремя очень простенькими примерами. Дикий темп исполнения создает особый колорит.

UPD2: Доработал "плеер", теперь темп в 2 раза меньше (нормальный) и выходит в бейсик по нажатию пробела.

UPD3: Удалил старые версии в связи с выкладыванием новой, см. на следующей странице


Last edited by ivagor on 28 Nov 2012, 13:39, edited 1 time in total.

Top
   
PostPosted: 25 Nov 2012, 13:04 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
ivagor
Красота! Как я понял все значения нот и длительностей - это такты. Хм... если использовать мелодии в пределах одной октавы, можно попробовать прикрутить фоновую музычку к игре.


Top
   
PostPosted: 25 Nov 2012, 13:51 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Quote:
ivagor
Как я понял все значения нот и длительностей - это такты.
Почти, чтобы получить такты нужно умножить длительности на 30 (в V2) или на 15 (в первом варианте), это слегка приближенно, но довольно точно.
Quote:
ivagor
если использовать мелодии в пределах одной октавы, можно попробовать прикрутить фоновую музычку к игре.
Почему в пределах одной октавы? Фишка этого варианта именно в том, что в широком диапазоне (в т.ч. и для верхних октав) сохраняется хорошая точность задания частот. Другое дело, что сейчас частоты нот рассчитаны для эмулятора EMU, для реала их нужно калибровать собственно с использованием реального ПК-01.
Если для игрушки планируется мелодия в диапазоне малая октава-вторая октава, то IMHO, проще и надежнее использовать ПЗУшную процедурку DE94 (или DE96), она и на реала и в EMU должна работать одинаково, бемоли/диезы уже посчитаны. Недостаток Fine Tuned Beep - нужно сравнительно много памяти, чем более низкие октавы используются тем больше нужно памяти.


Top
   
PostPosted: 26 Nov 2012, 11:43 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Quote:
Почему в пределах одной октавы?
Проблема в том, что паузы для нот нужно заполнять полезными действиями движка, например, отрисовкой графики. Если ноты будут иметь очень широкий диапазон, то нужно будет придумывать дополнительные методы синхронизации, чтобы не было сильной зависимости между музыкой и быстротой игрового процесса. Не скажу, что это не возможно, но трудновато.


Top
   
PostPosted: 26 Nov 2012, 14:20 
Offline

Joined: 23 Aug 2012, 12:28
Posts: 123
Quote:
Проблема в том, что паузы для нот нужно заполнять полезными действиями движка, например, отрисовкой графики. Если ноты будут иметь очень широкий диапазон, то нужно будет придумывать дополнительные методы синхронизации, чтобы не было сильной зависимости между музыкой и быстротой игрового процесса. Не скажу, что это не возможно, но трудновато.
Возможно как минимум 2 подхода и я не совсем понял, о каком из них идет речь:
1. Простой вариант - ноты коротенькие, паузы между нотами заполнены полезными действиями (рисуем на экране и т.п.), желательно чтобы паузы были небольшие, чем меньше тем лучше. Скорее всего паузы между нотами не удастся сделать совсем маленькими и музыка будет отрывистой, типа как в jet set и подобных. Зато при этом используются стандартные звуковые процедуры.
2. Сложный вариант - разделяем задание периода колебаний и их длительности на 2 части - постоянную, в которую можем делать какие-то полезные действия (опять же рисовать и т.п.) и довесок, который будет подстраивать период по конкретную ноту. Fine Tuned Beep как раз несложно переделать в такой вариант, но в целом такой подход слишком сложен.

UPD: Вот еще вариант:
3. Можно играть не отдельные ноты а "звуковой файл". Либо клипировать wav до 1 бита, и выдавать эти биты через равные промежутки в бипер или даже использовать ШИМ. Плюс этих подходов в том, что легче добиться равномерного хода игрового процесса. Минус огромный - нужна куча памяти. На Львове, насколько помню, есть пример воспроизведения музыки на заставке в таком варианте - то ли ROCKMAN то ли ROCKчто-то. Там вроде 16 Кб или больше ушло под короткий фрагмент.


Top
   
PostPosted: 26 Nov 2012, 14:59 
Offline
Site Admin
User avatar

Joined: 24 Jul 2008, 12:05
Posts: 1070
Я говорю как раз о втором варианте. Я его уже пробовал описать в теме про движок. По-моему, это единственный прийнятный вариант для музыкального оформления во время игры. Я бы его даже в демке опробовал, но к сожалению у меня есть несколько не равных по продолжительности фрагментов, обрабатывающих логику. Апдейтить текущий движок - скорее всего ничего не доделать. Так что идея отсалась на будущее.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 58 posts ]  Go to page Previous 1 2 3 4 Next

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited