|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #include "m68030core.h"
1.1.1.6 ! root 8: #include "vectortable.h"
1.1 root 9:
10: #define OP_PROTO(name) static inline void __CONCAT(op_,name)(m68kcpu *cpu)
11: #define OP_DEF(name) static inline void __CONCAT(op_,name)(m68kcpu *cpu)
12: #define OP_FUNC(name) __CONCAT(op_,name)(cpu)
13:
14: #include "m68030bus.h"
15: #include "m68030bus.cpp"
16: #include "m68030excep.h"
17: #include "m68030ea.h"
18: #include "m68030acc.h"
19: #include "m68030ops.h"
20: #include "m68030mmu.h"
21: #include "m68030fpu.h"
22: #include "m68030ops.cpp"
23:
1.1.1.6 ! root 24: // 1命令実行する。
! 25: // 戻り値は消費したサイクル数。
! 26: int
! 27: m68030_exec(m68kcpu *cpu)
1.1 root 28: {
1.1.1.6 ! root 29: uint64 cycle_start = cpu->used_cycle;
1.1 root 30:
1.1.1.6 ! root 31: try {
! 32: // 1命令版では switch-case を使うしかない。
! 33: RegPPC = RegPC;
! 34: cpu->flag_pi = 0;
! 35: cpu->flag_pd = 0;
! 36: RegIR = m68030_fetch_16(cpu);
! 37:
! 38: // uint16 を 6ビット右シフトしたら 1024 以上になるはずは
! 39: // ないのだが、デフォルトでは gcc/clang どちらも律儀に
! 40: // 1024 以上かどうか比較して分岐しようとする。
! 41: // gcc は __assume() を入れることでこの比較・分岐を出力
! 42: // しないようにすることが出来た(がパフォーマンスの差は
! 43: // 見えない程度でしかなかった)。
! 44: // clang ではどうやったら効くか不明。
! 45: uint16 ir = RegIR >> 6;
! 46: __assume(ir < 1024);
! 47: switch (ir) {
1.1 root 48: #include "m68030switch.h"
49: }
1.1.1.4 root 50:
1.1.1.6 ! root 51: cpu->used_cycle += cpu->cycle_nocache;
! 52: cpu->cycle_nocache = 0;
! 53: } catch (int vector) {
! 54: // ここで(C++の)例外スローをキャッチするのは
! 55: // - メモリ空間をアクセスした先でのバスエラー例外
! 56: // - EA パース中の不当命令例外
! 57: // のみ。それ以外の命令途中例外はその場で処理できる。
! 58: const char *name = gVectorTable->GetExceptionName(vector);
! 59: cpulog(1, "%s", name ?: "(reserved vector?)");
! 60: m68030_exception(cpu, vector);
! 61: }
1.1 root 62:
1.1.1.6 ! root 63: // 外部割り込みの起動は VM 側で処理している。
1.1 root 64:
1.1.1.6 ! root 65: return cpu->used_cycle - cycle_start;
1.1 root 66: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.