|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: // EA
8:
9: #pragma once
10:
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)
20: inline uint32 internal_ea_anin(uint n)
21: {
22: return reg.A[n];
23: }
24:
25: // (An)+ .B
26: inline uint32 internal_ea_anpi_1(uint n)
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
38: inline uint32 internal_ea_anpi_2(uint n)
39: {
40: reg.A[n] += 2;
41: return reg.A[n] - 2;
42: }
43:
44: // (An)+ .L
45: inline uint32 internal_ea_anpi_4(uint n)
46: {
47: reg.A[n] += 4;
48: return reg.A[n] - 4;
49: }
50:
51: // -(An) .B
52: inline uint32 internal_ea_anpd_1(uint n)
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
63: inline uint32 internal_ea_anpd_2(uint n)
64: {
65: reg.A[n] -= 2;
66: return reg.A[n];
67: }
68:
69: // -(An) .L
70: inline uint32 internal_ea_anpd_4(uint n)
71: {
72: reg.A[n] -= 4;
73: return reg.A[n];
74: }
75:
76: // d16(An)
77: inline uint32 internal_ea_andi(uint n)
78: {
79: int32 disp = (int32)(int16)fetch_2();
80: return reg.A[n] + disp;
81: }
82:
83: // (An,IX)
84: inline uint32 internal_ea_anix(uint n)
85: {
86: return internal_ea_ix(reg.A[n]);
87: }
88:
89: // Abs.W
90: inline uint32 internal_ea_absw()
91: {
92: return (int32)(int16)fetch_2();
93: }
94:
95: // Abs.L
96: inline uint32 internal_ea_absl()
97: {
98: return fetch_4();
99: }
100:
101: // d16(PC)
102: inline uint32 internal_ea_pcdi()
103: {
104: int32 origin = reg.pc;
105: int32 disp = (int32)(int16)fetch_2();
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 (個別)
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);
127: uint32 cea_absw();
128: uint32 cea_absl();
129: uint32 cea_pcdi();
130: uint32 cea_pcix();
131:
132: // FEA (個別)
133: uint32 fea_anin();
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();
140: uint32 fea_andi();
141: uint32 fea_anix();
142: uint32 fea_absw();
143: uint32 fea_absl();
144: uint32 fea_pcdi();
145: uint32 fea_pcix();
146: void fea_imm_2();
147: void fea_imm_4();
148:
149: // CEA (グループ)
150: uint32 cea_ctrl();
151: uint32 cea_data_1();
152: uint32 cea_data_2();
153: uint32 cea_data_4();
154: uint32 cea_copro();
155:
156: // FEA (グループ)
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.