Another new day.
A changed the VHDL so that no IO can occur when M1 is low. In hindsight that shouldn't matter because there is no RD or WR on the INT OP / Vector Fetch cycle of Interrupt modes 0 and 2.
I removed the CF card and tested and I get no memory corruption when the CF card is removed.
There are no direct connections to the CF card except the 5Volts and ground. Everything else goes through a buffer (and level translator) 74HC245. The only thing that can get back is the data bus which goes through a tristate buffer as well. I checked the VHDL for that and it seems fine.
So now I am left with two things that I can think of -
1) A problem in the VHDL that allows the CF to OUTPUT to the Buffer chip when the chip is also outputing to the CF card - and causing higher current drain, dropping the 5Volt rail and effecting the CPC that way.
2) Perhaps I still haven't solved the power issue. I am getting about 4.8Volts on the CF interface board after buying a new 3Amp switchmode - was the highest they had.
Oh for a scope right now.
I am going to spend some time trying random things because I don't have any test equipment.
Here is what I have in VHDL
M1 disables all access
CF_cs0 is related to IORQ and the Address range FEF0 to FEF7
CF_IORD is related to IORQ and RD
CF_IOWR is related to IORQ and WR
The buffer direction is related to CF_IORD
The buffer output enable ir related to CF_IORD or CF_IOWR
as below
databus buffer direction is -
0, Z80 <= CF card
1, Z80 => CF card
sigaddress_range <= ZA(15) AND ZA(14) AND ZA(13) AND ZA(12) AND -- 0x F
ZA(11) AND ZA(10) AND ZA(9) AND NOT ZA(

AND -- E
ZA(7) AND ZA(6) AND ZA(5) AND ZA(4) AND -- F
NOT ZA(3); -- 0 to 7
sigcf_cs0 <= NOT (sigaddress_range AND (NOT Z_IORQ) AND Z_M1);
sigcf_iord <= NOT (sigaddress_range AND (NOT Z_IORQ) AND (NOT Z_RD) AND Z_M1);
sigcf_iowr <= NOT (sigaddress_range AND (NOT Z_IORQ) AND (NOT Z_WR) AND Z_M1);
sigcfdatadir <= sigcf_iord;
sigcfdata_oe <= NOT ((NOT sigcf_iord) OR (NOT sigcf_iowr)); --NOT ((NOT sigcf_cs0) AND ((NOT Z_RD) OR (NOT Z_WR)));
sigcf_reset <= '1';
the code actually reads the sector or part of the sector (correctly) before crashing. When it crashes I get errors like sn error in line ... and a look at the line shows data corruption - ie incorrect basic keywords inserted into line.