1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.151
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Спасибо, я посмотрю.

    Насчет VBL я ошибся - это не из TB Multisound SDK, а прямо-таки код MIDI-драйвера AIL для TB Multisound Classic. Придется переписывать, наверное, раз это так ненадежно. Игры-то в разных разрешениях бывают.

    Впрочем, в самом SDK еще и похлеще написаны задержки. Например, for(int i = 1; i < 20000; i++).
     
  4. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Да там же нет особо разницы, подождать X миллисекунд, или подождать X*1.2 миллисекунд, так что не сильно важно.

    Все равно, от нечего делать написал реализацию:
    Код:
    sysex_wait      PROC Delay             ;Delay after System Exclusive message
                    USES ds, ax, cx, bx    ;transmissions
                    ; will only work with standard IRQ 0 handler, when interrupts are NOT disabled
    
                    mov ax, 40h             
                    mov ds, ax              
                    mov bx, 6Ch            ; Load BIOS Timer pointer
    
                    mov ax, [Delay]        ; Load 14 ms delay factor
                    mov cx, ax             ; Get count = (3 * x + 1)/4 
                    add ax, ax
                    inc ax
                    add cx, ax
                    shr cx, 2
    
                    jcxz __exit            ; Exit immediately if Delay was 0
                    inc cx                 ; First period may be < 18.2, so add 1
    __sync_1:       mov al, [bx]
    __sync_2:       cmp [bx], al
                    jz __sync_2            ; Wait for next 18.2 period
                    loop __sync_1
    __exit:         ret
                    ENDP
    
    Только у меня сомнения, что код, играющий MIDI, не трогает таймер, или что этого не делает любая игра, использующая драйвер. :)
     
    Последнее редактирование: 12 янв 2015
    Geryon нравится это.
  5. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Есть ещё забавный способ - вешаться на прерывание от COM-порта по готовности данных, программировать его на передачу и из обработчика прерывания передавать следующий байт. Был описан в журнале "Index PRO". Я на этом способе сделал замедлитель компьютера, выжимал частоту прерываний около 8 килогерц и, соответственно, получал вполне себе плавную работу при более-менее 200-кратном замедлении.
     
  6. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра, Отличная идея, уж COM-порт-то можно свободный найти! Но богатство выбора задержек не ахти :(
     
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Пхе, элементарно, Ватсон! Минимальная - чуть больше сотни мкс; можно играть скоростью порта, кол-вом битиков (чётность и стоп-биты) - этим меняешь частоту IRQ и задержка немного растёт; а ещё ж можно маневрировать кратностью срабатывания - реагировать на каждое N-е прерывание.
    Наконец, можно использовать furrball (или fuzzball, точно не помню) - порт на каждом тике перепрограммировать: давать то такие параметры, то этакие. В результате средняя частота IRQ может меняться вообще плавно.
    В оригинале статьи от порта синхронизировался то ли ковокс, то ли вообще спикер, там была проблема задрать частоту ещё выше. Не помню чем кончилось. :-(

    PS. Кстати, эту же фишку можно применить ещё для двух вещей - профилирования и анализа покрытия кода. Обработчик прерывания должен фиксировать место в проге, которую прервал, а после прогона останется только обработать накопленную статистику.
     
    nop нравится это.
  8. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Это уже многовато. PIT позволяет от 2-3 сделать, по-моему(теоретически, если процессор позволит). Я лично делал около 50-60 на 386 без проблем и вроде оставался запас. Кроме того, можно ли, имея необходимость, создать точную произвольную задержку в пределах 5..1000000 мкс не городя огорода? Это ведь именно то, что нужно в "правильном" сидплеере и тому подобных вещах. Конечно, на практике выше крыши хватит меньшей точности, но всё таки!
     
    Последнее редактирование: 12 янв 2015
  9. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Круто! Только я думаю, что трогает :(

    Как быть в этом случае?
     
  10. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Оставить тот, что был, я ж написал :) Подумаешь, в режиме 640x480 задержки в 7/6 удлинятся, или без видюшки повиснет...
    Но вообще, по досом всё зависит от того, с каким другим кодом этому придется делить ресурсы.
    Если это драйвер, играющий MIDI, то он в любом случае должен быть завязан на какой-то надежный таймер, для проигрывания нот вовремя. Может, это обычный системный, но временно установленный на другую частоту, может, это таймер, предоставляемый звуковой картой. Вот к нему-то и надо привязаться.
     
  11. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Я проверил: там ужас-ужас-ужас! Библиотека поддерживает до 16 драйверов одновременно, и каждому может быть назначен отдельный таймер, а стандартный обработчик заменяется целым менеджером таймеров.

    Код:
    hook_timer_process PROC                 ;Take over default BIOS INT 8 handler
                    USES ds,si,di
    
                    pushf
                    cli
                    
                    mov ax,0                ;get current INT 8 vector and save it
                    mov es,ax               ;as reserved timer function (stopped)
                    mov bx,es:[(8*4)]
                    mov es,es:[(8*4)+2]
    
                    mov WORD PTR bios_callback,bx
                    mov WORD PTR bios_callback+2,es
    
                    mov bx,OFFSET bios_caller
                    mov WORD PTR timer_callback[BIOS_H*4],bx
                    mov WORD PTR timer_callback[BIOS_H*4]+2,cs
    
                    IF USE_INT8
    
                    mov ax,cs
                    mov ds,ax
                    mov dx,OFFSET API_timer
    
                    mov ax,0                ;replace default handler with API task
                    mov es,ax               ;manager
                    mov es:[(8*4)],dx
                    mov es:[(8*4)+2],ds
    
                    ELSE
    
                    call RTC_set_freq C,RTC_FREQ_BITS
                    call RTC_enable
                    call RTC_install
    
                    ENDIF
    
                    POP_F
                    ret
                    ENDP
    
     
  12. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    1.19 МГц (точнее частоту не помню), но задолбательская процедура его программирования. :-(
    Увы: регенерация памяти будет путаться под ногами, от неё многие десятки микросекунд (а по писимисиським данным - и под миллисекунду) недоступности шины. :-(
    Вторая фишка - время на открытие аппаратной страницы памяти, тоже ЕМНИП сколько-то сотен микросекунд от обращения до результата. Исходники тестера видел у Мыщъха в, если не ошибаюсь, "Тайнах оптимизации программ".
    Впрочем, можно навскидку померять руками: прицепить обычный аналоговый джойстик (а ещё - вместо него пару постоянных резюков по 50 кОм), запустить простенькую программку с циклом опроса джойстика и посмотреть, как будут трепыхаться счётчики. Последний раз мерял на своём Celeron Northwood, когда покупал, - наблюдал болтанку в 10-15%. :-(

    ---------- Сообщение добавлено в 00:06 ---------- Предыдущее сообщение размещено в 00:04 ----------

    Кстати, в таких условиях чем COM-порт лучше таймера - не будет потери прерываний. Стабильность частоты-то подплывёт хоть так хоть этак... :-(
     
  13. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Да все ок. Частота вызова обработчика ведь константная, как я вижу. 14318180/12/RTC_FREQ_BITS. Может он даже пытается тот счетчик по адресу 0040:006C все равно инкрементировать, или свой крутит. Вот его и проверяем для задержки. Или добавляем свой код для того же.

    ---------- Сообщение добавлено в 01:25 ---------- Предыдущее сообщение размещено в 01:20 ----------

    Бывает и хуже :) Нормально еще.
    Ну COM-порт хуже уже хотя бы тем, что никто не обязан его для тебя разрешать в биосе, или оставлять неиспользуемым :).
    И, кстати, любое аппаратное прерывание - ж вроде ожидает в очереди, пока не обработано, нет?
    Ну, это наверное только в защищенном режиме, да еще и под виндовсом, ИМХО. Не должно быть столько для доступа к физической памяти. Сотни наносекунд - поверю. А если и будет, то это разовая ситуация, потом главное - в кэше.
     
    Последнее редактирование: 13 янв 2015
    Рыжий Тигра нравится это.
  14. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Тем не менее. :-( Там какая-то байда с перепрограммированием коммутатора старших-младших адресных линий, насколько помню. А чипсет i845PE позволяет держать одновременно открытыми где-то аж 32 физ-страницы (это по 32 и ли 64 КБ, точнее не скажу).
    Я на эти грабли напарывался, когда отлаживал БПФ: при увеличении размера обрабатываетмого массива от мега до 16 мег время обработки растёт не в 64 раза, как по O( N * log(N) ), а в десятки тысяч раз, а порог, за которым начинается резкий рост, как раз 2 то ли 4 МБ, т.е. на порядок больше размера кэша.
    (фыркает) А самостоятельно, руками и головой! Жопоподтирательные машинки в сельпо почему-то не завезли... :-(
    А с другой стороны, порт нужен кому или нет - легко выяснить, а наточить зубы на таймер желающие всегда найдутся. В том же WC1 таймер перепрограммируется на 60 тик/с, int 9 напрямую забирается игрой, ещё какие-то трюки в том же духе...
    Насколько помню - пока не взято на обслуживание; если приходит больше одного по одному IRQ - остальные теряются. А от COM-порта в описанной схеме больше одного прерывания одновременно быть не может в принципе.

    ЗЫ. Кстати, вот эта книга: http://rutracker.org/forum/viewtopic.php?t=4515536 Крис Касперски "Техника оптимизации программ".
     
  15. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Если вам нужен таймер - пишите обработчик таймера, корректно перехватываете вектор и имеете свои миллисекунды первым. Если вам нужно что то нестандартное - программируете таймер напрямую. Если хочется ну очень круто и по IRQ - перхватываете контроллер прерываний и живёте припеваючи.
     
  16. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Угу, особенно если нужно нестандартное поверх чужого не менее нестандартного. :-(
     
  17. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, ну, когда то такая фишка была использована в небезызвестном в узких кругах FreeGame. А винда и вообще сплошняком по этому принципу работает, используя механизм предсказания следующей ошибки по причине гениальности очередного изобретателя велосипедов (а что ж тут поделаешь то ?! Изобретать велосипед и дарить его людям - любимое занятие гениальных программистов, которым нравится пользовать хаки и фичи вместо RTFM). И, что интересно - работает прям таки отлично в отличии от линукса, который упорно не понимает как в системе может быть 1E99 компортов, которые постоянно посылают друг в друга данные, все живут с одной иркой и при этом она ещё и успевает их всех обслужить ! :D
     
  18. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    :-))))))))))))))))))))))))))))
     
  19. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Тут у тебя очень темное дело на самом деле. Что я точно знаю, у обычной DRAM время случайного доступа должно быть ну в разы, но не на порядки хуже, то есть по прежнему в области наносекунд. Проблема с доступом к огромным массивам - это скорее всего cache-line aliasing - патологически неэффективное использование кэша, если совпадает какое-то количество младших битов у одновременно используемых адресов. Сходные проблемы на уровне материнки - это что-то новое для меня, пока не уверен, что отфильтрованы уже известные проблемы с кэш-подсистемой и TLB процессора, сходу верить не стану :)
    А КрЫс - товарищ, конечно, интересный и достаточно компетентный, но я бы не стал верить его измышлениям на 100%.
    Кстати, а где саму книгу-то скачать? :)


    ---------- Сообщение добавлено в 13:21 ---------- Предыдущее сообщение размещено в 13:18 ----------

    Ну-ка поподробнее про этот волшебный метод! Как он делается, и чего позволяет добиться?
     
    Последнее редактирование: 15 янв 2015
  20. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    и правильно сделаешь. Ибо по каким то маркетинговым соображениям он всегда начинает "за здравие", а уже к середине уползает именно в "измышления" и "мыслью по древу", после чего заканчивает всё ... хм. Не заканчивает ничем по сути.
    я бы и рад, но, учитывая нехилый объём сего экскурса, не умнее ли будет погуглить документацию, благо всё отлично уже описано ? А кратко - всё. Полный контроль.

    Да и тема таймера себя не исчерпала ещё ибо, если его оставить как его BIOS установил - он будет вызывать прерывание раз в 55ms.
    Но это канал 0. А нафига нам канал 0 трогать ? Пусть тикает себе часами для системы. Есть же ещё каналы 1 и 2. Ну второй задействован под пищалку. А вот 1 на AT совершенно свободен (на XT использовался для регенерации RAM). Можно его использовать для своих целей.
    А кварц таймера тикает примерно с длительностью одного периода в 0.840336 мкс. Что как бэ является самым высоким разрешением для таймера вообще.

    В общем тоже смотрите доки по 8254 ибо тоже нехило инфы.
     
    Последнее редактирование: 13 янв 2015
  21. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ё-пс, я не всмотрелся и выдал первое нагугленное.
    Текст книги в HTML навскидку нагуглился на ситфоруме http://citforum.ru/book/optimize/ - не знаю, насколько полный. Я пользовался .djvu - года два или три назад нарыл, лови во вложении.
    Но сам я его тесты не гонял - некогда было, "гнали продукт" и дедлайн поджимал. :-( А потом руки так и не дошли.
     

    Вложения:

    nop нравится это.
  22. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Первое попавшееся подтвердилось и нам крупно помогло. Так что. :-
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление