Чтобы пользоваться хотя бы нулевым с каким-то иным разрешением, нежели 18.2мс, нужно было, чтобы ваша софтинка сама контролировала системное время.
Не вижу проблемы. Системное время не надо контролировать, просто вешаем свой обработчик на вектор 8 (сохранив старый) и из своего обработкичка вызываем старый через нужные промежутки тиков.
Если бы я сам не программировал таймер, я бы не спорил. А вы спорите со мной по вещам, которые я делал буквально вчера (чекайте мои статьи).
И как вы думаете в DOS работают музыкальные плееры Adlib (OPL2), в том числе в играх, у которого в отличии от Sound Blaster нет своего прерывания? Ессесно на таймер вешается.
Пытаться измерить производительность и на этой основе выставлять временные коэфициенты - это полная хрень. Нам ведь нужно прерывание, а не просто delay(). А просто "делэй" можно сделать ожиданием обратного хода луча развертки, поскольку частота развертки у конкретных видеорежимов была одинаковая на всех компьютерах. Но это полумера.
таймер Intel 8253/8254, что стоял в IBM PC-совместимых по дефолту тикает со скоростью 18.2 раза в секунду. Но можно перепрограммировать хоть в 1/1000. Хотя для игровой анимации обычно хватает скорости равной частоте развертки.
Так если абсолютно у всех была эта кнопка "Turbo", то в чем тайный смысл маркетинга? А еще можно пофантазировать, что кнопку включения назвали "Power" также из маркетинговых целей, так ведь круче! Power! А не "On/Off".
Кстати, даже у ZX Spectrum самопальных была кнопка "Turbo". Тоже видимо для пафоса и повышения продаж?
Всё изменилось с приходом маркетологов, которые быстро смекнули, что «медленный режим» — это то, что интересно пользователям. Нужно было продавать скорость, производительность, мощь!
Не понял логической цепочки.
Это создавало мощную иллюзию контроля и технологичности. Пользователь буквально видел, как его компьютер «ускоряется» или «замедляется».
....
Но здесь скрывалась самая большая ирония всей этой истории.
....
Это был стопроцентный маркетинговый трюк, призванный впечатлить покупателя и дать ему ложное, но приятное чувство участия в управлении мощностью машины.
Так и не понял - в чем был заговор. Автор что-то скрывает от нас! Не иначе как маркетолог! Пытается создать иллюзию, делает пасы рукаме и интригует!
Кнопка турбо действительно управляла скоростью компьютера и именно через частоту процессора. Понижает - или повышает - это вопрос точки зрения :)
да, "unlimited bobs" популярная тема :) На PC в демке Poor 2/Majic12 (для 386-го) есть сцена с кубиками базирующаяся на этом принципе https://youtu.be/R7Sg_B2PLyk?t=85
В том цикле, который палитру создаёт, вам точно надо mov ax, 1010hделать каждый раз внутри цикла? Может вынести в начало?
Да, можно и в начало. Правда есть еще один трюк, помогающий скостить 2 байта, если таки оставить "mov ax, 1010h" в цикле: убрать "int 10h" в инициализации видеорежима, а в цикле инита палитры "int 10h" поставить перед "mov ax, 1010h". Таким образом на первом цикле установки палитры как раз включится видеорежим (посколько AX все еще будет равен 0013h), а уж последующие циклы начнут устанавливать палитру. Поэтому я по привычке оставляю mov ax, 1010h внутри цикла. В статье решил не запутывать читателя лишний раз.
С блюром у вас занятно: для самого верхнего ряда вы обращаетесь и к предыдущим 320 байтам, которые вообще не в буфере.
На самом деле в "реальном режиме" нельзя обратиться к памяти вне сегмента. А буфер у нас - это весь сегмент (64кб). "add al, [si-320]" эквивалентен операции "add al, [si+65216]", ну а если si+65216 превышает 65535, то происходит сброс c переносом.
хотя достаточно обработать fa00h байт.
Если проходить блуром только 64000 точек, то будут некрасивые артефакты вверху экрана. Догадайтесь почему :)
В цикле блюра можно было бы обойтись одним регистром, тем же SI. Я думаю, что inc si выставит флаг нуля, и вместо loop сделать переход через jnz.
Да, можно. Правда в данном случае это на размер не повлияет (так как мы все равно убрали "xor cx, cx"). Но это правильный ход. Причем на старых процессорах (386-й, 486-й) "LOOP" еще и значительно медленнее, чем "dec + jnz", так что если важна скорость, то про LOOP вообще стоит забыть :)
На самом деле с представленным в статье кодом можно еще много чего сделать, чтобы уменьшить размер, я намеренно не стал дожимать все что мог, ожидая что читатели сами найдут такие места.
Не вижу проблемы. Системное время не надо контролировать, просто вешаем свой обработчик на вектор 8 (сохранив старый) и из своего обработкичка вызываем старый через нужные промежутки тиков.
Вкратце:
Скрытый текст
Если бы я сам не программировал таймер, я бы не спорил. А вы спорите со мной по вещам, которые я делал буквально вчера (чекайте мои статьи).
И как вы думаете в DOS работают музыкальные плееры Adlib (OPL2), в том числе в играх, у которого в отличии от Sound Blaster нет своего прерывания? Ессесно на таймер вешается.
Пытаться измерить производительность и на этой основе выставлять временные коэфициенты - это полная хрень. Нам ведь нужно прерывание, а не просто delay(). А просто "делэй" можно сделать ожиданием обратного хода луча развертки, поскольку частота развертки у конкретных видеорежимов была одинаковая на всех компьютерах. Но это полумера.
так ведь был https://ru.wikipedia.org/wiki/Intel_8253
таймер Intel 8253/8254, что стоял в IBM PC-совместимых по дефолту тикает со скоростью 18.2 раза в секунду. Но можно перепрограммировать хоть в 1/1000. Хотя для игровой анимации обычно хватает скорости равной частоте развертки.
просто и раньше нормальные программисты события в игре привязывали к таймеру, и этим играм было по-барабану, турбо/нетурбо.
P.S.: Сейчас такты процессора считать - странно, особенно учитывая, что основная нагрузка на GPU ложится.
Нет, в нажатом состоянии она не уменьшает ничего, а как раз в отжатом - замедляет. Если, конечно, правильно подключена.
Эт когда она отвязалась? ) Все еще вроде зависит.
А так-то и раньше производительность зависела не только от частоты.
Так если абсолютно у всех была эта кнопка "Turbo", то в чем тайный смысл маркетинга? А еще можно пофантазировать, что кнопку включения назвали "Power" также из маркетинговых целей, так ведь круче! Power! А не "On/Off".
Кстати, даже у ZX Spectrum самопальных была кнопка "Turbo". Тоже видимо для пафоса и повышения продаж?
Не понял логической цепочки.
Так и не понял - в чем был заговор. Автор что-то скрывает от нас! Не иначе как маркетолог! Пытается создать иллюзию, делает пасы рукаме и интригует!
Кнопка турбо действительно управляла скоростью компьютера и именно через частоту процессора. Понижает - или повышает - это вопрос точки зрения :)
Ну вообще-то СССР покупал и иностранное ПО, и программно-аппаратные комплексы целиком, вместе с ПО. У той же Франции, например. И даже у США и Англии в моменты оттепелей. С конца 50-х по 80-е было купленно масса компьютеров и всяких вычислительных комплексов.
Пруфы: https://www.etheroneph.com/index.php/machinery/586-zapadnye-evm-v-sssr.html
https://www.etheroneph.com/machinery/588-zapadnye-evm-v-sssr-spisok.html
https://www.kommersant.ru/doc/101251
https://topwar.ru/189960-rozhdenie-sovetskoj-pro-bjesm-saga-chast-iii.html
да, "unlimited bobs" популярная тема :) На PC в демке Poor 2/Majic12 (для 386-го) есть сцена с кубиками базирующаяся на этом принципе https://youtu.be/R7Sg_B2PLyk?t=85
Спасибо! :)
Благодарю за отзыв :)
А не с чем подаваться.
В каком-то смысле. Но не орги Ассембли. Чтобы получить призы, нужно присутствовать на пати. С этим возникли проблемы.
http://www.sizecoding.org/wiki/Linux
На PC в DOS "Hello word" в 23 байта помещается.
Но, к слову и под Виндовс можно намного меньше, чем у автора, если юзать асм, а не Си.
и это ужасно (хотя на самом деле пустая программа в TP 7 дает 1.5 кб ЕХЕ).
Да, можно и в начало. Правда есть еще один трюк, помогающий скостить 2 байта, если таки оставить "mov ax, 1010h" в цикле: убрать "int 10h" в инициализации видеорежима, а в цикле инита палитры "int 10h" поставить перед "mov ax, 1010h". Таким образом на первом цикле установки палитры как раз включится видеорежим (посколько AX все еще будет равен 0013h), а уж последующие циклы начнут устанавливать палитру. Поэтому я по привычке оставляю mov ax, 1010h внутри цикла. В статье решил не запутывать читателя лишний раз.
На самом деле в "реальном режиме" нельзя обратиться к памяти вне сегмента. А буфер у нас - это весь сегмент (64кб). "add al, [si-320]" эквивалентен операции "add al, [si+65216]", ну а если si+65216 превышает 65535, то происходит сброс c переносом.
Если проходить блуром только 64000 точек, то будут некрасивые артефакты вверху экрана. Догадайтесь почему :)
Да, можно. Правда в данном случае это на размер не повлияет (так как мы все равно убрали "xor cx, cx"). Но это правильный ход. Причем на старых процессорах (386-й, 486-й) "LOOP" еще и значительно медленнее, чем "dec + jnz", так что если важна скорость, то про LOOP вообще стоит забыть :)
На самом деле с представленным в статье кодом можно еще много чего сделать, чтобы уменьшить размер, я намеренно не стал дожимать все что мог, ожидая что читатели сами найдут такие места.
Спасибо за вдумчивое изучение кода :)