+static uint8_t visa_parity( uint32_t id) {
+ // 4bit parity LUT
+ uint8_t par_lut[] = {
+ 0,1,1,0
+ ,1,0,0,1
+ ,1,0,0,1
+ ,0,1,1,0
+ };
+ uint8_t par = 0;
+ par |= par_lut[ NIBBLE_HIGH( (id >> 24) & 0xFF) ] << 7;
+ par |= par_lut[ NIBBLE_LOW( (id >> 24) & 0xFF) ] << 6;
+ par |= par_lut[ NIBBLE_HIGH( (id >> 16) & 0xFF) ] << 5;
+ par |= par_lut[ NIBBLE_LOW( (id >> 16) & 0xFF) ] << 4;
+ par |= par_lut[ NIBBLE_HIGH( (id >> 8) & 0xFF) ] << 3;
+ par |= par_lut[ NIBBLE_LOW( (id >> 8) & 0xFF) ] << 2;
+ par |= par_lut[ NIBBLE_HIGH( id & 0xFF ) ] << 1;
+ par |= par_lut[ NIBBLE_LOW( id & 0xFF) ];
+ return par;
+}
+
+
+/**
+*
+* 56495332 00096ebd 00000077 —> tag id 618173
+* aaaaaaaa iiiiiiii -----..c
+*
+* a = fixed value ascii 'VIS2'
+* i = card id
+* c = checksum (xor of card id)
+* . = unknown
+*
+**/