Ассемблерные вставки в Watcom C делаются немного иначе, например:
void read_mem(void);
#pragma aux read_mem = \
"push di" \
"cld" \
"mov ax, 2000H" \
"mov dx, IDMA_ADDRESS_REG" \
"out dx, ax" \
"les di, pBuffer" \
"mov cx, 1024" \
"mov dx, IDMA_DATA_REG" \
"repe insw" \
"pop di" \
modify [ax bx cx dx di es];
Более подробно о директиве pragma можно почитать в документации на компилятор.
Действительно, компиляторы C и C++ (не только wcc и wpp) по-разному формируют имена переменных и функций. Чтобы "переименовать" asm1.c в asm1.cc надо обрамить объявление переменных и функций следующей конструкцией:
extern "C" {
}
Т.е. Ваш код будет выглядеть примерно так:
extern "C" {
extern short pBuffer[1024];
short DATA_REG, *ptrB;
void asm_funct();
}
Я бы не советовал выполнять длительный по времени код в самом обработчике прерывания, если этого можно избежать. Лучше из обработчика вернуть proxy процессу, который вычитает данные.
Выигрыша по времени от "repe insw" я бы не ждал, т.к. чтение из порта, в любом случае, очень длительная инструкция и именно её длительность и оказывает самое большое влияние на конечный результат.