#pragma warn -8070
u64 get_ticks()
{
asm RDTSC
};
#pragma warn +8070
Работа с портами
outport(port,byte);
inportb(port);
Никак, между С++ Builder и Turbo C++ всетаки есть разница...
Если надо, напишу подробно.
Напишите подробнее чайнику
2. В h-файле прописываешь указатели на функции
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
inpfuncPtr inp32;
oupfuncPtr out32;
HANDLE hLib;
3.В модуле cpp в обработчике FormCreate загружаем библиотеку
и получаем указатели на на функции ввода-вывода:
hLib = LoadLibrary("inpout32.dll");
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
out32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
4.Можно работать:
Например, чтобы выдать на все ножки LPT единички:
out32(0x378,0xFF);
Прочитать состояние LPT-порта (всего 5 ножек доступно):
int Condition =inp32 (0x379);
Например в цикле ждем приход сигнала:
while(inp32 (0x379)& 0x20)
{
Sleep(1);
}
Обязательно вставляйте Sleep, иначе сильно грузит процессор и
другие приложения будут тормозить. DLL-ку взял на logix4u.net
Хорошо написано как работать с ней на pcports.ru.
Чем могу - помогу, удачи.
Есть проблема при считывании значений с порта в цикле программа зависает и нечего не выводит в чем может быть дело ???
For(;;)
{
int x=inp32(port);
Panel1->Caption = x;
}
Решения может быть два:
1. Внутри бесконечного цикла вставляете вызов функции Sleep(200), которая приостанавливает выполнение процесса на 200 мс, и вызов метода Application->ProcessMessages(), который обрабатывает ожидающие сообщения в очереди.
2. Просто на форму помещаете объект TTimer, ставите у него интервал, например, в 200 мс, и ваш код (считывание из порта и вывод на форму) поместить в обработчик единтсвенного события таймера.
Как сделать выход из бесконечного цикла???
В обработчике кнопки "Старт" ставите Run в true и после этого там же запускаете ваш цикл.
В обработчике кнопки "Стоп" просто ставите Run в false.
Чтобы это всё работало, делаете цикл не for(;;), а for(;Run;) - тогда выполнение будет идти, пока значение Run истинное.
Либо по-другому - внутри цикла пишете if(!Run) break; - но по мне красивее первый вариант.
Но я всё-таки предпочёл бы сделать чтение порта по таймеру - выглядит более лаконично. Но вот если вам нужно очень часто читать - то он не поможет - период срабатываний меньше 5мс поставить не выйдет.
Все работает))) Спасибо всем ))):)
inline static unsigned char inportb (unsigned short _port)
{
unsigned char rv;
__asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
return rv;
}
inline static void outportb (unsigned short _port, unsigned char _data)
{
__asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}
или
inline static unsigned char inportb (unsigned short _port)
{
unsigned char rv;
asm inb rv, _port
return rv;
}
inline static void outportb (unsigned short _port, unsigned char _data)
{
asm outb _port, _data
}
Цитата: asmforce
Работает? Хорошо. Но можно сделать самому, надежность совместимости гарантирована (или почти гарантирована)
Ты это.. не безобразь :)
Твой код без библиотеки работать не будет, а с библиотекой он уже не нужен.
asmforce , а ты сам то пробовал то , что советуешь ? ))
Цитата: Phodopus
Ты это.. не безобразь :)
Твой код без библиотеки работать не будет, а с библиотекой он уже не нужен.
Твой код без библиотеки работать не будет, а с библиотекой он уже не нужен.
Ну это... не нужен - так не нужен. Это только как вариант.
Кроме того - поскольку функции inline - то при вставке этих функций в виде #include <.../iop.h> размер испонимого не возрастает.
Цитата: koderAlex
asmforce , а ты сам то пробовал то , что советуешь ? ))
Разумеется. Например вот элегантное решение:
Код:
команда RDTSC в винде доступна всем приложениям , а вот доступ к портам по умолчанию закрыт .
зы : код asm {
cli
db 0f3h,66h,0f0h,67h,0ffh,0fh,0bh
}; в любой операционке и в любом языке позволяющем ассемблерные вставки делает жизнь веселее . ;)