--- nono/m680x0/m68030bitfield.cpp 2026/04/29 17:05:15 1.1.1.1 +++ nono/m680x0/m68030bitfield.cpp 2026/04/29 17:05:26 1.1.1.2 @@ -5,6 +5,7 @@ // #include "m68030bitfield.h" +#include "bitops.h" // コンストラクタ // 呼び出し側でここまでに ir2 へのフェッチはしておくこと。 @@ -58,41 +59,19 @@ acc_bf::LoadMem(uint32 addr) bytes = (local_offset + width + 7) / 8; // 40ビットバッファに読み込む - // read_NN() はミスアラインドでもアクセスできる - switch (bytes) { - case 1: - buf = ((uint64)cpu->read_8(ea)) << 32; - break; - case 2: - buf = ((uint64)cpu->read_16(ea)) << 24; - break; - case 3: - if ((ea & 1) == 0) { - // 偶数アドレスから3バイト - buf = ((uint64)cpu->read_16(ea)) << 24; - buf |= ((uint64)cpu->read_8(ea + 2)) << 16; - } else { - // 奇数アドレスから3バイト - buf = ((uint64)cpu->read_8(ea)) << 32; - buf |= (uint64)cpu->read_16(ea + 1) << 16; - } - break; - case 4: - buf = ((uint64)cpu->read_32(ea)) << 8; - break; - case 5: + if (bytes <= 4) { + buf = ((uint64)cpu->read_n(ea, bytes)) << ((5 - bytes) * 8); + } else { + // 実際どういうアクセスになるのか分からないが。 if ((ea & 1) == 0) { // 偶数アドレスから5バイト - buf = ((uint64)cpu->read_32(ea)) << 8; - buf |= ((uint64)cpu->read_8(ea + 4)); + buf = ((uint64)cpu->read_4(ea)) << 8; + buf |= ((uint64)cpu->read_1(ea + 4)); } else { // 奇数アドレスから5バイト - buf = ((uint64)cpu->read_8(ea)) << 32; - buf |= ((uint64)cpu->read_32(ea + 1)); + buf = ((uint64)cpu->read_1(ea)) << 32; + buf |= ((uint64)cpu->read_4(ea + 1)); } - break; - default: - PANIC("corrupted bytes=%d", bytes); } // 32ビット左詰めにする @@ -119,40 +98,18 @@ acc_bf::StoreMem() buf = (buf & ~m) | (d & m); // 40ビットバッファを書き戻す - // write_NN() はミスアラインドでもアクセスできる - switch (bytes) { - case 1: - cpu->write_8(ea, buf >> 32); - break; - case 2: - cpu->write_16(ea, buf >> 24); - break; - case 3: - if ((ea & 1) == 0) { - // 偶数アドレスから3バイト - cpu->write_16(ea, buf >> 24); - cpu->write_8(ea + 2, buf >> 16); - } else { - // 奇数アドレスから3バイト - cpu->write_8(ea, buf >> 32); - cpu->write_16(ea + 1, buf >> 16); - } - break; - case 4: - cpu->write_32(ea, buf >> 8); - break; - case 5: + if (bytes <= 4) { + cpu->write_n(ea, bytes, buf >> ((5 - bytes) * 8)); + } else { + // 実際どういうアクセスになるのか分からないが。 if ((ea & 1) == 0) { // 偶数アドレスから5バイト - cpu->write_32(ea, buf >> 8); - cpu->write_8(ea + 4, buf); + cpu->write_4(ea, buf >> 8); + cpu->write_1(ea + 4, buf & 0xff); } else { // 奇数アドレスから5バイト - cpu->write_8(ea, buf >> 32); - cpu->write_32(ea + 1, buf); + cpu->write_1(ea, buf >> 32); + cpu->write_4(ea + 1, buf); } - break; - default: - PANIC("corrupted bytes=%d", bytes); } }