1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
pub(crate) const EA_ARI: usize = 4;
pub(crate) const EA_ARIWPO: usize = 4;
pub(crate) const EA_ARIWPR: usize = 6;
pub(crate) const EA_ARIWD: usize = 8;
pub(crate) const EA_ARIWI8: usize = 10;
pub(crate) const EA_ABSSHORT: usize = 8;
pub(crate) const EA_ABSLONG: usize = 12;
pub(crate) const EA_PCIWD: usize = 8;
pub(crate) const EA_PCIWI8: usize = 10;
pub(crate) const EA_IMMEDIATE: usize = 4;

pub(crate) const VECTOR_RESET: usize = 40;
pub(crate) const fn vector_execution_time(vector: u8) -> usize {
    match vector {
        2 => 50, // Access Error
        3 => 50, // Address Error
        4 => 34, // Illegal
        5 => 38, // Zero Divide
        6 => 40, // Chk
        7 => 34, // Trapv
        8 => 34, // Privilege Violation
        9 => 34, // Trace
        24..=31 => 44, // Interrupt
        32..=47 => 34, // Trap
        _ => VECTOR_RESET, // TODO: what to return with the other vectors?
    }
}

pub(crate) const ABCD_REG: usize = 6;
pub(crate) const ABCD_MEM: usize = 18;

pub(crate) const ADD_REG_BW: usize = 4;
pub(crate) const ADD_REG_L: usize = 6;
pub(crate) const ADD_REG_L_RDIMM: usize = 8;
pub(crate) const ADD_MEM_BW: usize = 8;
pub(crate) const ADD_MEM_L: usize = 12;

pub(crate) const ADDA_WORD: usize = 8;
pub(crate) const ADDA_LONG: usize = 6;
pub(crate) const ADDA_LONG_RDIMM: usize = 8;

pub(crate) const ADDI_REG_BW: usize = 8;
pub(crate) const ADDI_REG_L: usize = 16;
pub(crate) const ADDI_MEM_BW: usize = 12;
pub(crate) const ADDI_MEM_L: usize = 20;

pub(crate) const ADDQ_REG_BW: usize = 4;
pub(crate) const ADDQ_REG_L: usize = 8;
pub(crate) const ADDQ_MEM_BW: usize = 8;
pub(crate) const ADDQ_MEM_L: usize = 12;

pub(crate) const ADDX_REG_BW: usize = 4;
pub(crate) const ADDX_REG_L: usize = 8;
pub(crate) const ADDX_MEM_BW: usize = 18;
pub(crate) const ADDX_MEM_L: usize = 30;

pub(crate) const AND_REG_BW: usize = 4;
pub(crate) const AND_REG_L: usize = 6;
pub(crate) const AND_REG_L_RDIMM: usize = 8;
pub(crate) const AND_MEM_BW: usize = 8;
pub(crate) const AND_MEM_L: usize = 12;

pub(crate) const ANDI_REG_BW: usize = 8;
pub(crate) const ANDI_REG_L: usize = 14;
pub(crate) const ANDI_MEM_BW: usize = 12;
pub(crate) const ANDI_MEM_L: usize = 20;

pub(crate) const ANDICCR: usize = 20;

pub(crate) const ANDISR: usize = 20;

pub(crate) const ASM: usize = 8;

pub(crate) const ASR_COUNT: usize = 2;
pub(crate) const ASR_BW: usize = 6;
pub(crate) const ASR_L: usize = 8;

pub(crate) const BCC_BRANCH: usize = 10;
pub(crate) const BCC_NO_BRANCH_BYTE: usize = 8;
pub(crate) const BCC_NO_BRANCH_WORD: usize = 12;

pub(crate) const BCHG_DYN_REG: usize = 8;
pub(crate) const BCHG_DYN_MEM: usize = 8;
pub(crate) const BCHG_STA_REG: usize = 12;
pub(crate) const BCHG_STA_MEM: usize = 12;

pub(crate) const BCLR_DYN_REG: usize = 10;
pub(crate) const BCLR_DYN_MEM: usize = 8;
pub(crate) const BCLR_STA_REG: usize = 14;
pub(crate) const BCLR_STA_MEM: usize = 12;

pub(crate) const BRA_BYTE: usize = 10;
pub(crate) const BRA_WORD: usize = 10;

pub(crate) const BSET_DYN_REG: usize = 8;
pub(crate) const BSET_DYN_MEM: usize = 8;
pub(crate) const BSET_STA_REG: usize = 12;
pub(crate) const BSET_STA_MEM: usize = 12;

pub(crate) const BSR_BYTE: usize = 18;
pub(crate) const BSR_WORD: usize = 18;

pub(crate) const BTST_DYN_REG: usize = 6;
pub(crate) const BTST_DYN_MEM: usize = 4;
pub(crate) const BTST_STA_REG: usize = 10;
pub(crate) const BTST_STA_MEM: usize = 8;

pub(crate) const CHK_NO_TRAP: usize = 10;

pub(crate) const CLR_REG_BW: usize = 4;
pub(crate) const CLR_REG_L: usize = 6;
pub(crate) const CLR_MEM_BW: usize = 8;
pub(crate) const CLR_MEM_L: usize = 12;

pub(crate) const CMP_BW: usize = 4;
pub(crate) const CMP_L: usize = 6;

pub(crate) const CMPA: usize = 6;

pub(crate) const CMPI_REG_BW: usize = 8;
pub(crate) const CMPI_REG_L: usize = 14;
pub(crate) const CMPI_MEM_BW: usize = 8;
pub(crate) const CMPI_MEM_L: usize = 12;

pub(crate) const CMPM_BW: usize = 12;
pub(crate) const CMPM_L: usize = 20;

pub(crate) const DBCC_TRUE: usize = 12;
pub(crate) const DBCC_FALSE_BRANCH: usize = 10;
pub(crate) const DBCC_FALSE_NO_BRANCH: usize = 14;

pub(crate) const DIVS: usize = 158;
pub(crate) const DIVU: usize = 140;

pub(crate) const EOR_REG_BW: usize = 4;
pub(crate) const EOR_REG_L: usize = 8;
pub(crate) const EOR_MEM_BW: usize = 8;
pub(crate) const EOR_MEM_L: usize = 12;

pub(crate) const EORI_REG_BW: usize = 8;
pub(crate) const EORI_REG_L: usize = 16;
pub(crate) const EORI_MEM_BW: usize = 12;
pub(crate) const EORI_MEM_L: usize = 20;

pub(crate) const EORICCR: usize = 20;

pub(crate) const EORISR: usize = 20;

pub(crate) const EXG: usize = 6;

pub(crate) const EXT: usize = 4;

pub(crate) const JMP_ARI: usize = 8;
pub(crate) const JMP_ARIWD: usize = 10;
pub(crate) const JMP_ARIWI8: usize = 14;
pub(crate) const JMP_ABSSHORT: usize = 10;
pub(crate) const JMP_ABSLONG: usize = 12;
pub(crate) const JMP_PCIWD: usize = 10;
pub(crate) const JMP_PCIWI8: usize = 14;

pub(crate) const JSR_ARI: usize = 16;
pub(crate) const JSR_ARIWD: usize = 18;
pub(crate) const JSR_ARIWI8: usize = 22;
pub(crate) const JSR_ABSSHORT: usize = 18;
pub(crate) const JSR_ABSLONG: usize = 20;
pub(crate) const JSR_PCIWD: usize = 18;
pub(crate) const JSR_PCIWI8: usize = 22;

pub(crate) const LEA_ARI: usize = 4;
pub(crate) const LEA_ARIWD: usize = 8;
pub(crate) const LEA_ARIWI8: usize = 12;
pub(crate) const LEA_ABSSHORT: usize = 8;
pub(crate) const LEA_ABSLONG: usize = 12;
pub(crate) const LEA_PCIWD: usize = 8;
pub(crate) const LEA_PCIWI8: usize = 12;

pub(crate) const LINK: usize = 16;

pub(crate) const LSM: usize = 8;

pub(crate) const LSR_COUNT: usize = 2;
pub(crate) const LSR_BW: usize = 6;
pub(crate) const LSR_L: usize = 8;

pub(crate) const MOVE_DST_ARIWPR: usize = 2;
pub(crate) const MOVE_OTHER: usize = 4;

pub(crate) const MOVEA: usize = 4;

pub(crate) const MOVECCR: usize = 12;

pub(crate) const MOVEFSR_REG: usize = 6;
pub(crate) const MOVEFSR_MEM: usize = 8;

pub(crate) const MOVESR: usize = 12;

pub(crate) const MOVEUSP: usize = 4;

pub(crate) const MOVEM_WORD: usize = 4;
pub(crate) const MOVEM_LONG: usize = 8;
pub(crate) const MOVEM_MTR: usize = 4;
pub(crate) const MOVEM_ARI: usize = 8; // R -> M, do +4 for M -> R.
pub(crate) const MOVEM_ARIWPO: usize = 8;
pub(crate) const MOVEM_ARIWPR: usize = 8;
pub(crate) const MOVEM_ARIWD: usize = 12;
pub(crate) const MOVEM_ARIWI8: usize = 14;
pub(crate) const MOVEM_ABSSHORT: usize = 12;
pub(crate) const MOVEM_ABSLONG: usize = 16;
pub(crate) const MOVEM_PCIWD: usize = 12;
pub(crate) const MOVEM_PCIWI8: usize = 14;

pub(crate) const MOVEP_RTM_WORD: usize = 16;
pub(crate) const MOVEP_RTM_LONG: usize = 24;
pub(crate) const MOVEP_MTR_WORD: usize = 16;
pub(crate) const MOVEP_MTR_LONG: usize = 24;

pub(crate) const MOVEQ: usize = 4;

pub(crate) const MULS: usize = 70;

pub(crate) const MULU: usize = 70;

pub(crate) const NBCD_REG: usize = 6;
pub(crate) const NBCD_MEM: usize = 8;

pub(crate) const NEG_REG_BW: usize = 4;
pub(crate) const NEG_REG_L: usize = 6;
pub(crate) const NEG_MEM_BW: usize = 8;
pub(crate) const NEG_MEM_L: usize = 12;

pub(crate) const NEGX_REG_BW: usize = 4;
pub(crate) const NEGX_REG_L: usize = 6;
pub(crate) const NEGX_MEM_BW: usize = 8;
pub(crate) const NEGX_MEM_L: usize = 12;

pub(crate) const NOP: usize = 4;

pub(crate) const NOT_REG_BW: usize = 4;
pub(crate) const NOT_REG_L: usize = 6;
pub(crate) const NOT_MEM_BW: usize = 8;
pub(crate) const NOT_MEM_L: usize = 12;

pub(crate) const OR_REG_BW: usize = 4;
pub(crate) const OR_REG_L: usize = 6;
pub(crate) const OR_REG_L_RDIMM: usize = 8;
pub(crate) const OR_MEM_BW: usize = 8;
pub(crate) const OR_MEM_L: usize = 12;

pub(crate) const ORI_REG_BW: usize = 8;
pub(crate) const ORI_REG_L: usize = 16;
pub(crate) const ORI_MEM_BW: usize = 12;
pub(crate) const ORI_MEM_L: usize = 20;

pub(crate) const ORICCR: usize = 20;

pub(crate) const ORISR: usize = 20;

pub(crate) const PEA_ARI: usize = 12;
pub(crate) const PEA_ARIWD: usize = 16;
pub(crate) const PEA_ARIWI8: usize = 20;
pub(crate) const PEA_ABSSHORT: usize = 16;
pub(crate) const PEA_ABSLONG: usize = 20;
pub(crate) const PEA_PCIWD: usize = 16;
pub(crate) const PEA_PCIWI8: usize = 20;

pub(crate) const RESET: usize = 132;

pub(crate) const ROM: usize = 8;

pub(crate) const ROR_COUNT: usize = 2;
pub(crate) const ROR_BW: usize = 6;
pub(crate) const ROR_L: usize = 8;

pub(crate) const ROXM: usize = 8;

pub(crate) const ROXR_COUNT: usize = 2;
pub(crate) const ROXR_BW: usize = 6;
pub(crate) const ROXR_L: usize = 8;

pub(crate) const RTE: usize = 20;

pub(crate) const RTR: usize = 20;

pub(crate) const RTS: usize = 16;

pub(crate) const SBCD_REG: usize = 6;
pub(crate) const SBCD_MEM: usize = 18;

pub(crate) const SCC_REG_FALSE: usize = 4;
pub(crate) const SCC_REG_TRUE: usize = 6;
pub(crate) const SCC_MEM_FALSE: usize = 8;
pub(crate) const SCC_MEM_TRUE: usize = 8;

pub(crate) const STOP: usize = 4;

pub(crate) const SUB_REG_BW: usize = 4;
pub(crate) const SUB_REG_L: usize = 6;
pub(crate) const SUB_REG_L_RDIMM: usize = 8;
pub(crate) const SUB_MEM_BW: usize = 8;
pub(crate) const SUB_MEM_L: usize = 12;

pub(crate) const SUBA_WORD: usize = 8;
pub(crate) const SUBA_LONG: usize = 6;
pub(crate) const SUBA_LONG_RDIMM: usize = 8;

pub(crate) const SUBI_REG_BW: usize = 8;
pub(crate) const SUBI_REG_L: usize = 16;
pub(crate) const SUBI_MEM_BW: usize = 12;
pub(crate) const SUBI_MEM_L: usize = 20;

pub(crate) const SUBQ_DREG_BW: usize = 4;
pub(crate) const SUBQ_AREG_BW: usize = 8;
pub(crate) const SUBQ_REG_L: usize = 8;
pub(crate) const SUBQ_MEM_BW: usize = 8;
pub(crate) const SUBQ_MEM_L: usize = 12;

pub(crate) const SUBX_REG_BW: usize = 4;
pub(crate) const SUBX_REG_L: usize = 8;
pub(crate) const SUBX_MEM_BW: usize = 18;
pub(crate) const SUBX_MEM_L: usize = 30;

pub(crate) const SWAP: usize = 4;

pub(crate) const TAS_REG: usize = 4;
pub(crate) const TAS_MEM: usize = 14;

pub(crate) const TRAPV_NO_TRAP: usize = 4;

pub(crate) const TST_REG_BW: usize = 4;
pub(crate) const TST_REG_L: usize = 4;
pub(crate) const TST_MEM_BW: usize = 4;
pub(crate) const TST_MEM_L: usize = 4;

pub(crate) const UNLK: usize = 12;