fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/cpu/e8086/ea.c *
7 * Created: 1996-04-28 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 1996-2012 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include "e8086.h"
24#include "internal.h"
25
26
27/* EA 00: [BX + SI] */
28static
29void ea_get00 (e8086_t *c)
30{
31 c->ea.is_mem = 1;
32 c->ea.seg = e86_get_ds (c);
33 c->ea.ofs = e86_get_bx (c) + e86_get_si (c);
34 c->ea.cnt = 1;
35 c->delay += 7;
36}
37
38/* EA 01: [BX + DI] */
39static
40void ea_get01 (e8086_t *c)
41{
42 c->ea.is_mem = 1;
43 c->ea.seg = e86_get_ds (c);
44 c->ea.ofs = e86_get_bx (c) + e86_get_di (c);
45 c->ea.cnt = 1;
46 c->delay += 8;
47}
48
49/* EA 02: [BP + SI] */
50static
51void ea_get02 (e8086_t *c)
52{
53 c->ea.is_mem = 1;
54 c->ea.seg = e86_get_ss (c);
55 c->ea.ofs = e86_get_bp (c) + e86_get_si (c);
56 c->ea.cnt = 1;
57 c->delay += 8;
58}
59
60/* EA 03: [BP + DI] */
61static
62void ea_get03 (e8086_t *c)
63{
64 c->ea.is_mem = 1;
65 c->ea.seg = e86_get_ss (c);
66 c->ea.ofs = e86_get_bp (c) + e86_get_di (c);
67 c->ea.cnt = 1;
68 c->delay += 7;
69}
70
71/* EA 04: [SI] */
72static
73void ea_get04 (e8086_t *c)
74{
75 c->ea.is_mem = 1;
76 c->ea.seg = e86_get_ds (c);
77 c->ea.ofs = e86_get_si (c);
78 c->ea.cnt = 1;
79 c->delay += 5;
80}
81
82/* EA 05: [DI] */
83static
84void ea_get05 (e8086_t *c)
85{
86 c->ea.is_mem = 1;
87 c->ea.seg = e86_get_ds (c);
88 c->ea.ofs = e86_get_di (c);
89 c->ea.cnt = 1;
90 c->delay += 5;
91}
92
93/* EA 06: [XXXX] */
94static
95void ea_get06 (e8086_t *c)
96{
97 c->ea.is_mem = 1;
98 c->ea.seg = e86_get_ds (c);
99 c->ea.ofs = e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
100 c->ea.cnt = 3;
101 c->delay += 6;
102}
103
104/* EA 07: [BX] */
105static
106void ea_get07 (e8086_t *c)
107{
108 c->ea.is_mem = 1;
109 c->ea.seg = e86_get_ds (c);
110 c->ea.ofs = e86_get_bx (c);
111 c->ea.cnt = 1;
112 c->delay += 5;
113}
114
115/* EA 08: [BX + SI + XX] */
116static
117void ea_get08 (e8086_t *c)
118{
119 c->ea.is_mem = 1;
120 c->ea.seg = e86_get_ds (c);
121 c->ea.ofs = e86_get_bx (c) + e86_get_si (c) + e86_mk_sint16 (c->ea.data[1]);
122 c->ea.cnt = 2;
123 c->delay += 11;
124}
125
126/* EA 09: [BX + DI + XX] */
127static
128void ea_get09 (e8086_t *c)
129{
130 c->ea.is_mem = 1;
131 c->ea.seg = e86_get_ds (c);
132 c->ea.ofs = e86_get_bx (c) + e86_get_di (c) + e86_mk_sint16 (c->ea.data[1]);
133 c->ea.cnt = 2;
134 c->delay += 12;
135}
136
137/* EA 0A: [BP + SI + XX] */
138static
139void ea_get0a (e8086_t *c)
140{
141 c->ea.is_mem = 1;
142 c->ea.seg = e86_get_ss (c);
143 c->ea.ofs = e86_get_bp (c) + e86_get_si (c) + e86_mk_sint16 (c->ea.data[1]);
144 c->ea.cnt = 2;
145 c->delay += 12;
146}
147
148/* EA 0B: [BP + DI + XX] */
149static
150void ea_get0b (e8086_t *c)
151{
152 c->ea.is_mem = 1;
153 c->ea.seg = e86_get_ss (c);
154 c->ea.ofs = e86_get_bp (c) + e86_get_di (c) + e86_mk_sint16 (c->ea.data[1]);
155 c->ea.cnt = 2;
156 c->delay += 11;
157}
158
159/* EA 0C: [SI + XX] */
160static
161void ea_get0c (e8086_t *c)
162{
163 c->ea.is_mem = 1;
164 c->ea.seg = e86_get_ds (c);
165 c->ea.ofs = e86_get_si (c) + e86_mk_sint16 (c->ea.data[1]);
166 c->ea.cnt = 2;
167 c->delay += 9;
168}
169
170/* EA 0D: [DI + XX] */
171static
172void ea_get0d (e8086_t *c)
173{
174 c->ea.is_mem = 1;
175 c->ea.seg = e86_get_ds (c);
176 c->ea.ofs = e86_get_di (c) + e86_mk_sint16 (c->ea.data[1]);
177 c->ea.cnt = 2;
178 c->delay += 9;
179}
180
181/* EA 0E: [BP + XX] */
182static
183void ea_get0e (e8086_t *c)
184{
185 c->ea.is_mem = 1;
186 c->ea.seg = e86_get_ss (c);
187 c->ea.ofs = e86_get_bp (c) + e86_mk_sint16 (c->ea.data[1]);
188 c->ea.cnt = 2;
189 c->delay += 9;
190}
191
192/* EA 0F: [BX + XX] */
193static
194void ea_get0f (e8086_t *c)
195{
196 c->ea.is_mem = 1;
197 c->ea.seg = e86_get_ds (c);
198 c->ea.ofs = e86_get_bx (c) + e86_mk_sint16 (c->ea.data[1]);
199 c->ea.cnt = 2;
200 c->delay += 9;
201}
202
203/* EA 10: [BX + SI + XXXX] */
204static
205void ea_get10 (e8086_t *c)
206{
207 c->ea.is_mem = 1;
208 c->ea.seg = e86_get_ds (c);
209 c->ea.ofs = e86_get_bx (c) + e86_get_si (c);
210 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
211 c->ea.cnt = 3;
212 c->delay += 11;
213}
214
215/* EA 11: [BX + DI + XXXX] */
216static
217void ea_get11 (e8086_t *c)
218{
219 c->ea.is_mem = 1;
220 c->ea.seg = e86_get_ds (c);
221 c->ea.ofs = e86_get_bx (c) + e86_get_di (c);
222 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
223 c->ea.cnt = 3;
224 c->delay += 12;
225}
226
227/* EA 12: [BP + SI + XXXX] */
228static
229void ea_get12 (e8086_t *c)
230{
231 c->ea.is_mem = 1;
232 c->ea.seg = e86_get_ss (c);
233 c->ea.ofs = e86_get_bp (c) + e86_get_si (c);
234 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
235 c->ea.cnt = 3;
236 c->delay += 12;
237}
238
239/* EA 13: [BP + DI + XXXX] */
240static
241void ea_get13 (e8086_t *c)
242{
243 c->ea.is_mem = 1;
244 c->ea.seg = e86_get_ss (c);
245 c->ea.ofs = e86_get_bp (c) + e86_get_di (c);
246 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
247 c->ea.cnt = 3;
248 c->delay += 11;
249}
250
251/* EA 14: [SI + XXXX] */
252static
253void ea_get14 (e8086_t *c)
254{
255 c->ea.is_mem = 1;
256 c->ea.seg = e86_get_ds (c);
257 c->ea.ofs = e86_get_si (c);
258 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
259 c->ea.cnt = 3;
260 c->delay += 9;
261}
262
263/* EA 15: [DI + XXXX] */
264static
265void ea_get15 (e8086_t *c)
266{
267 c->ea.is_mem = 1;
268 c->ea.seg = e86_get_ds (c);
269 c->ea.ofs = e86_get_di (c);
270 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
271 c->ea.cnt = 3;
272 c->delay += 9;
273}
274
275/* EA 16: [BP + XXXX] */
276static
277void ea_get16 (e8086_t *c)
278{
279 c->ea.is_mem = 1;
280 c->ea.seg = e86_get_ss (c);
281 c->ea.ofs = e86_get_bp (c);
282 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
283 c->ea.cnt = 3;
284 c->delay += 9;
285}
286
287/* EA 17: [BX + XXXX] */
288static
289void ea_get17 (e8086_t *c)
290{
291 c->ea.is_mem = 1;
292 c->ea.seg = e86_get_ds (c);
293 c->ea.ofs = e86_get_bx (c);
294 c->ea.ofs += e86_mk_uint16 (c->ea.data[1], c->ea.data[2]);
295 c->ea.cnt = 3;
296 c->delay += 9;
297}
298
299/* EA 18-1F: REG */
300static
301void ea_get18 (e8086_t *c)
302{
303 c->ea.is_mem = 0;
304 c->ea.seg = 0;
305 c->ea.ofs = c->ea.data[0] & 7;
306 c->ea.cnt = 1;
307 c->delay = 0;
308}
309
310e86_ea_f e86_ea[32] = {
311 &ea_get00, &ea_get01, &ea_get02, &ea_get03,
312 &ea_get04, &ea_get05, &ea_get06, &ea_get07,
313 &ea_get08, &ea_get09, &ea_get0a, &ea_get0b,
314 &ea_get0c, &ea_get0d, &ea_get0e, &ea_get0f,
315 &ea_get10, &ea_get11, &ea_get12, &ea_get13,
316 &ea_get14, &ea_get15, &ea_get16, &ea_get17,
317 &ea_get18, &ea_get18, &ea_get18, &ea_get18,
318 &ea_get18, &ea_get18, &ea_get18, &ea_get18
319};
320
321void e86_get_ea_ptr (e8086_t *c, unsigned char *ea)
322{
323 unsigned fea;
324
325 c->ea.data = ea;
326
327 fea = (ea[0] & 7) | ((ea[0] & 0xc0) >> 3);
328
329 e86_ea[fea] (c);
330
331 c->ea.ofs &= 0xffffU;
332
333 if (c->prefix & E86_PREFIX_SEG) {
334 c->ea.seg = c->seg_override;
335 c->delay += 2;
336 }
337}
338
339unsigned char e86_get_ea8 (e8086_t *c)
340{
341 if (c->ea.is_mem) {
342 return (e86_get_mem8 (c, c->ea.seg, c->ea.ofs));
343 }
344
345 return (e86_get_reg8 (c, c->ea.ofs));
346}
347
348unsigned short e86_get_ea16 (e8086_t *c)
349{
350 if (c->ea.is_mem) {
351 if ((c->cpu & E86_CPU_8BIT) || (c->ea.ofs & 1)) {
352 c->delay += 4;
353 }
354
355 return (e86_get_mem16 (c, c->ea.seg, c->ea.ofs));
356 }
357
358 return (e86_get_reg16 (c, c->ea.ofs));
359}
360
361void e86_set_ea8 (e8086_t *c, unsigned char val)
362{
363 if (c->ea.is_mem) {
364 e86_set_mem8 (c, c->ea.seg, c->ea.ofs, val);
365 }
366 else {
367 e86_set_reg8 (c, c->ea.ofs, val);
368 }
369}
370
371void e86_set_ea16 (e8086_t *c, unsigned short val)
372{
373 if (c->ea.is_mem) {
374 if ((c->cpu & E86_CPU_8BIT) || (c->ea.ofs & 1)) {
375 c->delay += 4;
376 }
377
378 e86_set_mem16 (c, c->ea.seg, c->ea.ofs, val);
379 }
380 else {
381 e86_set_reg16 (c, c->ea.ofs, val);
382 }
383}