2022-02-16
Part of my journey through Shenzhen I/O
Problem: There are two simple I/O slots for audio: audio-in and audio-out. There is a single XBus switch, maximize, which enables maximization when enabled. If not enabled, the signal is simply copied from audio-in to audio-out. When enabled, the audio value should be altered according to the provided formula.
Here's that formula, provided in the manual:
audio_out = 4 · (audio_in - 50) + 50The chips available don't handle three simple I/O pins. Both the MC4000 and MC6000 only have 2 simple I/O pins and either 2 or 5 XBus pins. So in order to get the value of maximize into the mix, I added a dedicated MC4000 that simply copies the simple I/O value to XBus:
mov p0 x1
slp 1Not great, but I can't think of anything better.
For the core logic, we now have an MC4000 with audio-in and audio-out coming in over simple I/O, and the maximize value coming in to x0 over XBus.
The first insight is that we can expand the formula to execute it in two computations instead of three:
audio_out = 4 · (audio_in - 50) + 50
audio_out = 4 · audio_in - 200 + 50
audio_out = 4 · audio_in - 150This saves an instruction, leading to this code for the second MC4000:
mov x0 acc
teq 0 acc
mov p0 acc
- mul 4
- sub 150
mov acc p1
slp 1This ended up costing ¥6, using 490 power, and requiring 9 lines of code. All three dimensions have significant populations of answers lower than what I achieved (¥4, ~250P, 7LoC), so I might return to optimize.