|
Thank you for the reply.
After playing some with type casting and the logical operation OR, below is what I'm doing right now.
I have this function 'UWORD GetOpcode(address)' that reads from mem_chip[] (or mem_slow[] or mem_rom[]) like this: 'word = (UWORD) (mem_chip[address] << 8) | (UWORD) mem_chip[address+1];
note: the memory arrays I'm using are supposed to always follow the 68000 way of storing words/longwords (thats: mem[0] = highest byte, mem[1] = second highest byte, etc.. So I'm reading from emulated amiga memory, converting words/longwords by switching the order of the bytes and store in a variable, do the necessary operations etc.., switch the order of the bytes place that into the amiga memory.
Now I have not run any tests of the cpu emulator yet as I am far from nearly finished, so it would be informative to know what you feel about my way of doing this.
> > Hi, I've just started coding what is ment to be an emulator of the Amiga 500 > in > > C, advice needed. > > > > The first thing I've wondered about is this: the mc 68000 reads/writes > > words/longwords "normal" as opposed to the x86 (in the PC I'm trying to code > an > > emulator for) that swaps the cointained bytes (LO-to-HI). > > > > what is the easiest way to deal with this ? I've got somwhat confused for the > > past ours to be honest. > > There are a few ways to deal with this depending on which version of the 68K you > have to emulate. If dealing with the 68000 or 68010, you can actually byteswap > every 16-bit word in your emulated memory spaces and then use normal > loads/stores on X86. This is platform-specific of course. To access bytes, > you'll have to XOR the address with 1 to get at the right part. > > For the 68020 and higher, this won't work because the processor can perform > unaligned memory access and you have to either use a really tricky backwards > memory scheme or simply byteswap everything after you've read it from memory. > > This works for the 68000 and any processor: just shift the bytes around using > standard C bit shift and logical AND/OR operators. >
|