|
|
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: //
1.1.1.2 root 6:
1.1 root 7: // EA
8:
9: #pragma once
10:
1.1.1.3 root 11: // 命令ワードの下位6ビット mmmrrr のうち mmm の部分を取り出す
12: static inline int eamode(uint x) { return (x >> 3) & 7; }
13: // 命令ワードの下位6ビット mmmrrr のうち rrr の部分を取り出す
14: static inline int eanum(uint x) { return x & 7; }
15:
16: // internal_ea_*() は EA を計算だけする部分。CYCLE はここでは加算しない。
17: // MOVE の DST 側からも呼ばれる。
18:
19: // (An)
1.1.1.4 ! root 20: inline uint32 internal_ea_anin(uint n)
1.1.1.3 root 21: {
22: return reg.A[n];
23: }
24:
25: // (An)+ .B
1.1.1.4 ! root 26: inline uint32 internal_ea_anpi_1(uint n)
1.1.1.3 root 27: {
28: if (n == 7) {
29: reg.A[n] += 2;
30: return reg.A[n] - 2;
31: } else {
32: reg.A[n] += 1;
33: return reg.A[n] - 1;
34: }
35: }
36:
37: // (An)+ .W
1.1.1.4 ! root 38: inline uint32 internal_ea_anpi_2(uint n)
1.1.1.3 root 39: {
40: reg.A[n] += 2;
41: return reg.A[n] - 2;
42: }
43:
44: // (An)+ .L
1.1.1.4 ! root 45: inline uint32 internal_ea_anpi_4(uint n)
1.1.1.3 root 46: {
47: reg.A[n] += 4;
48: return reg.A[n] - 4;
49: }
50:
51: // -(An) .B
1.1.1.4 ! root 52: inline uint32 internal_ea_anpd_1(uint n)
1.1.1.3 root 53: {
54: if (n == 7) {
55: reg.A[n] -= 2;
56: } else {
57: reg.A[n] -= 1;
58: }
59: return reg.A[n];
60: }
61:
62: // -(An) .W
1.1.1.4 ! root 63: inline uint32 internal_ea_anpd_2(uint n)
1.1.1.3 root 64: {
65: reg.A[n] -= 2;
66: return reg.A[n];
67: }
68:
69: // -(An) .L
1.1.1.4 ! root 70: inline uint32 internal_ea_anpd_4(uint n)
1.1.1.3 root 71: {
72: reg.A[n] -= 4;
73: return reg.A[n];
74: }
75:
76: // d16(An)
1.1.1.4 ! root 77: inline uint32 internal_ea_andi(uint n)
1.1.1.3 root 78: {
1.1.1.4 ! root 79: int32 disp = (int32)(int16)fetch_2();
1.1.1.3 root 80: return reg.A[n] + disp;
81: }
82:
83: // (An,IX)
1.1.1.4 ! root 84: inline uint32 internal_ea_anix(uint n)
1.1.1.3 root 85: {
86: return internal_ea_ix(reg.A[n]);
87: }
88:
89: // Abs.W
90: inline uint32 internal_ea_absw()
91: {
1.1.1.4 ! root 92: return (int32)(int16)fetch_2();
1.1.1.3 root 93: }
94:
95: // Abs.L
96: inline uint32 internal_ea_absl()
97: {
1.1.1.4 ! root 98: return fetch_4();
1.1.1.3 root 99: }
100:
101: // d16(PC)
102: inline uint32 internal_ea_pcdi()
103: {
104: int32 origin = reg.pc;
1.1.1.4 ! root 105: int32 disp = (int32)(int16)fetch_2();
1.1.1.3 root 106: return origin + disp;
107: }
108:
109: // (PC,IX)
110: inline uint32 internal_ea_pcix()
111: {
112: return internal_ea_ix(reg.pc);
113: }
114:
115: uint32 internal_ea_ix(uint32);
116:
117: // CEA (個別)
1.1.1.4 ! root 118: uint32 cea_anin(uint n);
! 119: uint32 cea_anpi_1(uint n);
! 120: uint32 cea_anpi_2(uint n);
! 121: uint32 cea_anpi_4(uint n);
! 122: uint32 cea_anpd_1(uint n);
! 123: uint32 cea_anpd_2(uint n);
! 124: uint32 cea_anpd_4(uint n);
! 125: uint32 cea_andi(uint n);
! 126: uint32 cea_anix(uint n);
1.1.1.3 root 127: uint32 cea_absw();
128: uint32 cea_absl();
129: uint32 cea_pcdi();
130: uint32 cea_pcix();
131:
132: // FEA (個別)
133: uint32 fea_anin();
1.1.1.4 ! root 134: uint32 fea_anpi_1();
! 135: uint32 fea_anpi_2();
! 136: uint32 fea_anpi_4();
! 137: uint32 fea_anpd_1();
! 138: uint32 fea_anpd_2();
! 139: uint32 fea_anpd_4();
1.1.1.3 root 140: uint32 fea_andi();
141: uint32 fea_anix();
142: uint32 fea_absw();
143: uint32 fea_absl();
144: uint32 fea_pcdi();
145: uint32 fea_pcix();
1.1.1.4 ! root 146: void fea_imm_2();
! 147: void fea_imm_4();
1.1.1.3 root 148:
149: // CEA (グループ)
150: uint32 cea_ctrl();
1.1.1.4 ! root 151: uint32 cea_data_1();
! 152: uint32 cea_data_2();
! 153: uint32 cea_data_4();
1.1.1.3 root 154: uint32 cea_copro();
155:
156: // FEA (グループ)
1.1.1.4 ! root 157: uint32 fea_data_1();
! 158: uint32 fea_data_2();
! 159: uint32 fea_data_4();
! 160: uint32 fea_all_1();
! 161: uint32 fea_all_2();
! 162: uint32 fea_all_4();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.