You declared p to be a pointer to ulong data. A ulong is 4 bytes, and since the 68000 is big-endian, the data you store through the pointer will end up at p+3 for the LSB. So even if you could use long accesses to the device, the data is going to the wrong address. In fact, you are trying to store a ulong to an odd address, which will instantly fault on the 68000.
Stef's change is to make p a pointer to an unsigned char, or 1 byte. That way you are doing byte accesses to the proper address. Now notice how it also uses volatile - that prevents the compiler from doing things like leaving the data in a temp variable instead of reading/writing the data when you tell it to. The data will always be read from memory or written to memory when you use the accessor function on the pointer without regard to if you have done so before.