+// by marshmellow
+// find viking preamble 0xF200 in already demoded data
+int VikingDemod_AM(uint8_t *dest, size_t *size) {
+ //make sure buffer has data
+ if (*size < 64*2) return -2;
+ size_t startIdx = 0;
+ uint8_t preamble[] = {1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+ if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
+ return -4; //preamble not found
+
+ uint32_t checkCalc = bytebits_to_byte(dest+startIdx,8) ^
+ bytebits_to_byte(dest+startIdx+8,8) ^
+ bytebits_to_byte(dest+startIdx+16,8) ^
+ bytebits_to_byte(dest+startIdx+24,8) ^
+ bytebits_to_byte(dest+startIdx+32,8) ^
+ bytebits_to_byte(dest+startIdx+40,8) ^
+ bytebits_to_byte(dest+startIdx+48,8) ^
+ bytebits_to_byte(dest+startIdx+56,8);
+ if ( checkCalc != 0xA8 ) return -5;
+ if (*size != 64) return -6;
+ //return start position
+ return (int)startIdx;
+}
+
+// by iceman
+// find Visa2000 preamble in already demoded data
+int Visa2kDemod_AM(uint8_t *dest, size_t *size) {
+ if (*size < 96) return -1; //make sure buffer has data
+ size_t startIdx = 0;
+ uint8_t preamble[] = {0,1,0,1,0,1,1,0,0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,1,0};
+ if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
+ return -2; //preamble not found
+ if (*size != 96) return -3; //wrong demoded size
+ //return start position
+ return (int)startIdx;
+}
+// by iceman
+// find Noralsy preamble in already demoded data
+int NoralsyDemod_AM(uint8_t *dest, size_t *size) {
+ if (*size < 96) return -1; //make sure buffer has data
+ size_t startIdx = 0;
+ uint8_t preamble[] = {1,0,1,1,1,0,1,1,0,0,0,0};
+ if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
+ return -2; //preamble not found
+ if (*size != 96) return -3; //wrong demoded size
+ //return start position
+ return (int)startIdx;
+}
+// find presco preamble 0x10D in already demoded data
+int PrescoDemod(uint8_t *dest, size_t *size) {
+ if (*size < 128*2) return -1; //make sure buffer has data
+ size_t startIdx = 0;
+ uint8_t preamble[] = {0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0};
+ if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
+ return -2; //preamble not found
+ if (*size != 128) return -3; //wrong demoded size
+ //return start position
+ return (int)startIdx;
+}
+
+// Ask/Biphase Demod then try to locate an ISO 11784/85 ID
+// BitStream must contain previously askrawdemod and biphasedemoded data
+int FDXBdemodBI(uint8_t *dest, size_t *size) {
+ if (*size < 128*2) return -1; //make sure buffer has enough data
+ size_t startIdx = 0;
+ uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,1};
+ if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
+ return -2; //preamble not found
+ if (*size != 128) return -3; //wrong demoded size
+ //return start position
+ return (int)startIdx;
+}
+
+// ASK/Diphase fc/64 (inverted Biphase)
+// Note: this i s not a demod, this is only a detection
+// the parameter *dest needs to be demoded before call
+// 0xFFFF preamble, 64bits
+int JablotronDemod(uint8_t *dest, size_t *size){
+ if (*size < 64*2) return -1; //make sure buffer has enough data
+ size_t startIdx = 0;
+ uint8_t preamble[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0};
+ if (!preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx))
+ return -2; //preamble not found
+ if (*size != 64) return -3; // wrong demoded size
+
+ uint8_t checkchksum = 0;
+ for (int i=16; i < 56; i += 8) {
+ checkchksum += bytebits_to_byte(dest+startIdx+i,8);