Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема...перекодить несколько функций из C в Delphi... [D6]


Atrion ©   (2005-07-22 01:56:00) 

Вот достался мне древний код написанный на сях. Все интерфейсные функции я
вырвал из кода, чтобы не громоздить тут много. Оставил только работу с портом...прошу помочь мне. Т.е. написать
эквивалент сишного кода на Delphi...

Кстати эти функции эквивалентны???:
 inportb>>>WriteFile
 outportb>>ReadFile
???

#include
#include
#include
#include
#include
#include
#include
#include
#define ON 1
#define OFF 0

void help(void);

void RD_DATA(void);        /*однократное считывание с АЦП*/
void STR_RD_DATA(void); /*считывание с АЦП, стробируемое угловой меткой */
void MOTOR_DRV(void); /* запуск и останов двигателя*/

   char key,motor_state=OFF,snd=ON;
   int baseport=0x378;   //адрес базового порт        
   signed int data,U1,U2,dataarray[7200];                  // данные с АЦП
   int point_number;

int main(void)
   {
   outportb(baseport,192);//инициализация порта
   
 
   

   

/******************************* HARD DRIVERS *******************************/

       /* однократное считывание с АЦП */

void RD_DATA()
   {
   int i,a;
   data=0;
   a=(inportb(baseport)|32);
   outportb(baseport,a);
   a=a&223;
   outportb(baseport,a);//пуск АЦП
   a=8;
   while(a==8)
   a=(inportb(baseport+1)&8);//ожидание готовности АЦП
   a=(inportb(baseport)&191);
   outportb(baseport,a);
   a=a|64;
   outportb(baseport,a);//запись в сдвиговый регистр
   for(i=0;i>1;
      a=(inportb(baseport+1)&64);
      a=a


Atrion   (2005-07-23 17:27:00) [1]

в основном ориентировка идет на 98...там мощный компутер не нужен так что 98 обойдутся...

ну а если затребуют на выше NT видимо придется по методике isasa


isasa   (2005-07-23 12:07:00) [2]

И под какой OS будем работать.
Если не связываться с секьрити то, нормально, через ф-цию API CreateFile.
В противном случае(в OS NT и выше), придется оформлять приложение с правами драйвера системы.


alpet   (2005-07-23 09:42:00) [3]

Atrion ©   (23.07.05 02:10) [4]

Точно сказать не могу, будет такой способ работать или нет. Во всяком случае известные мне примеры работы с драйверами, выглядели примерно так:

hFile := CreateFile ('Device\SomeDevice', ...);
WriteFile (hFile, buff, buff_size, writed, nil);

Для уточнения рекомендую почитать DDK.


Atrion   (2005-07-23 02:10:00) [4]

alpet ©   (23.07.05 00:24) [3]
  Turbo Pascal да раньше много чего хорошего было...
Спасибо что помог немножко... правда я собирался через:
 CreateFile(0,PChar('LPT1'),....);
 WriteFile(const Buffer;Size,wrSize,0)
 ReadFile(....)
...
 что так будет проще или я ошибаюсь?...


alpet   (2005-07-23 00:24:00) [5]

В Turbo Pascal такой синтаксис:

port [ port_num] := value;
value:= port [ port_num];

В Delphi его есстно упразднили - не планировалось, что язык кто-то будет использовать для написания драйверов.


Atrion   (2005-07-22 20:11:00) [6]

alpet ©   (22.07.05 07:11) [1]
такс понятненько...

а если без асемблерных вставок?...
в Delphe же много прекрасных функций для работы с портами..что посоветуете?....


alpet   (2005-07-22 07:11:00) [7]

procedure  OutportB (port, value: Cardinal); assembler;
asm
push     ebx
push     edx
movzx    edx, word ptr [port]
movzx    eax, byte ptr [value]
out      dx, al  
mov      bx, 10
div      bx    // delay for hardware reaction (about 10-40 ticks)
pop      edx
pop      ebx
end; // OutportB

function   InportB (port: Cardinal): byte; assembler;
asm
push     dx
mov      dx, word ptr [port]
in       al, dx
pop      dx
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо