Нужно прочитать код
{$ifdef RWPort}
var
len: cardinal;
written: cardinal;
{$endif}
begin
{$ifdef RWPort}
len:= 1;
WriteFile(hport,b,len,written,nil);
{$else}
asm
push edx
push eax
mov dx,p
mov al,b
out dx,al
pop eax
pop edx
end;
И что туту значит условная компиляция.
Заранее спасибо.
Нужно прочитать код. Что тут значит условная компиляция.
Заранее спасибо.
Здесь условная компиляция значит, что если, например, лексема RWPort определена (с помощью {$define RWPort}), то код между директивами {$ifdef RWPort} и {$endif} скомпилируется, а если нет - значит в программе он будет отсутствовать, как буддто его и не было вовсе. Про {$else} ты наверное сам догадаешься. А ассемблерный код делает вот что:
1. сохраняет в стеке содержимое регистров edx и eax
2. помещает в регистр dx (версия edx для 16 бит) значение p, в регистр al (eax для 8 бит)
3. отправляет на порт, 16-битное значение которого находится в регистре dx, значение, находящееся в регистре al.
восстанавливает значения регистров edx и eax. Ассемблер надо учить, батенька!!! Да и теорию по Delphi тоже. (Я об условной компиляции и методах отладки приложений)
Здесь условная компиляция значит, что если, например, лексема RWPort определена (с помощью {$define RWPort}), то код между директивами {$ifdef RWPort} и {$endif} скомпилируется, а если нет - значит в программе он будет отсутствовать, как буддто его и не было вовсе. Про {$else} ты наверное сам догадаешься. А ассемблерный код делает вот что:
1. сохраняет в стеке содержимое регистров edx и eax
2. помещает в регистр dx (версия edx для 16 бит) значение p, в регистр al (eax для 8 бит)
3. отправляет на порт, 16-битное значение которого находится в регистре dx, значение, находящееся в регистре al.
восстанавливает значения регистров edx и eax. Ассемблер надо учить, батенька!!! Да и теорию по Delphi тоже. (Я об условной компиляции и методах отладки приложений)
Спасибо огромное!
я не отрицаю. Delphi пятый день вижу.
Спасибо огромное!
я не отрицаю. Delphi пятый день вижу.
код делает вот что: если определена RWport то мы будем для записи в порт использовать Win32 API функцию WriteFile, в противном случае - мы пишем всё тот же байт в порт, но на асме.
К сведению, инструкция out на WinNT 2000 XP ... не прокатит в обычном приложении - она привелигированная.
код делает вот что: если определена RWport то мы будем для записи в порт использовать Win32 API функцию WriteFile, в противном случае - мы пишем всё тот же байт в порт, но на асме.
К сведению, инструкция out на WinNT 2000 XP ... не прокатит в обычном приложении - она привелигированная.
Спасибо огромное. А как обойти out? в XP.
Спасибо огромное. А как обойти out? в XP.
чтобы можно было обращаться к произвольному порту нужно писать драйвер - больше никак. Можно, правда, использовать апишки типа DeviceIoControl, но их возможности сильно ограничены.
чтобы можно было обращаться к произвольному порту нужно писать драйвер - больше никак. Можно, правда, использовать апишки типа DeviceIoControl, но их возможности сильно ограничены.
Да и смысла обращаться к конкретному порту помимо коммуникационных нет. Винда предоставляет кучу библиотек и интерфейсов на все случаи жизни. Методы, связанные с обращением к портам напрямую уже давно умерли вместе с Win9x. Настало время новых высокоуровневых интерфейсов, как выражаются мелкомягкие :D
Да и смысла обращаться к конкретному порту помимо коммуникационных нет.
Согласен - смысла мало, разве что так, ради интереса, ну там пару тройку аппаратных функций посмотреть или с BIOS повозиться...
Согласен - смысла мало, разве что так, ради интереса, ну там пару тройку аппаратных функций посмотреть или с BIOS повозиться...
Да, с BIOS повоевать не получится, а для аппаратных функций - только DeviceIOControl (зато можно напрямую на жёсткий диск писать или, например, int 21h эмулировать...)