10 REM *** Program that reads/writes 2nd generation smart-cards *** 20 REM *** through a direct connection with the parallel port. *** 30 REM *** L. Padilla (e-mail: padilla at domain "gae ucm es") *** 40 REM *** Madrid, 1996, Ver 2.1 (1997) *** 50 OPTION BASE 1 : DIM BYTE%(64) 60 OUT 888, 0 : REM *** 0v data pins *** 70 PRINT "Insert card and hit F5 (CONT)." : STOP 80 REM *** Reset card: *** 90 OUT 888, 2^0 : REM *** +5v pins 2(Vcc) *** 100 OUT 888, 2^1 + 2^0 : REM *** +5v 2,3(Reset) *** 110 OUT 888, 2^2 + 2^1 + 2^0 : REM *** +5v 2,3,4(Clock) *** 120 OUT 888, 2^1 + 2^0 : REM *** +5v 2,3 *** 130 OUT 888, 2^0 : REM *** +5v 2 *** 140 REM *** Go through all the addresses: *** 150 PRINT "By b7 b6 b5 b4 b3 b2 b1 b0 Dec Hex A |Byt b7 b6 b5 b4 b3 b2 b1 b0 Dec Hex A" 160 PRINT "-- -- -- -- -- -- -- -- -- --- --- - |--- -- -- -- -- -- -- -- -- --- --- -" 170 FOR I% = 1 TO 64 180 BYTE%(I%) = 0 190 IF (I% MOD 2 = 0) THEN PRINT " "; 200 PRINT USING "## "; I%; 210 FOR J% = 7 TO 0 STEP -1 220 BITCOUNT% = I% * 8 - J% 230 NUM% = 1 : REM *** Choose write or writecarry *** 240 REM *** Write if required: *** 250 IF (BITCOUNT% >= 1000 AND BITCOUNT% <= 1000) THEN GOSUB 630 260 BIT% = INP (889) AND 8 : REM *** Read pin 15 (I/O) *** 270 BIT% = BIT%/8 : PRINT BIT%; 280 BYTE%(I%) = BYTE%(I%) + BIT% * 2^J% 290 GOSUB 710 300 NEXT J% 310 PRINT USING " ### "; BYTE%(I%); 320 IF (BYTE%(I%) < 16) THEN PRINT " "; 330 PRINT HEX$ (BYTE%(I%)); 340 PRINT " "; 350 IF (BYTE%(I%) > 0 AND (BYTE%(I%) < 9 OR (BYTE%(I%) > 13 AND BYTE%(I%) <> 29 AND BYTE%(I%) <> 30 AND BYTE%(I%) <> 31))) THEN PRINT CHR$ (BYTE%(I%)); ELSE PRINT " "; 360 IF (I% MOD 2 <> 0) THEN PRINT " |"; ELSE PRINT "" 370 NEXT I% 380 OUT 888, 0 : REM *** 0v data pins *** 390 IF (BYTE%(2) = &H2F) THEN PRINT "Country: Germany.", ELSE PRINT "Country: unknown.", 400 IF (BYTE%(4) = &H2A) THEN PRINT "Telecard: Solaic.", : GOTO 450 410 IF (BYTE%(4) = &H4A) THEN PRINT "Telecard: ODS.", : GOTO 450 420 IF (BYTE%(4) = &H8A) THEN PRINT "Telecard: G+D.", : GOTO 450 430 IF (BYTE%(4) = &HCA) THEN PRINT "Telecard: Gemplus.", : GOTO 450 440 PRINT "Telecard: unknown.", 450 IF (BYTE%(2) = &H2F AND (BYTE%(5) AND &HF0) = &HE0) THEN PRINT "Type: 50 DM." : GOTO 480 460 IF (BYTE%(2) = &H2F AND (BYTE%(5) AND &HF0) = &HA0) THEN PRINT "Type: 12 DM." : GOTO 480 470 PRINT "Type: unknown." 480 PRINT "Serial number:"; 490 PRINT (BYTE%(4) AND &H10)/16 * 2^3 + (BYTE%(4) AND &H20)/32 * 2^2 + (BYTE%(4) AND &H40)/64 * 2^1 + (BYTE%(4) AND &H80)/128 * 2^0; 500 PRINT (BYTE%(5) AND &H01)/01 * 2^3 + (BYTE%(5) AND &H02)/02 * 2^2 + (BYTE%(5) AND &H04)/04 * 2^1 + (BYTE%(5) AND &H08)/008 * 2^0; 510 PRINT " 0 "; 520 PRINT (BYTE%(6) AND &H10)/16 * 2^3 + (BYTE%(6) AND &H20)/32 * 2^2 + (BYTE%(6) AND &H40)/64 * 2^1 + (BYTE%(6) AND &H80)/128 * 2^0; 530 PRINT (BYTE%(8) AND &H01)/01 * 2^3 + (BYTE%(8) AND &H02)/02 * 2^2 + (BYTE%(8) AND &H04)/04 * 2^1 + (BYTE%(8) AND &H08)/008 * 2^0; 540 PRINT (BYTE%(8) AND &H10)/16 * 2^3 + (BYTE%(8) AND &H20)/32 * 2^2 + (BYTE%(8) AND &H40)/64 * 2^1 + (BYTE%(8) AND &H80)/128 * 2^0; 550 PRINT (BYTE%(7) AND &H01)/01 * 2^3 + (BYTE%(7) AND &H02)/02 * 2^2 + (BYTE%(7) AND &H04)/04 * 2^1 + (BYTE%(7) AND &H08)/008 * 2^0; 560 PRINT (BYTE%(7) AND &H10)/16 * 2^3 + (BYTE%(7) AND &H20)/32 * 2^2 + (BYTE%(7) AND &H40)/64 * 2^1 + (BYTE%(7) AND &H80)/128 * 2^0; 570 PRINT (BYTE%(6) AND &H01)/01 * 2^3 + (BYTE%(6) AND &H02)/02 * 2^2 + (BYTE%(6) AND &H04)/04 * 2^1 + (BYTE%(6) AND &H08)/008 * 2^0; 580 PRINT " X X" 590 PRINT "Money left:"; 600 PRINT USING " ##.## "; (LOG (BYTE%(9) + 1.0)/LOG (2.0) * 8^4 + LOG (BYTE%(10) + 1.0)/LOG (2.0) * 8^3 + LOG (BYTE%(11) + 1.0)/LOG (2.0) * 8^2 + LOG (BYTE%(12) + 1.0)/LOG (2.0) * 8^1 + LOG (BYTE%(13) + 1.0)/LOG (2.0) * 8^0)/100.0; 610 PRINT "DM" 620 PRINT "Hit F6 (SYSTEM) + to quit." : END 630 REM *** Writing routine: *** 640 FOR K% = 1 TO NUM% : REM *** NUM% = 1 -> write, 2 -> writecarry *** 650 OUT 888, 2^6 + 2^1 + 2^0 : REM *** +5v 2,3,8(I/O) *** 660 OUT 888, 2^6 + 2^0 : REM *** +5v 2,8 *** 670 OUT 888, 2^6 + 2^2 + 2^0 : REM *** +5v 2,4,8 *** 680 OUT 888, 2^0 : REM *** +5v 2 *** 690 NEXT K% 700 RETURN 710 REM *** Increment address routine: *** 720 OUT 888, 2^2 + 2^0 : REM *** +5v 2,4 *** 730 OUT 888, 2^0 : REM *** +5v 2 *** 740 RETURN