1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.045
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Напоролся сегодня на "магию" в 16-битном MASM. Есть огромный проект с макросами на макросах, которые погоняют макросами. Так вот, в одном из макросов, когда пишется подряд две строчки: push ds и pop ds (просто ради теста), весь функционал виснет. Если их заменить на любые другие регистры в любом количестве - все работает. То есть проблема не в стеке и не в занимаемом кодом месте. В других местах, программа нормально отностится к пушанью DS. В чем может быть магия?!
     
  4. GigaWatt

    GigaWatt

    Регистрация:
    20 ноя 2010
    Сообщения:
    1.299
    "весь функционал виснет"? Сие как должно понимать? Макрос весь давай, покумекаем.
     
  5. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Вобщем-то я уже заготовил воркэраунд. Переключаю сегменты в начале вызова функции, где push/pop для DS работат, а нужное значение сохраняю в переменную в текущем сегемнте.
    Но все-таки просто интересно, почему оно не работало.
    Насчет "макрос весь". Пожалуйста (хотя не думаю, что он поможет):
    Код:
    spec_case	macro	name,logic,draw
    if1
    name&_DEST_ADJ = 0
    endif
    	logic				;;Define required macros
    
    name&_disp_table label byte
    	db	name&_loop_0-name&_loop
    	db	name&_loop_1-name&_loop
    	db	name&_loop_2-name&_loop
    	db	name&_loop_3-name&_loop
    if UNROLL_BY_8
    	db	name&_loop_4-name&_loop
    	db	name&_loop_5-name&_loop
    	db	name&_loop_6-name&_loop
    	db	name&_loop_7-name&_loop
    endif
    
    	public	name
    name	proc	near
    	mov	bl,byte ptr clipped_font_height
    if UNROLL_BY_8
    	and	bx,0007h
    else
    	and	bx,0003h
    endif
    	mov	bl,name&_disp_table[bx]
    	add	bx,CodeOFFSET name&_loop
    	mov	unrolled_entry_point,bx
    	mov	dx,ss_next_scan 	;;Index to next scan of a bitmap
    if name&_DEST_ADJ
    	dec	dx
    else
    	nop
    endif
    	entry_logic			;;Any specific entry logic required
    
    name&_outer_loop proc near
    	loop_setup			;;Char offset fetching
    	mov	ch,byte ptr clipped_font_height
    	jmp	unrolled_entry_point
    
    	even
    name&_loop:
    name&_loop_0:
    	draw	<fetch_logic>
    	add	di,dx
    name&_DEST_ADJ = DRAW_ADJUST		;;Need to know if a stosb was used
    
    if UNROLL_BY_8
    name&_loop_7:
    	draw	<fetch_logic>
    	add	di,dx
    
    name&_loop_6:
    	draw	<fetch_logic>
    	add	di,dx
    
    name&_loop_5:
    	draw	<fetch_logic>
    	add	di,dx
    
    name&_loop_4:
    	draw	<fetch_logic>
    	add	di,dx
    endif
    
    name&_loop_3:
    	draw	<fetch_logic>
    	add	di,dx
    
    name&_loop_2:
    	draw	<fetch_logic>
    	add	di,dx
    
    name&_loop_1:
    	draw	<fetch_logic>
    	add	di,dx
    if UNROLL_BY_8
    	sub	ch,8
    else
    	sub	ch,4
    endif
    	ja	name&_loop
    
    name&_done_char:
    	loop_logic name&_outer_loop
    	jmp	ret_addr		;To caller
    
    name&_outer_loop endp
    
    name	endp
    	endm
    Здесь в середину макроса draw передатеся макрос fetch_logic, который есть частью макроса logic (draw и logic передаются, как параметры). Так вот, в этом fetch_logic была захардкоджена константа, которую нужно заменить на переменную из другого сегмента данных. Даже если вписать пустой push/pop для DS, скажем, перед jmp unrolled_entry_point - программа больше не работает. Любые другие изменения ничего не ломают. Я могу пушать-попать все рагистры, писать хитрую логику, но на DS - табу. Почему - никак в голову не вкладывается!
    А вот что за программа, как не работает и почему я ее не дебажу, я напишу чуток позже - сюрприз будет, благо воркэрануд нашел :).
     
  6. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    С таким количеством дополнительных макросов и переменных, влияющих на поведение формируемой процедуры - неудивительно, если не поможет. Мне так точно не помогло - если заменить недостающие части пустышками, всё просто работает, с push/pop или без, увы. Но там же огромных кусков не хватает, так что гадать без исходника можно ещё очень долго.

    И не понятно ни рожна :) Ну процедура формируется, ну блок меток-разностей, ну ещё одна внутри неё. Ничего особенного. Я не представляю, почему виснет.

    ret_addr портится? ss_next_scan?

    UNROLL_BY_8 / DRAW_ADJUST - загадка, logic / draw - макросы и никто не знает, что в них.

    Вот это самый интересный вопрос :)
     
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Потому что не компилируется?
     
  8. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    A.P.$lasH, Рыжий Тигра,
    Ладно, времени баловаться сейчас нет, так что "открою карты". Пишу я универсальный видео-драйвер под вторую винду. Собрать отдельные драйвера, скажем для 16 цветов 640х350, 640х480, 800х600 - проще пареной репы. Но если мы захотим поменять расширение, то, увы, придется переставлять винду. Проблема в том, что все данные под текущий режим захардкоджены. Соответственно, драйвер компилится под конкретный один режим. Мне удалось добить всю эту фигню. Теперь за видео режим отвечает один байтик в ОЗУ, поменяв который можно переключатся между тремя режимами, по идее, даже не перезапуская саму винду. Только вот теперь вопрос в написании переключателя. Сначала возникла проблема, что Винда копирует данные из драйвера куда-то себе. Проблему, вроде пофиксал таким ообразом: когда винда первый раз запрашивает данные, я сохраняю адрес в который их нужно копировать. При измененнии режима, меняю данные и по тому адресу. Надеюсь, что они больше никуда не пересылаются, хотя... Но есть еще одна проблема: написать саму функцию-переключатель. Непосредственно функции драйвера дергает только сама винда, пользовательские программы не имеют к ним доступа. Нужно извратится и "выколупать" эти функции из ядра. Увы, архитектура "двойки" солидно отличается даже от 3.0, а ассортимен WinAPI для подобных операций скудный до безобразия. Вот, теперь, когда будет время, подумаю, как все-таки выколупать из собранного виндового бинаря нужную функцию.
    А не дебажу, потому что собрать дебажную Винду дольше, чем прицепить воркэраунд :).
     
  9. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    :) А что тогда виснет, блокнот с исходником?

    Zelya, это ещё и двойка... Круто :)

    Вот тут лучше спросить, даже на таких условиях.
    http://www.cyberforum.ru/drivers-programming/
     
  10. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Нет, Винда виснет при загрузке, если добавть эти злосчастные push/pop DS где-то в районе того макроса. В соседних макросах, или в функции, где они используются, все работает. Мне вобще в голову не укладывается, как такой код мог бы поломать программу?! Ладно, если б были проблемы со стеком или с размером кода, но тогда любой другой push pop должен был бы тоже не работать. Магия одним словом.

    Да ладно, проехали. Главное проблему-то обошел. Тем более по дровам ниже Винды 3.1 вряд ли хоть кто-то подскажет.

    Сейчас главное, как мою DeviceMode функцию из win200.ovl дернуть. Лежит - вот она, на поверхности, рядышком со всеми остальными, а вот дернуть ее из проги, ну никак, пока не выходит. Нужно, наверное, забить на WinAPi и обычной сишкой колупать. Хотя не знаю, получится ли. Вдруг сишка попробует лоадить этот win200.ovl, а он уже в памяти. Короче, нужно пробовать, а времени нет.

    ---------- Сообщение добавлено в 12:54 ---------- Предыдущее сообщение размещено в 12:48 ----------

    ПС Конечно, всегда есть вариант WinAPI расширить, но, пока надеюсь на лучшее :)
     
  11. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Я понял. Тигра же предположил, что не компилируется :)

    Так ведь порча других регистров может и не проявиться, в отличие от сегмента данных, который буквально при следующем обращении к любой переменной даст о себе знать. А что если после push/pop проверить, что вытолкнулось, совпадает ли с исходным? На любом регистре проверить.

    Раз уж отладки не было, где гарантия, что результат не портился?

    Там ребята весьма неглупые, я бы не зарекался. Хороший форум.
     
    Bato-San нравится это.
  12. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Проверить-то можно, но мне уже лень :). Непонятно просто, как DS может портится. Мы ж его достаем сразу же как только положили. Спцеиально для теста писал, так как мой код не работал.
     
  13. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    :) Эт святое, да.

    Ну а как раньше можно было без cli/sti скормить прерыванию новый сегмент стека со старым смещением? И тоже, казалось бы, подряд присваиваем ss/sp.
     
    Bato-San нравится это.
  14. netsky2004

    netsky2004

    Регистрация:
    31 янв 2007
    Сообщения:
    1.443
    Программирование сведений о системе

    Пробовал вставить код:

    (код)

    Но для Visual Studio не подходит, так как там не существует ManagementObject. Под чем этот скрипт можно запустить?
     
    Последнее редактирование модератором: 2 авг 2014
  15. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    netsky2004, Это C# NET Framework 4.5

    И ты мог узнать это сам, просто полистав MSDN или спросив Google.
     
  16. netsky2004

    netsky2004

    Регистрация:
    31 янв 2007
    Сообщения:
    1.443
    Bato-San, я пробовал. В VS 2008 C# NET Framework 3.5 нельзя запустить. Чего тут листать? Это не поможет. Уже 2 года листаю, всю жизнь мне листать?
     
    Последнее редактирование: 28 июл 2014
  17. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    netsky2004, есть же какая то разница между 3.5 и 4.5 - тебе так не думается ? И, да ! Программист всю жизнь листает и учит.
     
  18. netsky2004

    netsky2004

    Регистрация:
    31 янв 2007
    Сообщения:
    1.443
    Bato-San, почему using System.Management ничего не даёт? Писать using System.Management могу сколько хочешь, но это не даст распознание WqlObjectQuery
     
    Последнее редактирование: 28 июл 2014
  19. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    System.Management появился ещё в 3.5.
     
  20. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    netsky2004 нравится это.
  21. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Если кому интересно, то до моих функций, как оказалось, доступится очень легко. Совершенно случайно нашел, что видеодрайвер грузится системой, как модуль DISPLAY. Берем хендл на этот модуль, а потом ищем в нем любые интересные нам функции. Только оправдались мои наихудшие опасения. При переключении режима, Винда сплошь и рядом использует данные от старого ражима, из-за чего изображение ломается. Нужно будет определять такие места и заставлять драйвер брать в этих местах собственные данные.
     
    Последнее редактирование: 28 июл 2014
  22. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    надо просто сообшить винде о смене видеорежима. А при переключении видеорежима преобразовать имеющееся изображение в требуемый формат. Собственно это не проблема винды. В любой доспроге при переключении видеорежима имеющееся в видеопамяти изображение превратится в чёрте что. Собственно так и появился DIB (DeviceIndependentBitmap) для виндовс.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление