COFIRMED: Version 2.230 uses the cel count byte of a loop to handle mirroring.
When a loop is set (when loading a view or using the set.loop command), cel count is set to the lower nibble of the cel count byte. Then bit 7 is tested:
- if bit 7 is set, then bits 5 and 4 are read as a two-bit number (i.e. 0,1,2 or 3). This number is compared to the desired loop being set. If they match, the loop is OK and no flipping is done. If they don't match, the cel count byte is updated to indicate the new loop (i.e. bits 5 and 4 are changed to match the desired loop value). THEN bit 6 is checked; if set, all cels in the loop are flipped, if bit 6 is not set, the cels are not flipped.
- if bit 7 is NOT set, then no further checks are made, and none of the cels are flipped.
What this means is that both bits 7 and 6 must be set for mirroring to work. My suspicion is that bit 6 was going to be used to do something else at one point, but they switched to the newer mirroring format before it was finished.
It also means mirroring would be limited to loops 0 through 3, and the max number of loops that could be in a view was 16. In the mirroring format added in v2.272, loops 0 through 7 could be mirrored, and up to 255 loops could be in a view.
Note that in this version, when a loop changes ALL cels are flipped immediately; in v2.272 and beyond, each cel is flipped individually when it is being drawn to the screen.
My educated guess is that they decided to change the format for mirroring so that more loops could be involved (8 loops available for mirroring instead of 4, and more than 16 loops allowed in a view) and also to minimize clock cycles (by only flipping when a cel is needed, instead of doing all of them every time a loop is changed).
This version also includes a number of changes that show up in v2.272 but not all of them, which confirms that it fits between v2.089 and v2.272.