Важная информация

User Tag List

Страница 4 из 4 ПерваяПервая 1234
Показано с 31 по 38 из 38

Тема: Кадровые прерывания ( 50гц ).

  1. #31
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,754
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    141
    Спасибо Благодарностей получено 
    1,172
    Поблагодарили
    769 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    можно обойтись и без IM2 (как например в игре renegade) там подвязка к чтению аттрибутов из несуществующего порта #FF, но это справедливо только для некоторых фирменных моделей.
    также можно сделать привязку на im1 вместо im2 (только на машинах где есть ПЗУ с 128ым бейсиком)

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Возник вопрос: какая длительность запроса кадрового прерывания? В EmuZWin путём экспериментов выяснено, что если EI поставить сразу за DI, то следующая команда не приводит к потерям прерываний если для её выполнения требуется не более 4х обращений к памяти, то есть LD HL,XXX или LD A,(XXX) прокатывает, а вот LD HL,(XXX) может привести к потере прерываний. Можно ли сделать чтобы запрос прерывания запоминался или как-то удлинить его скажем до 5 мс?

  4. #33
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    Возник вопрос: какая длительность запроса кадрового прерывания? В EmuZWin путём экспериментов выяснено, что если EI поставить сразу за DI, то следующая команда не приводит к потерям прерываний если для её выполнения требуется не более 4х обращений к памяти, то есть LD HL,XXX или LD A,(XXX) прокатывает, а вот LD HL,(XXX) может привести к потере прерываний. Можно ли сделать чтобы запрос прерывания запоминался или как-то удлинить его скажем до 5 мс?
    Стандартная длительность импульса запроса прерывания для 48к моделей - 32/33 такта для early/late моделей. Для 128к - 36 тактов. Насколько я знаю, удлинить его можно только аппаратно, а запомнить - никак.

  5. #34
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    weiv, а если очень хочется использовать SP не по назначению, есть какой либо еще способ подсчитывать кадры кроме прерывания?
    (вернее нужно подсчитывать не кадры, а время)
    Последний раз редактировалось blackmirror; 20.10.2016 в 11:06.

  6. #35
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от blackmirror Посмотреть сообщение
    weiv, а если очень хочется использовать SP не по назначению, есть какой либо еще способ подсчитывать кадры кроме прерывания?
    (вернее нужно подсчитывать не кадры, а время)
    SP в смысле, что на стек кладутся возвраты и регистры во время входа в обработчик... Не знаю, ещё одним способом измерения времени может быть чтение порта FF, но это сложнее, и не будет работать даже на +2A/+3, не говоря уже об отечественных клонах. Проще таки использовать прерывания, а финты с SP оформлять строго в рамках времени между двумя импульсами прерывания.

  7. #36
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,041
    Спасибо Благодарностей отдано 
    931
    Спасибо Благодарностей получено 
    224
    Поблагодарили
    121 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    blackmirror,
    1. Подсчитывать такты процессора.
    2. Всё таки использовать IM2, а порчу памяти сразу восстанавливать.
    Вариантов восстановления много:
    2.1 Если известен регистр, в который только что считалось из стека - использовать это:

    Скрытый текст

    Код:
      org #bfbf
      entrypoint $
          ld (rethl+1),hl
          pop hl
          ld (retpc+1),hl
          ld (retsp+1),sp
          push bc ; восстанавливаем из bc
          ld sp,IntStack
          Push af
          ld hl,IntCounter
    L_001
          inc(hl)
          jp nz,IntExit
          inc l
          jp L_001
    IntExit
          pop af
    retsp ld sp,0
    rethl ld hl,0
    retpc jp 0
    IntStack equ #c000
    IntCounter defb #ff,0,0,0,0,0,0,0 ; хватит на 11 млрд. лет
    [свернуть]

    Как начать читать с помощью стека?
    2.1.1 Перед блоком, который будем читать, иметь пару_байт, которые не жалко запортить.
    2.1.2 Сделать DI: LD SP,BeginRead: POP BC: EI, и надеяться, что длинны прерывания хватит.
    2.1.3 Сделать LD C,(HL):INC HL: LD B,(HL): INC HL: LD SP,HL
    2.2 Хранить информацию для восстановления. (как в AMAUROTE)
    В примитивном виде - держать в памяти две копии информации.
    3. Хитрить дальше и изворачиваться сильнее.
    Последний раз редактировалось Reobne; 21.10.2016 в 07:42.

  8. #37
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    192
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Если известен регистр, в который только что считалось из стека - использовать это:
    Этот чудесный код полностью решил проблему, хотя вместо EXX пришлось пользоваться IX/IY, теперь прерывания не запрещаются и не теряются.

    Цитата Сообщение от Reobne Посмотреть сообщение
    2.1.2 Сделать DI: LD SP,BeginRead: POP BC: EI, и надеется, что длинны прерывания хватит.
    В эмуляторе даже на DI: EI: LD HL,(MEM) длины прерывания не хватает - теряются.

  9. #38
    Member
    Регистрация
    08.05.2016
    Адрес
    г. Южа, Ивановская обл.
    Сообщений
    33
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Del
    Последний раз редактировалось апро; 21.03.2017 в 22:50.

Страница 4 из 4 ПерваяПервая 1234

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. какой тайминг прерывания Z80?
    от Руслан в разделе Несортированное железо
    Ответов: 3
    Последнее: 20.03.2013, 14:41
  2. Использование стека и прерывания
    от drbars в разделе Программирование
    Ответов: 21
    Последнее: 16.12.2012, 12:47
  3. Прерывания IM 2
    от GM BIT в разделе Программирование
    Ответов: 12
    Последнее: 21.01.2011, 23:52
  4. Ответов: 1
    Последнее: 03.05.2009, 23:06
  5. IM2, вектор прерывания
    от Jukov в разделе Программирование
    Ответов: 18
    Последнее: 20.09.2006, 09:32

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •