1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Константы c_dfDIKeyboard, c_dfDIMouse

Тема в разделе "WASM.DirectX", создана пользователем inew, 28 фев 2005.

  1. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Более короткий вариант кода (если я нигде не ошибся):
    Код (Text):
    1.  
    2. @@: xor     ecx, ecx
    3.     mov     eax, offset l@pguid
    4.     mov     dword ptr[eax], offset guid_
    5.     mov     dword ptr[eax+4], ecx
    6.     mov     dword ptr[eax+8], 8000000C
    7.     mov     byte  ptr[eax+8+1], cl
    8.     and     dword ptr[eax+12], 0
    9.     add     eax, 10h
    10.     inc     cl
    11.     jnz     @b
    12.  




    ЗЫ: Я бы с радостью удалил все свои посты, кроме первого, как не имеющие отношения к теме, но это будет нарушением правил, т.к. есть логически связянные с ними посты q_q
     
  2. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    S_T_A_S_

    Мне кажется, что твой вариант не совсем верен.



    Ты затираешь GUID_Key.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А да, я перепутал местами guid_ и l@pguid (исправлено), теперь вроде ничего не затираю?
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    S_T_A_S_

    К сожалению, результат не поменялся.
    Код (Text):
    1.  
    2. В целом, алгоритм заполнения массива должен быть таким:
    3.  
    4. 1. 00h - ADDR guid_
    5.    04h - 0  
    6.    08h - 8000000Ch
    7.    0Ch - 0
    8.  
    9. 2. 10h - ADDR guid_
    10.    14h - 1
    11.    18h - 8000000Ch + 256
    12.    1Ch - 0
    13.  
    14. 3. 20h - ADDR guid_
    15.    24h - 2
    16.    28h - 8000000Ch + 256 + 256
    17.    2Ch - 0
    18.  
    19.    и т.д.
    20.  


    Вот возможный вариант (рабочий):
    Код (Text):
    1.  
    2. xor     ecx, ecx
    3. mov     eax, offset l@pguid
    4. mov     ebx, 8000000Ch
    5. @@:
    6. mov     dword ptr[eax], offset guid_
    7. mov     dword ptr[eax+4], ecx
    8. mov     dword ptr[eax+8], ebx
    9. and     dword ptr[eax+12], 0
    10. add     eax, 10h
    11. add     ebx, 256
    12. inc     cl
    13. jnz     @b
    14.  
     
  6. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Дополнительно к вопросу:
    Код (Text):
    1.  
    2. S_BUILD_c_dfDIMouse  MACRO
    3.  
    4.   .DATA
    5.  
    6.   ;DIDATAFORMAT --------------------------------------------------------------
    7.    ;dwSize_              dd  6*4 ; 18h                                       ; Размер структуры в байтах
    8.    ;dwObjSize_           dd  4*4 ; 10h                                       ; Размер структуры DIOBJECTDATAFORMAT    
    9.    ;dwFlags_             dd  DIDF_RELAXIS                                    ; или DIDF_ABSAXIS
    10.    ;dwDataSize_          dd  16                                              ; Размер пересылаемых данных в байтах  
    11.    ;dwNumObjs_           dd  7                                               ; Число объектов в массиве rgodf
    12.    ;rgodf_               dd  OFFSET l@pguid2                                 ; Адрес массива состоящего из структур DIOBJECTDATAFORMAT
    13.  
    14.    l@pguid2              dd  key1,  0,  00FFFF03h,  0
    15.                          dd  key2,  4,  00FFFF03h,  0
    16.                          dd  key3,  8,  80FFFF03h,  0
    17.                          dd  0,    12,  00FFFF0Ch,  0
    18.                          dd  0,    13,  00FFFF0Ch,  0
    19.                          dd  0,    14,  80FFFF0Ch,  0
    20.                          dd  0,    15,  80FFFF0Ch,  0
    21.  
    22.    c_dfDIMouse_alt       dd    6*4, 4*4, DIDF_RELAXIS, 16, 7, OFFSET l@pguid2
    23.    key1                  GUID  GUID_XAxis
    24.    key2                  GUID  GUID_YAxis
    25.    key3                  GUID  GUID_ZAxis
    26.  
    27.   ENDM
    28.  




    Данный макрос имеет смысл, только если не хочеться подключать dxguid.lib. В размере данных выигрыша нет.
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Да, код зависает в бесконечном цикле, вечно эти левые ошибки, когда пишу в броузере, метку цикла не там поставил =)

    алго у меня такое и реализовано, просто я не использую ebx, поскольку и так есть счётчик цикла, изменяющийся по тому же закону.
    Код (Text):
    1.  
    2.     xor     ecx, ecx
    3.     mov     eax, offset key_data_format
    4. __: mov     dword ptr[eax], offset GUID_Key
    5.     mov     dword ptr[eax+4], ecx
    6.     mov     dword ptr[eax+8], 8000000Ch
    7.     mov     byte  ptr[eax+8+1], cl
    8.     and     dword ptr[eax+12], 0
    9.     add     eax, 10h
    10.     inc     cl
    11.     jnz     __
    12.  
     
  8. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Протестировано. Работает :)
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Дык я тоже протестировал, на этот раз пришлось :))
     
  10. icegood

    icegood New Member

    Публикаций:
    0
    Регистрация:
    13 мар 2012
    Сообщения:
    1
    Извините за поднятие древней темы, но кто знает, как выглядела структура c_dfDIKeyboard для dinput древней версии 5.0?
    Под отладкой я вижу, что расстояние между статусами символов = 1байт и при нажатии на символ на клавиатуре высвечивается старший бит, все остальные =0.
     
  11. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    Если смотреть по инклудам от 5 версии, то структура такая же как и у старших версий.
    Если нужны именно значения которые там лежат, то это только отладчик ибо сама структура описана как extern и при сборке приложения прилинковывается что необходимо автоматом (по моему из dxguid.lib)

    Если в приложении есть вызов типа такого: SetDataFormat то как раз можно посмотреть что там
    лежит в этой структуре взять данные оттуда и использовать потом по своему усмотрению.