Обновить
79
0.5
Алексей@BiTL

Пользователь

Отправить сообщение

Чтобы пользоваться хотя бы нулевым с каким-то иным разрешением, нежели 18.2мс, нужно было, чтобы ваша софтинка сама контролировала системное время.

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

Вкратце:

Скрытый текст
#include <dos.h>
#include "timer.h"

static void interrupt (*old_timer)();

void interrupt timer()   // ticks once per millisecond
{
    static unsigned count_55ms = 0;

    // our code

    // execute default handler
    if (++count_55ms == 55)
    {
       old_timer();
       count_55ms = 0;
    }
    else outp (0x20, 0x20);
};


void main()
{
   // timer init
   new_divisor (1193);           // 1 tick per 1ms
   old_timer = _dos_getvect (8); // save vector
   _dos_setvect (8, timer);      // set new vector

   // our program

   new_divisor (0);   // restore timer
   _dos_setvect (8, old_timer);
};


Если бы я сам не программировал таймер, я бы не спорил. А вы спорите со мной по вещам, которые я делал буквально вчера (чекайте мои статьи).

И как вы думаете в DOS работают музыкальные плееры Adlib (OPL2), в том числе в играх, у которого в отличии от Sound Blaster нет своего прерывания? Ессесно на таймер вешается.

Пытаться измерить производительность и на этой основе выставлять временные коэфициенты - это полная хрень. Нам ведь нужно прерывание, а не просто delay(). А просто "делэй" можно сделать ожиданием обратного хода луча развертки, поскольку частота развертки у конкретных видеорежимов была одинаковая на всех компьютерах. Но это полумера.

таймер Intel 8253/8254, что стоял в IBM PC-совместимых по дефолту тикает со скоростью 18.2 раза в секунду. Но можно перепрограммировать хоть в 1/1000. Хотя для игровой анимации обычно хватает скорости равной частоте развертки.

просто и раньше нормальные программисты события в игре привязывали к таймеру, и этим играм было по-барабану, турбо/нетурбо.

P.S.: Сейчас такты процессора считать - странно, особенно учитывая, что основная нагрузка на GPU ложится.

Нет, в нажатом состоянии она не уменьшает ничего, а как раз в отжатом - замедляет. Если, конечно, правильно подключена.

Эт когда она отвязалась? ) Все еще вроде зависит.

А так-то и раньше производительность зависела не только от частоты.

Так если абсолютно у всех была эта кнопка "Turbo", то в чем тайный смысл маркетинга? А еще можно пофантазировать, что кнопку включения назвали "Power" также из маркетинговых целей, так ведь круче! Power! А не "On/Off".

Кстати, даже у ZX Spectrum самопальных была кнопка "Turbo". Тоже видимо для пафоса и повышения продаж?

Всё изменилось с приходом маркетологов, которые быстро смекнули, что «медленный режим» — это то, что интересно пользователям. Нужно было продавать скорость, производительность, мощь!

Не понял логической цепочки.

Это создавало мощную иллюзию контроля и технологичности. Пользователь буквально видел, как его компьютер «ускоряется» или «замедляется».

....

Но здесь скрывалась самая большая ирония всей этой истории.

....

Это был стопроцентный маркетинговый трюк, призванный впечатлить покупателя и дать ему ложное, но приятное чувство участия в управлении мощностью машины.


Так и не понял - в чем был заговор. Автор что-то скрывает от нас! Не иначе как маркетолог! Пытается создать иллюзию, делает пасы рукаме и интригует!

Кнопка турбо действительно управляла скоростью компьютера и именно через частоту процессора. Понижает - или повышает - это вопрос точки зрения :)

поскольку в 80е еще вовсю жил СССР и вопрос покупки иностранного программного обеспечения был мягко говоря неактуальным.


Ну вообще-то СССР покупал и иностранное ПО, и программно-аппаратные комплексы целиком, вместе с ПО. У той же Франции, например. И даже у США и Англии в моменты оттепелей. С конца 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

Спасибо! :)

Благодарю за отзыв :)

А не с чем подаваться.

В каком-то смысле. Но не орги Ассембли. Чтобы получить призы, нужно присутствовать на пати. С этим возникли проблемы.

На PC в DOS "Hello word" в 23 байта помещается.

Но, к слову и под Виндовс можно намного меньше, чем у автора, если юзать асм, а не Си.

и это ужасно (хотя на самом деле пустая программа в TP 7 дает 1.5 кб ЕХЕ).

В том цикле, который палитру создаёт, вам точно надо 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 вообще стоит забыть :)

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

Спасибо за вдумчивое изучение кода :)

Информация

В рейтинге
2 280-й
Откуда
Актобе (Актюбинск), Актюбинская обл., Казахстан
Дата рождения
Зарегистрирован
Активность