Comments 33
Еще немного и прям нормальную графику реализуешь. Респект!
Ты не одинок в своих развлечениях с клоном 86РК
https://www.youtube.com/watch?v=Nlw-08O7XwE
Это краткая версия, полная у него по моему часов на восемь. Но тут куча аппаратных доработок, и это читерство.
А не пробовали зайти со стороны того, что при использовании только символов псевдографики достаточно всего одного байта на два знакоместа, а половина кадров у вас дублируется (при вращении от 180 до 360 градусов)? При тех же вводных (78х30 символов, вращение, использование только псевдографики, 24 кб на хранение кадров) можно было бы закодировать кадры с шагом 9 градусов, что дало бы анимацию гораздо плавнее.
Так-то можно взять ваш способ, сжатие, diff и можно было упихать сильно больше кадров.
А есть видео, где вращение сделано вообще без задержек? Ну то есть максимум скорости анимации увидеть, без музыки, только анимация напрямую.
Музыка никак не влияет на задержки, так как задержки между кадрами всё равно нужно ставить. А если убрать задержку, будет просто мазанное изображение.
Не трушный подход к разработке под 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 — тоже.
К сожалению, не знаю, как сделать здесь код более красиво.
А вот сделать лишний кадр, для того чтобы вращение было плавнее — интересно. Но уже пороху не хватило.
Если добавить в информацию о кадре время на его отрисовку, то можно учесть его. Тогда и кадры будут рисоваться строго через равные промежутки, и музыка будет идти в соответствии с ритмом.
Насколько я понял, возможности использовать таймер для измерения временных промежутков в Микроше нет. Или есть?
Насколько я понял, возможности использовать таймер для измерения временных промежутков в Микроше нет. Или есть?
Нету.
Да, музыку можно оптимизировать. Но там отрисовка каждого кадра плавающая. Но лично я на слух не слышу плавания мелодии (кроме перехода с портьеры). Так что смысла не вижу особо. Но как я сказал вам в личном сообщении, вы всегда можете взять и улучшить код, он открыт.
Добрый день! Объясните старому неучу, воспроизведение звука в данном случае - это частотно-импульсная модуляция, оно же широтно-импульсная модуляция с постоянным коэффициентом заполнения 50% ??? Или?
Т.е. тональность буззера будет меняться за счёт изменения частоты прямоугольных импульсов от м/с счетчика, а не от изменения коэффициента заполнения?
А почему не сделать именно ШИМ ? Это позволит регулировать громкость звучания отдельных нот. А если вы подвесите конденсатор в несколько нФ параллельно динамику, то звучание будет качественней (ФНЧ).
И еще, бит управления тоже можно модулировать (программно), у вас получится "второй голос".
Вспомните старый добрый Scream Tracker который манипулируя всего одним битом умудрялся выводить на PC спикер четыре голосовых канала. В середине 90-х это было умопомрачительное зрелище.
Не уверен. Во-первых нужно задействовать контроллер прерываний. Во-вторых, есть ли на Микроше контроллер ПДП ? Если есть, то почти всю работу по проигрыванию музыки можно переложить на аппаратуру. Или наоборот - работу по отрисовке.
ПДП только для видео. И больше его не для чего использовать нельзя. Таймер не может генерировать прерывания, вообще, никак.
Если бы было всё так просто, то всё по другому бы реализовал.
Никаких аппаратных изменений (кроме конденсатора) я не предлагаю.
Я не верю в то, что на данном ПЭВМ нет системного таймера способного генерировать прерывания. Где можно ознакомиться со схемой ?
ПДП для видео это уже большое дело, Вы разгрузите ЦП и сможете на нем генерировать музыку.
Я не верю в то, что на данном ПЭВМ нет системного таймера способного генерировать прерывания. Где можно ознакомиться со схемой ?
Зачем мне верить или не верить, я не проповедник. Гугл творит чудеса. Схемы Микроши и различная литература
ПДП для видео это уже большое дело, Вы разгрузите ЦП и сможете на нем генерировать музыку.
Ощущение будто бы вы статью не читали.
В «Микроше» установлен микропроцессор КР580ВМ80А, работающий на тактовой частоте 1,77 МГц, быстродействие которого составляет всего 300 тыс. оп/с (грубо 300 кГц!). Это достаточно мало даже для тех лет. Например, первый микроконтроллер AVR AT90S1200 просто мейнфрейм в сравнении с этим процессором (хотя рассматривать их в одной линейке не совсем корректно). У него хотя бы каждая операция выполнялась за один такт, была команда умножения и таймер генерировал прерывания.
В целом, вы можете купить себе «Микрошу», и заткнуть меня за пояс многоголосым воспроизведением звука. Лично для меня даже такое решение оказалось весьма сложным. Сейчас у вас есть серия моих статей с подробным разбором как всё работает.
А для создания ШИМ разве используется генератор каких-то других импульсов? Можете не отвечать. Спасибо за статью ???
Круто, только это не PPK, а Эдуард Артемьев в оригинале, музыка из фильма "Сибириада". PPK сделали только ремейк.
Вы можете сравнить сами звучание:
Более подробный разбор был в "Откуда ноты растут". Ну и если бы не ППК, вы бы даже не знали об этой мелодии.
Создание демки специально для HABR — Часть 2