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

User Tag List

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

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

  1. #1
    Master Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    759
    Благодарностей: 207
    Mentioned
    0 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. Этот пользователь поблагодарил Oleg N. Cher за это полезное сообщение:
    hobot (10.10.2015)

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

  4. #2
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    880
    Благодарностей: 470
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  5. #3
    Master Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    759
    Благодарностей: 207
    Mentioned
    0 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

  6. #4
    Member
    Регистрация
    18.04.2015
    Адрес
    г. Люберцы
    Сообщений
    60
    Благодарностей: 31
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  7. #5
    Master Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    759
    Благодарностей: 207
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

    По умолчанию

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

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

  9. #7
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    3,363
    Благодарностей: 706
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    это рекомендации. необязательны для исполнения, но исполнение улучшит геймплей.
    С уважением,
    Jerri / Red Triangle.
    [02.05.2014] не забудь этот день. Чубайс должен умереть. Dixi.
    [l'Abbey des morts TSEvo EV...5%] kiwi кошелек +79178162712

  10. Этот пользователь поблагодарил jerri за это полезное сообщение:
    troosh (09.10.2015)

  11. #8
    Member
    Регистрация
    18.04.2015
    Адрес
    г. Люберцы
    Сообщений
    60
    Благодарностей: 31
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  12. #9
    Veteran Аватар для drbars
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,529
    Благодарностей: 654
    Mentioned
    0 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,переход_клавиша_нажата
    
    	итд...
    ZX Spectrum +2 / DataGear / DivIDE 2k14
    ZX Evolution rev.C
    ZX Spectrum NEXT

  13. Этот пользователь поблагодарил drbars за это полезное сообщение:
    John North (09.10.2015)

  14. #10
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    682
    Благодарностей: 488
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

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

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

Похожие темы

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

Ваши права

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