User Tag List

Страница 2 из 9 ПерваяПервая 123456 ... ПоследняяПоследняя
Показано с 11 по 20 из 102

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

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

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

    По умолчанию

    Цитата Сообщение от jerri Посмотреть сообщение
    а вот вторая ошибка программиста
    Код:
        LDI          ; #9
        LDI
        DEC  E
        DEC  E
        INC  D
    если интересно поясню где именно ошибка
    Не, ну там на один байт можно сделать короче и быстрее (сохранить в A, в B или в C регистре содержимое E, а затем после каждой пары LDI оттуда восстанавливать, а не делать два декремента). Но чтоб ошибка?.. Судя по коду там запись двух байт спрайта по горизонтале, а затем переход на строку ниже по вертикале. Проблемы будут если выводить в последний байт по горизонтале.

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

  3. #2

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 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,переход_клавиша_нажата
    
    	итд...

  4. #3

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

    По умолчанию

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

  5. #4

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

    Post

    Если не ошибаюсь, единственный раз, когда мне приходила в голову идея вернуться в IM 1 была программка "System Information V1.01", написанная давным давно забавы ради. Там измерялось число тактов между прерываниями, может кому будет интересно в учебных целях:

    Код:
            ORG     40000
            ENT     $
            DI
            LD      (STACK),SP
            LD      A,#FE
            LD      I,A
    
            LD      H,A
            LD      L,0
            LD      B,L
            INC     A
    L_SAV   LD      (HL),A
            INC     L
            DJNZ    L_SAV
            INC     H
            LD      (HL),A
    
            LD      A,24
            LD      (#FFFF),A
            LD      A,#C3
            LD      (#FFF4),A
            LD      HL,INTER
            LD      (#FFF5),HL
            IM      2
            LD      DE,INTER2
            LD      HL,0
            EI
            HALT
    
    INTER
            LD      (#FFF5),DE
            EI
    L_INC   INC     HL
            JP      L_INC
    
    
    INTER2  LD      DE,-5
            LD      BC,-1
    L_DIV   ADD     HL,DE
            INC     BC
            JR      C,L_DIV
    
            SLA     C
            RL      B
            SLA     C
            RL      B
    
            IM      1
            LD      A,#3F
            LD      I,A
            EI
    STACK   EQU     $+1
            LD      SP,0
    
            PUSH    BC
            LD      HL,TEXT
            CALL    PRINT
            POP     HL
            LD      DE,-1000
            CALL    DIVOUT
            LD      A,"."
            CALL    PR_CHR
            LD      DE,-100
            CALL    DIVOUT
            LD      DE,-10
            CALL    DIVOUT
            LD      DE,-1
            CALL    DIVOUT
    
            LD      HL,_MHZ
            CALL    PRINT
    
            LD      HL,_ROMN
            CALL    PRINT
            LD      HL,5433
            CALL    PRINT
            LD      HL,_D_LF
            CALL    PRINT
    
            LD      HL,#3D00
            XOR     A
    L_SUM   ADC     A,(HL)
            INC     HL
            BIT     6,H
            JR      Z,L_SUM
            CP      237
            LD      HL,_NFONT
            JR      NZ,M_FONT
            LD      HL,_SFONT
    M_FONT
            CALL    PRINT
    
            LD      HL,14446
            LD      A,#FF
    L_AND   AND     (HL)
            INC     HL
            LD      E,A
            LD      A,H
            CP      #3D
            LD      A,E
            JR      NZ,L_AND
            LD      HL,_NUSE
            INC     A
            JR      Z,M_NUSE
            LD      HL,_USE
    M_NUSE  CALL    PRINT
    
            LD      HL,_RAM
            CALL    PRINT
    
            LD      HL,#C000
            LD      BC,#7FFD
    
            LD      A,#10
            OUT     (C),A
    
            LD      D,(HL)
            LD      A,#17
            OUT     (C),A
            LD      A,D
            CPL
            LD      (HL),A
            LD      A,#10
            OUT     (C),A
            LD      A,(HL)
            LD      (HL),D
            CP      D
            LD      HL,_128K
            JR      Z,M128
            LD      HL,_48K
    M128    JR      PRINT
    
    
    
    PR_CHR  PUSH    HL
            RST     #10
            POP     HL
            RET
    
    PRINT   LD      A,(HL)
            AND     #7F
            CALL    PR_CHR
            BIT     7,(HL)
            RET     NZ
            INC     HL
            JR      PRINT
    
    DIVOUT  LD      A,"0"-1
    DIV_L1  ADD     HL,DE
            INC     A
            JR      C,DIV_L1
            SBC     HL,DE
            JR      PR_CHR
    
    TEXT    DEFB    22,0,0,127
            DEFM    '1992 WRITTEN BY ALEXANDER TRUSH'
            DEFB    13
            DEFM    '  Odessa OPI AT903  28-VIII-92'
            DEFB    13,13
            DEFM    'System Information V1.01'
            DEFB    13,13,13
            DEFM    ' CPU FREQ:'
            DEFB    " "+128
    
    _MHZ    DEFM    ' MHz.'
    _D_LF   DEFB    13,13+128
    
    _ROMN   DEFM    ' ROM:'
            DEFB    13,13
            DEFM    ' -Name:'
            DEFB    13," "," "," "+128
    
    _SFONT  DEFM    ' -Standard font.'
            DEFB    13,13+128
    _NFONT  DEFM    ' -Non standard font.'
            DEFB    13,13+128
    
    _NUSE   DEFM    ' -Free zone not used.'
            DEFB    13,13+128
    _USE    DEFM    ' -Free zone used.'
            DEFB    13,13+128
    
    _RAM    DEFM    ' RAM:'
            DEFB    " "+128
    
    _128K   DEFM    '128K'
            DEFB    13,13+128
    _48K    DEFM    '48K'
            DEFB    13,13+128
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	02_SI.png 
Просмотров:	136 
Размер:	5.3 Кб 
ID:	53698  
    Вложения Вложения

  6. #5

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    480
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    troosh, помню твой упаковщик, сильно спасал в своё время. Кучу игр им пожал

  7. #6

    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,928
    Спасибо Благодарностей отдано 
    37
    Спасибо Благодарностей получено 
    124
    Поблагодарили
    44 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Вопрос №1: игра работает в режиме IM 2, для опроса клавиатуры переходит в IM 0, потом опять возвращается в IM 2. Можно ли оптимизировать вот такой рабочий код? (за счёт отказа от лишних DI/EI)
    1. На время переключения режима прерываний их запрещать не нужно. Классический способ включения прерываний импользует DI/EI для окружения инструкций ld i,a: im n чтобы прерывание не пришло в тот момент, когда режим еще не выставлен, а I уже обновлен.
    2. Не надо врубать IM 0. Надо IM 1. Они не равнозначны.
    3. Я бы на стал щелкать режим имненно на момент опроса. В меню выставляется IM 1 для простого опроса кнопок (для ввода имени, выбора пунктов), а при запуске игры ставится IM 2.
    Последний раз редактировалось Alex Rider; 09.10.2015 в 15:01.
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

  8. #7

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

    По умолчанию

    Мне вот лично больше интересно, есть ли смысл использовать два вида прерывания?

  9. #8

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,712
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Исходник на языке высокого уровня вообще ничего не знает про прерывания. Это не *****код, Шурик. Это инкапсуляция. Говнокод - это логика вперемешку с низкоуровневыми реализациями. Вам непривычно, я понимаю. Это не базовый опрос клавы для игры, его я делаю по-другому. Это для набирания имени в таблицу рекордов. Всё, вопрос №1 закрыт.

    Вопрос №2: у меня был такой код для "возвращения" на родину (скажем, корректного возврата в Бейсик после выхода из игры). Уже не помню откуда, скорее всего, с какой-то книги:

    Код:
    ; ************************************************
    ; *              Set IM1 mode back               *
    ; ************************************************
        DI
        LD   A,#63
        LD   I,A
        IM   1
        EI
        RET
    Поясните, пожалуйста, не избыточен ли он, и зачем здесь нужно устанавливать регистр I ?

  10. #9

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

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Поясните, пожалуйста, не избыточен ли он, и зачем здесь нужно устанавливать регистр I ?
    Установка I в 63 вроде бы связано с ULA фирменных спектрумов, точнее сказать не смогу.

  11. #10

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

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Код:
        LD   A,#63
        LD   I,A
        IM   1
    Поясните, пожалуйста, не избыточен ли он, и зачем здесь нужно устанавливать регистр I ?
    Я может чего-то не помню, но это похоже лишнее, т.к. в IM 1 ничего с шины не читается, при обработке прерываний и этот I регистр вообще может быть использован как регистр общего назначения.

    Кстати, на оригинальных машинах важно какое именно место выбрано под таблицу: http://zx-pk.ru/showthread.php?t=7427

Страница 2 из 9 ПерваяПервая 123456 ... ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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