Amstrad used an off-the-shelf component, and did the best they could.
For generating video addresses, sync timing, etc, Amstrad used the 6845 CRTC, which was originally designed for text displays. In particular it is designed for a linear text area, looking up character graphics from a font ROM, so e.g. if you’ve set up a 40-column display with 8px characters then an address counter will go through the same 40 character positions eight times, while a row counter goes up once after every 40 characters has been scanned, then after eight lines of that the address goes up by 40. In a typical implementation external hardware would use the character address to look up a character, then use the fetched character plus the row counter to look up a slice of character graphics from a ROM, and output those.
Acorn used the same chip for pixel graphics in the BBC Micro, and just wired up three bits of the row number as the three lowest address bits, and the character address as the rest. That produces a very non-linear display where every graphics byte is located 8 bytes after the one to its left, each line starts one byte after the one before within each 8-line group, and there’s a (40 or 80) * 8 leap in start addresses every eighth line.
Amstrad wanted to do better than that so, they wired the outputs up as:
- top two bits: bits 13 and 12 of the character address;
- next three bits: row number;
- 10 further bits: bits 0 to 9 of the character address;
- least significant bit: an internally generated left/right bit, as Amstrad fetches two bytes per CRTC address.
So it’s linear across a line, for all supported line lengths (and then some).
With a 6845 it is impossible to have a fully linear display unless you can fit the entire buffer with 14 bits of address space. On a machine which guarantees a particular power-of-two line length you could incorporate the row number into the character address seamlessly, but a design goal of the CPC was industry-standard 80-column output, which is not a power of two.