【ncmdump】解决网易云音乐ncm格式加密的3种创新方法:从入门到精通
整体结构RP2040 ├── PIO0 │ ├── Instruction RAM(32× 16bit)│ ├── SM0 │ ├── SM1 │ ├── SM2 │ └── SM3 └── PIO1 ├── Instruction RAM(32× 16bit)├── SM0 ├── SM1 ├── SM2 └── SM3State MachineSM内部寄存器名称位宽类型说明PC5 bit寄存器指令计数器X32 bit寄存器通用工作寄存器Y32 bit寄存器通用工作寄存器ISR32 bit移位寄存器输入移位缓存OSR32 bit移位寄存器输出移位缓存SM FIFOPULLTX → OSR PUSHISR → RX名称方向位宽深度本质TX FIFOCPU → SM32 bit4硬件队列RX FIFOSM → CPU32 bit4硬件队列指令宽度16 bit1 指令 1 cycle delay
PIO 指令分布 delay / side-set 可重分配位15–1312–87–0含义OPCODEOPERANDDELAY / SIDESET指令表指令作用示例JMP条件 / 无条件跳转jmp x-- loopWAIT等待 GPIO / IRQwait 1 pin 0IN输入到 ISRin pins, 1OUT从 OSR 输出out pins, 1PUSHISR → RX FIFOpushPULLTX FIFO → OSRpullMOV寄存器操作mov x, osrIRQ触发 / 等待中断irq 0SET立即数写寄存器 / GPIOset pins, 1
各指令详细表含例子1️⃣ JMP —— 跳转jmp condition, target条件含义例子always无条件jmp startx--X–不为 0 则跳jmp x-- loopy--Y–不为 0 则跳jmp y-- send!xX 0jmp !x donex!yX ≠ Yjmp x!y retrypinpin 为 1jmp pin high!osreOSR 非空jmp !osre more2️⃣ WAIT —— 等待waitpolaritysourceindex项目说明例子polarity等待 0 / 1wait 0 gpio 5GPIO指定 GPIOwait 1 gpio 2PINpin 映射wait 1 pin 0IRQ等待 IRQwait 1 irq 03️⃣ IN —— 输入移位insource, bit_countsource说明例子pins从 GPIO 读in pins, 1x从 Xin x, 8y从 Yin y, 4null填 0in null, 8isrISR → ISRin isr, 14️⃣ OUT —— 输出移位out dest, bit_countdest说明例子pins输出到 GPIOout pins, 1x输出到 Xout x, 8y输出到 Yout y, 4null丢弃out null, 32pindirs设置方向out pindirs, 15️⃣ PUSH —— ISR → RX FIFOpush[if_full][block]形式说明例子默认阻塞pushif_fullISR 满才推push if_fullnoblock非阻塞push noblock6️⃣ PULL —— TX FIFO → OSRpull[if_empty][block]形式说明例子默认阻塞pullif_emptyOSR 空才拉pull if_emptynoblock非阻塞pull noblock7️⃣ MOV —— 寄存器操作mov dest, srcsrc说明例子xXmov y, xyYmov x, yosrOSRmov x, osrisrISRmov osr, isrnull0mov x, null~x取反mov x, ~x8️⃣ IRQ —— 中断irq[set|clear|wait]index操作说明例子set触发 IRQirq set 0clear清 IRQirq clear 0wait等待 IRQirq wait 09️⃣SET —— 立即数写setdest, valuedest说明例子pinsGPIO 输出set pins, 1xX 寄存器set x, 10yY 寄存器set y, 3pindirsGPIO 方向set pindirs, 1
好看spq-好看应用