Commit 5928ccfc authored by GnoStiC's avatar GnoStiC

puae 2.3.1

parent bb1b7971
...@@ -2196,10 +2196,7 @@ STATIC_INLINE void record_sprite_1 (int sprxp, uae_u16 *buf, uae_u32 datab, int ...@@ -2196,10 +2196,7 @@ STATIC_INLINE void record_sprite_1 (int sprxp, uae_u16 *buf, uae_u32 datab, int
if ((sprxp >= sprite_minx && sprxp < sprite_maxx) || (bplcon3 & 2)) if ((sprxp >= sprite_minx && sprxp < sprite_maxx) || (bplcon3 & 2))
col = (datab & 3) << (2 * num); col = (datab & 3) << (2 * num);
#if 0
if (sprxp == sprite_minx || sprxp == sprite_maxx - 1)
col ^= (rand () << 16) | rand ();
#endif
if ((j & mask) == 0) { if ((j & mask) == 0) {
unsigned int tmp = (*buf) | col; unsigned int tmp = (*buf) | col;
*buf++ = tmp; *buf++ = tmp;
......
...@@ -3640,7 +3640,7 @@ void debug (void) ...@@ -3640,7 +3640,7 @@ void debug (void)
&& nr_units () == 0 && nr_units () == 0
#endif #endif
) { ) {
//savestate_capture (1); savestate_capture (1);
} }
for (i = 0; i < BREAKPOINT_TOTAL; i++) { for (i = 0; i < BREAKPOINT_TOTAL; i++) {
if (bpnodes[i].enabled) if (bpnodes[i].enabled)
......
...@@ -1138,8 +1138,8 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR ...@@ -1138,8 +1138,8 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
openwritefile (drv, 0); openwritefile (drv, 0);
drive_settype_id (drv); /* Set DD or HD drive */ drive_settype_id (drv); /* Set DD or HD drive */
drive_fill_bigbuf (drv, 1); drive_fill_bigbuf (drv, 1);
drv->mfmpos = rand (); drv->mfmpos = uaerand ();
drv->mfmpos |= (rand () << 16); drv->mfmpos |= (uaerand () << 16);
drv->mfmpos %= drv->tracklen; drv->mfmpos %= drv->tracklen;
drv->prevtracklen = 0; drv->prevtracklen = 0;
#ifdef DRIVESOUND #ifdef DRIVESOUND
...@@ -1151,10 +1151,10 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR ...@@ -1151,10 +1151,10 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
static void rand_shifter (void) static void rand_shifter (void)
{ {
unsigned int r = ((rand () >> 4) & 7) + 1; unsigned int r = ((uaerand () >> 4) & 7) + 1;
while (r-- > 0) { while (r-- > 0) {
word <<= 1; word <<= 1;
word |= (rand () & 0x1000) ? 1 : 0; word |= (uaerand () & 0x1000) ? 1 : 0;
bitoffset++; bitoffset++;
bitoffset &= 15; bitoffset &= 15;
} }
...@@ -2391,6 +2391,7 @@ static void DISK_check_change (void) ...@@ -2391,6 +2391,7 @@ static void DISK_check_change (void)
void DISK_vsync (void) void DISK_vsync (void)
{ {
unsigned int i; unsigned int i;
DISK_check_change (); DISK_check_change ();
for (i = 0; i < MAX_FLOPPY_DRIVES; i++) { for (i = 0; i < MAX_FLOPPY_DRIVES; i++) {
drive *drv = floppy + i; drive *drv = floppy + i;
......
...@@ -178,7 +178,7 @@ void dongle_potgo (uae_u16 val) ...@@ -178,7 +178,7 @@ void dongle_potgo (uae_u16 val)
case ITALY90: case ITALY90:
case LOGISTIX: case LOGISTIX:
case DAMESGRANDMAITRE: case DAMESGRANDMAITRE:
flag = (rand () & 7) - 3; flag = (uaerand () & 7) - 3;
break; break;
} }
......
...@@ -234,7 +234,6 @@ static uae_u32 REGPARAM2 expamem_bget (uaecptr addr) ...@@ -234,7 +234,6 @@ static uae_u32 REGPARAM2 expamem_bget (uaecptr addr)
#endif #endif
addr &= 0xFFFF; addr &= 0xFFFF;
b = expamem[addr]; b = expamem[addr];
//write_log ("%08x=%02X\n", addr, b);
return b; return b;
} }
...@@ -1168,7 +1167,7 @@ static void allocate_expamem (void) ...@@ -1168,7 +1167,7 @@ static void allocate_expamem (void)
z3fastmem_start = currprefs.z3fastmem_start; z3fastmem_start = currprefs.z3fastmem_start;
if (currprefs.z3chipmem_size) if (currprefs.z3chipmem_size)
z3fastmem_start += currprefs.z3chipmem_size + 16 * 1024 * 1024; z3fastmem_start += currprefs.z3chipmem_size + 16 * 1024 * 1024;
z3fastmem2_start = currprefs.z3fastmem_start + currprefs.z3fastmem_size; z3fastmem2_start = z3fastmem_start + currprefs.z3fastmem_size;
if (allocated_fastmem != currprefs.fastmem_size) { if (allocated_fastmem != currprefs.fastmem_size) {
free_fastmemory (); free_fastmemory ();
......
...@@ -39,7 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc., ...@@ -39,7 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "sysconfig.h" #include "sysconfig.h"
#include "sysdeps.h" #include "sysdeps.h"
#include "zfile.h" #include "zfile.h"
/* ELSE */ /* ELSE */
//#include "types.h" //#include "types.h"
#include "fdi2raw.h" #include "fdi2raw.h"
...@@ -525,7 +525,7 @@ static void s0b(FDI *fdi) ...@@ -525,7 +525,7 @@ static void s0b(FDI *fdi)
i = 7; i = 7;
b = *fdi->track_src++; b = *fdi->track_src++;
while (bits--) { while (bits--) {
bit_add (fdi, b & (1 << i)); bit_add (fdi, b & (1 << i));
i--; i--;
} }
} }
...@@ -746,7 +746,7 @@ static int amiga_check_track (FDI *fdi) ...@@ -746,7 +746,7 @@ static int amiga_check_track (FDI *fdi)
if (chksum) { if (chksum) {
outlog ("sector %d data checksum error\n",trackoffs); outlog ("sector %d data checksum error\n",trackoffs);
ok = 0; ok = 0;
} else if (sectable[trackoffs]) { } else if (sectable[trackoffs]) {
outlog ("sector %d already found?\n", trackoffs); outlog ("sector %d already found?\n", trackoffs);
mbuf = mbuf2; mbuf = mbuf2;
} else { } else {
...@@ -767,7 +767,7 @@ static int amiga_check_track (FDI *fdi) ...@@ -767,7 +767,7 @@ static int amiga_check_track (FDI *fdi)
return ok; return ok;
} }
static void amiga_data_raw (FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, unsigned int len) static void amiga_data_raw (FDI *fdi, uae_u8 *secbuf, uae_u8 *crc, unsigned int len)
{ {
unsigned int i; unsigned int i;
uae_u8 crcbuf[4]; uae_u8 crcbuf[4];
...@@ -1321,13 +1321,13 @@ static int handle_sectors_described_track (FDI *fdi) ...@@ -1321,13 +1321,13 @@ static int handle_sectors_described_track (FDI *fdi)
do { do {
fdi->track_type = *fdi->track_src++; fdi->track_type = *fdi->track_src++;
outlog ("%06.6X %06.6X %02.2X:",fdi->track_src - start_src + 0x200, fdi->out/8, fdi->track_type); outlog ("%06X %06X %02X:",fdi->track_src - start_src + 0x200, fdi->out/8, fdi->track_type);
oldout = fdi->out; oldout = fdi->out;
decode_sectors_described_track[fdi->track_type](fdi); decode_sectors_described_track[fdi->track_type](fdi);
outlog (" %d\n", fdi->out - oldout); outlog (" %d\n", fdi->out - oldout);
oldout = fdi->out; oldout = fdi->out;
if (fdi->out < 0 || fdi->err) { if (fdi->out < 0 || fdi->err) {
outlog ("\nin %d bytes, out %d bits\n", fdi->track_src - fdi->track_src_buffer, fdi->out); outlog ("\nin %d bytes, out %d bits\n", fdi->track_src - fdi->track_src_buffer, fdi->out);
return -1; return -1;
} }
if (fdi->track_src - fdi->track_src_buffer >= fdi->track_src_len) { if (fdi->track_src - fdi->track_src_buffer >= fdi->track_src_len) {
...@@ -1375,8 +1375,8 @@ static void dumpstream(int track, uae_u8 *stream, int len) ...@@ -1375,8 +1375,8 @@ static void dumpstream(int track, uae_u8 *stream, int len)
FILE *f; FILE *f;
sprintf (name, "track_%d.raw", track); sprintf (name, "track_%d.raw", track);
f = fopen(name, "wb"); f = fopen(name, "wb");
fwrite (stream, 1, len * 4, f); fwrite (stream, 1, len * 4, f);
fclose (f); fclose (f);
#endif #endif
} }
...@@ -1474,7 +1474,7 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3 ...@@ -1474,7 +1474,7 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3
if (i >= pulses) if (i >= pulses)
i = 0; i = 0;
indx = idx[i]; indx = idx[i];
if (rand() <= (indx * RAND_MAX) / maxidx) { if (uaerand() <= (indx * RAND_MAX) / maxidx) {
pulse += avgp[i] - ref_pulse; pulse += avgp[i] - ref_pulse;
if (indx >= maxidx) if (indx >= maxidx)
ref_pulse = 0; ref_pulse = 0;
...@@ -1525,8 +1525,8 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3 ...@@ -1525,8 +1525,8 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3
for (j = real_size; j > 1; j--) for (j = real_size; j > 1; j--)
addbit (d, 0); addbit (d, 0);
addbit (d, 1); addbit (d, 1);
for (j = 0; j < real_size; j++) for (j = 0; j < real_size; j++)
*pt++ = (uae_u16)(pulse / real_size); *pt++ = (uae_u16)(pulse / real_size);
} }
/* prepares for the next pulse */ /* prepares for the next pulse */
...@@ -1625,7 +1625,7 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3 ...@@ -1625,7 +1625,7 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3
max_pulse = avg_pulse + (avgp[nexti] - minp[nexti]); max_pulse = avg_pulse + (avgp[nexti] - minp[nexti]);
if (min_pulse < ref_pulse) if (min_pulse < ref_pulse)
min_pulse = ref_pulse; min_pulse = ref_pulse;
randval = rand(); randval = uaerand();
if (randval < (RAND_MAX / 2)) { if (randval < (RAND_MAX / 2)) {
if (randval > (RAND_MAX / 4)) { if (randval > (RAND_MAX / 4)) {
if (randval <= (3 * RAND_MAX / 8)) if (randval <= (3 * RAND_MAX / 8))
...@@ -1656,11 +1656,11 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3 ...@@ -1656,11 +1656,11 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3
ref_pulse = 0; ref_pulse = 0;
if (i == eodat) if (i == eodat)
outstep++; outstep++;
} else if ((unsigned int)rand () <= ((idx[i] * RAND_MAX) / maxidx)) { } else if (uaerand() <= ((idx[i] * RAND_MAX) / maxidx)) {
avg_pulse = avgp[i]; avg_pulse = avgp[i];
min_pulse = minp[i]; min_pulse = minp[i];
max_pulse = maxp[i]; max_pulse = maxp[i];
randval = rand(); randval = uaerand();
if (randval < (RAND_MAX / 2)) { if (randval < (RAND_MAX / 2)) {
if (randval > (RAND_MAX / 4)) { if (randval > (RAND_MAX / 4)) {
if (randval <= (3 * RAND_MAX / 8)) if (randval <= (3 * RAND_MAX / 8))
...@@ -1793,7 +1793,7 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3 ...@@ -1793,7 +1793,7 @@ static void fdi2_decode (FDI *fdi, unsigned long totalavg, uae_u32 *avgp, uae_u3
#endif #endif
static void fdi2_celltiming (FDI *fdi, unsigned long totalavg, unsigned int bitoffset, uae_u16 *out) static void fdi2_celltiming (FDI *fdi, unsigned long totalavg, unsigned int bitoffset, uae_u16 *out)
{ {
uae_u16 *pt2, *pt; uae_u16 *pt2, *pt;
double avg_bit_len; double avg_bit_len;
......
...@@ -515,8 +515,8 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src) ...@@ -515,8 +515,8 @@ STATIC_INLINE int get_fp_value (uae_u32 opcode, uae_u16 extra, fptype *src)
STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra) STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra)
{ {
uae_u16 tmp; uae_u16 tmp;
uaecptr tmppc; uaecptr tmppc;
int size, mode, reg; int size, mode, reg;
uae_u32 ad; uae_u32 ad;
static int sz1[8] = { 4, 4, 12, 12, 2, 8, 1, 0 }; static int sz1[8] = { 4, 4, 12, 12, 2, 8, 1, 0 };
...@@ -570,121 +570,121 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra) ...@@ -570,121 +570,121 @@ STATIC_INLINE int put_fp_value (fptype value, uae_u32 opcode, uae_u16 extra)
break; break;
case 5: case 5:
ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword (); ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword ();
break; break;
case 6: case 6:
ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ()); ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ());
break; break;
case 7: case 7:
switch (reg) { switch (reg) {
case 0: case 0:
ad = (uae_s32) (uae_s16) x_next_iword (); ad = (uae_s32) (uae_s16) x_next_iword ();
break; break;
case 1: case 1:
ad = x_next_ilong (); ad = x_next_ilong ();
break; break;
case 2: case 2:
ad = m68k_getpc (); ad = m68k_getpc ();
ad += (uae_s32) (uae_s16) x_next_iword (); ad += (uae_s32) (uae_s16) x_next_iword ();
break; break;
case 3: case 3:
tmppc = m68k_getpc (); tmppc = m68k_getpc ();
tmp = x_next_iword (); tmp = x_next_iword ();
ad = x_get_disp_ea_020 (tmppc, tmp); ad = x_get_disp_ea_020 (tmppc, tmp);
break; break;
case 4: case 4:
ad = m68k_getpc (); ad = m68k_getpc ();
m68k_setpc (ad + sz2[size]); m68k_setpc (ad + sz2[size]);
break; break;
default: default:
return 0; return 0;
}
} }
} switch (size) {
switch (size) { case 0:
case 0:
x_put_long (ad, (uae_u32)toint (value, -2147483648.0, 2147483647.0)); x_put_long (ad, (uae_u32)toint (value, -2147483648.0, 2147483647.0));
break; break;
case 1: case 1:
x_put_long (ad, from_single (value)); x_put_long (ad, from_single (value));
break; break;
case 2: case 2:
{ {
uae_u32 wrd1, wrd2, wrd3; uae_u32 wrd1, wrd2, wrd3;
from_exten (value, &wrd1, &wrd2, &wrd3); from_exten (value, &wrd1, &wrd2, &wrd3);
x_put_long (ad, wrd1); x_put_long (ad, wrd1);
ad += 4; ad += 4;
x_put_long (ad, wrd2); x_put_long (ad, wrd2);
ad += 4; ad += 4;
x_put_long (ad, wrd3); x_put_long (ad, wrd3);
} }
break; break;
case 3: case 3:
{ {
uae_u32 wrd1, wrd2, wrd3; uae_u32 wrd1, wrd2, wrd3;
from_pack (value, &wrd1, &wrd2, &wrd3); from_pack (value, &wrd1, &wrd2, &wrd3);
x_put_long (ad, wrd1); x_put_long (ad, wrd1);
ad += 4; ad += 4;
x_put_long (ad, wrd2); x_put_long (ad, wrd2);
ad += 4; ad += 4;
x_put_long (ad, wrd3); x_put_long (ad, wrd3);
} }
break; break;
case 4: case 4:
x_put_word (ad, (uae_s16) toint (value, -32768.0, 32767.0)); x_put_word (ad, (uae_s16) toint (value, -32768.0, 32767.0));
break; break;
case 5:{ case 5:{
uae_u32 wrd1, wrd2; uae_u32 wrd1, wrd2;
from_double (value, &wrd1, &wrd2); from_double (value, &wrd1, &wrd2);
x_put_long (ad, wrd1); x_put_long (ad, wrd1);
ad += 4; ad += 4;
x_put_long (ad, wrd2); x_put_long (ad, wrd2);
} }
break; break;
case 6: case 6:
x_put_byte (ad, (uae_s8)toint (value, -128.0, 127.0)); x_put_byte (ad, (uae_s8)toint (value, -128.0, 127.0));
break; break;
default: default:
return 0; return 0;
} }
return 1; return 1;
} }
STATIC_INLINE int get_fp_ad (uae_u32 opcode, uae_u32 * ad) STATIC_INLINE int get_fp_ad (uae_u32 opcode, uae_u32 * ad)
{ {
uae_u16 tmp; uae_u16 tmp;
uaecptr tmppc; uaecptr tmppc;
int mode; int mode;
int reg; int reg;
mode = (opcode >> 3) & 7; mode = (opcode >> 3) & 7;
reg = opcode & 7; reg = opcode & 7;
switch (mode) { switch (mode) {
case 0: case 0:
case 1: case 1:
return 0; return 0;
case 2: case 2:
*ad = m68k_areg (regs, reg); *ad = m68k_areg (regs, reg);
break; break;
case 3: case 3:
*ad = m68k_areg (regs, reg); *ad = m68k_areg (regs, reg);
break; break;
case 4: case 4:
*ad = m68k_areg (regs, reg); *ad = m68k_areg (regs, reg);
break; break;
case 5: case 5:
*ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword (); *ad = m68k_areg (regs, reg) + (uae_s32) (uae_s16) x_next_iword ();
break; break;
case 6: case 6:
*ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ()); *ad = x_get_disp_ea_020 (m68k_areg (regs, reg), x_next_iword ());
break; break;
case 7: case 7:
switch (reg) { switch (reg) {
case 0: case 0:
*ad = (uae_s32) (uae_s16) x_next_iword (); *ad = (uae_s32) (uae_s16) x_next_iword ();
break; break;
case 1: case 1:
*ad = x_next_ilong (); *ad = x_next_ilong ();
break; break;
case 2: case 2:
*ad = m68k_getpc (); *ad = m68k_getpc ();
*ad += (uae_s32) (uae_s16) x_next_iword (); *ad += (uae_s32) (uae_s16) x_next_iword ();
break; break;
...@@ -786,7 +786,7 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra) ...@@ -786,7 +786,7 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra)
{ {
uaecptr pc = (uae_u32) m68k_getpc (); uaecptr pc = (uae_u32) m68k_getpc ();
uae_s32 disp; uae_s32 disp;
int cc; int cc;
#if DEBUG_FPP #if DEBUG_FPP
if (!isinrom ()) if (!isinrom ())
...@@ -797,22 +797,22 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra) ...@@ -797,22 +797,22 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra)
disp = (uae_s32) (uae_s16) x_next_iword (); disp = (uae_s32) (uae_s16) x_next_iword ();
cc = fpp_cond (extra & 0x3f); cc = fpp_cond (extra & 0x3f);
if (cc == -1) { if (cc == -1) {
fpu_op_illg (opcode, 4); fpu_op_illg (opcode, 4);
} else if (!cc) { } else if (!cc) {
int reg = opcode & 0x7; int reg = opcode & 0x7;
m68k_dreg (regs, reg) = ((m68k_dreg (regs, reg) & 0xffff0000) m68k_dreg (regs, reg) = ((m68k_dreg (regs, reg) & 0xffff0000)
| (((m68k_dreg (regs, reg) & 0xffff) - 1) & 0xffff)); | (((m68k_dreg (regs, reg) & 0xffff) - 1) & 0xffff));
if ((m68k_dreg (regs, reg) & 0xffff) != 0xffff) if ((m68k_dreg (regs, reg) & 0xffff) != 0xffff)
m68k_setpc (pc + disp); m68k_setpc (pc + disp);
} }
} }
void fpuop_scc (uae_u32 opcode, uae_u16 extra) void fpuop_scc (uae_u32 opcode, uae_u16 extra)
{ {
uae_u32 ad; uae_u32 ad;
int cc; int cc;
#if DEBUG_FPP #if DEBUG_FPP
if (!isinrom ()) if (!isinrom ())
...@@ -822,7 +822,7 @@ void fpuop_scc (uae_u32 opcode, uae_u16 extra) ...@@ -822,7 +822,7 @@ void fpuop_scc (uae_u32 opcode, uae_u16 extra)
return; return;
cc = fpp_cond (extra & 0x3f); cc = fpp_cond (extra & 0x3f);
if (cc == -1) { if (cc == -1) {
fpu_op_illg (opcode, 4); fpu_op_illg (opcode, 4);
} else if ((opcode & 0x38) == 0) { } else if ((opcode & 0x38) == 0) {
m68k_dreg (regs, opcode & 7) = (m68k_dreg (regs, opcode & 7) & ~0xff) | (cc ? 0xff : 0x00); m68k_dreg (regs, opcode & 7) = (m68k_dreg (regs, opcode & 7) & ~0xff) | (cc ? 0xff : 0x00);
...@@ -830,14 +830,14 @@ void fpuop_scc (uae_u32 opcode, uae_u16 extra) ...@@ -830,14 +830,14 @@ void fpuop_scc (uae_u32 opcode, uae_u16 extra)
if (get_fp_ad (opcode, &ad) == 0) { if (get_fp_ad (opcode, &ad) == 0) {
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
} else } else
x_put_byte (ad, cc ? 0xff : 0x00); x_put_byte (ad, cc ? 0xff : 0x00);
} }
} }
void fpuop_trapcc (uae_u32 opcode, uaecptr oldpc, uae_u16 extra) void fpuop_trapcc (uae_u32 opcode, uaecptr oldpc, uae_u16 extra)
{ {
int cc; int cc;
#if DEBUG_FPP #if DEBUG_FPP
if (!isinrom ()) if (!isinrom ())
...@@ -856,7 +856,7 @@ void fpuop_trapcc (uae_u32 opcode, uaecptr oldpc, uae_u16 extra) ...@@ -856,7 +856,7 @@ void fpuop_trapcc (uae_u32 opcode, uaecptr oldpc, uae_u16 extra)
void fpuop_bcc (uae_u32 opcode, uaecptr pc, uae_u32 extra) void fpuop_bcc (uae_u32 opcode, uaecptr pc, uae_u32 extra)
{ {
int cc; int cc;
#if DEBUG_FPP #if DEBUG_FPP
if (!isinrom ()) if (!isinrom ())
...@@ -877,17 +877,17 @@ void fpuop_bcc (uae_u32 opcode, uaecptr pc, uae_u32 extra) ...@@ -877,17 +877,17 @@ void fpuop_bcc (uae_u32 opcode, uaecptr pc, uae_u32 extra)
void fpuop_save (uae_u32 opcode) void fpuop_save (uae_u32 opcode)
{ {
uae_u32 ad; uae_u32 ad;
int incr = (opcode & 0x38) == 0x20 ? -1 : 1; int incr = (opcode & 0x38) == 0x20 ? -1 : 1;
int fpu_version = get_fpu_version(); int fpu_version = get_fpu_version();
int i; int i;
#if DEBUG_FPP #if DEBUG_FPP
if (!isinrom ()) if (!isinrom ())
write_log ("fsave_opp at %08lx\n", m68k_getpc ()); write_log ("fsave_opp at %08lx\n", m68k_getpc ());
#endif #endif
if (fault_if_no_fpu (opcode, 2)) if (fault_if_no_fpu (opcode, 2))
return; return;
if (get_fp_ad (opcode, &ad) == 0) { if (get_fp_ad (opcode, &ad) == 0) {
fpu_op_illg (opcode, 2); fpu_op_illg (opcode, 2);
...@@ -912,32 +912,32 @@ void fpuop_save (uae_u32 opcode) ...@@ -912,32 +912,32 @@ void fpuop_save (uae_u32 opcode)
ad += 4; ad += 4;
} }
} else if (currprefs.fpu_model == 68040) { } else if (currprefs.fpu_model == 68040) {
/* 4 byte 68040 IDLE frame. */ /* 4 byte 68040 IDLE frame. */
if (incr < 0) { if (incr < 0) {
ad -= 4; ad -= 4;
x_put_long (ad, fpu_version << 24); x_put_long (ad, fpu_version << 24);
} else { } else {
x_put_long (ad, fpu_version << 24); x_put_long (ad, fpu_version << 24);
ad += 4; ad += 4;
} }
} else { /* 68881/68882 */ } else { /* 68881/68882 */
int idle_size = currprefs.fpu_model == 68882 ? 0x38 : 0x18; int idle_size = currprefs.fpu_model == 68882 ? 0x38 : 0x18;
if (incr < 0) { if (incr < 0) {
ad -= 4; ad -= 4;
x_put_long (ad, 0x70000000); x_put_long (ad, 0x70000000);
for (i = 0; i < (idle_size - 1) / 4; i++) { for (i = 0; i < (idle_size - 1) / 4; i++) {
ad -= 4; ad -= 4;
x_put_long (ad, 0x00000000); x_put_long (ad, 0x00000000);
} }
ad -= 4; ad -= 4;
x_put_long (ad, (fpu_version << 24) | (idle_size << 16)); x_put_long (ad, (fpu_version << 24) | (idle_size << 16));
} else { } else {
x_put_long (ad, (fpu_version << 24) | (idle_size << 16)); x_put_long (ad, (fpu_version << 24) | (idle_size << 16));
ad += 4; ad += 4;
for (i = 0; i < (idle_size - 1) / 4; i++) { for (i = 0; i < (idle_size - 1) / 4; i++) {
x_put_long (ad, 0x00000000); x_put_long (ad, 0x00000000);
ad += 4; ad += 4;
} }
x_put_long (ad, 0x70000000); x_put_long (ad, 0x70000000);
ad += 4; ad += 4;
} }
...@@ -1037,13 +1037,13 @@ void fpuop_restore (uae_u32 opcode) ...@@ -1037,13 +1037,13 @@ void fpuop_restore (uae_u32 opcode)
static void fround (int reg) static void fround (int reg)
{ {
regs.fp[reg] = (float)regs.fp[reg]; regs.fp[reg] = (float)regs.fp[reg];
} }
void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
{ {
int reg; int reg;
fptype src; fptype src;
#if DEBUG_FPP #if DEBUG_FPP
if (!isinrom ()) if (!isinrom ())
...@@ -1151,11 +1151,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1151,11 +1151,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
uae_u32 ad; uae_u32 ad;
int incr = 0; int incr = 0;
if (get_fp_ad (opcode, &ad) == 0) { if (get_fp_ad (opcode, &ad) == 0) {
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
return; return;
} }
if((opcode & 0x38) == 0x20) { if((opcode & 0x38) == 0x20) {
if (extra & 0x1000) if (extra & 0x1000)
incr += 4; incr += 4;
...@@ -1165,25 +1165,25 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1165,25 +1165,25 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
incr += 4; incr += 4;
ad = ad - incr; ad = ad - incr;
} }
if (extra & 0x1000) { if (extra & 0x1000) {
regs.fpcr = x_get_long (ad); regs.fpcr = x_get_long (ad);
native_set_fpucw (regs.fpcr); native_set_fpucw (regs.fpcr);
ad += 4; ad += 4;
} }
if (extra & 0x0800) { if (extra & 0x0800) {
set_fpsr(x_get_long (ad)); set_fpsr(x_get_long (ad));
ad += 4; ad += 4;
} }
if (extra & 0x0400) { if (extra & 0x0400) {
regs.fpiar = x_get_long (ad); regs.fpiar = x_get_long (ad);
ad += 4; ad += 4;
} }
if ((opcode & 0x38) == 0x18) if ((opcode & 0x38) == 0x18)
m68k_areg (regs, opcode & 7) = ad; m68k_areg (regs, opcode & 7) = ad;
if ((opcode & 0x38) == 0x20) if ((opcode & 0x38) == 0x20)
m68k_areg (regs, opcode & 7) = ad - incr; m68k_areg (regs, opcode & 7) = ad - incr;
} }
return; return;
case 6: case 6:
case 7: case 7:
...@@ -1220,37 +1220,37 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1220,37 +1220,37 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
uae_u32 wrd1, wrd2, wrd3; uae_u32 wrd1, wrd2, wrd3;
if (list & 0x80) { if (list & 0x80) {
from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3); from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3);
ad -= 4; ad -= 4;
x_put_long (ad, wrd3); x_put_long (ad, wrd3);
ad -= 4; ad -= 4;
x_put_long (ad, wrd2); x_put_long (ad, wrd2);
ad -= 4; ad -= 4;
x_put_long (ad, wrd1); x_put_long (ad, wrd1);
} }
list <<= 1; list <<= 1;
} }
} else { } else {
for (reg = 0; reg <= 7; reg++) { for (reg = 0; reg <= 7; reg++) {
uae_u32 wrd1, wrd2, wrd3; uae_u32 wrd1, wrd2, wrd3;
if (list & 0x80) { if (list & 0x80) {
from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3); from_exten (regs.fp[reg], &wrd1, &wrd2, &wrd3);
x_put_long (ad, wrd1); x_put_long (ad, wrd1);
ad += 4; ad += 4;
x_put_long (ad, wrd2); x_put_long (ad, wrd2);
ad += 4; ad += 4;
x_put_long (ad, wrd3); x_put_long (ad, wrd3);
ad += 4; ad += 4;
} }
list <<= 1; list <<= 1;
} }
} }
if ((opcode & 0x38) == 0x18) if ((opcode & 0x38) == 0x18)
m68k_areg (regs, opcode & 7) = ad; m68k_areg (regs, opcode & 7) = ad;
if ((opcode & 0x38) == 0x20) if ((opcode & 0x38) == 0x20)
m68k_areg (regs, opcode & 7) = ad; m68k_areg (regs, opcode & 7) = ad;
} else { } else {
/* FMOVEM memory->FPP */ /* FMOVEM memory->FPP */
if (get_fp_ad (opcode, &ad) == 0) { if (get_fp_ad (opcode, &ad) == 0) {
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
return; return;
...@@ -1277,26 +1277,26 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1277,26 +1277,26 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
for (reg = 7; reg >= 0; reg--) { for (reg = 7; reg >= 0; reg--) {
uae_u32 wrd1, wrd2, wrd3; uae_u32 wrd1, wrd2, wrd3;
if (list & 0x80) { if (list & 0x80) {
ad -= 4; ad -= 4;
wrd3 = x_get_long (ad); wrd3 = x_get_long (ad);
ad -= 4; ad -= 4;
wrd2 = x_get_long (ad); wrd2 = x_get_long (ad);
ad -= 4; ad -= 4;
wrd1 = x_get_long (ad); wrd1 = x_get_long (ad);
regs.fp[reg] = to_exten(wrd1, wrd2, wrd3); regs.fp[reg] = to_exten(wrd1, wrd2, wrd3);
} }
list <<= 1; list <<= 1;
} }
} else { } else {
for (reg = 0; reg <= 7; reg++) { for (reg = 0; reg <= 7; reg++) {
uae_u32 wrd1, wrd2, wrd3; uae_u32 wrd1, wrd2, wrd3;
if (list & 0x80) { if (list & 0x80) {
wrd1 = x_get_long (ad); wrd1 = x_get_long (ad);
ad += 4; ad += 4;
wrd2 = x_get_long (ad); wrd2 = x_get_long (ad);
ad += 4; ad += 4;
wrd3 = x_get_long (ad); wrd3 = x_get_long (ad);
ad += 4; ad += 4;
regs.fp[reg] = to_exten(wrd1, wrd2, wrd3); regs.fp[reg] = to_exten(wrd1, wrd2, wrd3);
} }
list <<= 1; list <<= 1;
...@@ -1317,79 +1317,79 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1317,79 +1317,79 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
switch (extra & 0x7f) { switch (extra & 0x7f) {
case 0x00: case 0x00:
regs.fp[reg] = *fp_pi; regs.fp[reg] = *fp_pi;
break; break;
case 0x0b: case 0x0b:
regs.fp[reg] = *fp_l10_2; regs.fp[reg] = *fp_l10_2;
break; break;
case 0x0c: case 0x0c:
regs.fp[reg] = *fp_exp_1; regs.fp[reg] = *fp_exp_1;
break; break;
case 0x0d: case 0x0d:
regs.fp[reg] = *fp_l2_e; regs.fp[reg] = *fp_l2_e;
break; break;
case 0x0e: case 0x0e:
regs.fp[reg] = *fp_l10_e; regs.fp[reg] = *fp_l10_e;
break; break;
case 0x0f: case 0x0f:
regs.fp[reg] = 0.0; regs.fp[reg] = 0.0;
break; break;
case 0x30: case 0x30:
regs.fp[reg] = *fp_ln_2; regs.fp[reg] = *fp_ln_2;
break; break;
case 0x31: case 0x31:
regs.fp[reg] = *fp_ln_10; regs.fp[reg] = *fp_ln_10;
break; break;
case 0x32: case 0x32:
regs.fp[reg] = (fptype)fp_1e0; regs.fp[reg] = (fptype)fp_1e0;
break; break;
case 0x33: case 0x33:
regs.fp[reg] = (fptype)fp_1e1; regs.fp[reg] = (fptype)fp_1e1;
break; break;
case 0x34: case 0x34:
regs.fp[reg] = (fptype)fp_1e2; regs.fp[reg] = (fptype)fp_1e2;
break; break;
case 0x35: case 0x35:
regs.fp[reg] = (fptype)fp_1e4; regs.fp[reg] = (fptype)fp_1e4;
break; break;
case 0x36: case 0x36:
regs.fp[reg] = (fptype)fp_1e8; regs.fp[reg] = (fptype)fp_1e8;
break; break;
case 0x37: case 0x37:
regs.fp[reg] = *fp_1e16; regs.fp[reg] = *fp_1e16;
break; break;
case 0x38: case 0x38:
regs.fp[reg] = *fp_1e32; regs.fp[reg] = *fp_1e32;
break; break;
case 0x39: case 0x39:
regs.fp[reg] = *fp_1e64; regs.fp[reg] = *fp_1e64;
break; break;
case 0x3a: case 0x3a:
regs.fp[reg] = *fp_1e128; regs.fp[reg] = *fp_1e128;
break; break;
case 0x3b: case 0x3b:
regs.fp[reg] = *fp_1e256; regs.fp[reg] = *fp_1e256;
break; break;
case 0x3c: case 0x3c:
regs.fp[reg] = *fp_1e512; regs.fp[reg] = *fp_1e512;
break; break;
case 0x3d: case 0x3d:
regs.fp[reg] = *fp_1e1024; regs.fp[reg] = *fp_1e1024;
break; break;
case 0x3e: case 0x3e:
regs.fp[reg] = *fp_1e2048; regs.fp[reg] = *fp_1e2048;
break; break;
case 0x3f: case 0x3f:
regs.fp[reg] = *fp_1e4096; regs.fp[reg] = *fp_1e4096;
break; break;
default: default:
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
return; return;
} }
MAKE_FPSR (regs.fp[reg]); MAKE_FPSR (regs.fp[reg]);
return; return;
} }
if (get_fp_value (opcode, extra, &src) == 0) { if (get_fp_value (opcode, extra, &src) == 0) {
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
return; return;
...@@ -1422,11 +1422,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1422,11 +1422,11 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
switch ((regs.fpcr >> 4) & 3) { switch ((regs.fpcr >> 4) & 3) {
case 0: /* to nearest */ case 0: /* to nearest */
regs.fp[reg] = floor (src + 0.5); regs.fp[reg] = floor (src + 0.5);
break; break;
case 1: /* to zero */ case 1: /* to zero */
if (src >= 0.0) if (src >= 0.0)
regs.fp[reg] = floor (src); regs.fp[reg] = floor (src);
else else
regs.fp[reg] = ceil (src); regs.fp[reg] = ceil (src);
break; break;
case 2: /* down */ case 2: /* down */
...@@ -1445,141 +1445,141 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1445,141 +1445,141 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
break; break;
case 0x03: /* FINTRZ */ case 0x03: /* FINTRZ */
regs.fp[reg] = fp_round_to_zero(src); regs.fp[reg] = fp_round_to_zero(src);
break; break;
case 0x04: /* FSQRT */ case 0x04: /* FSQRT */
case 0x41: case 0x41:
case 0x45: case 0x45:
regs.fp[reg] = sqrt (src); regs.fp[reg] = sqrt (src);
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x06: /* FLOGNP1 */ case 0x06: /* FLOGNP1 */
regs.fp[reg] = log (src + 1.0); regs.fp[reg] = log (src + 1.0);
break; break;
case 0x08: /* FETOXM1 */ case 0x08: /* FETOXM1 */
regs.fp[reg] = exp (src) - 1.0; regs.fp[reg] = exp (src) - 1.0;
break; break;
case 0x09: /* FTANH */ case 0x09: /* FTANH */
regs.fp[reg] = tanh (src); regs.fp[reg] = tanh (src);
break; break;
case 0x0a: /* FATAN */ case 0x0a: /* FATAN */
regs.fp[reg] = atan (src); regs.fp[reg] = atan (src);
break; break;
case 0x0c: /* FASIN */ case 0x0c: /* FASIN */
regs.fp[reg] = asin (src); regs.fp[reg] = asin (src);
break; break;
case 0x0d: /* FATANH */ case 0x0d: /* FATANH */
#if 1 /* The BeBox doesn't have atanh, and it isn't in the HPUX libm either */ #if 1 /* The BeBox doesn't have atanh, and it isn't in the HPUX libm either */
regs.fp[reg] = 0.5 * log ((1 + src) / (1 - src)); regs.fp[reg] = 0.5 * log ((1 + src) / (1 - src));
#else #else
regs.fp[reg] = atanh (src); regs.fp[reg] = atanh (src);
#endif #endif
break; break;
case 0x0e: /* FSIN */ case 0x0e: /* FSIN */
regs.fp[reg] = sin (src); regs.fp[reg] = sin (src);
break; break;
case 0x0f: /* FTAN */ case 0x0f: /* FTAN */
regs.fp[reg] = tan (src); regs.fp[reg] = tan (src);
break; break;
case 0x10: /* FETOX */ case 0x10: /* FETOX */
regs.fp[reg] = exp (src); regs.fp[reg] = exp (src);
break; break;
case 0x11: /* FTWOTOX */ case 0x11: /* FTWOTOX */
regs.fp[reg] = pow (2.0, src); regs.fp[reg] = pow (2.0, src);
break; break;
case 0x12: /* FTENTOX */ case 0x12: /* FTENTOX */
regs.fp[reg] = pow (10.0, src); regs.fp[reg] = pow (10.0, src);
break; break;
case 0x14: /* FLOGN */ case 0x14: /* FLOGN */
regs.fp[reg] = log (src); regs.fp[reg] = log (src);
break; break;
case 0x15: /* FLOG10 */ case 0x15: /* FLOG10 */
regs.fp[reg] = log10 (src); regs.fp[reg] = log10 (src);
break; break;
case 0x16: /* FLOG2 */ case 0x16: /* FLOG2 */
regs.fp[reg] = *fp_l2_e * log (src); regs.fp[reg] = *fp_l2_e * log (src);
break; break;
case 0x18: /* FABS */ case 0x18: /* FABS */
case 0x58: case 0x58:
case 0x5c: case 0x5c:
regs.fp[reg] = src < 0 ? -src : src; regs.fp[reg] = src < 0 ? -src : src;
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x19: /* FCOSH */ case 0x19: /* FCOSH */
regs.fp[reg] = cosh (src); regs.fp[reg] = cosh (src);
break; break;
case 0x1a: /* FNEG */ case 0x1a: /* FNEG */
case 0x5a: case 0x5a:
case 0x5e: case 0x5e:
regs.fp[reg] = -src; regs.fp[reg] = -src;
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x1c: /* FACOS */ case 0x1c: /* FACOS */
regs.fp[reg] = acos (src); regs.fp[reg] = acos (src);
break; break;
case 0x1d: /* FCOS */ case 0x1d: /* FCOS */
regs.fp[reg] = cos (src); regs.fp[reg] = cos (src);
break; break;
case 0x1e: /* FGETEXP */ case 0x1e: /* FGETEXP */
{ {
if (src == 0) { if (src == 0) {
regs.fp[reg] = 0; regs.fp[reg] = 0;
} else { } else {
int expon; int expon;
frexp (src, &expon); frexp (src, &expon);
regs.fp[reg] = (double) (expon - 1); regs.fp[reg] = (double) (expon - 1);
} }
} }
break; break;
case 0x1f: /* FGETMAN */ case 0x1f: /* FGETMAN */
{ {
if (src == 0) { if (src == 0) {
regs.fp[reg] = 0; regs.fp[reg] = 0;
} else { } else {
int expon; int expon;
regs.fp[reg] = frexp (src, &expon) * 2.0; regs.fp[reg] = frexp (src, &expon) * 2.0;
} }
} }
break; break;
case 0x20: /* FDIV */ case 0x20: /* FDIV */
case 0x60: case 0x60:
case 0x64: case 0x64:
regs.fp[reg] /= src; regs.fp[reg] /= src;
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x21: /* FMOD */ case 0x21: /* FMOD */
{ {
fptype quot = fp_round_to_zero(regs.fp[reg] / src); fptype quot = fp_round_to_zero(regs.fp[reg] / src);
regs.fp[reg] = regs.fp[reg] - quot * src; regs.fp[reg] = regs.fp[reg] - quot * src;
} }
break; break;
case 0x22: /* FADD */ case 0x22: /* FADD */
case 0x62: case 0x62:
case 0x66: case 0x66:
regs.fp[reg] += src; regs.fp[reg] += src;
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x23: /* FMUL */ case 0x23: /* FMUL */
case 0x63: case 0x63:
case 0x67: case 0x67:
regs.fp[reg] *= src; regs.fp[reg] *= src;
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x24: /* FSGLDIV */ case 0x24: /* FSGLDIV */
regs.fp[reg] /= src; regs.fp[reg] /= src;
break; break;
case 0x25: /* FREM */ case 0x25: /* FREM */
{ {
fptype quot = fp_round_to_nearest(regs.fp[reg] / src); fptype quot = fp_round_to_nearest(regs.fp[reg] / src);
regs.fp[reg] = regs.fp[reg] - quot * src; regs.fp[reg] = regs.fp[reg] - quot * src;
} }
break; break;
case 0x26: /* FSCALE */ case 0x26: /* FSCALE */
if (src != 0) { if (src != 0) {
#ifdef ldexp #ifdef ldexp
regs.fp[reg] = ldexp (regs.fp[reg], (int) src); regs.fp[reg] = ldexp (regs.fp[reg], (int) src);
...@@ -1587,112 +1587,112 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra) ...@@ -1587,112 +1587,112 @@ void fpuop_arithmetic (uae_u32 opcode, uae_u16 extra)
regs.fp[reg] *= exp (*fp_ln_2 * (int) src); regs.fp[reg] *= exp (*fp_ln_2 * (int) src);
#endif #endif
} }
break; break;
case 0x27: /* FSGLMUL */ case 0x27: /* FSGLMUL */
regs.fp[reg] *= src; regs.fp[reg] *= src;
break; break;
case 0x28: /* FSUB */ case 0x28: /* FSUB */
case 0x68: case 0x68:
case 0x6c: case 0x6c:
regs.fp[reg] -= src; regs.fp[reg] -= src;
if ((extra & 0x44) == 0x40) if ((extra & 0x44) == 0x40)
fround (reg); fround (reg);
break; break;
case 0x30: /* FSINCOS */ case 0x30: /* FSINCOS */
case 0x31: case 0x31:
case 0x32: case 0x32:
case 0x33: case 0x33:
case 0x34: case 0x34:
case 0x35: case 0x35:
case 0x36: case 0x36:
case 0x37: case 0x37:
regs.fp[extra & 7] = cos (src); regs.fp[extra & 7] = cos (src);
regs.fp[reg] = sin (src); regs.fp[reg] = sin (src);
break; break;
case 0x38: /* FCMP */ case 0x38: /* FCMP */
{ {
fptype tmp = regs.fp[reg] - src; fptype tmp = regs.fp[reg] - src;
regs.fpsr = 0; regs.fpsr = 0;
MAKE_FPSR (tmp); MAKE_FPSR (tmp);
} }
return; return;
case 0x3a: /* FTST */ case 0x3a: /* FTST */
regs.fpsr = 0; regs.fpsr = 0;
MAKE_FPSR (src); MAKE_FPSR (src);
return; return;
default: default:
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
return; return;
} }
MAKE_FPSR (regs.fp[reg]); MAKE_FPSR (regs.fp[reg]);
return; return;
} }
m68k_setpc (m68k_getpc () - 4); m68k_setpc (m68k_getpc () - 4);
op_illg (opcode); op_illg (opcode);
} }
void fpu_reset (void) void fpu_reset (void)
{ {
regs.fpcr = regs.fpsr = regs.fpiar = 0; regs.fpcr = regs.fpsr = regs.fpiar = 0;
regs.fp_result = 1; regs.fp_result = 1;
fpux_restore (NULL); fpux_restore (NULL);
} }
#ifdef SAVESTATE #ifdef SAVESTATE
uae_u8 *restore_fpu (uae_u8 *src) uae_u8 *restore_fpu (uae_u8 *src)
{ {
int i; int i;
uae_u32 flags; uae_u32 flags;
changed_prefs.fpu_model = currprefs.fpu_model = restore_u32(); changed_prefs.fpu_model = currprefs.fpu_model = restore_u32 ();
flags = restore_u32 (); flags = restore_u32 ();
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
uae_u32 w1 = restore_u32 (); uae_u32 w1 = restore_u32 ();
uae_u32 w2 = restore_u32 (); uae_u32 w2 = restore_u32 ();
uae_u32 w3 = restore_u16 (); uae_u32 w3 = restore_u16 ();
regs.fp[i] = to_exten (w1, w2, w3); regs.fp[i] = to_exten (w1, w2, w3);
} }
regs.fpcr = restore_u32 (); regs.fpcr = restore_u32 ();
native_set_fpucw (regs.fpcr); native_set_fpucw (regs.fpcr);
regs.fpsr = restore_u32 (); regs.fpsr = restore_u32 ();
regs.fpiar = restore_u32 (); regs.fpiar = restore_u32 ();
if (flags & 0x80000000) { if (flags & 0x80000000) {
restore_u32(); restore_u32();
restore_u32(); restore_u32();
} }
write_log ("FPU=%d\n", currprefs.fpu_model); write_log ("FPU: %d\n", currprefs.fpu_model);
return src; return src;
} }
uae_u8 *save_fpu (int *len, uae_u8 *dstptr) uae_u8 *save_fpu (int *len, uae_u8 *dstptr)
{ {
uae_u8 *dstbak,*dst; uae_u8 *dstbak,*dst;
int i; int i;
*len = 0; *len = 0;
if (currprefs.fpu_model == 0) if (currprefs.fpu_model == 0)
return 0; return 0;
if (dstptr) if (dstptr)
dstbak = dst = dstptr; dstbak = dst = dstptr;
else else
dstbak = dst = xmalloc (uae_u8, 4+4+8*10+4+4+4+4+4); dstbak = dst = xmalloc (uae_u8, 4+4+8*10+4+4+4+4+4);
save_u32 (currprefs.fpu_model); save_u32 (currprefs.fpu_model);
save_u32 (0x80000000); save_u32 (0x80000000);
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
uae_u32 w1, w2, w3; uae_u32 w1, w2, w3;
from_exten (regs.fp[i], &w1, &w2, &w3); from_exten (regs.fp[i], &w1, &w2, &w3);
save_u32 (w1); save_u32 (w1);
save_u32 (w2); save_u32 (w2);
save_u16 (w3); save_u16 (w3);
} }
save_u32 (regs.fpcr); save_u32 (regs.fpcr);
save_u32 (regs.fpsr); save_u32 (regs.fpsr);
save_u32 (regs.fpiar); save_u32 (regs.fpiar);
save_u32 (-1); save_u32 (-1);
save_u32 (0); save_u32 (0);
*len = dst - dstbak; *len = dst - dstbak;
return dstbak; return dstbak;
} }
void fpux_save (int *v) {} void fpux_save (int *v) {}
void fpux_restore (int *v) {} void fpux_restore (int *v) {}
......
...@@ -111,7 +111,7 @@ uae_u32 uaesrand (uae_u32 seed) ...@@ -111,7 +111,7 @@ uae_u32 uaesrand (uae_u32 seed)
oldhcounter = -1; oldhcounter = -1;
randseed = seed; randseed = seed;
//randseed = 0x12345678; //randseed = 0x12345678;
//write_log (L"seed=%08x\n", randseed); //write_log ("seed=%08x\n", randseed);
return randseed; return randseed;
} }
uae_u32 uaerand (void) uae_u32 uaerand (void)
...@@ -121,7 +121,7 @@ uae_u32 uaerand (void) ...@@ -121,7 +121,7 @@ uae_u32 uaerand (void)
oldhcounter = hsync_counter; oldhcounter = hsync_counter;
} }
uae_u32 r = rand (); uae_u32 r = rand ();
//write_log (L"rand=%08x\n", r); //write_log ("rand=%08x\n", r);
return r; return r;
} }
uae_u32 uaerandgetseed (void) uae_u32 uaerandgetseed (void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment