--- uae/src/fpp.c 2018/04/24 16:38:39 1.1 +++ uae/src/fpp.c 2018/04/24 16:39:11 1.1.1.2 @@ -17,11 +17,11 @@ #include "gui.h" #include "memory.h" #include "custom.h" +#include "readcpu.h" #include "newcpu.h" #include "ersatz.h" -#include "readcpu.h" -#if CPU_LEVEL >= 2 +#if CPU_LEVEL >= 3 #define DEBUG_FPP 0 @@ -215,13 +215,13 @@ get_fp_value(ULONG opcode, UWORD extra,d switch (mode) { case 0: switch (size) { - case 6: *src = (double)(BYTE)regs.d[reg]; + case 6: *src = (double)(BYTE)m68k_dreg(regs, reg); break; - case 4: *src = (double)(WORD)regs.d[reg]; + case 4: *src = (double)(WORD)m68k_dreg(regs, reg); break; - case 0: *src = (double)(LONG)regs.d[reg]; + case 0: *src = (double)(LONG)m68k_dreg(regs, reg); break; - case 1: *src = to_single(regs.d[reg]); + case 1: *src = to_single(m68k_dreg(regs, reg)); break; default: return 0; @@ -230,21 +230,21 @@ get_fp_value(ULONG opcode, UWORD extra,d case 1: return 0; case 2: - ad = regs.a[reg]; + ad = m68k_areg(regs, reg); break; case 3: - ad = regs.a[reg]; - regs.a[reg] += reg == 7 ? sz2[size] : sz1[size]; + ad = m68k_areg(regs, reg); + m68k_areg(regs, reg) += reg == 7 ? sz2[size] : sz1[size]; break; case 4: - regs.a[reg] -= reg == 7 ? sz2[size] : sz1[size]; - ad = regs.a[reg]; + m68k_areg(regs, reg) -= reg == 7 ? sz2[size] : sz1[size]; + ad = m68k_areg(regs, reg); break; case 5: - ad = regs.a[reg] + (LONG)(WORD)nextiword(); + ad = m68k_areg(regs, reg) + (LONG)(WORD)nextiword(); break; case 6: - ad = get_disp_ea(regs.a[reg]); + ad = get_disp_ea(m68k_areg(regs, reg)); break; case 7: switch (reg) { @@ -320,15 +320,15 @@ put_fp_value(double value, ULONG opcode, switch (mode) { case 0: switch (size) { - case 6: regs.d[reg] = ((int)value & 0xff) | - (regs.d[reg] & ~0xff); + case 6: m68k_dreg(regs, reg) = ((int)value & 0xff) | + (m68k_dreg(regs, reg) & ~0xff); break; - case 4: regs.d[reg] = ((int)value & 0xffff) | - (regs.d[reg] & ~0xffff); + case 4: m68k_dreg(regs, reg) = ((int)value & 0xffff) | + (m68k_dreg(regs, reg) & ~0xffff); break; - case 0: regs.d[reg] = (int)value; + case 0: m68k_dreg(regs, reg) = (int)value; break; - case 1: regs.d[reg] = from_single(value); + case 1: m68k_dreg(regs, reg) = from_single(value); break; default: return 0; @@ -337,21 +337,21 @@ put_fp_value(double value, ULONG opcode, case 1: return 0; case 2: - ad = regs.a[reg]; + ad = m68k_areg(regs, reg); break; case 3: - ad = regs.a[reg]; - regs.a[reg] += reg == 7 ? sz2[size] : sz1[size]; + ad = m68k_areg(regs, reg); + m68k_areg(regs, reg) += reg == 7 ? sz2[size] : sz1[size]; break; case 4: - regs.a[reg] -= reg == 7 ? sz2[size] : sz1[size]; - ad = regs.a[reg]; + m68k_areg(regs, reg) -= reg == 7 ? sz2[size] : sz1[size]; + ad = m68k_areg(regs, reg); break; case 5: - ad = regs.a[reg] + (LONG)(WORD)nextiword(); + ad = m68k_areg(regs, reg) + (LONG)(WORD)nextiword(); break; case 6: - ad = get_disp_ea(regs.a[reg]); + ad = get_disp_ea(m68k_areg(regs, reg)); break; case 7: switch (reg) { @@ -419,19 +419,19 @@ get_fp_ad(ULONG opcode,ULONG *ad) case 1: return 0; case 2: - *ad = regs.a[reg]; + *ad = m68k_areg(regs, reg); break; case 3: - *ad = regs.a[reg]; + *ad = m68k_areg(regs, reg); break; case 4: - *ad = regs.a[reg]; + *ad = m68k_areg(regs, reg); break; case 5: - *ad = regs.a[reg] + (LONG)(WORD)nextiword(); + *ad = m68k_areg(regs, reg) + (LONG)(WORD)nextiword(); break; case 6: - *ad = get_disp_ea(regs.a[reg]); + *ad = get_disp_ea(m68k_areg(regs, reg)); break; case 7: switch (reg) { @@ -510,12 +510,13 @@ fdbcc_opp(ULONG opcode, UWORD extra) if (cc == -1) { m68k_setpc(pc-2); op_illg(opcode); - } - else if (!cc) { - regs.d[opcode & 0x7] = (regs.d[opcode & 0x7] & ~0xffff) | - ((regs.d[opcode & 0x7]-1) & 0xffff); - if ((regs.d[opcode & 0x7] & 0xffff) == 0xffff) - m68k_setpc(pc + disp); + } else if (!cc) { + int reg = opcode & 0x7; + + m68k_dreg(regs, reg) = ((m68k_dreg(regs, reg) & ~0xffff) + | ((m68k_dreg(regs, reg)-1) & 0xffff)); + if ((m68k_dreg(regs, reg) & 0xffff) == 0xffff) + m68k_setpc(pc + disp); } } @@ -534,7 +535,7 @@ fscc_opp(ULONG opcode, UWORD extra) op_illg(opcode); } else if ((opcode & 0x38) == 0) { - regs.d[opcode & 7] = (regs.d[opcode & 7] & ~0xff) | + m68k_dreg(regs, opcode & 7) = (m68k_dreg(regs, opcode & 7) & ~0xff) | (cc ? 0xff : 0x00); } else { @@ -612,8 +613,8 @@ fsave_opp(ULONG opcode) } put_long(ad,0x70000000); ad += 4; } - if ((opcode & 0x38) == 0x18) regs.a[opcode & 7] = ad; - if ((opcode & 0x38) == 0x20) regs.a[opcode & 7] = ad; + if ((opcode & 0x38) == 0x18) m68k_areg(regs, opcode & 7) = ad; + if ((opcode & 0x38) == 0x20) m68k_areg(regs, opcode & 7) = ad; } void @@ -652,8 +653,8 @@ frestore_opp(ULONG opcode) ad += 45 * 4; } } - if ((opcode & 0x38) == 0x18) regs.a[opcode & 7] = ad; - if ((opcode & 0x38) == 0x20) regs.a[opcode & 7] = ad; + if ((opcode & 0x38) == 0x18) m68k_areg(regs, opcode & 7) = ad; + if ((opcode & 0x38) == 0x20) m68k_areg(regs, opcode & 7) = ad; } void @@ -678,37 +679,37 @@ fpp_opp(ULONG opcode, UWORD extra) if ((opcode & 0x38) == 0) { if (extra & 0x2000) { if (extra & 0x1000) - regs.d[opcode & 7] = regs.fpcr; + m68k_dreg(regs, opcode & 7) = regs.fpcr; if (extra & 0x0800) - regs.d[opcode & 7] = regs.fpsr; + m68k_dreg(regs, opcode & 7) = regs.fpsr; if (extra & 0x0400) - regs.d[opcode & 7] = regs.fpiar; + m68k_dreg(regs, opcode & 7) = regs.fpiar; } else { if (extra & 0x1000) - regs.fpcr = regs.d[opcode & 7]; + regs.fpcr = m68k_dreg(regs, opcode & 7); if (extra & 0x0800) - regs.fpsr = regs.d[opcode & 7]; + regs.fpsr = m68k_dreg(regs, opcode & 7); if (extra & 0x0400) - regs.fpiar = regs.d[opcode & 7]; + regs.fpiar = m68k_dreg(regs, opcode & 7); } } else if ((opcode & 0x38) == 1) { if (extra & 0x2000) { if (extra & 0x1000) - regs.a[opcode & 7] = regs.fpcr; + m68k_areg(regs, opcode & 7) = regs.fpcr; if (extra & 0x0800) - regs.a[opcode & 7] = regs.fpsr; + m68k_areg(regs, opcode & 7) = regs.fpsr; if (extra & 0x0400) - regs.a[opcode & 7] = regs.fpiar; + m68k_areg(regs, opcode & 7) = regs.fpiar; } else { if (extra & 0x1000) - regs.fpcr = regs.a[opcode & 7]; + regs.fpcr = m68k_areg(regs, opcode & 7); if (extra & 0x0800) - regs.fpsr = regs.a[opcode & 7]; + regs.fpsr = m68k_areg(regs, opcode & 7); if (extra & 0x0400) - regs.fpiar = regs.a[opcode & 7]; + regs.fpiar = m68k_areg(regs, opcode & 7); } } else if ((opcode & 0x3f) == 0x3c) { @@ -747,8 +748,8 @@ fpp_opp(ULONG opcode, UWORD extra) put_long(ad,regs.fpiar);ad+=4; } ad -= incr; - if ((opcode & 0x38) == 0x18) regs.a[opcode & 7] = ad; - if ((opcode & 0x38) == 0x20) regs.a[opcode & 7] = ad; + if ((opcode & 0x38) == 0x18) m68k_areg(regs, opcode & 7) = ad; + if ((opcode & 0x38) == 0x20) m68k_areg(regs, opcode & 7) = ad; } else { /* FMOVEM memory->FPP */ @@ -769,8 +770,8 @@ fpp_opp(ULONG opcode, UWORD extra) if (extra & 0x0400) { regs.fpiar = get_long(ad);ad+=4; } - if ((opcode & 0x38) == 0x18) regs.a[opcode & 7] = ad; - if ((opcode & 0x38) == 0x20) regs.a[opcode & 7] = ad-12; + if ((opcode & 0x38) == 0x18) m68k_areg(regs, opcode & 7) = ad; + if ((opcode & 0x38) == 0x20) m68k_areg(regs, opcode & 7) = ad-12; } return; case 6: @@ -791,7 +792,7 @@ fpp_opp(ULONG opcode, UWORD extra) incr = -1; break; case 1: /* dynamic pred */ - list = regs.d[(extra >> 4) & 3] & 0xff; + list = m68k_dreg(regs, (extra >> 4) & 3) & 0xff; incr = -1; break; case 2: /* static postinc */ @@ -799,7 +800,7 @@ fpp_opp(ULONG opcode, UWORD extra) incr = 1; break; case 3: /* dynamic postinc */ - list = regs.d[(extra >> 4) & 3] & 0xff; + list = m68k_dreg(regs, (extra >> 4) & 3) & 0xff; incr = 1; break; } @@ -823,8 +824,8 @@ fpp_opp(ULONG opcode, UWORD extra) } list = fpp_movem_next[list]; } - if ((opcode & 0x38) == 0x18) regs.a[opcode & 7] = ad; - if ((opcode & 0x38) == 0x20) regs.a[opcode & 7] = ad; + if ((opcode & 0x38) == 0x18) m68k_areg(regs, opcode & 7) = ad; + if ((opcode & 0x38) == 0x20) m68k_areg(regs, opcode & 7) = ad; } else { /* FMOVEM memory->FPP */ @@ -839,7 +840,7 @@ fpp_opp(ULONG opcode, UWORD extra) incr = -1; break; case 1: /* dynamic pred */ - list = regs.d[(extra >> 4) & 3] & 0xff; + list = m68k_dreg(regs, (extra >> 4) & 3) & 0xff; incr = -1; break; case 2: /* static postinc */ @@ -847,7 +848,7 @@ fpp_opp(ULONG opcode, UWORD extra) incr = 1; break; case 3: /* dynamic postinc */ - list = regs.d[(extra >> 4) & 3] & 0xff; + list = m68k_dreg(regs, (extra >> 4) & 3) & 0xff; incr = 1; break; } @@ -869,8 +870,8 @@ fpp_opp(ULONG opcode, UWORD extra) } list = fpp_movem_next[list]; } - if ((opcode & 0x38) == 0x18) regs.a[opcode & 7] = ad; - if ((opcode & 0x38) == 0x20) regs.a[opcode & 7] = ad; + if ((opcode & 0x38) == 0x18) m68k_areg(regs, opcode & 7) = ad; + if ((opcode & 0x38) == 0x20) m68k_areg(regs, opcode & 7) = ad; } } return; @@ -965,8 +966,8 @@ fpp_opp(ULONG opcode, UWORD extra) (regs.fp[reg] < 0 ? 0x8000000 : 0); break; case 0x0d: /* FATANH */ -#ifdef __bebox__ - printf("atanh\n"); +#if 1 /* The BeBox doesn't have atanh, and it isn't in the HPUX libm either */ + regs.fp[reg] = log((1+src)/(1-src))/2; #else regs.fp[reg] = atanh(src); #endif