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

User Tag List

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

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

  1. #1
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,606
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    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,055
    Спасибо Благодарностей отдано 
    219
    Спасибо Благодарностей получено 
    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,606
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    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,606
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    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,751
    Спасибо Благодарностей отдано 
    256
    Спасибо Благодарностей получено 
    266
    Поблагодарили
    200 сообщений
    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
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Oleg N. Cher, самый правильный способ опроса клавиатуры в начале прерывания.
    Включаешь режим IM2 настраиваешь вектор и вызываешь эту подпрограмму каждое прерывание:

    Код:
    CHECK_KEYS:
    	LD (SCAN_SP+1),SP
            LD SP,KEY_TAB		; Опрос клавиатуры
            LD DE,MAIN.KEY_MAP
            LD BC,#29FF
    SCANLP:
    	POP HL
    	LD A,L
    	IN A,(#FE)
    	CPL
            AND H
    	ADD A,C
    	CCF
    	SBC A,A
    	LD (DE),A
    	INC E
            DJNZ SCANLP
    SCAN_SP:
    	LD SP,#0000
    	RET
    
    ; Таблица портов клавиатуры
    KEY_TAB:
    	DB #FD,1        ;#14
    	DB #7F,16       ;#23
    	DB #FE,8        ;#21
    	DB #FD,4        ;#16
    	DB #FB,4        ;#0C
    	DB #FD,8        ;#17
    	DB #FD,16       ;#18
    	DB #BF,16       ;#19
    	DB #DF,4        ;#11
    	DB #BF,8        ;#1A
    	DB #BF,4        ;#1B
    	DB #BF,2        ;#1C
    	DB #7F,4        ;#25
    	DB #7F,8        ;#24
    	DB #DF,2        ;#12
    	DB #DF,1        ;#13
    	DB #FB,1        ;#0A
    	DB #FB,8        ;#0D
    	DB #FD,2        ;#15
    	DB #FB,16       ;#0E
    	DB #DF,8        ;#10
    	DB #FE,16       ;#22
    	DB #FB,2        ;#0B
    	DB #FE,4        ;#20
    	DB #DF,16       ;#0F
    	DB #FE,2        ;#1F
    	DB #EF,1	;#09
    	DB #F7,1	;#00
    	DB #F7,2        ;#01
    	DB #F7,4        ;#02
    	DB #F7,8        ;#03
    	DB #F7,16       ;#04
    	DB #EF,16       ;#05
    	DB #EF,8        ;#06
    	DB #EF,4        ;#07
    	DB #EF,2        ;#08
    	DB #7F,1        ;#27
    	DB #BF,1        ;#1D
    	DB #FE,1        ;#1E
    	DB #7F,2        ;#26
    	DB #00,#1F
    Результатом работы этой процедуры будет массив с состояниями клавиш:

    Код:
    ;------------------------------------------------------------------------------------------------------------
    ; Начало массива клавиш
    KEY_MAP:
    	DS #29,#00	
    KEY_A	EQU KEY_MAP+#00
    KEY_B	EQU KEY_MAP+#01
    KEY_C	EQU KEY_MAP+#02
    KEY_D	EQU KEY_MAP+#03
    KEY_E	EQU KEY_MAP+#04
    KEY_F	EQU KEY_MAP+#05
    KEY_G	EQU KEY_MAP+#06
    KEY_H	EQU KEY_MAP+#07
    KEY_I	EQU KEY_MAP+#08
    KEY_J	EQU KEY_MAP+#09
    KEY_K	EQU KEY_MAP+#0A
    KEY_L	EQU KEY_MAP+#0B
    KEY_M	EQU KEY_MAP+#0C
    KEY_N	EQU KEY_MAP+#0D
    KEY_O	EQU KEY_MAP+#0E
    KEY_P	EQU KEY_MAP+#0F
    KEY_Q	EQU KEY_MAP+#10
    KEY_R	EQU KEY_MAP+#11
    KEY_S	EQU KEY_MAP+#12
    KEY_T	EQU KEY_MAP+#13	
    KEY_U	EQU KEY_MAP+#14
    KEY_V	EQU KEY_MAP+#15
    KEY_W	EQU KEY_MAP+#16
    KEY_X	EQU KEY_MAP+#17
    KEY_Y	EQU KEY_MAP+#18
    KEY_Z	EQU KEY_MAP+#19
    KEY_0	EQU KEY_MAP+#1A
    KEY_1	EQU KEY_MAP+#1B
    KEY_2	EQU KEY_MAP+#1C
    KEY_3	EQU KEY_MAP+#1D
    KEY_4	EQU KEY_MAP+#1E
    KEY_5	EQU KEY_MAP+#1F
    KEY_6	EQU KEY_MAP+#20
    KEY_7	EQU KEY_MAP+#21
    KEY_8	EQU KEY_MAP+#22
    KEY_9	EQU KEY_MAP+#23
    KEY_SPC	EQU KEY_MAP+#24
    KEY_ENT	EQU KEY_MAP+#25
    KEY_CS	EQU KEY_MAP+#26
    KEY_SS	EQU KEY_MAP+#27
    KEY_ANY	EQU KEY_MAP+#28
    Всё, теперь проверить нажата ли клавиша "A" например можно так:
    Код:
    	LD A,(KEY_A)
    	OR A
    	JR Z,переход_клавиша_нажата
    
    	итд...

  11. #10
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    игра работает в режиме IM 2, для опроса клавиатуры переходит в IM 0
    *****код же

Страница 1 из 11 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

Ваши права

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