Эмулятор таксофонной карты. Раунд 3. Часть #3

Шаг третий. Джин в
бутылке или Считываем инфу.

Ну а теперь перейдем от
теории к практике. И первым нашим шагом
будет сборка ридера
карточки (card reader), т.е. считывающего
устройства. Наиболее
простым вариантом является сборка ридера
для подключения его к LPT-порту
компьютера. Схема элементарна (тут).
Дальше следует написать простейшую прогу,
которая будет считывать с карточки инфу и
выдавать ее в более или
менее удобочитаемом виде. Пример такой
программы приведен ниже.

program Phonecard_reader;
uses Crt;
const
LPT=$378; {Базовый адрес порта LPT}
del=1; {константа задержки в 1 мс}
procedure Clk(v:byte); {Clk(1) - устанавливает высокий
уровень CLK
Clk(0) - устанавливает низкий уровень CLK}
var
tmp:byte;
begin
tmp:=Port[LPT];
if v=0 then
tmp:=tmp and $FE
else
tmp:=tmp or 1;
Port[LPT]:=tmp;
end;

procedure Reset(v:byte); {Reset(1) -
устанавливает высокий уровень RST
Reset(0) - устанавливает низкий уровень RST}
var
tmp:byte;
begin
tmp:=Port[LPT];
if v=0 then
tmp:=tmp and $FD
else
tmp:=tmp or 2;
Port[LPT]:=tmp;
end;

function GetData:Byte;
var
tmp:Byte;
begin
tmp:=Port[LPT+1];
if tmp=120 then
GetData:=1
else
GetData:=0;
end;

procedure SetData(v:byte);
var
tmp:byte;
begin
tmp:=Port[LPT];
if v=0 then
tmp:=tmp and $FB
else
tmp:=tmp or 4;
Port[LPT]:=tmp;
end;

var
arr:array[0..1024] of byte;
idx:word;
f:text;
begin
assign(f,'con'); {По умолчанию вывод идет на экран.
Вместо con
можно поставить имя
файла, и вывод будет
направлен в него}
rewrite(f);
idx:=0;
textmode(Font8x8 or CO80);
clrscr;
Clk(0);Reset(0);delay(del);
Reset(1);delay(del);
Clk(1);delay(del);Clk(0);delay(del);Reset(0);delay(del);
repeat
begin
if (idx mod 8)=0 then
write(f,#13#10+'Byte ',(idx div 8):2,' :')
else
if (idx mod 4)=0 then
write(f,' ');
Clk(1);delay(del);
arr[idx]:=GetData;
Clk(0);delay(del);
write(f,arr[idx]);
inc(idx);
end;
until idx=1024;
while keypressed do readkey;
writeln(#13#10'Press any key to exit ...');readkey;
close(f);
end.

Для тех, кто весьма ленив
и не любит топтать клавиатуру, могу порекомендовать
готовую прогу, называемую SmartLab.
Комменты, как говорится, излишни. Вся
дополнительная информация находится в help-файле
этой проги. Ну, а теперь
разберем, что же означают все эти байтики,
болтики и винтики, которые
мы выгребли из карточки. (Несущественные
данные пропущены).

Байт Биты Значение/Описание
1 1-8 D8 старые карты
DD новыекарты
2 9-16 код страны
5 33-36 номинал
карточки
5 37-40 последняя цифра
года выпуска
6 41-44 № месяца
выпуска
6-9 45-64 серийный номер
9 65-72 4096* NBS единиц
10 73-80 512* NBS единиц
11 81-88 64* NBS единиц
12 89-96 8* NBS единиц
13 97-104 1* NBS единиц (NBS-число
установленных битов)
14-40 105-320 FF - проверочная
область

Итак, можно выделить
следующие информационные области на карте:
заголовок, счетчик и
фуфел. Заголовок содержит 40 бит информации,
которые жестко программируются
изготовителем карт. Обычно эта область
содержит чисто служебные данные, которые в
принципе нам нужны только для
информативности. Следует иметь в виду, что
некоторые производители в битах 36-64 пишут
копию даты выпуска и серийного номера.
Кроме этого, интересной фишкой является то,
что первыми четыремя цифрами серийного
номера всегда будет дата выпуска, т.е., 0600
будет означать июнь 2000 года. Назначение
счетчика понятно: вначале все биты
установлены в 00, потом как только таксофон
"съедает" единицу времени, соответствующий
бит принимает значение FF. Проверочная
область - область, на
которой производитель проверяет
работоспособность чипа. И, наконец, все, что
находится после 40 байта, не имеет для нас
никакого значения. Последние две области и
есть тот фуфел, который только мешает и
вносит кучу неразберихи
в этот вопрос.

Значение счетчика
определяется по следующему принципу:

Байт
9
10
11
12            13

8-езначение  00000001 00011111
01111111 00000011 00011111

10-езначение
1
5
7
2             5

Переводим из 1*8^4  + 5*8^3
+ 7*8^2   + 2*8^1   + 5*8^0

8-й СС в 10-ю  4096  +
2560  +     448    +
16           +
5      =7125

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

Похожие материалы