I've come up with a much better explanation of this after spending some time on it.
There are two primary ways ROMs can be mapped on the bus:
Mode 0:
Code:
00-7f:8000-ffff -> 40-7f:0000-7fff
80-ff:8000-ffff -> c0-ff:0000-7fff
Mode 1:
Code:
40-7f:0000-ffff -> 00-3f:8000-ffff
c0-ff:0000-ffff -> 80-bf:8000-ffff
The lefthand side reflects the native area, where ROM is mapped to linearly (each address is one byte further into the ROM.)
The righthand side is the "secondary" area.
Mode 0
never connects A15 to the ROM address lines. So the address is {A22-A16, A14-A0}
Mode 1
always connects A15 to the ROM address lines. So the address is {A21-A0}
By not connected, I mean the bits in the address are shifted right to compensate, so it's like A15 does not exist at all.
So in mode 0, the effect is that Bus 008000 = ROM 000000, Bus 018000 = ROM 080000, etc for the left-hand side. And Bus c00000 == Bus c08000 == Bus 008000, etc.
And in mode 1, the effect is that the left-hand side is linear: Bus c00000 = ROM 000000, Bus c08000 = ROM 008000. And the right-hand side has A15 always forced high because you can only access ROM in $xx:8000-ffff there. So Bus 008000 = ROM 008000, Bus 018000 = ROM 018000, etc.
Now of course, there are special case variations to this. Different PCBs will change where RAM is mirrored, some won't map anything into c0-ff:0000-7fff, some won't even map c0-ff at all (SuperFX), etc.
But we can narrow down LoROM vs HiROM to whether or not A15 is connected to the ROM pins. We don't need the complexity of "linear" and "shadow", or all that LoROM and HiROM entails. We simply need to provide where the ROM appears on the bus, and whether A15 is used or ignored. And that's enough to describe every commercial board ever released.