mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2026-07-26 10:38:52 +00:00
61 lines
1.2 KiB
C++
61 lines
1.2 KiB
C++
#include "tetra_descrambler.hpp"
|
|
|
|
namespace ui::external_app::tetra_rx {
|
|
|
|
static inline uint8_t lfsr_step(uint32_t& s) {
|
|
uint8_t b = 0;
|
|
|
|
b ^= (s >> (32 - 32)) & 1;
|
|
b ^= (s >> (32 - 26)) & 1;
|
|
b ^= (s >> (32 - 23)) & 1;
|
|
b ^= (s >> (32 - 22)) & 1;
|
|
b ^= (s >> (32 - 16)) & 1;
|
|
b ^= (s >> (32 - 12)) & 1;
|
|
b ^= (s >> (32 - 11)) & 1;
|
|
b ^= (s >> (32 - 10)) & 1;
|
|
b ^= (s >> (32 - 8)) & 1;
|
|
b ^= (s >> (32 - 7)) & 1;
|
|
b ^= (s >> (32 - 5)) & 1;
|
|
b ^= (s >> (32 - 4)) & 1;
|
|
b ^= (s >> (32 - 2)) & 1;
|
|
b ^= (s >> (32 - 1)) & 1;
|
|
|
|
s = (s >> 1) | (uint32_t(b) << 31);
|
|
|
|
return b;
|
|
}
|
|
|
|
void Descrambler::generate(
|
|
uint32_t init,
|
|
uint8_t* seq,
|
|
size_t bits) {
|
|
uint32_t s = init;
|
|
|
|
for (size_t i = 0; i < bits; i++)
|
|
seq[i] = lfsr_step(s);
|
|
}
|
|
|
|
void Descrambler::descramble(
|
|
BitVector& bits,
|
|
uint32_t init) {
|
|
uint32_t s = init;
|
|
|
|
for (size_t i = 0; i < bits.size(); i++)
|
|
bits.xor_bit(i, lfsr_step(s));
|
|
}
|
|
|
|
uint32_t Descrambler::dmo_scramb_init(
|
|
uint32_t mni,
|
|
uint32_t src) {
|
|
uint32_t init =
|
|
(src & 0xFFFFFF) |
|
|
((mni & 0x3F) << 24);
|
|
|
|
init <<= 2;
|
|
init |= 3;
|
|
|
|
return init;
|
|
}
|
|
|
|
} // namespace ui::external_app::tetra_rx
|