帮忙把一个c语言编的ic卡写函数翻译成delphi(程序很短)(50分)

  • 主题发起人 linke520
  • 开始时间
L

linke520

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个深圳明华公司的ic卡读写器,型号为 at45d041,
并口通讯的。编的写数据程序没有用到提供的接口函数。
unsigned card_data_address=0x280;
unsigned card_command_address=0x288;

void write_data(unsigned card_data_address,unsigned card_command_address,unsigned long int mem_address,int data)
{ _outp(card_data_address,0x30);
for (int i=1;i<=40;i++) _outp(card_command_address,0x18);
_outp(card_command_address,0x08);
unsigned h_mem_address,l_mem_address;
h_mem_address=(unsigned)(mem_address/0x100);
l_mem_address=(unsigned)(mem_address%0x100);
if(h_mem_address<=255)
{
_outp(card_data_address,l_mem_address);
_outp(card_command_address,0x09);
_outp(card_command_address,0x08);
_outp(card_data_address,h_mem_address);
_outp(card_command_address,0x0a);
_outp(card_command_address,0x08);
_outp(card_data_address,data);
_outp(card_command_address,0x04);
_outp(card_command_address,0x00);
_outp(card_data_address,0x40);
_outp(card_command_address,0x10);
_outp(card_command_address,0x00);
_outp(card_data_address,0x30);
_outp(card_command_address,0x10);
_outp(card_command_address,0x00);
_outp(card_data_address,0x30);
_outp(card_command_address,0x18);
_outp(card_command_address,0x08);
}
else
{
h_mem_address=h_mem_address-256;
_outp(card_data_address,l_mem_address);
_outp(card_command_address,0x09);
_outp(card_command_address,0x08);
_outp(card_data_address,h_mem_address);
_outp(card_command_address,0x0a);
_outp(card_command_address,0x08);
_outp(card_data_address,data);
_outp(card_command_address,0x04);
_outp(card_command_address,0x00);
_outp(card_data_address,0x41);
_outp(card_command_address,0x10);
_outp(card_command_address,0x00);
_outp(card_data_address,0x30);
_outp(card_command_address,0x10);
_outp(card_command_address,0x00);
_outp(card_data_address,0x30);
_outp(card_command_address,0x18);
_outp(card_command_address,0x08);
}
return;
}
问一个比较低级的问题,为什么写入一个数据,要从card_data_address写入7个数据,
而从card_command_address端口写入53个数据?写入的这些数据是干什么用的啊?
我在想这是不是一个通讯协议呢?也就是说其他那些数据只是控制
那个数据写入的位置和格式,而实际上他们没有被写入呢?
那些数据如果都被写入的话,那存放的位置是不是按写入的先后
存放的呢?数据区和命令区是不是分开的啊?感觉好像命令区
占的地方太大了。
什么的?通过端口写入的
 



const card_data_address=$280;
card_command_address=$288;

procedure write_data(card_data_address,card_command_address,mem_address:dword;data:integer);stdcall;
var
i:integer;
h_mem_address,l_mem_address:dword;
begin
_outp(card_data_address,$30);
for i:=1 to 40 do _outp(card_command_address,$18);
_outp(card_command_address,$08);
h_mem_address:=dword(mem_address div $100);
l_mem_address:=dword(mem_address mod $100);
if (h_mem_address<=255) then
begin
_outp(card_data_address,l_mem_address);
_outp(card_command_address,$09);
.......
end else
begin
.......
end;
end;


关键可能在于 _outp 的声明 ,声明为 __cdecl
前面的 _ 就不要了。
outp(card_data_address,l_mem_address);
 
_outp需要自己写

procedure _outp(address: word; Value: byte); register
begin
xchg ax, dx
out dx, al
end;
 
to tseug:
delphi 不认识xchg这个指令阿,编译通不过阿
 
那个是汇编指令,添加一个asm就可以了
procedure _outp(address: word; Value: byte); register
begin
asm
xchg ax, dx
out dx, al
end
end;
 
呵呵不好意思, 把asm丢掉了
 
多谢多谢,不知道该怎样给你们分配分数阿!
还有一个问题,就是写入的不就只有一个data数据
是需要的吗?其他那么多写入的是干什么的啊?
如果写入一个字节需要那么多控制的话,那不是
浪费了很多的ic卡容量啊,这个我不太明白,望
大虾给于讲解一下。
 
IC卡的读写本来就很麻烦,尤其是直接控制端口, 它有很多控制命令,所以我一般
都用他的开发包提供的函数接口
 
对于ic卡,你认为你需要写的是一个字节的数据,实际它是每次都写固定的数量,比如4个或者其他数量个字节,有的
还需要首先擦除,然后再写入。
就像你写文本文件,根本不知道系统是按照每次64k的容量进行读写一样。
 
to tseug:
_inp(card_data_address);帮忙把这个函数也翻译一下,不好意思,
没有分数了,希望你还是能帮一下!
 
为什么要从两个不同的端口写入呢?
unsigned card_data_address=0x280;
unsigned card_command_address=0x288;
这个并口的地址是随意的吗?还是有一定的规定的啊?
 
procedure OutByte(aAddr: Word; aValue: Byte); register;
function InByte(aAddr: Word): Byte; register;

implementation

procedure OutByte(aAddr: Word; aValue: Byte);
asm
XCHG AX, DX
OUT DX, AL
end;

function InByte(aAddr: Word): Byte;
asm
XCHG AX, DX
IN AL, DX
end;
 
大虾真厉害啊,函数的定义你也知道啊,
这个应该是c++函数把,反正我是在msdn
帮助文挡中查到的,你好象很熟悉啊,还知道
函数的原始定义,真是高手啊!
 
不是, 这个是自定义的函数和过程, 和那两个_outp, _inp功能一样的...
 
这样的啊,那更厉害啊,
能用很简单的几句话就实现了
相应的功能。
 
--》真是高手啊!。。。
--》这样的啊,那更厉害啊,。。。
你倒是说点实在的回应啊,别搞的大家浑身疙瘩的,

明华公司的ic卡读写器我也用过几种,他是有提供
delphi的接口函数库的,用法很简单,你为什么不用呢?
 
接受答案了.
 
顶部