Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Помогите перевести на паскаль с Си   Найти похожие ветки 

 
M@X ©   (2004-04-30 11:50) [0]


hofs=0;
hsel=0;
rz=_dos_seg_alloc(0,&hsel, &hmaxpg);
if (!rz) rz=_dx_map_phys(hsel, io_base, 0x100, &hofs);
_adress = (char _far *)MK_FP(hsel, hofs)


 
Григорьев Антон   (2004-04-30 13:02) [1]

Судя по именам, это какие-то нестандартные функции. Надо разбираться с той библиотекой, откуда они взяты. И, похоже, это какие-то манипуляции с памятью, которые в виндах ни на C, ни на Паскале не пройдут.


 
Игорь Шевченко ©   (2004-04-30 13:09) [2]

Так это же для ДОС


 
Григорьев Антон   (2004-04-30 13:16) [3]


> Игорь Шевченко ©   (30.04.04 13:09) [2]
> Так это же для ДОС


Это я понял. Просто мне уже не раз приходилось встречаться с вопросами людей, которые озаботились переносом старых досовских программ под винды, и пытаются перевести их дословно, не понимая, что принципы работы с памятью, портами, устройствами и т.д. здесь совсем другие. Вот и предупредил на всякий случай.


 
ЮрийК ©   (2004-04-30 13:25) [4]

Наверное так:

pchar _far = ^char _far;

hofs=0;
hsel=0;
rz=_dos_seg_alloc(0,@hsel, @hmaxpg);
if (rz = nil) rz=_dx_map_phys(hsel, io_base, 0x100, @hofs);
_adress = pchar _far(MK_FP(hsel, hofs));


 
ЮрийК ©   (2004-04-30 13:27) [5]

Блин, вместо "=" нужно ":="


 
ЮрийК ©   (2004-04-30 13:31) [6]

А может и так достаточно:

hofs:=0;
hsel:=0;
rz:=_dos_seg_alloc(0,@hsel, @hmaxpg);
if (rz = nil) rz:=_dx_map_phys(hsel, io_base, 0x100, @hofs);
_adress = MK_FP(hsel, hofs);


 
ЮрийК ©   (2004-04-30 13:36) [7]

И снова не всё переведено (вместо "0x" "$") :

hofs:=0;
hsel:=0;
rz:=_dos_seg_alloc(0,@hsel, @hmaxpg);
if (rz = nil) rz:=_dx_map_phys(hsel, io_base, $100, @hofs);
_adress = MK_FP(hsel, hofs);


 
Григорьев Антон   (2004-04-30 13:59) [8]


> И снова не всё переведено (вместо "0x" "$") :


А ещё then после if"а забыл :))


 
ЮрийК ©   (2004-04-30 14:11) [9]

Есть утилиты для перевода, сначала через них пропускать, а потом уже ручками, если что не так.


 
M@X ©   (2004-04-30 14:41) [10]

Это именно какие то хитрые манипуляции с вычислением _adress (это или порт или скорее всего массив в памяти девайса)которому в дальнейшем через _adress+смещение^:=Значение присваиваются всякие значения.


 
M@X ©   (2004-04-30 14:44) [11]

Кусок кода программы. который поперек горла стоит:


void wr_config ( int addr, int cword )
{
outpd ( 0xCF8 , 0x80000000l | (devnum<<8) | (addr&0xFF) );
outpd ( 0xCFC , cword );
}

int rd_config ( int addr )
{
outpd ( 0xCF8 , 0x80000000l | (devnum<<8) | (addr&0xFF) );
return inpd ( 0xCFC );
}

//далее определяется указатель _ibuf через который путем *(_ibuf) = Value;

h_base = rd_config( 0x10 ) & 0xFF000000l;
wr_config( 0x30 , h_base );
hofs=0;
hsel=0;
rz = _dos_seg_alloc(0, &hsel, &hmaxpg);
if(!rz) rz = _dx_map_phys(hsel, h_base, 0x400 , &hofs);
if(!rz)
{
_hbuf = (char _far *)MK_FP(hsel, hofs);
}
else
{
_hbuf = (char _far *)NULL; printf ("1 allocation error %02x\n",rz);getch();
}
hofs=0;
hsel=0;
rz = _dos_seg_alloc(0, &hsel, &hmaxpg);
if(!rz) rz = _dx_map_phys(hsel, h_base, 0x400 , &hofs);
if(!rz)
{
_dhbuf = (unsigned int _far *)MK_FP(hsel, hofs);
}
else
{
_dhbuf = (unsigned int _far *)NULL; printf ("2 allocation error %02x\n",rz);getch();
}

if (vga_agp)
{
io_base = rd_config( 0x14 );
printf ( "I/O Base : %08X ", io_base );
wr_config( 0x4 , 0x02000002 );
hofs=0;
hsel=0;
rz = _dos_seg_alloc(0, &hsel, &hmaxpg);
if(!rz) rz = _dx_map_phys(hsel, io_base, 0x100 , &hofs);
if(!rz)
{
_ibuf = (char _far *)MK_FP(hsel, hofs);
}
else
{
_ibuf = (char _far *)NULL; printf ("3 allocation error %02x\n",rz);getch();
}
}

pnp_int = rd_config( 0x3C ) & 0xFF;



 
ЮрийК ©   (2004-04-30 15:19) [12]

На чём компилишь (delphi1 или другое), на что ругается?


 
M@X ©   (2004-04-30 15:32) [13]

код Си_шный, не могу перевести на Pascal


 
ЮрийК ©   (2004-04-30 15:37) [14]

А кто-нить видел утилиту перевода с паскаль в в си (другой язык), посоветуйте линк. Очень желательно с сорсами чтобы.


 
ЮрийК ©   (2004-04-30 15:39) [15]

"код Си_шный, не могу перевести на Pascal"

Поподробнее с этого места. Конкретику будьте добры.


 
ЮрийК ©   (2004-04-30 15:43) [16]

Далее самому ручками править:

{*********************************}
{ Generated by c2pas32  v0.9b     }
{ (c) 2001 Oleg Bulychov          }
{ Gladiators Software             }
{ http://www.astonshell.com/      }
{*********************************}

unit TEST_c;

interface

implementation

procedure wr_config(addr: integer;  cword: integer);
begin
 outpd($CF8,$80000000 or (devnum shl 8) or (addr and $FF));
 outpd($CFC,cword);
end;

function rd_config(addr: integer): integer;
begin
 outpd($CF8,$80000000 or (devnum shl 8) or (addr and $FF));
 begin
   result:= inpd($CFC);
   exit;
 end;
end;
h_base:= rd_config($10) and $FF000000;
wr_config($30,h_base);

(*далее определяется указатель _ibuf через который путем *(_ibuf) = Value;*)
hofs:= 0;
hsel:= 0;
rz:= _dos_seg_alloc(0,@hsel,@hmaxpg);
if {not}0=rz
then
rz:= _dx_map_phys(hsel,h_base,$400,@hofs);
if {not}0=rz
then
begin
 _hbuf:= (char_far* )MK_FP(hsel,hofs);
end;
else
begin
 _hbuf:= (char_far* )0{nil};
 printf("1 allocation error %02x"#13#10"",rz);
 getch();
end;
hofs:= 0;
hsel:= 0;
rz:= _dos_seg_alloc(0,@hsel,@hmaxpg);
if {not}0=rz
then
rz:= _dx_map_phys(hsel,h_base,$400,@hofs);
if {not}0=rz
then
begin
 _dhbuf:= (unsignedint_far* )MK_FP(hsel,hofs);
end;
else
begin
 _dhbuf:= (unsignedint_far* )0{nil};
 printf("2 allocation error %02x"#13#10"",rz);
 getch();
end;

if vga_agp<>0{nil} {<= !!!9}
then
begin
 io_base:= rd_config($14);
 printf("I/O Base : %08X ",io_base);
 wr_config($4,$02000002);
 hofs:= 0;
 hsel:= 0;
 rz:= _dos_seg_alloc(0,@hsel,@hmaxpg);
 if {not}0=rz
 then
 rz:= _dx_map_phys(hsel,io_base,$100,@hofs);
 if {not}0=rz
 then
 begin
   _ibuf:= (char_far* )MK_FP(hsel,hofs);
 end;
 else
 begin
   _ibuf:= (char_far* )0{nil};
   printf("3 allocation error %02x"#13#10"",rz);
   getch();
 end;
end;
pnp_int:= rd_config($3C) and $FF;

end.


 
M@X ©   (2004-04-30 15:54) [17]

Далее TMT Pascal


 
M@X ©   (2004-04-30 15:58) [18]

Далее первый камень:
_dos_seg_alloc и _dx_map_phys за ним следует (char_far* )MK_FP(hsel,hofs)


 
ЮрийК ©   (2004-04-30 16:13) [19]

Убери для начала.
Или объяви pchar_far = ^char_far;
pchar_far(MK_FP(hsel,hofs))


 
SammIk ©   (2004-04-30 16:16) [20]

Скорее всего далее поидет такои булыжник:
А где брать эти ф-ии _dos_seg_alloc и _dx_map_phys


 
WebErr ©   (2004-04-30 16:25) [21]

Конечно можно и переделать, а вообще-то если Builder есть - скомпиль unit и подключи к проекту.



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
14-1082809313
Yar-Com
2004-04-24 16:21
2004.05.16
расстояние между скрещивающимися прямыми


7-1080732327
Fiend
2004-03-31 15:25
2004.05.16
Импорт функции из .exe


1-1083146120
Immortal
2004-04-28 13:55
2004.05.16
перерисовка региона


14-1083134788
syte_ser78
2004-04-28 10:46
2004.05.16
Помогите найти


14-1082741400
Sane
2004-04-23 21:30
2004.05.16
Курсовик =(