Previous 15994 Revisions Next

r15065 Monday 30th April, 2012 at 01:42:19 UTC by Barry Rodewald
i386: Fix for bt? instructions [Carl]
[src/emu/cpu/i386]i386.c i386op16.c i386op32.c

src/emu/cpu/i386/i386op16.c
r15064r15065
365365
366366      CYCLES(cpustate,CYCLES_BT_REG_REG);
367367   } else {
368      UINT32 ea = GetEA(cpustate,modrm,0);
368      UINT8 segment;
369      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
369370      UINT16 bit = LOAD_REG16(modrm);
370371      ea += 2*(bit/16);
371      ea = (cpustate->address_size)?ea:(ea&0xffff);
372      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0);
372373      bit %= 16;
373374      UINT16 dst = READ16(cpustate,ea);
374375
r15064r15065
397398      STORE_RM16(modrm, dst);
398399      CYCLES(cpustate,CYCLES_BTC_REG_REG);
399400   } else {
400      UINT32 ea = GetEA(cpustate,modrm,1);
401      UINT8 segment;
402      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
401403      UINT16 bit = LOAD_REG16(modrm);
402404      ea += 2*(bit/16);
403      ea = (cpustate->address_size)?ea:(ea&0xffff);
405      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
404406      bit %= 16;
405407      UINT16 dst = READ16(cpustate,ea);
406408
r15064r15065
431433      STORE_RM16(modrm, dst);
432434      CYCLES(cpustate,CYCLES_BTR_REG_REG);
433435   } else {
434      UINT32 ea = GetEA(cpustate,modrm,1);
436      UINT8 segment;
437      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
435438      UINT16 bit = LOAD_REG16(modrm);
436439      ea += 2*(bit/16);
437      ea = (cpustate->address_size)?ea:(ea&0xffff);
440      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
438441      bit %= 16;
439442      UINT16 dst = READ16(cpustate,ea);
440443
r15064r15065
465468      STORE_RM16(modrm, dst);
466469      CYCLES(cpustate,CYCLES_BTS_REG_REG);
467470   } else {
468      UINT32 ea = GetEA(cpustate,modrm,1);
471      UINT8 segment;
472      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
469473      UINT16 bit = LOAD_REG16(modrm);
470474      ea += 2*(bit/16);
471      ea = (cpustate->address_size)?ea:(ea&0xffff);
475      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
472476      bit %= 16;
473477      UINT16 dst = READ16(cpustate,ea);
474478
r15064r15065
11611165static void I386OP(lea16)(i386_state *cpustate)            // Opcode 0x8d
11621166{
11631167   UINT8 modrm = FETCH(cpustate);
1164   UINT32 ea = GetNonTranslatedEA(cpustate,modrm);
1168   UINT32 ea = GetNonTranslatedEA(cpustate,modrm,NULL);
11651169   STORE_REG16(modrm, ea);
11661170   CYCLES(cpustate,CYCLES_LEA);
11671171}
src/emu/cpu/i386/i386.c
r15064r15065
335335   }
336336}
337337
338static UINT32 GetNonTranslatedEA(i386_state *cpustate,UINT8 modrm)
338static UINT32 GetNonTranslatedEA(i386_state *cpustate,UINT8 modrm,UINT8 *seg)
339339{
340340   UINT8 segment;
341341   UINT32 ea;
342342   modrm_to_EA(cpustate, modrm, &ea, &segment );
343   if(seg) *seg = segment;
343344   return ea;
344345}
345346
src/emu/cpu/i386/i386op32.c
r15064r15065
341341
342342      CYCLES(cpustate,CYCLES_BT_REG_REG);
343343   } else {
344      UINT32 ea = GetEA(cpustate,modrm,0);
344      UINT8 segment;
345      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
345346      UINT32 bit = LOAD_REG32(modrm);
346347      ea += 4*(bit/32);
347      ea = (cpustate->address_size)?ea:(ea&0xffff);
348      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0);
348349      bit %= 32;
349350      UINT32 dst = READ32(cpustate,ea);
350351
r15064r15065
373374      STORE_RM32(modrm, dst);
374375      CYCLES(cpustate,CYCLES_BTC_REG_REG);
375376   } else {
376      UINT32 ea = GetEA(cpustate,modrm,1);
377      UINT8 segment;
378      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
377379      UINT32 bit = LOAD_REG32(modrm);
378380      ea += 4*(bit/32);
379      ea = (cpustate->address_size)?ea:(ea&0xffff);
381      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
380382      bit %= 32;
381383      UINT32 dst = READ32(cpustate,ea);
382384
r15064r15065
407409      STORE_RM32(modrm, dst);
408410      CYCLES(cpustate,CYCLES_BTR_REG_REG);
409411   } else {
410      UINT32 ea = GetEA(cpustate,modrm,1);
412      UINT8 segment;
413      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
411414      UINT32 bit = LOAD_REG32(modrm);
412415      ea += 4*(bit/32);
413      ea = (cpustate->address_size)?ea:(ea&0xffff);
416      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
414417      bit %= 32;
415418      UINT32 dst = READ32(cpustate,ea);
416419
r15064r15065
441444      STORE_RM32(modrm, dst);
442445      CYCLES(cpustate,CYCLES_BTS_REG_REG);
443446   } else {
444      UINT32 ea = GetEA(cpustate,modrm,1);
447      UINT8 segment;
448      UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
445449      UINT32 bit = LOAD_REG32(modrm);
446450      ea += 4*(bit/32);
447      ea = (cpustate->address_size)?ea:(ea&0xffff);
451      ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
448452      bit %= 32;
449453      UINT32 dst = READ32(cpustate,ea);
450454
r15064r15065
10021006static void I386OP(lea32)(i386_state *cpustate)            // Opcode 0x8d
10031007{
10041008   UINT8 modrm = FETCH(cpustate);
1005   UINT32 ea = GetNonTranslatedEA(cpustate,modrm);
1009   UINT32 ea = GetNonTranslatedEA(cpustate,modrm,NULL);
10061010   if (!cpustate->address_size)
10071011   {
10081012      ea &= 0xffff;

Previous 15994 Revisions Next


© 1998-2018 The MESS Team