+ if (MF_DBGLEVEL >= 1) Dbprintf("halt error. response len: %x", len); \r
+ return 1;\r
+ }\r
+\r
+ return 0;
+}
+
+int mifare_ultra_halt(uint32_t uid)
+{
+ uint16_t len;
+
+ // Mifare HALT
+ uint8_t *receivedAnswer = get_bigbufptr_recvrespbuf();\r
+ uint8_t *receivedAnswerPar = receivedAnswer + MAX_FRAME_SIZE;
+
+ len = mifare_sendcmd_short(NULL, true, 0x50, 0x00, receivedAnswer, receivedAnswerPar, NULL);
+ if (len != 0) {
+ if (MF_DBGLEVEL >= 1) Dbprintf("halt error. response len: %x", len);
+ return 1;
+ }
+
+ return 0;
+}
+
+\r
+// Mifare Memory Structure: up to 32 Sectors with 4 blocks each (1k and 2k cards),\r
+// plus evtl. 8 sectors with 16 blocks each (4k cards)\r
+uint8_t NumBlocksPerSector(uint8_t sectorNo) \r
+{\r
+ if (sectorNo < 32) \r
+ return 4;\r
+ else\r
+ return 16;\r
+}\r
+\r
+uint8_t FirstBlockOfSector(uint8_t sectorNo) \r
+{\r
+ if (sectorNo < 32)\r
+ return sectorNo * 4;\r
+ else\r
+ return 32*4 + (sectorNo - 32) * 16;\r
+ \r
+}\r
+\r
+\r
+// work with emulator memory
+void emlSetMem(uint8_t *data, int blockNum, int blocksCount) {
+ uint8_t* emCARD = get_bigbufptr_emlcardmem();
+ \r
+ memcpy(emCARD + blockNum * 16, data, blocksCount * 16);\r
+}\r
+\r
+void emlGetMem(uint8_t *data, int blockNum, int blocksCount) {\r
+ uint8_t* emCARD = get_bigbufptr_emlcardmem();\r
+ \r
+ memcpy(data, emCARD + blockNum * 16, blocksCount * 16);\r
+}\r
+\r
+void emlGetMemBt(uint8_t *data, int bytePtr, int byteCount) {\r
+ uint8_t* emCARD = get_bigbufptr_emlcardmem();\r
+ \r
+ memcpy(data, emCARD + bytePtr, byteCount);\r
+}\r
+\r
+int emlCheckValBl(int blockNum) {\r
+ uint8_t* emCARD = get_bigbufptr_emlcardmem();\r
+ uint8_t* data = emCARD + blockNum * 16;\r
+\r
+ if ((data[0] != (data[4] ^ 0xff)) || (data[0] != data[8]) ||\r
+ (data[1] != (data[5] ^ 0xff)) || (data[1] != data[9]) ||\r
+ (data[2] != (data[6] ^ 0xff)) || (data[2] != data[10]) ||\r
+ (data[3] != (data[7] ^ 0xff)) || (data[3] != data[11]) ||\r
+ (data[12] != (data[13] ^ 0xff)) || (data[12] != data[14]) ||\r
+ (data[12] != (data[15] ^ 0xff))\r
+ ) \r
+ return 1;\r
+ return 0;\r
+}\r
+\r
+int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum) {\r
+ uint8_t* emCARD = get_bigbufptr_emlcardmem();\r
+ uint8_t* data = emCARD + blockNum * 16;\r
+ \r
+ if (emlCheckValBl(blockNum)) {\r