|
Программирование >> Арифметические и логические операции
100% совместимости c dos4gw никто, конечно, гарантировать не может, но говорят, что под ним удалось запустить даже D00M. Более того, 100% совместимости просто нет - например, графические программы под DOS/4G в Цинке, которые определяют наличие DOS/4GW путем вызова int 21h, ah = 0xFF. При этом DOS/4GW и PMODE/W возвращают различный (хотя и похожий) результат. А также DOS/4G подобные : ♦ WDOSX (последняя версия 0.94, size ~12 Kb) ♦ DOS32A (последняя версия 4.30, size ~20 Kb) В чем отличия между DOS4GW и DOS4GW PRO? DOS4GW: ♦ используется в виде отдельного .EXE модуля, имеет ограничения по размеру виртуальной памяти (16 Мб), ограничение по общей используемой памяти (32 Мб) ♦ отсутствует поддержка некоторых DPMI вызовов (например 303h - allocate callback) ♦ отсутствует возможность писать TSRы ♦ отсутствует поддержка DLL, freeware ♦ 4GWPRO - встраивается в исполняемую программу ♦ ограничений в размере виртуальной памяти нет ♦ полная поддержка DPMI 1.0 ♦ поддержка DLL ♦ поддержка TSR ♦ стоит денег. DOS4G: ♦ не привязан к конкретному компилятору ♦ возможен запуск нескольких .EXEшников под одним экстендером ♦ поддержка DLL документирована ♦ обильная документация ♦ стоит больших денег. В процессе экспериментов выяснилось, что поддержка виртуальной памяти (VMM - virtual memory manager) и поддержка полного набора DPMI вызовов присутствуют не во всех вариантах 4GWPRO. Можно ли поиметь 4GWPRO даром? Да, можно. Для этого его надо вырезать из головы программы собранной с 4GWPRO. Обычно такая программа при запуске сама об этом сообщает. Однако не из любой программы можно получить полноценный экстендер. Ниже приведен список программ подвергшихся обрезанию и результаты. ♦ ACMAIN.EXE, ♦ DESCENT.EXE, ♦ HB5.EXE, ♦ HEROES.EXE дают версию 1.97 с полным набором прелестей. Размер: 217764 байта. ♦ ABUSE.EXE, ♦ BK.EXE, ♦ HEXEN.EXE, ♦ ROTT.EXE, ♦ TV.EXE (Terminal Velocity) дают версию 1.97 без VMM и поддержки расширенного набора DPMI. Размер: 157268 байт. ♦ ACRODOS.EXE (Acrobat reader for DOS) дает версию 1.97 с VMM, но без расширенного набора DPMI. Размер: 203700 байт. ♦ D4GRUN.EXE (из Watcom 10.0а) дает версию 1.96 без VMM, но с расширенной поддержкой DPMI (но судя по надписям внутри - это DOS4G, а не 4GWPRO). Размер: 154996 байт. ♦ DOOM2.EXE дает версию 1.95 без поддержек VMM и расширенного набора DPMI. Размер: 152084 байт. Как переделать программу, скомпилированную под DOS4GW для использования с полученным 4GWPRO? COPY /В 4GWPRO + OLD.EXE NEW.EXE Почему полученный 4GWPRO не дает использовать VMM, или не дает больше 16 Мб? Простое шаманство поможет:
Для 1.97 размером 217764 байта. 0001BFF8: (4 байта) размер виртуальной памяти по умолчанию. Можно ли использовать DLL c DOS4GW? Можно, это обеспечивает утилита DLLPOWER. Ищите в SimTelовских архивах файлы dllpr251.zip, dllpr254.zip и может быть уже есть более поздние. Я всю жизнь писал на Борланд-С, теперь решил перебраться на Ватком, как мне проще всего это сделать? Перенос ваших программ возможен, но скорее всего вам придется править ваш код. Начать можно с изменения int -> short. Ватком ругается на стандартные библиотечные функции, в то время как BC жует их нормально, что делать? Большинство программ, которые нормально работали под BC, будут нормально компилироваться и Ваткомом, нужно лишь немного изменить код, использующий специфичные функции, реализованные в BC, как расширение стандартной библиотеки. Для большинства таких функций есть аналогичная или подобная функция. Например, вместо gettime() следует использовать dos gettime(), вместо findfirst - dos find first, и так далее. Обратитесь к хелпу по BC, вы наверняка найдете имена аналогичных функций, запросив помощь по тем именам, которые не устроили компилятор Ваткома. Кроме того, следует помнить, что например random(num) не является стандартной функцией, а это просто макрос из stdlib.h, и вместо него можно использовать конструкцию типа (rand() % num). Можно ли перенести под Ватком программы, написанные с применением OWL или TVision? OWL - скорее всего нет, поскольку он построен на расширениях синтаксиса, которые не обрабатывается компилятором Ватком. Для переноса TVision есть несколько вариантов. Существуют diffы для преобразования TV под GNU C++ (продукт называется GVISION. Это не решает разом все проблемы, естественно, но по крайней мере этот вариант TV заточен под 32 бита и флат модель. Совсем недавно стали доступны два порта TV под Watcom C++. Первый - это перенос под полуось и dos4gw TV 1.0. Второй имеет внутри маленькую доку и собственно сы-рец+ makefile. Доку рекомендуем внимательно прочесть - может пригодится при перекомпиляции ваших программ. В моей программе используются inline ассемблер и псевдорегистры, смогу ли я заставить их работать под Ваткомом? Нет. Придется переписать на встроенном ассемблере, либо вынести в отдельный .asm модуль. С 11 версии поддерживает стиль a la Borland: asm ... А нельзя ли кaк-нибyдь на вaткoмe реализовать AX из Borland? А то переношу под него библиотеку, a там они активно юзаются Если вам AX нужен на read-only, то можно сделать прозрачно: === Cut === short reg ax ( void ) ; #define AX reg ax() #pragma aux reg ax = \ value [ax] #if defined( 386 ) defined( FLAT ) int reg eax ( void ) ; #define EAX reg eax() #pragma aux reg eax = \ value [eax] #define rAX reg eax() чтобы не задумываться о контексте #else #define rAX reg ax() #endif === Cut === А если для модификации, то лучше не полениться и сделать как просит Ватком (то бишь оформите этот фрагмент как inline-asm). Встречается проблема, когда надо собирать смешанный проект - часть модулей компилится Ваткомом, а часть Боpландом (например ассемблером). Линкер падает по трапу, вываливается с бредовыми ошибками и вообще ведет себя плохо. Что делать? Ha худой конец есть способ: ♦ борландовый ob]->wdisasm->.asm->wasm-> ♦ ваткомовский А дальше это отдавать как обычно wlinky. Есть еще народное средство - нужно взять tasm 3.2, а еще лучше tasm 4.0, последний хорош тем, что имеет режимы совместимости по синтаксису со всеми своими предками... Или TASM32 5.0 с патчем (обязательно 32 bits) При задании надписей заголовков окон, меню, кнопок и т.п. на русском языке все прекрасно видно пока я нахожусь в режиме дизайнера. Стоит только запустить созданную аппликуху - кириллица исчезает напрочь Замените WRC.DLL из поставки Optima 1.0 на WRC.EXE из поставки Watcom 11.0 и все придет в норму. Какой компилятор C (C++) лучше всех? Что лучше: Watcom C++ или Borland C++? Посоветуйте самый крутой компилятор?! Смотря для чего. Если нужна многоплатформенность и хорошая кодогенерация, то лучше - Ватком. Но следует учитывать, что производство Ваткома прекращено и компилятор уже не соответствует в полной мере стандарту C++, и уже никогда не будет соответствовать. А вот для разработки приложений под Win32 лучше будет Borland C++ Builder, хотя качество кодогенерации у него ниже и ни о какой многоплатформен-ности говорить не приходится. Что же касается BC++ 3.1 - это не более, чем учебный компилятор, и он уже давно забыт. Не следует забывать и о gcc, который есть подо все мыслимые платформы и почти полностью поддерживает стандарт, однако он (точнее, его Win32 версия - cygwin) не слишком удобна для создания оконных Win32 приложений, с консольными - все в порядке, причем консольные приложения можно создавать и досовой версией - djgpp, дополненной пакетом rsxnt. А вообще - рассуждать, какой компилятор лучше, достаточно бесполезное занятие. Идеального компилятора не существует в природе. Совершенно негодные компиляторы не имеют широкого распространения, а тот десяток компиляторов (не считая специфических кросс-компиляторов под разные встроенные системы), которые имеют широкое распространение, имеют свои достоинства и недостатки, так что приходится подбирать компилятор, наиболее подходящий для решения конкретной задачи. Есть ли в Watcom встроенный ассемблер? Встроенного asma у него на самом деле нет. Есть правда возможность писать asm-функции через #pragma aux .... Например: #pragma aux DWordsMover = \ mov esi, eax , \ mov edi, ebx , \ jcxz @@skipDwordsMover , \ rep movsd , \ @@skipDWordsMover: , \ parm [ebx] [eax] [ecx] modify [esi edi ecx] void DWordsMover(void* dst, void* src, size t sz); В версии 11.0 точно имеется asm{}. BC не хочет понимать метки в ассемблерной вставке - компилятор сказал, что не определена эта самая метка. Пришлось определить метку за пределами ASM-блока. Может быть есть более корректное решение? Загляни в исходники RTL от BC++ 3.1 и увидишь там нечто красивое, например: #define I asm ........ I or si,si I ]z m1 I mov dx,1 m1: I int 21h и т.д.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |