Skip to content

Microcode review (mechanical pass) — 2026-09-29

Generated by tools/ucode_review.py from firmware/microcode/ucode-generator2/test.hex. Rules are in the script's docstring; the hardware model behind them is the one used for docs/isa/ (pipeline registers apply a step's word for the whole step, memory writes happen while -MEM-WR is low, the address bus follows the register selected by ADDR-REG-ID). Register families are checked on every member (all 256 records that hold microcode).

Totals by rule: L1 8, R2 3, S1 107

Opcode Mnemonic Steps Findings
$00 START 4 clean
$01 ON 5 S1 x1
$02 OFF 5 S1 x1
$03 HALT 5 clean
$04 JSR 28 S1 x1
$05 RET 17 S1 x2
$06 JSRUR 30 S1 x1
$07 PUSHR 26 S1 x2
$08 POPR 24 S1 x1
$09 PUSH 12 clean
$0A POP 10 S1 x1
$0B MVAT 7 clean
$0C MVTA 8 clean
$0D LDTI 9 clean
$0E LDAI 10 clean
$0F MOVRR 14 R2 x3, S1 x1
$10 MVIB 10 clean
$11 MVIB R1 10 clean
$12 MVIB R2 10 clean
$13 MVIB R3 10 clean
$14 MVIB R4 10 clean
$15 MVIB R5 10 clean
$16 MVIB R6 10 clean
$17 MVIB R7 10 clean
$18 MVIW 15 clean
$19 MVIW R1 15 clean
$1A MVIW R2 15 clean
$1B MVIW R3 15 clean
$1C MVIW R4 15 clean
$1D MVIW R5 15 clean
$1E MVIW R6 15 clean
$1F MVIW R7 15 clean
$20 MVRLA 7 clean
$21 MVRLA R1 8 S1 x1
$22 MVRLA R2 8 S1 x1
$23 MVRLA R3 8 S1 x1
$24 MVRLA R4 8 S1 x1
$25 MVRLA R5 8 S1 x1
$26 MVRLA R6 8 S1 x1
$27 MVRLA R7 8 S1 x1
$28 MVRHA 7 clean
$29 MVRHA R1 8 S1 x1
$2A MVRHA R2 8 S1 x1
$2B MVRHA R3 8 S1 x1
$2C MVRHA R4 8 S1 x1
$2D MVRHA R5 8 S1 x1
$2E MVRHA R6 8 S1 x1
$2F MVRHA R7 8 S1 x1
$30 MVARL 9 clean
$31 MVARL R1 9 clean
$32 MVARL R2 9 clean
$33 MVARL R3 9 clean
$34 MVARL R4 9 clean
$35 MVARL R5 9 clean
$36 MVARL R6 9 clean
$37 MVARL R7 9 clean
$38 MVARH 9 clean
$39 MVARH R1 9 clean
$3A MVARH R2 9 clean
$3B MVARH R3 9 clean
$3C MVARH R4 9 clean
$3D MVARH R5 9 clean
$3E MVARH R6 9 clean
$3F MVARH R7 9 clean
$40 LDAVR 8 clean
$41 LDAVR R1 8 clean
$42 LDAVR R2 8 clean
$43 LDAVR R3 8 clean
$44 LDAVR R4 8 clean
$45 LDAVR R5 8 clean
$46 LDAVR R6 8 clean
$47 LDAVR R7 8 clean
$48 STAVR 9 clean
$49 STAVR R1 9 clean
$4A STAVR R2 9 clean
$4B STAVR R3 9 clean
$4C STAVR R4 9 clean
$4D STAVR R5 9 clean
$4E STAVR R6 9 clean
$4F STAVR R7 9 clean
$50 INCR 6 S1 x1
$51 INCR R1 6 S1 x1
$52 INCR R2 6 S1 x1
$53 INCR R3 6 S1 x1
$54 INCR R4 6 S1 x1
$55 INCR R5 6 S1 x1
$56 INCR R6 6 S1 x1
$57 INCR R7 6 S1 x1
$58 DECR 6 clean
$59 DECR R1 7 S1 x1
$5A DECR R2 7 S1 x1
$5B DECR R3 7 S1 x1
$5C DECR R4 7 S1 x1
$5D DECR R5 7 S1 x1
$5E DECR R6 7 S1 x1
$5F DECR R7 7 S1 x1
$60 OUTA 9 clean
$61 OP61 9 clean
$62 OP62 9 clean
$63 OP63 9 clean
$64 OP64 9 clean
$65 OP65 9 clean
$66 OP66 9 clean
$67 OP67 9 clean
$68 OP68 9 clean
$69 OP69 9 clean
$6A OP6A 9 clean
$6B OP6B 9 clean
$6C OP6C 9 clean
$6D OP6D 9 clean
$6E OP6E 9 clean
$6F OP6F 9 clean
$70 OUTI 10 clean
$71 OP71 11 clean
$72 OP72 11 clean
$73 OP73 11 clean
$74 OP74 11 clean
$75 OP75 11 clean
$76 OP76 11 clean
$77 OP77 11 clean
$78 OP78 11 clean
$79 OP79 11 clean
$7A OP7A 11 clean
$7B OP7B 11 clean
$7C OP7C 11 clean
$7D OP7D 11 clean
$7E OP7E 11 clean
$7F OP7F 11 clean
$80 LDZ 26 S1 x2
$81 LDZ R1 26 S1 x2
$82 LDZ R2 26 S1 x2
$83 LDZ R3 26 S1 x2
$84 LDZ R4 26 S1 x2
$85 LDZ R5 26 S1 x2
$86 LDZ R6 26 S1 x2
$87 LDZ R7 26 S1 x2
$88 STZ 27 S1 x2
$89 STZ R1 28 S1 x3
$8A STZ R2 27 S1 x3
$8B STZ R3 28 S1 x3
$8C STZ R4 28 S1 x3
$8D STZ R5 28 S1 x3
$8E STZ R6 28 S1 x3
$8F STZ R7 28 S1 x3
$90 INP 9 clean
$91 OP91 9 clean
$92 OP92 9 clean
$93 OP93 9 clean
$94 OP94 9 clean
$95 OP95 9 clean
$96 OP96 9 clean
$97 OP97 9 clean
$98 OP98 9 clean
$99 OP99 9 clean
$9A OP9A 9 clean
$9B OP9B 9 clean
$9C OP9C 9 clean
$9D OP9D 9 clean
$9E OP9E 9 clean
$9F OP9F 9 clean
$A0 BR 18 clean
$A1 BRZ 18 clean
$A2 BRNZ 18 clean
$A3 BRINH 18 clean
$A4 BRINL 18 clean
$A5 BRNC 5 clean
$A6 BRC 18 clean
$A7 BRLT 18 clean
$A8 BREQ 18 clean
$A9 BRGT 18 clean
$AA BRNEQ 18 clean
$AB BR16Z 18 clean
$AC BR16NZ 18 clean
$AD BRUR 18 S1 x1
$AE OPAE 5 clean
$AF BRDEV 18 clean
$B0 ADDI 12 clean
$B1 SUBI 12 clean
$B2 ORI 10 clean
$B3 ANDI 10 clean
$B4 XORI 10 clean
$B5 INVA 7 clean
$B6 SHL 13 L1 x1
$B7 SHR 13 L1 x1
$B8 ADDT 10 clean
$B9 SUBT 10 clean
$BA ORT 8 clean
$BB ANDT 8 clean
$BC XORT 8 clean
$BD RSHL 12 L1 x1
$BE RSHR 13 L1 x1
$BF PSHR 13 L1 x1
$C0 ADDIW 42 clean
$C1 ADDIW R1 43 S1 x1
$C2 ADDIW R2 43 S1 x1
$C3 ADDIW R3 43 S1 x1
$C4 ADDIW R4 43 S1 x1
$C5 ADDIW R5 43 S1 x1
$C6 ADDIW R6 43 S1 x1
$C7 ADDIW R7 43 S1 x1
$C8 SHL16 32 clean
$C9 SHL16 R1 33 S1 x1
$CA SHL16 R2 33 S1 x1
$CB SHL16 R3 33 S1 x1
$CC SHL16 R4 33 S1 x1
$CD SHL16 R5 33 S1 x1
$CE SHL16 R6 33 S1 x1
$CF SHL16 R7 33 S1 x1
$D0 LDIVR 11 clean
$D1 LDIVR R1 11 clean
$D2 LDIVR R2 11 clean
$D3 LDIVR R3 11 clean
$D4 LDIVR R4 11 clean
$D5 LDIVR R5 11 clean
$D6 LDIVR R6 11 clean
$D7 LDIVR R7 11 clean
$D8 BRVR 18 clean
$D9 BRVR R1 18 clean
$DA BRVR R2 18 clean
$DB BRVR R3 18 clean
$DC BRVR R4 18 clean
$DD BRVR R5 18 clean
$DE BRVR R6 18 clean
$DF BRVR R7 18 clean
$E0 CSHL 13 L1 x1
$E1 CSHR 13 L1 x1
$E2 ADDIC 12 clean
$E3 ADDTC 10 clean
$E4 LDA 18 clean
$E5 STA 19 clean
$E6 LDT 17 clean
$E7 STT 17 clean
$E8 STR 28 clean
$E9 STR R1 29 S1 x1
$EA STR R2 28 S1 x1
$EB STR R3 29 S1 x1
$EC STR R4 29 S1 x1
$ED STR R5 29 S1 x1
$EE STR R6 29 S1 x1
$EF STR R7 29 S1 x1
$F0 LDR 26 clean
$F1 LDR R1 26 clean
$F2 LDR R2 26 clean
$F3 LDR R3 26 clean
$F4 LDR R4 26 clean
$F5 LDR R5 26 clean
$F6 LDR R6 26 clean
$F7 LDR R7 26 clean
$F8 OPF8 5 clean
$F9 OPF9 5 clean
$FA OPFA 5 clean
$FB INTE 6 S1 x1
$FC INTD 6 S1 x1
$FD IRET 19 S1 x2
$FE IADDR 13 clean
$FF INT 26 L1 x1, S1 x2

Details (idle steps S1 listed as counts only)

$01 ON (5 steps) idle steps: [3]

$02 OFF (5 steps) idle steps: [3]

$04 JSR (28 steps) idle steps: [22]

$05 RET (17 steps) idle steps: [3, 12]

$06 JSRUR (30 steps) idle steps: [25]

$07 PUSHR (26 steps) idle steps: [7, 16]

$08 POPR (24 steps) idle steps: [7]

$0A POP (10 steps) idle steps: [3]

$0F MOVRR (14 steps) idle steps: [7]

  • R2 step 9: several data-bus drivers at once: ['-REG-RD-LO', '-REG-RD-HI']
  • R2 step 10: several data-bus drivers at once: ['-REG-RD-LO', '-REG-RD-HI']
  • R2 step 11: several data-bus drivers at once: ['-REG-RD-LO', '-REG-RD-HI']

$21 MVRLA R1 (8 steps) idle steps: [3]

$22 MVRLA R2 (8 steps) idle steps: [3]

$23 MVRLA R3 (8 steps) idle steps: [3]

$24 MVRLA R4 (8 steps) idle steps: [3]

$25 MVRLA R5 (8 steps) idle steps: [3]

$26 MVRLA R6 (8 steps) idle steps: [3]

$27 MVRLA R7 (8 steps) idle steps: [3]

$29 MVRHA R1 (8 steps) idle steps: [3]

$2A MVRHA R2 (8 steps) idle steps: [3]

$2B MVRHA R3 (8 steps) idle steps: [3]

$2C MVRHA R4 (8 steps) idle steps: [3]

$2D MVRHA R5 (8 steps) idle steps: [3]

$2E MVRHA R6 (8 steps) idle steps: [3]

$2F MVRHA R7 (8 steps) idle steps: [3]

$50 INCR (6 steps) idle steps: [3]

$51 INCR R1 (6 steps) idle steps: [3]

$52 INCR R2 (6 steps) idle steps: [3]

$53 INCR R3 (6 steps) idle steps: [3]

$54 INCR R4 (6 steps) idle steps: [3]

$55 INCR R5 (6 steps) idle steps: [3]

$56 INCR R6 (6 steps) idle steps: [3]

$57 INCR R7 (6 steps) idle steps: [3]

$59 DECR R1 (7 steps) idle steps: [3]

$5A DECR R2 (7 steps) idle steps: [3]

$5B DECR R3 (7 steps) idle steps: [3]

$5C DECR R4 (7 steps) idle steps: [3]

$5D DECR R5 (7 steps) idle steps: [3]

$5E DECR R6 (7 steps) idle steps: [3]

$5F DECR R7 (7 steps) idle steps: [3]

$80 LDZ (26 steps) idle steps: [3, 11]

$81 LDZ R1 (26 steps) idle steps: [3, 11]

$82 LDZ R2 (26 steps) idle steps: [3, 11]

$83 LDZ R3 (26 steps) idle steps: [3, 11]

$84 LDZ R4 (26 steps) idle steps: [3, 11]

$85 LDZ R5 (26 steps) idle steps: [3, 11]

$86 LDZ R6 (26 steps) idle steps: [3, 11]

$87 LDZ R7 (26 steps) idle steps: [3, 11]

$88 STZ (27 steps) idle steps: [3, 11]

$89 STZ R1 (28 steps) idle steps: [3, 11, 13]

$8A STZ R2 (27 steps) idle steps: [3, 11, 13]

$8B STZ R3 (28 steps) idle steps: [3, 11, 13]

$8C STZ R4 (28 steps) idle steps: [3, 11, 13]

$8D STZ R5 (28 steps) idle steps: [3, 11, 13]

$8E STZ R6 (28 steps) idle steps: [3, 11, 13]

$8F STZ R7 (28 steps) idle steps: [3, 11, 13]

$AD BRUR (18 steps) idle steps: [13]

$B6 SHL (13 steps)

  • L1 step 10: load ['-AC-LD'] with nothing driving the data bus

$B7 SHR (13 steps)

  • L1 step 10: load ['-AC-LD'] with nothing driving the data bus

$BD RSHL (12 steps)

  • L1 step 9: load ['-AC-LD'] with nothing driving the data bus

$BE RSHR (13 steps)

  • L1 step 10: load ['-AC-LD'] with nothing driving the data bus

$BF PSHR (13 steps)

  • L1 step 10: load ['-AC-LD'] with nothing driving the data bus

$C1 ADDIW R1 (43 steps) idle steps: [7]

$C2 ADDIW R2 (43 steps) idle steps: [7]

$C3 ADDIW R3 (43 steps) idle steps: [7]

$C4 ADDIW R4 (43 steps) idle steps: [7]

$C5 ADDIW R5 (43 steps) idle steps: [7]

$C6 ADDIW R6 (43 steps) idle steps: [7]

$C7 ADDIW R7 (43 steps) idle steps: [7]

$C9 SHL16 R1 (33 steps) idle steps: [3]

$CA SHL16 R2 (33 steps) idle steps: [3]

$CB SHL16 R3 (33 steps) idle steps: [3]

$CC SHL16 R4 (33 steps) idle steps: [3]

$CD SHL16 R5 (33 steps) idle steps: [3]

$CE SHL16 R6 (33 steps) idle steps: [3]

$CF SHL16 R7 (33 steps) idle steps: [3]

$E0 CSHL (13 steps)

  • L1 step 10: load ['-AC-LD'] with nothing driving the data bus

$E1 CSHR (13 steps)

  • L1 step 10: load ['-AC-LD'] with nothing driving the data bus

$E9 STR R1 (29 steps) idle steps: [14]

$EA STR R2 (28 steps) idle steps: [14]

$EB STR R3 (29 steps) idle steps: [14]

$EC STR R4 (29 steps) idle steps: [14]

$ED STR R5 (29 steps) idle steps: [14]

$EE STR R6 (29 steps) idle steps: [14]

$EF STR R7 (29 steps) idle steps: [14]

$FB INTE (6 steps) idle steps: [4]

$FC INTD (6 steps) idle steps: [4]

$FD IRET (19 steps) idle steps: [3, 12]

$FF INT (26 steps) idle steps: [4, 20]

  • L1 step 23: load ['REG-LD-LO', 'REG-LD-HI'] with nothing driving the data bus