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

User Tag List

Страница 1 из 9 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 102

Тема: Разработка игры Dash

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,610
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    139
    Поблагодарили
    105 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Разработка игры Dash

    Топик открываем для обсуждения вопросов разработки игры Dash

    Вопрос №1: игра работает в режиме IM 2, для опроса клавиатуры переходит в IM 0, потом опять возвращается в IM 2. Можно ли оптимизировать вот такой рабочий код? (за счёт отказа от лишних DI/EI)

    Код:
      LD   IY,#5C3A
      RES  5,(IY+1)
      DI
      IM   0
      EI
    LOOP_REPEAT:
      BIT  5,(IY+1)
      JR   Z,LOOP_REPEAT
      LD   L,(IY-50) ; result in L - a pressed key code
      DI
      IM   2
      EI
      RET

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

  3. #2
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Можно. Для этого надо в обработчике прерываний по IM 2, когда необходимо опрашивать клавиатуру, поставить вызов обработчика прерываний из ПЗУ (CALL 0x38). Еще лучше - сделать свой драйвер клавиатуры. Потому что ПЗУшный во-первых требует, чтобы IY=0x5C3A, что исключает возможность использование хорошего регистра IY для других целей. Во-вторых, ПЗУшный драйвер не поддерживает одновременного нажатия нескольких клавиш.

  4. #3
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,610
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    139
    Поблагодарили
    105 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Можно. Для этого надо в обработчике прерываний по IM 2, когда необходимо опрашивать клавиатуру, поставить вызов обработчика прерываний из ПЗУ (CALL 0x38).
    Вот этого не делаю для скорости - опрос клавиатуры таким способом нужен время от времени, а не постоянно. А обработчик 0x38 грузный.

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Еще лучше - сделать свой драйвер клавиатуры. Потому что ПЗУшный во-первых требует, чтобы IY=0x5C3A, что исключает возможность использование хорошего регистра IY для других целей. Во-вторых, ПЗУшный драйвер не поддерживает одновременного нажатия нескольких клавиш.
    Опрос одновременного нажатия не требуется. Это чтобы буковки печатать, имя вводить.

    Ладно, спрошу проще. В чём у меня сомнения. Нельзя ли переписать код вот так:

    Код:
      LD   IY,#5C3A
      RES  5,(IY+1)
    ;  DI ; убираем
      IM   0
    ;  EI ; убираем
    LOOP_REPEAT:
      BIT  5,(IY+1)
      JR   Z,LOOP_REPEAT
      LD   L,(IY-50) ; result in L - a pressed key code
    ;  DI ; убираем
      IM   2
    ;  EI ; убираем
      RET

  5. #4
    Activist
    Регистрация
    18.04.2015
    Адрес
    г. Люберцы
    Сообщений
    342
    Спасибо Благодарностей отдано 
    103
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    26 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Олег, даже не знаю с чего начать,.. вопрос прямо с издёвкой чтоли задан, либо есть не понимания этих редких команд.

    Смотри, вот маленький ликбез:
    1) Режим прерывания не менют по многу раз. Всего один раз перешел на "im 2", так и живешь пока программа не закончится (для возврата в бейсик или сброса)
    2) В своём обработчике прерываний делаешь всё что тебе нужно, что будет запускаться каждые 1/50 сек. Можешь частично или полность повторить, что есть по адресу 0x38 (дизассемблер ПЗУ с коментами легко найти в инете). Можно сделать и push/call 0x38 или компактнее rst 0x38, но это плохая практика, т.к. обработчик из ПЗУ разрешит прерывания (и потенциально твой оставшийся код может быть повторно прерван, когда ты этого не ждешь)
    3) Инструкции di и ei нужны только для кратковременного запрета прерваний для как можно более коротких участков кода
    4) Инструкция halt нужна для того, чтоб перестать делать что-то полезное и тупо ждать прихода следующего прерывания. Если перед эти выполнить di, то ждать будешь бесконечно.

  6. #5
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,610
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    139
    Поблагодарили
    105 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А почему режим прерывания не меняют по много раз? Есть какие-то ограничения?

    Мой вопрос вообще без издёвки, он звучит как "нужно ли при смене режима IM запрещать прерывания?"

  7. #6
    Master
    Регистрация
    17.05.2005
    Адрес
    г. Абакан
    Сообщений
    694
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    нужно ли при смене режима IM запрещать прерывания?
    Если вопрос только в этом, то нужно.

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    А почему режим прерывания не меняют по много раз? Есть какие-то ограничения?
    Можно. Никаких ограничений нет. Но... Есть мнение, что это не эффективно.

  8. #7
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    263
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Oleg N. Cher,
    1.лучше всего, если для опроса клавиатуры ты будешь использовать свой собственный опрос клавиатуры.
    2.лучше всего, если твоя программа не будет дергать прерывания
    (установил IM2, добавил на прерывания все нужные подпрограммы, разрешил прерывания и забыл про них.)
    3.лучше всего, если твоя программа не будет использовать ПЗУ вообще (свои библиотеки подпрограмм)
    4.лучше всего, если твоя программа будет уметь стабильную скорость обновления игрового поля (не будет падения скорости при увеличении количества объектов)
    (для этого обычно на прерывании вешают счетчик и синхронизируются по нему обновляя экран каждые 2,3,4,... фреймов)
    5.хорошо если игра будет цветное

    это рекомендации. необязательны для исполнения, но исполнение улучшит геймплей.
    С уважением,
    Jerri / Red Triangle.

  9. #8
    Activist
    Регистрация
    18.04.2015
    Адрес
    г. Люберцы
    Сообщений
    342
    Спасибо Благодарностей отдано 
    103
    Спасибо Благодарностей получено 
    31
    Поблагодарили
    26 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Нужно ли при смене режима IM запрещать прерывания
    Только если по какой-то причине включаешь IM 2, когда таблица с адресами для него ещё не готова. Кроме того, нужно запрешать прерывания (но режим при этом меня не нужно), если зачем-то решил изменить адреса в этой таблице, - есть риск что прерывание придёт и один из байтов адреса будет иметь уже новое значение, а другой старое.

  10. #9
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,610
    Спасибо Благодарностей отдано 
    2,182
    Спасибо Благодарностей получено 
    139
    Поблагодарили
    105 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от troosh Посмотреть сообщение
    Только если по какой-то причине включаешь IM 2, когда таблица с адресами для него ещё не готова. Кроме того, нужно запрешать прерывания (но режим при этом меня не нужно), если зачем-то решил изменить адреса в этой таблице, - есть риск что прерывание придёт и один из байтов адреса будет иметь уже новое значение, а другой старое.
    Да, это важное замечание. Я формирую таблицу до перехода в режим IM 2 и после этого её уже никогда не трогаю.

    Но если я из IM 2 перейду в IM 0, а потом назад в IM 2, всё будет ок? Не нужно устанавливать регистр I или делать что-то подобное?

    jerri, благодарю за советы как сделать спектрумную игру лучше. Но цель другая - кроссплатформенность. Покажи мне хотя бы один исходник игры для ZX, который ты, а ещё лучше - кто-то ещё, смог бы за вечерок-два осмыслить и переписать для другой платформы, желательно не-Z80-based. Можешь гнать хоть с мегабасика на пуребасик, хоть на чём хочешь. Притом хорошо если переписать понадобится ну 30% кода, ну ладно, 40%. Но не 100%. Ага, нету такого? То-то же. Самый кроссплатформенный язык Си в этом тебе тоже плохой помощник, потому что на нём пишут для ZX как на асме.

    Моя конверсия Dash делается совсем по другим соображениям, это, скорее, исследовательский проект, чем игровой. Оригинальный его исходник на Си, я вам доложу, ещё та песня. Он настолько укоренён в DOS, что там ничего человеческого нет, ну почти

    Затык №1. Не связанный с Обероном, jerri. Сегодня оптимизировал вывод тайла 16x12 точек и опять нашёл баг в SDCC. Подождём-с фикса. Эх, и вот так всё время.

  11. #10
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    263
    Спасибо Благодарностей получено 
    279
    Поблагодарили
    207 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Затык №1. Не связанный с Обероном, jerri. Сегодня оптимизировал вывод тайла 16x12 точек и опять нашёл баг в SDCC. Подождём-с фикса. Эх, и вот так всё время.
    здесь нет ошибки компилятора
    здесь есть ошибка программиста

    error: [JR] Target out of range (131)
    а вот вторая ошибка программиста
    Код:
        LDI          ; #9
        LDI
        DEC  E
        DEC  E
        INC  D
    если интересно поясню где именно ошибка
    С уважением,
    Jerri / Red Triangle.

Страница 1 из 9 12345 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Ищу неломанный Boulder Dash 5
    от transman в разделе Игры
    Ответов: 17
    Последнее: 01.07.2021, 23:28
  2. Boulder Dash
    от Cat_Alex/QRP в разделе Игры
    Ответов: 6
    Последнее: 04.03.2013, 21:43
  3. О чем думал автор? Boulder Dash IV
    от JeRrS в разделе Игры
    Ответов: 7
    Последнее: 08.07.2010, 12:52
  4. Slalom demo by Dr.Dash
    от cardin в разделе Демо
    Ответов: 2
    Последнее: 06.02.2010, 06:28

Ваши права

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