--- nono/m680x0/m68030.h 2026/04/29 17:05:15 1.1.1.12 +++ nono/m680x0/m68030.h 2026/04/29 17:05:22 1.1.1.13 @@ -6,7 +6,7 @@ #pragma once -#include "header.h" +#include "bus.h" // どこ? __BEGIN_DECLS @@ -69,6 +69,7 @@ struct M68K static const uint32 CACR_CD = 0x0800; static const uint32 CACR_DBE = 0x1000; static const uint32 CACR_WA = 0x2000; + static const uint32 CACR_MASK = 0x3f1f; // FP static const uint32 FPCR_MASK = 0x0000fff0; @@ -260,8 +261,8 @@ struct m68kreg uint32 msp; uint32 vbr; - uint32 sfc; - uint32 dfc; + busaddr sfc; // (R/W も含む) + busaddr dfc; // (R/W も含む) uint32 cacr; uint32 caar; @@ -281,40 +282,44 @@ struct m68kreg | (intr_mask << 8) | ccr.Get(); } + // SFC, DFC レジスタの値を返す + uint32 GetSFC() const { return sfc.GetFC(); } + uint32 GetDFC() const { return dfc.GetFC(); } }; // バス状態 struct m68kbus { - // 論理アドレスと SSW。 - // SSW はアクセス前に SSW_BUS_{R,W} と FC[012] をセットすること。 - DEF_UNION64(, ssw_laddr, ssw, laddr); + // 論理アドレス。(R/W, FC2-0, Addr すべて使用) + busaddr laddr; + + // 対応する物理アドレス (FC2, Addr のみ使用) + busaddr paddr; + + // アクセスサイズ (SSW_SIZE_*) + uint32 size; - uint32 paddr; // 対応する物理アドレス // データバス。 // 今の所書き込みだけで使う。読み込みデータは戻り値のみ。 uint32 data; - // SSW のうち現在の FC2 だけ別途覚えておく。 - // FC2 が変化するのは SR:S による特権モードが変わった時だけなので。 - uint16 fc2; + // キャッシュ禁止。/CIIN + bool ci; + + // Supervisor アクセスなら true を返す + bool IsSuper() const { return laddr.IsSuper(); } // バスが Write なら true を返す - bool IsWrite() const { return (ssw & M68K::SSW_BUS_R) == 0; } + bool IsWrite() const { return laddr.IsWrite(); } - // このへんどうするか + // FC を取得する。(これは MMU ルーチンから呼ばれる) + uint GetFC() const { return laddr.GetFC(); } - // FC2 をキャッシュしておく。 - void SetFC2(bool newfc2) { - fc2 = newfc2 ? 4 : 0; - } - // FC を取得する。 - // これは MMU ルーチンから呼ばれる。そのためこの時点ではすでに - // FC0/1 と FC2 は ssw に合成済みなので、これでよい。 - uint GetFC() const { return ssw & M68K::SSW_FC_MASK; } + // SSW を取得する。 + uint32 GetSSW() const { return laddr.GetSSW() | size; } - // バスエラー時に SSW をセットする。 - void SET_SSW(bool use_mmu, uint size); + // アクセス方向(R/W)を設定する。 + void SetWrite(bool write_) { laddr.SetWrite(write_); } }; // 仮