--- nono/m88xx0/m88100.h 2026/04/29 17:04:31 1.1.1.1 +++ nono/m88xx0/m88100.h 2026/04/29 17:04:34 1.1.1.2 @@ -1,51 +1,25 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once #include "header.h" +#include "branchhistory.h" #include "bus.h" +#include "m88200.h" #include // 外部リクエストフラグ // XXX m680x0 側にもよく似たものがあってどうしたもんか +#define CPU_REQ_STOP (0x00000001) // ストップ状態 #define CPU_REQ_TRACE (0x00000004) // デバッガ有効 #define CPU_REQ_PROMPT (0x00000008) // デバッガプロンプト #define CPU_REQ_RELEASE (0x00000010) // 命令後に CPU 実行中断 #define CPU_REQ_INTR (0x00000020) // 命令後に割り込みチェック -class m88200 -{ - public: - m88200(); - virtual ~m88200(); - - public: - uint64 load_8(uint32 addr) { - return vm_phys_read_8(addr); - } - uint64 load_16(uint32 addr) { - return vm_phys_read_16(addr); - } - uint64 load_32(uint32 addr) { - return vm_phys_read_32(addr); - } - uint64 store_8(uint32 addr, uint32 data) { - return vm_phys_write_8(addr, data); - } - uint64 store_16(uint32 addr, uint32 data) { - return vm_phys_write_16(addr, data); - } - uint64 store_32(uint32 addr, uint32 data) { - return vm_phys_write_32(addr, data); - } - - uint32 idr = 0; - //: -}; - // m88100 レジスタイメージを保持する構造体。 // この構造体はコピーや比較をするので、ポインタとかは置かないこと。 struct m88100reg @@ -167,6 +141,7 @@ struct m88100reg } static const char * const sipname[3]; + static const char * const dmt_en_str[16]; }; class m88kcpu : public m88100reg @@ -184,6 +159,9 @@ class m88kcpu : public m88100reg void Interrupt(); + // PID.VERSION を設定する (初期化時に呼ぶ) + void SetVersion(uint32 version); + public: // [0] 命令バス // [1] データバス @@ -213,6 +191,16 @@ class m88kcpu : public m88100reg return (OpIsBusErr(op) ? ~op : op) & DELAYSLOT; } + // PSR を変更する。 + // CY ビットは特別にこの関数を経由しないで変更してよいことにする。 + void SetPSR(uint32 newpsr) + { + psr = newpsr; + // CMMU に S/U 信号を出す + cmmu[0].SetSuper(IsSuper()); + cmmu[1].SetSuper(IsSuper()); + } + // クラス外部からの xip 取得 uint32 Getxip() const { return xip; @@ -221,6 +209,7 @@ class m88kcpu : public m88100reg enum ExceptionKind { NORMAL, + DATA, ERROR, INTR, TRAP, @@ -230,6 +219,10 @@ class m88kcpu : public m88100reg void ExceptionCore(int vec, ExceptionKind cause); void ReadDataException(uint32 addr, uint32 flag); void WriteDataException(uint32 addr, uint32 data, uint32 flag); + void XmemDataException(uint32 addr, uint32 data, uint32 flag); + + // ブランチ履歴 + BranchHistory brhist {}; // FPU bool IsFPUEnable() { return !(psr & PSR_SFD1); } @@ -247,15 +240,19 @@ class m88kcpu : public m88100reg // ブランチ処理用 void EnterBranch(); + void DoBranch(uint32 toaddr); void ExitBranch(); void ExitDelayBranch(); + uint32 nop_counter {}; // STOP 検出用の nop 命令カウンタ + // ロードストア命令用の下処理 - bool ldst_usr(uint32 size, uint32& usr); + bool ldst_usr(uint32& usr); uint32 ldst_scale(uint32 size); bool ldst_align(uint32 size, uint32& addr); #define OP_PROTO(name) void __CONCAT(op_,name)() #include "m88100ops.h" +OP_PROTO(illegal); #undef OP_PROTO void op_unimpl() {