Pull to refresh

Comments 33

Еще немного и прям нормальную графику реализуешь. Респект!

Спасибо! Думаю это максимум, что можно выжать из этого железа. Другое дело, что можно много классных игрушек сделать, было бы желание.
Таки Апогей имеет нормальный трёхканальный звук, 64 кБ ОЗУ. Ну и в демке используется графика звёздочками, а у меня полноценная псевдографика. И я использовал стопроцентов своё решение. У меня сложнее, так-то я далеко не первый, один из проектов, на который тоже ориентировался (но код уж больно нечист), это вот такой:



Это краткая версия, полная у него по моему часов на восемь. Но тут куча аппаратных доработок, и это читерство.

А не пробовали зайти со стороны того, что при использовании только символов псевдографики достаточно всего одного байта на два знакоместа, а половина кадров у вас дублируется (при вращении от 180 до 360 градусов)? При тех же вводных (78х30 символов, вращение, использование только псевдографики, 24 кб на хранение кадров) можно было бы закодировать кадры с шагом 9 градусов, что дало бы анимацию гораздо плавнее.

Не, не пробовал. Там ещё есть куда и что оптимизировать, но можно было в этой части закопаться ещё на пол года. А мне хотелось увидеть конечный результат, может и не идеальный, но работающий. Поэтому, как уже сказал, добился того, что меня устроило.

Так-то можно взять ваш способ, сжатие, diff и можно было упихать сильно больше кадров.

А есть видео, где вращение сделано вообще без задержек? Ну то есть максимум скорости анимации увидеть, без музыки, только анимация напрямую.

Не совсем понял вопрос. Перечитал, понял.
Музыка никак не влияет на задержки, так как задержки между кадрами всё равно нужно ставить. А если убрать задержку, будет просто мазанное изображение.

Ну вот хотелось на него посмотреть, в динамике.

Не всё сразу, терпение. А так, можете посмотреть гифку вначале статьи.
В функции memcpy можно выкинуть первые три строчки, а метку саму переместить ниже. Экономия — 3 байта кода!!!
Можно, но не нужно. Лишние проверки никому не вредили.
А кто предлагает убирать проверки? Проверка как раз стоит в конце цикла.
Не трушный подход к разработке под 8080. Отказаться от ТРЕХ байтов экономии… И ради чего? Да у нас этой памяти завались просто???
Понимаю, что когда видишь проект и не понимаешь масштабов, хочется зацепиться хоть за что-нибудь, и находишь область: «вот оно». Там можно килобайты оптимизировать, если поработать с кодом. А это место трогать нельзя.
Да, есть у меня особенность такая — когда вижу бессмысленные действия, всегда хочется обратить на них внимание, чтобы что-то упростить.
Насчет килобайтов — сомневаюсь. Разве что алгоритм использовать другой.
А насчет «место трогать нельзя» — это кто сказал?
;memcpy:
; mov a,b ;Copy register B to register A
; ora c ;Bitwise OR of A and C into register A
; rz ;Return if the zero-flag is set high.
loop:
ldax d ;Load A from the address pointed by DE
mov m,a ;Store A into the address pointed by HL
inx d ;Increment DE
inx h ;Increment HL
dcx b ;Decrement BC (does not affect Flags)
memcpy:
mov a,b ;Copy B to A (so as to compare BC with zero)
ora c ;A = A | C (set zero)
jnz loop ;Jump to 'loop:' if the zero-flag is not set.
ret ;Return

Да, на несколько тактов дольше выполняется первая проверка. Принципиально ли это? Если нужно увеличить скорость, можно попробовать развернуть цикл, использовать другой способ копирования. Да и просто проверять не содержимое пары, а отдельно содержимое младшего регистра, и лишь затем делать декремент старшего и его проверку — это даст выигрыш (в среднем) на каждом шаге. Тогда код будет выглядеть чуть иначе:

memcpy:
mov a,b ;Copy register B to register A
ora c ;Bitwise OR of A and C into register A
rz ;Return if the zero-flag is set high.
inr b
loop:
ldax d ;Load A from the address pointed by DE
mov m,a ;Store A into the address pointed by HL
inx d ;Increment DE
inx h ;Increment HL
; dcx b ;Decrement BC (does not affect Flags)
dcr c
jnz loop
drc b
jnz loop
; mov a,b ;Copy B to A (so as to compare BC with zero)
; ora c ;A = A | C (set zero)
; jnz loop ;Jump to 'loop:' if the zero-flag is not set.
ret ;Return

А если серьезно — вызывать функцию копирования нуля байтов странно, особенно в демке. Да, и говорить о масштабах применительно к довольно простой демке для 8080 — тоже.
К сожалению, не знаю, как сделать здесь код более красиво.
Там просто главная засада это во фреймах, в способах сжатия и оптимизации. Вот где главная экономия. На данный момент у меня свободно осталось несколько килобайт (может даже 4-5), так что эти экономии в байтах мне были не интересны.

А вот сделать лишний кадр, для того чтобы вращение было плавнее — интересно. Но уже пороху не хватило.
Сколько тактов тратится на рисование самого большого (сложного) кадра?
Ну я там приводил пример задержки, она где-то 48020*6, плюс копирование (там плавающая величина), ну где-то 2 тысчячи сравнений. Можете посчитать сами. Другое дело, зачем…
Не задержка, а время отрисовки.
Если добавить в информацию о кадре время на его отрисовку, то можно учесть его. Тогда и кадры будут рисоваться строго через равные промежутки, и музыка будет идти в соответствии с ритмом.
Насколько я понял, возможности использовать таймер для измерения временных промежутков в Микроше нет. Или есть?
Насколько я понял, возможности использовать таймер для измерения временных промежутков в Микроше нет. Или есть?


Нету.

Да, музыку можно оптимизировать. Но там отрисовка каждого кадра плавающая. Но лично я на слух не слышу плавания мелодии (кроме перехода с портьеры). Так что смысла не вижу особо. Но как я сказал вам в личном сообщении, вы всегда можете взять и улучшить код, он открыт.

Добрый день! Объясните старому неучу, воспроизведение звука в данном случае - это частотно-импульсная модуляция, оно же широтно-импульсная модуляция с постоянным коэффициентом заполнения 50% ??? Или?

Т.е. тональность буззера будет меняться за счёт изменения частоты прямоугольных импульсов от м/с счетчика, а не от изменения коэффициента заполнения?

ШИМ тут не при чём. Это обычный генератор прямоугольных импульсов заданной частоты, вроде же подробно всё расписал.

А почему не сделать именно ШИМ ? Это позволит регулировать громкость звучания отдельных нот. А если вы подвесите конденсатор в несколько нФ параллельно динамику, то звучание будет качественней (ФНЧ).

И еще, бит управления тоже можно модулировать (программно), у вас получится "второй голос".

Вспомните старый добрый Scream Tracker который манипулируя всего одним битом умудрялся выводить на PC спикер четыре голосовых канала. В середине 90-х это было умопомрачительное зрелище.

https://www.youtube.com/watch?v=_bj6n41Cr1w&t=858s

У вас реальная частота процессора около 300 кГц. С учётом того, что надо выводить видео, это будет невозможно.

Не уверен. Во-первых нужно задействовать контроллер прерываний. Во-вторых, есть ли на Микроше контроллер ПДП ? Если есть, то почти всю работу по проигрыванию музыки можно переложить на аппаратуру. Или наоборот - работу по отрисовке.

Если вы прочитаете первую статью, то там было сказано: не вносить аппаратных изменений.

ПДП только для видео. И больше его не для чего использовать нельзя. Таймер не может генерировать прерывания, вообще, никак.

Если бы было всё так просто, то всё по другому бы реализовал.

Никаких аппаратных изменений (кроме конденсатора) я не предлагаю.

Я не верю в то, что на данном ПЭВМ нет системного таймера способного генерировать прерывания. Где можно ознакомиться со схемой ?

ПДП для видео это уже большое дело, Вы разгрузите ЦП и сможете на нем генерировать музыку.

Я не верю в то, что на данном ПЭВМ нет системного таймера способного генерировать прерывания. Где можно ознакомиться со схемой ?


Зачем мне верить или не верить, я не проповедник. Гугл творит чудеса. Схемы Микроши и различная литература

ПДП для видео это уже большое дело, Вы разгрузите ЦП и сможете на нем генерировать музыку.

Ощущение будто бы вы статью не читали.
В самой первой статье саги, говорил следующее:

В «Микроше» установлен микропроцессор КР580ВМ80А, работающий на тактовой частоте 1,77 МГц, быстродействие которого составляет всего 300 тыс. оп/с (грубо 300 кГц!). Это достаточно мало даже для тех лет. Например, первый микроконтроллер AVR AT90S1200 просто мейнфрейм в сравнении с этим процессором (хотя рассматривать их в одной линейке не совсем корректно). У него хотя бы каждая операция выполнялась за один такт, была команда умножения и таймер генерировал прерывания.


В целом, вы можете купить себе «Микрошу», и заткнуть меня за пояс многоголосым воспроизведением звука. Лично для меня даже такое решение оказалось весьма сложным. Сейчас у вас есть серия моих статей с подробным разбором как всё работает.

А для создания ШИМ разве используется генератор каких-то других импульсов? Можете не отвечать. Спасибо за статью 👍👍👍

Как я помню, этим таймером можно и ШИМ делать. Но это лежит вне моих задач.

Круто, только это не PPK, а Эдуард Артемьев в оригинале, музыка из фильма "Сибириада". PPK сделали только ремейк.

Это именно ППК, но сделана на основе это мелодии. Отличие там есть, она сделана по мотивам, но таки самостоятельное произведение.

Вы можете сравнить сами звучание:



Более подробный разбор был в "Откуда ноты растут". Ну и если бы не ППК, вы бы даже не знали об этой мелодии.
Sign up to leave a comment.