Two months down the line -
Thanks, Kef , for your suggestion. You were very much on the right track, in that SPI (and other) configuration registers were sometimes being corrupted. But discovering why this was happening was quite another matter.
The underlying problem lay with the Ethernet controller, Microchip type ENC28J60 - or rather, in the way I was using it. It's pretty clear that this device is a mask programmed processor of some sort, therefore on exit from Reset, it executes an initialisation routine of its own. After that, it's ready for the host processor (MC9X12DT512 in my case) to configure it for the application by writing to its various registers. The ENC28J60 datasheet specifies a 300 usec minimum delay following exit from reset before attempting to write to these registers (a later engineering note recommends extending this to 1 msec). Of course Juggins was only giving it 50 usec.
Result was that the pointers defining the start and finish of the circular buffer for receiving Ethernet packets (up to 8K available in the ENC28J60) were not being properly set, since the commands issued via the SPI interface would have been ignored if the device was still doing its initialisation.
When the ENC28J60 places a received packet in the circular buffer, it precedes it with three 2-byte words: Next Packet Pointer, which gives the next location beyond the last one occupied by the present packet; byte count for the present packet; and two bytes containing various status bits. After reading and storing these quantities, a firmware function running on the host processor copies the packet content to a buffer reserved in HCS12 memory. In my application, this is a 512-byte buffer located in paged memory at 0x1000-11FF.
Trouble was, due to the start and finish points of the circular buffer not being set properly (for the reason given above), the firmware function that copies the packet would fetch a totally erroneous value for byte count. In some cases this would exceed 0x1000 (4K), therefore data was being dumped into the entire 4K block of paged memory, and spilling over into the fixed page at 0x2000. This is where the heap for the networking firmware is located, therefore several global data structures pertaining to TCP and HTTP processes were being overwritten with incoming packet data.
The result of a TCP or HTTP process using wildly erratic data is of course virtually unpredictable. But by using various highly tortuous methods, I was able to track execution of the program and to identify (among other things) cases of the program writing to the register block at address zero onwards. One effect of this was, as you suggested, corruption of an SPI configuration register.
The moral of the tale I guess is that when using a complex device such as the EN28J60, which itself represents a firmware controlled sub-system, read the bloody datasheet!