Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизПомогите перевести на паскаль с Си Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.032 c