Introducing DISP56S, a compact zero-latency 56x56 screen! Using cutting-edge meta-APOM (advanced particle-order manipulation) technology, this screen decodes a whopping 112 FILTs per frame to produce color video at unprecedented subframe speeds. Here's how it works and how you can use it for your next project.
How to Use It
The FILTs are fed into the bus feed (labeled "bus" in the demo). See the FILT ROM's DRAY in the demo for details. Each frame of 112 FILTs represents a 56x56 binary bitmap, in the following order: The first two FILTs encode the first row, the second two FILTs encode the second row, etc. Only the last 28 bits of each FILT are used. Each row is encoded in an interlaced format: the 28th (most significant) bit of the first FILT is (1, 1), the 28th bit of the second FILT is (2, 1), the 27th bit of the first FILT is (3, 1), etc.
Another FILT is used as the control word. It is fed both into the color picker (labeled "demux" in the demo) and the write toggle (labeled "write toggle" in the demo). The 29th bit is called the "flush bit" (used in the write toggle) and the remaining 28 bits select the color (only the last 4 are used in the demo). Note that you can easily extend this to support more colors by swapping out the color demux in the demo for a larger one.
The screen works by using an intermediate buffer, which is distinct from the part of the screen intended for viewing. This is located on the bottom left, which you can see as a half-filled INSL region. Each frame, a single color is written to the buffer -- specifically, for each pixel where the corresponding bit in the FILT bitmap is set, that pixel in the buffer is set to the color selected by the color picker. You can see this in action by stepping through the demo frame by frame, where each "displayed frame" is constrcuted color by color before being flushed to the actual display. The flush bit controls when the buffer is flushed.
For a more detailed example of how the screen data format works, the code used to generate the demo is located at https://github.com/krawthekrow/disp56s-demo.
How it Works
The screen achieves its crazy compactness mainly through the use of classical piston particle-order manipulation (POM). A set of pistons is used to push all the ARAYs up. This allows their initial subframe order to be after the clearing DRAYs (those on the left that copy the FILTs in and clear the BRAY output zone), while still before the demux DRAYs (those on the right that copy the DRAY sparkers into the BRAY output zone). The BRAY output zone is shared with the sparkers for the next set of ARAYs, so it is necessary that the writing DRAYs (those that copy the INSLs into the buffer; hidden underneath the giant block pulled by the pistons and so absent from the pmap) come before the clearing DRAYs for the next row. Each column is interlaced to prevent the writing DRAY sparkers from activating adjacent writing DRAYs.
Annoyingly, PSCNs are required to activate the writing DRAYs (since overwrite mode is desired in a double buffer setup) so these have to be replaced with INWRs to activate the ARAYs in the next row. This is done with the CRAYs on the right, placed in the right position in subframe order by another piston POM contraption. At the end of operation, the reset DRAYs (those at the bottom) convert all the input FILTs in the block to INSLs to prevent them from overriding the pmap since they would lie on top of the writing DRAYs at the end of the frame.
Finally, the colored INSLs need to be inserted into the mechanism at the start of the frame. This is by far the most challenging part of the system, and is achieved using meta-APOM (advanced POM). Essentially, the IDs from the five rows of INSLs at the top right are transferred to five sets of DRAYs that copy the colored INSL into the piston-POM block in an exponential fashion. This involves iteratively erasing a row of INSL, exponential-DRAYing the DRAYs into place, waiting for the DRAYs to activate, clearing the DRAYs with CRAY, creating the INSLs back in their original position, and swapping out the DRAYs for the next iteration. Almost all of these steps employ APOM in some form or another, hence "meta"-APOM.
This is admittedly a very rough description, but I hope it's useful if you were interested. If you like subframe or want to learn more, come join us at #powder-subframe on freenode IRC (wiki page on IRC setup).