--- nono/m88xx0/m88100.h 2026/04/29 17:05:26 1.1.1.15 +++ nono/m88xx0/m88100.h 2026/04/29 17:05:56 1.1.1.17 @@ -6,9 +6,7 @@ #pragma once -#include "nono.h" - -class MPU88xx0Device; +#include "header.h" // 定数。 struct M88100 @@ -195,27 +193,62 @@ struct M88100 static const uint32 FPCR_EFOVF = 0x00000002; // Enable Overflow static const uint32 FPCR_EFINX = 0x00000001; // Enable Inexact - // 例外 - static const uint32 EXCEP_RESET = 0; - static const uint32 EXCEP_INTERRUPT = 1; - static const uint32 EXCEP_INST = 2; - static const uint32 EXCEP_DATA = 3; - static const uint32 EXCEP_MISALIGNED = 4; - static const uint32 EXCEP_UNIMPL_OP = 5; - static const uint32 EXCEP_PRIV = 6; - static const uint32 EXCEP_BOUNDS = 7; - static const uint32 EXCEP_INT_DIV = 8; - static const uint32 EXCEP_INT_OVF = 9; - static const uint32 EXCEP_ERROR = 10; - - static const uint32 EXCEP_SFU1_PRECISE = 114; - static const uint32 EXCEP_SFU1_IMPRECISE= 115; - static const uint32 EXCEP_SFU2_PRECISE = 116; - static const uint32 EXCEP_SFU3_PRECISE = 118; - static const uint32 EXCEP_SFU4_PRECISE = 120; - static const uint32 EXCEP_SFU5_PRECISE = 122; - static const uint32 EXCEP_SFU6_PRECISE = 124; - static const uint32 EXCEP_SFU7_PRECISE = 126; + // 例外ベクタ。 + static const uint32 EXCVEC_RESET = 0; + static const uint32 EXCVEC_INTERRUPT = 1; + static const uint32 EXCVEC_INST = 2; + static const uint32 EXCVEC_DATA = 3; + static const uint32 EXCVEC_MISALIGNED = 4; + static const uint32 EXCVEC_UNIMPL_OP = 5; + static const uint32 EXCVEC_PRIV = 6; + static const uint32 EXCVEC_BOUNDS = 7; + static const uint32 EXCVEC_INT_DIV = 8; + static const uint32 EXCVEC_INT_OVF = 9; + static const uint32 EXCVEC_ERROR = 10; + static const uint32 EXCVEC_SFU1_PRECISE = 114; + static const uint32 EXCVEC_SFU1_IMPRECISE = 115; + static const uint32 EXCVEC_SFU2_PRECISE = 116; + static const uint32 EXCVEC_SFU3_PRECISE = 118; + static const uint32 EXCVEC_SFU4_PRECISE = 120; + static const uint32 EXCVEC_SFU5_PRECISE = 122; + static const uint32 EXCVEC_SFU6_PRECISE = 124; + static const uint32 EXCVEC_SFU7_PRECISE = 126; + + // 例外の優先順位 (LSB 側が優先度高)。一部カテゴリ分けも兼ねる。 + // + // 優先度 例外 + // 1 RESET + // 1 (ERROR) + // 2 INST + // 3 UNIMPL_OP + // 4 PRIV + // 5 INTERNAL … 内部発生例外のうちトラップ以外 + // 5 TRAP … 内部発生例外のうちトラップのみ + // -- (OUTER) …これ以降のどれかが立っているという代表ビット + // 6 INTERRUPT + // 7 SFU_IMPRECISE + // 8 DATA + // + // ERROR 例外は Table. 6-2 には載ってないけど、実質ダブルバスフォールト + // なので、リセットに準じる高さの気がする…。 + // TRAP は他の内部発生例外 (INTERNAL) とは区別が必要なので分けてある。 + // INTERNAL と TRAP はこの優先度だけでなくベクタ情報も必要。 + // INTERRUPT と DATA はどちらが起きても同時に処理するので、 + // どちらかを立てたまま OUTER ビットで処理させる。 + // SFU_IMPRECISE は未調査。 + static const uint32 EXCPRI_RESET = (1U << 0); + static const uint32 EXCPRI_ERROR = (1U << 1); + static const uint32 EXCPRI_INST = (1U << 2); + static const uint32 EXCPRI_UNIMPL_OP = (1U << 3); + static const uint32 EXCPRI_PRIV = (1U << 4); + static const uint32 EXCPRI_INTERNAL = (1U << 5); + static const uint32 EXCPRI_TRAP = (1U << 6); + static const uint32 EXCPRI_OUTER = (1U << 7); + static const uint32 EXCPRI_INTERRUPT = (1U << 8); + static const uint32 EXCPRI_SFU_IMPRECISE = (1U << 9); + static const uint32 EXCPRI_DATA = (1U << 10); + static const uint32 EXCPRI_OUTER_MASK = + EXCPRI_INTERRUPT | EXCPRI_SFU_IMPRECISE | EXCPRI_DATA; // 32bit 命令コードからディスパッチ用の 12bit に変換。 // ops と disasm で使うため。 @@ -243,11 +276,11 @@ struct m88100reg union { uint32 cr[21] {}; struct { - uint32 pid; // cr0 + uint32 pid; // cr0 (ReadOnly) uint32 psr; // cr1 uint32 epsr; // cr2 uint32 ssbr; // cr3 - uint32 sxip; // cr4 + uint32 sxip; // cr4 (ReadOnly) uint32 snip; // cr5 uint32 sfip; // cr6 uint32 vbr; // cr7