feat(audio): implement PSG pulse channel 1

This commit is contained in:
0xrsydn 2026-10-07 01:53:42 +07:00
commit 9a646651da
18 changed files with 850 additions and 55 deletions

View file

@ -10,7 +10,7 @@ No ROM bytes, extracted code, or assets were added to the repository.
## General correction
The reset correction introduced bounded sound and [disconnected serial](../hardware/serial.md) initialization models.
The [sound model](../hardware/audio.md) now also supports timer-driven Direct Sound and bounded FIFO DMA.
The [sound model](../hardware/audio.md) now also supports Direct Sound, bounded FIFO DMA, and nominal pulse channel 1 playback.
The BIOS performs reset through original ARM stores against that model.
Bit 5 selects general-purpose input pins and clears supported serial reset registers.
Bit 6 disables sound, resets FIFO queues, clears mixing configuration and accessible wave RAM, and sets the functional bias default.
@ -30,16 +30,17 @@ direnv exec . cargo run --locked --release -- --rom roms/pokemon-emerald.gba --w
```
The earlier reset-only implementation stopped at master sound enable (`0x04000084`, PC `0x082e0518`).
After the Direct Sound increment, both runs pass that write and stop at an enabled PSG channel 1 trigger:
The Direct Sound increment then reached a PSG channel 1 trigger (`0x04000065`, PC `0x082e03bc`).
After implementing channel 1, both runs pass that trigger and stop at channel 2:
```text
Steps: 321159; instructions: 320647; IRQ entries: 0; DMA units: 512; HALT idle: 0
Nominal cycles: 1038738
PC=0x082e03bc
unsupported PSG channel trigger (synthesis not implemented): write 0x80 at 0x04000065
Steps: 321161; instructions: 320649; IRQ entries: 0; DMA units: 512; HALT idle: 0
Nominal cycles: 1038742
PC=0x082e03c0
unsupported PSG channel trigger (synthesis not implemented): write 0x80 at 0x0400006d
```
The native run captures three startup frames. Direct Sound behavior is validated by original tests, not by audible game output.
The native run captures three startup frames. Audio-device behavior is validated by original tests, not by audible game output.
The native run captures startup frames before this diagnostic. These are not evidence of a working title screen or gameplay.
The window run does not reach its requested frame limit and correctly exits with failure.
@ -52,8 +53,9 @@ Workspace debug/release tests, strict Clippy, public ARM/Thumb/memory/BIOS check
Native ROM-window tests and graphics smoke modes pass on Darwin arm64.
The pinned Pong debug/release reports match.
The next observed startup requirement is PSG channel playback, beginning with pulse channel 1.
Direct Sound now has FIFO clocks, nominal DMA requests, and an instantaneous digital-level inspection interface.
The next observed startup requirement is PSG pulse channel 2, which has no sweep unit.
Channel 1 now has nominal waveform, length, envelope, sweep, and stereo mixing behavior.
Direct Sound has FIFO clocks and nominal DMA requests. Both use the instantaneous digital-level inspection interface.
A continuous sample stream and desktop output are still missing. Do not treat digital-level tests as audible-game validation.
Do not suppress the PSG trigger diagnostic without implementing the requested device behavior.
Cartridge saves remain a separate required feature. SRAM alone will not support Emerald's Flash save protocol.