$4000–$4013、$4015、$4017。$4015 → 声道开关。



freq_* ROM 得真实 Hz → FREQupdateRequired → 音频线程整段重建缓冲、重开 Clip。WAIT 主动停 PC → 高速时钟被分成约 60Hz 音乐帧率。frame_commit 在一帧写完后才把参数提交给 Buzzer,避免采到"半更新"组合。encode.py 提供颤音死区、最大更新率等过滤选项。
freq_pulse ROM → 蜂鸣器(Buzzer)。
用途:证明 Buzzer 链路已实测可发声,高位分频对策有效。
Nes_Apu::write_register:每次 APU 写入记录为 frame addr value。$4010–$4013 在此跳过。WRITE,再补 WAIT = 32 − 写入数 → 每帧恒占 32 周期。END。v2.0 raw 文本,直接 加载映像(Load Image…)进 ROM。# 寄存器日志 16-bit 指令字 frame 0 $4015 0x0F → 0x190F WRITE reg9,0x0F frame 0 $4000 0x86 → 0x1086 WRITE reg0,0x86 frame 0 $4002 0xFD → 0x12FD WRITE reg2,0xFD (本帧共 3 条写入) → 0x001D WAIT 29 = 32−3 frame 1 … (曲目结束) → 0xF000 END → PC 归零循环
| opcode | 指令 | 作用 | 用途 |
|---|---|---|---|
| 0x0 | WAIT imm12 | 停 PC 若干周期 | 节奏主体 |
| 0x1 | WRITE r,v | 写 APU 寄存器 | 回放主体 |
| 0x2 | LWAIT | 长等待 | 空帧合并 |
| 0x4 | LOADI | 立即数 → R | ALU / 可控加减 (详见第 13 页) |
| 0x5 | ADD | Rd ← Ra + Rb | |
| 0x6 | SUB | Rd ← Ra − Rb | |
| 0x7 | WRITEREG | R 值写 APU | |
| 0xF | END | 曲终 → PC 装 0 循环 | 循环播放 |
reg_id / value / WR / frame_clk / ch_mask 输入引脚(Pin)、
RegFile(译码器 Decoder + 16 个寄存器 Register)、四个 Channel 子电路实例。
freq_pulse ROM、蜂鸣器(Buzzer)的 FREQ / VOL / PW / ENABLE 四路接线。
make_tables.py 按
NES 公式 + Buzzer 边界程序化生成,可复现、可校验。
pcbus 出 / instr 入——CPU 与存储器边界清晰,天然支持多曲切换。
pcbus / instr 引脚(Pin)、Splitter(分线器)+ 译码器(Decoder)、WAITCNT、ALU 区、R0–R3、APU 输出信号。
start = is_wait · ¬busy ← 防止 WAIT 被反复重装(死循环陷阱) en_count = busy · ¬at_zero busy_next = start + en_count stall = busy_next → PC 计数使能 = ¬stall wr = is_write · clk ← 连续 WRITE 不丢边沿 frame_commit = start · clk ← 一帧写完才提交 Buzzer 参数
start / en_count / busy_next / stall 逻辑门、
Carry → at_zero 回线、PC 计数使能由 ¬stall 控制。
frame_cycles=32 预算因此才生效。LOADI / ADD / SUB / WRITEREG:现场演示 CPU 执行通用加减,结果可直接写 APU。
tempo_mode / tempo_delta 输入、ALU 输出接 WAITCNT 装载路径、
R0–R3 寄存器(Register)与读写多路复用器(Multiplexer)。
探针(Probe)显示 tempo_delta 数值更佳。
tempo_mode / tempo_delta 与 ch_mask 四路开关、
CPU→APU 的 reg_id / value / wr / frame_commit 连线。