Я унаследовал довольно старую большую и сложную кодовую базу для программы, изначально предназначенной для MSDOS. Оказывается, некоторые разделы этой программы написаны на малопонятном диалекте ассемблера x86, называемом «ассемблер Phar Lap», после компании и продукта, который создал программу на ассемблере. Я сделал довольно глубокий поиск в Google, и я не могу найти ни оригинальную программу на ассемблере, ни какую-либо информацию или документацию о ней. (Хотя я нашел несколько довольно разочаровывающих страниц на бирже экспертов людей, задающих подобные вопросы).
Так что, по сути, я не смогу заставить эту вещь скомпилироваться, пока не найду копию PharLap Assembler (386asm.exe) или найду достаточно информации о диалекте, чтобы перевести ее на более «стандартный» MASM как диалект. Либо так, либо попробуйте потренироваться, просто разобравшись, прочитав это.
В качестве альтернативы, если ничего из этого не возможно, тогда мне просто нужна помощь в решении этой проблемы, и я должен, по крайней мере, иметь возможность получить один раздел программы для компиляции.
В файле .c есть объявление структуры, которое выглядит следующим образом:
//static struct bhash *bhash;
typedef struct bhash_control {
void *cachedata;
Rgb3 *ctab;
int rederr;
int grnerr;
int bluerr;
ULONG drgb; // temp var used by dithering, blackbox to us here
#ifdef SHOW_STATS
int calls, hits1, hits2, fhits, misses;
#endif
} BhashCtl;
BhashCtl bhashctl; // global so assembler code can see it.
а затем есть некоторый ассемблер, который выглядит следующим образом, который, по-видимому, пытается сделать такое же объявление типа, чтобы некоторый код на ассемблере мог использовать тот же тип:
BhashCtl struct
cachedata dd ? ; pointer to alloc'd cache data area
ctab dd ? ; contains vb.pencel->cmap->ctab
rederr dd ? ; error diffusion dithering variables...
grnerr dd ?
bluerr dd ?
drgb dd ? ; rgb value with dithering rolled in
;calls dd ? ; cache stats...
;hits1 dd ? ; to use these, you also need to
;hits2 dd ? ; uncomment a few lines below.
;fhits dd ? ; search for 'bhashctl.' to find them.
;misses dd ?
BhashCtl ends
extern bhashctl:BhashCtl ; the one-and-only lives in bhash.c
это компилируется с ошибкой в последней строке, которая выглядит следующим образом (ассемблер watcom):
Error! E518: External definition different from previous one
Так что, по сути, я думаю, что это говорит о том, что версия ассемблера этой структуры не совпадает с версией С этой структуры. Я пробовал несколько различных комбинаций WORD и DWORD вместо dd в ассемблере, но я не могу обойти эту мелочь. Возможно, если бы я мог найти способ сделать эти два объявления идеально подходящими, моя потребность в информации о pharlap уменьшилась бы.
Кроме того, если кто-то может придумать лучшее название для этого растягивающегося вопроса, я открыт для идей.
Редактировать: Хорошо, оказывается, я пролистал некоторую важную информацию. Это файл, изначально написанный для ассемблера Phar Lap (которого у меня нет), который я пытаюсь собрать, используя сборку watcom (wasm). Оказывается, проблема с этой конкретной ошибкой заключается в том, что Phar Lap чувствителен к регистру, а watcom - нет. Таким образом, он видит bhashctl так же, как BhashCtl. Разобрался с помощью моего зятя. Я никогда бы не подумал, что причиной этого является нечувствительность к регистру.