fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 383 lines 8.2 kB view raw
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}