User Tag List

Страница 6 из 11 ПерваяПервая ... 2345678910 ... ПоследняяПоследняя
Показано с 51 по 60 из 105

Тема: Джойстики на Векторе-06ц

  1. #51

    Регистрация
    24.08.2012
    Адрес
    г. Волжский
    Сообщений
    458
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    268
    Поблагодарили
    103 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Исправленная версия кода - успешно прошла проверку на реальном Векторе и реальном Джойстике П
    Спасибо всем кто помог мне в этом вопросе !!

    Вот окончательный вариант моего кода опроса "джойстика П" (может кому пригодится)

    ; этот код находится в подпрограмме прерываний
    ; вначале опрашивается клавиатура и результат опроса заносится в ячейку KEYKOD
    ; если на клавиатуре ничего не было нажато то в ячейку KEYKOD заносится код того что ничего не нажато
    ; далее идёт опрос "джойстика П" - результат опроса заносится тоже в ячейку KEYKOD
    ; таким образом работает и клавиатура и джойстик

    ; ============= Joystik P
    ; =============
    JOY:
    in 06h ; читаем порт где подключён джойстик П
    cma ; инвертируем для удобства обработки
    mov l,a ; сохраняем значение сигнала

    ani 128 ; выделяем бит первой кнопки
    cpi 128 ;
    jnz joykon2asd
    mvi a,0FEH ; эта кнопка джойстика аналогична нажатию кнопки "TAB" клавиатуры в игре
    sta KEYKOD ; записываем в ячейку для дальнейшей обработки в основном коде
    jmp joykon5 ; переход на конец опроса джойстика если было нажатие кнопки

    joykon2asd:
    mov a,l ; выделяем бит второй кнопки
    ani 64 ;
    cpi 64 ;
    jnz joykon3asd
    mvi a,0FEH
    sta KEYKOD
    jmp joykon5

    joykon3asd:
    mov a,l
    ani 1 ; выделяем бит направления вправо
    cpi 1 ; vpravo ?
    jnz joykon2
    mvi a,0BFH
    sta KEYKOD
    jmp joykon5

    joykon2:
    mov a,l
    ani 2 ; выделяем бит направления влево
    cpi 2 ; vlevo ?
    jnz joykon3
    mvi a,0EFH
    sta KEYKOD
    jmp joykon5

    joykon3:
    mov a,l
    ani 4 ; выделяем бит направления вверх
    cpi 4 ; vverx ?
    jnz joykon4
    mvi a,0DFH
    sta KEYKOD
    jmp joykon5

    joykon4:
    mov a,l
    ani 8 ; выделяем бит направления вниз
    cpi 8 ; vniz ?
    jnz joykon5
    mvi a,7FH
    sta KEYKOD

    joykon5:

    Этот пользователь поблагодарил metamorpho за это полезное сообщение:

    parallelno(05.06.2023)

  2. #52

    Регистрация
    06.02.2018
    Адрес
    г. Волгоград
    Сообщений
    1,065
    Спасибо Благодарностей отдано 
    582
    Спасибо Благодарностей получено 
    471
    Поблагодарили
    253 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    metamorpho, небольшое замечание: в этом коде можно легко убрать все команды "cpi XX", т.к. стояшие перед ними "ani XX" уже устанавливают признак Z при отсутствии единицы в проверяемом разряде. Это сократит код на 12 байт и ускорит его, если не ошибаюсь, на 48 тактов.

    - - - Добавлено - - -

    И ещё запись "sta KEYKOD" можно было бы сделать всего один раз... В общем, принцип "любую программу можно сократить как минимум на одну команду" работает.

    Этот пользователь поблагодарил Improver за это полезное сообщение:

    metamorpho(07.08.2021)

  3. #53

    Регистрация
    24.08.2012
    Адрес
    г. Волжский
    Сообщений
    458
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    268
    Поблагодарили
    103 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Improver Посмотреть сообщение
    metamorpho, небольшое замечание: в этом коде можно легко убрать все команды "cpi XX", т.к. стояшие перед ними "ani XX" уже устанавливают признак Z при отсутствии единицы в проверяемом разряде. Это сократит код на 12 байт и ускорит его, если не ошибаюсь, на 48 тактов.

    - - - Добавлено - - -

    И ещё запись "sta KEYKOD" можно было бы сделать всего один раз... В общем, принцип "любую программу можно сократить как минимум на одну команду" работает.

    Improver, спасибо за полезный совет !!
    Реальная оптимизация кода

  4. #54

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Влезу не в свою стихию (кодил для Z80), но захотелось поучаствовать из спортивного интереса.
    Почитал доки по 580ВМ80 - это же аналог i8080, то есть лайтовая версия Z80. Так что вперед =)
    Можно сократить процедуру, проверяя кнопки сдвигом аккумулятора вместо AND с перезагрузкой каждый раз.
    Переделал обработку условий: вместо кучи jmp и jr (jnz) теперь однобайтовые ret, экономим память.
    То есть подразумевается, что JOY вызывается по call, а не просто вставлена в текст кода.
    Кстати, в процедуре или опечатка, или так и должно быть, но обе кнопки (1 и 2) дают значение FE на выходе.
    Писал с учетом этого, но если должны выходить разные значения - раскомментировать команду "mvi l,число".
    Убрал кучу лишних меток и переставил местами проверки направлений из-за положения битов в регистре.
    Как понял, если ничего не нажимали - значение в KEYKOD не переписывается.
    Получится примерно так (если где ошибся в написании команды - прощу пардонить):

    JOY:
    in 06h ; читаем порт джойстика
    cma ; инвертируем
    call joy_test ; проверки выделены в подпрограмму для замены jmp и jr на ret'ы
    ret nc ; выходим без записи кода, если ничего не жали
    mov a,l ; получаем код
    sta KEYKOD ; записываем код
    ret ; конец процедуры

    joy_test:
    mvi l,0FEH ; код "ТАБ"
    rlc ; проверяем бит первой кнопки, флаг С=1 - кнопка нажата
    ret c; кнопка нажата - возврат в JOY
    ; mvi l,число ; - это если нажатия кнопок 1 и 2 различаются, иначе не нужна
    rlc ; проверяем бит второй кнопки, они равнозначны с 1-й, судя по исходному коду
    ret c; любая из кнопок 1 и 2 дает код клавиши "ТАБ"

    rlc
    rlc ; пропускаем 5-й и 4-й незначащие биты

    mvi l,07FH ; код "вниз"
    rlc ; проверяем бит направления (3-й, значение 8)
    ret c

    mvi l,0DFH ; код "вверх"
    rlc ; вверх (2-й, значение 4)
    ret c

    mvi l,0EFH ; код "влево"
    rlc ; влево (1-й, значение 2)
    ret c

    mvi l,0BFH ; "код вправо"
    rlc ; вправо (0-й, значение 1)
    ret ; безусловный выход, все проверено


    Итого процедура сократилась раза в два. Прошу написать точные числа исходной и моей, лень считать =)
    Да, еще кое-что: в данном виде процедуры не предусматривают обработку диагональных направлений,
    то есть нажатия сразу вверх+влево, например. При этом на джойстике может быть еще и огонь нажат.
    Хотя на любой платформе с любым джойстиком возможно движение по диагонали + огонь сразу.

    Эти 2 пользователя(ей) поблагодарили reddie за это полезное сообщение:

    metamorpho(07.08.2021), parallelno(05.06.2023)

  5. #55

    Регистрация
    24.08.2012
    Адрес
    г. Волжский
    Сообщений
    458
    Спасибо Благодарностей отдано 
    792
    Спасибо Благодарностей получено 
    268
    Поблагодарили
    103 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    reddie, спасибо !!
    Отличный вариант оптимизации кода, буду применять эти идеи в будущем.

  6. #56

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от metamorpho Посмотреть сообщение
    буду применять эти идеи в будущем
    Пользуйтесь на здоровье)) но в будущем при разработке блока управления, если предполагается джойстик, лучше сразу заложить возможность диагональных нажатий,
    а также одновременных нажатий кнопки "огонь" или что там на ней будет, да и второй кнопки тоже. Код усложнится, зато игровой процесс станет интереснее.
    Реализация клавиатуры Вектора, как понимаю, отслеживает только одну клавишу в момент времени (как на БК), это плохо, но терпимо. Для игр есть джойстик.
    А чтобы реализовать момент с "диагоналями и fire", процедура скана выдает на выходе не код "клавиши", а суммарную маску нажатых клавиш.
    То бишь, в принципе, можно брать прочитанный байт из порта джойстика и обрабатывать все "нажатые" биты, изменяя с их учетом координаты спрайта, например.
    Если были нажаты биты влево и вверх - уменьшаем Х, увеличиваем Y (или уменьшаем, смотря откуда считается начало экрана, сверху или снизу).
    Для особого прикола можно одновременно обработать и влево, и вправо, главное, чтобы при этом итоговая координата не изменилась (+1-1 равно ноль).
    Зачем? Для сопряжения с управлением клавиатурой. Сканируем коды с нее (если клава позволяет, как на Спектруме, опросить сразу несколько клавиш)
    или код (если можно опросить только одну), интерпретируем в коды направлений/нажатий и суммируем это с байтом из порта джойстика по OR.
    На выходе получим универсальное значение от всех устройств, с которым проще работать. Надеюсь, идея понятна. С реализацией, если что, поможем.

    Этот пользователь поблагодарил reddie за это полезное сообщение:

    metamorpho(07.08.2021)

  7. #57

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    Реализация клавиатуры Вектора, как понимаю, отслеживает только одну клавишу в момент времени (как на БК), это плохо, но терпимо.
    Можно отслеживать несколько клавиш клавиатуры одновременно, но с ограничениями.
    Цитата Сообщение от reddie Посмотреть сообщение
    и суммируем это с байтом из порта джойстика по OR.
    Проще отказаться от лишних команд инвертирования и комбинировать клавиатуру и преобразованные направления с джойстика по and.

  8. #58

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Проще отказаться от лишних команд инвертирования и комбинировать клавиатуру и преобразованные направления с джойстика по and
    Да, это уже детали реализации на конкретной платформе. Не в курсе тонкостей опроса клавы на Векторе, поэтому описал саму идею.

  9. #59

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,391
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Несколько отвлеченное рассуждение. Авторы УСПИД/ПУ джойстика похоже собирались максимально упростить одновременный опрос джойстика и клавиатуры (если огонь - ЗБ). Единственный странный момент - они зачем-то поменяли вверх и вниз по сравнению с клавиатурой. Вот раскладка -П/-С более загадочная.

  10. #60

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от reddie Посмотреть сообщение
    ...
    mvi l,07FH ; код "вниз"
    rlc ; проверяем бит направления (3-й, значение 8)
    ret c
    ...
    Не помню, когда последний раз пользовался возвратом из подпрограммы по условию...
    В i8080 это вроде-бы мнемоника не "RET C", а "RC" (но зависит от компилятора, возможно и ret c переварит).

    Но если бы я делал обработку джойстика, то я бы вообще не занимался её обработкой, а наложил бы считанный код на код считанный из клавы, преобразовав его предварительно с помощью таблицы. Там таблицы всего 16 байт, из них полезных 9 байт.
    В таблице коды соответствия состояния джойстика и клавиш клавиатуры.
    Для простоты, таблицу расположил-бы начиная с адреса 0103h, тогда получился-бы примерно такой код.
    Код:
      in   06
      ani 00Fh
      adi 003h
      sta adrk+1
    adrk:
      lda 0103h
      mov b,a
      lda KEYS (адрес где хранится уже считанный код клавы ряда с клавишами курсора)
      ana b      (наложил джойстик на клавиши)
      sta KEYS (и пусть теперь основной код обработки нажатий клавиш разбирается)
    ;
      in 06
      ani 0C0h (выделение кнопок джойстика)
      ... тут код совмещения с нужными клавишами клавы, их меньше - таблица уже не нужна.
    Главное преимущество, с моей точки зрения, что эта часть программы всегда выполняется одинаковое количество тактов вне зависимости от того используется-ли джойстик, и какие контакты на нём замкнуты... предсказуемость времени выполнения кода...

    Если "нормализовать" код считанный из УСПИД-а, то и его таким методом можно юзать... таблица там будет возможно другая, но дело поправимое...
    Последний раз редактировалось KTSerg; 09.08.2021 в 07:33.

    Этот пользователь поблагодарил KTSerg за это полезное сообщение:

    parallelno(05.06.2023)

Страница 6 из 11 ПерваяПервая ... 2345678910 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Биперная музыка на Векторе-06Ц
    от ivagor в разделе Вектор
    Ответов: 352
    Последнее: 29.07.2025, 19:04
  2. Эмулятор "ZX Spectrum 48" на "Векторе-06Ц"
    от Tim0xA в разделе Вектор
    Ответов: 31
    Последнее: 27.12.2022, 21:40
  3. Ответов: 18
    Последнее: 11.04.2021, 10:54
  4. Картинки демок Amstrad на векторе
    от yur в разделе Вектор
    Ответов: 13
    Последнее: 14.03.2016, 08:25
  5. Катинки С64 на Векторе
    от yur в разделе Вектор
    Ответов: 6
    Последнее: 13.03.2016, 15:40

Ваши права

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