pads
Every kind of controller: what is plugged into each port, what it is sending, and a cursor any of them can move.
Controls
Whatever is plugged in moves the cursor: the directions, a stick, a mouse, a neGcon's twist, or a GunCon's aim. Every button held is listed.
It is the SCEE tutorial's chapter 1 in one program (docs/manuals/tutorial-peripherals.md): the peripherals tester of its first example, which names what is in each port and lists the buttons held, and the mouse, analog and GunCon examples after it, which move something with each. The tutorial decoded the library's controller buffers with a header of its own, cntrl.h; yaroze.ReadController does the same here, and the rest is the tester's screen.
The standard controller and the analog controller move the cursor with the direction buttons, and an analog controller or joystick with its left stick too, past a dead zone, since a stick at rest is near its centre rather than on it. A mouse moves it by what it reports moving each frame. A neGcon steers it with its twist, and I and II move it up and down. A GunCon puts it where the gun points, scaled from the gun's units, the GPU's dot clock across and lines down, to the screen's.
Differences from the tutorial: the tester's nine font windows are one, written a line at a time with a Buffer; the four examples are one program; and the analog example's calibration screen is left out, since Sony's checklist (docs/manuals/requirements.md) forbids one for the DUAL SHOCK, whose sticks calibrate themselves.