Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
PUAE
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PocketInsanity
PUAE
Commits
5928ccfc
Commit
5928ccfc
authored
Nov 22, 2010
by
GnoStiC
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
puae 2.3.1
parent
bb1b7971
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
387 additions
and
390 deletions
+387
-390
custom.c
src/custom.c
+1
-4
debug.c
src/debug.c
+1
-1
disk.c
src/disk.c
+5
-4
dongle.c
src/dongle.c
+1
-1
expansion.c
src/expansion.c
+1
-2
fdi2raw.c
src/fdi2raw.c
+15
-15
fpp.c
src/fpp.c
+361
-361
main.c
src/main.c
+2
-2
No files found.
src/custom.c
View file @
5928ccfc
...
@@ -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
;
...
...
src/debug.c
View file @
5928ccfc
...
@@ -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
)
...
...
src/disk.c
View file @
5928ccfc
...
@@ -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
=
uae
rand
();
drv
->
mfmpos
|=
(
rand
()
<<
16
);
drv
->
mfmpos
|=
(
uae
rand
()
<<
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
=
((
uae
rand
()
>>
4
)
&
7
)
+
1
;
while
(
r
--
>
0
)
{
while
(
r
--
>
0
)
{
word
<<=
1
;
word
<<=
1
;
word
|=
(
rand
()
&
0x1000
)
?
1
:
0
;
word
|=
(
uae
rand
()
&
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
;
...
...
src/dongle.c
View file @
5928ccfc
...
@@ -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
=
(
uae
rand
()
&
7
)
-
3
;
break
;
break
;
}
}
...
...
src/expansion.c
View file @
5928ccfc
...
@@ -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
();
...
...
src/fdi2raw.c
View file @
5928ccfc
...
@@ -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
(
"%06
X %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
(
"
\n
in %d bytes, out %d bits
\n
"
,
fdi
->
track_src
-
fdi
->
track_src_buffer
,
fdi
->
out
);
outlog
(
"
\n
in %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 (
uae
rand() <= (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
=
uae
rand
();
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
=
uae
rand
();
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
;
...
...
src/fpp.c
View file @
5928ccfc
...
@@ -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
)
{}
...
...
src/main.c
View file @
5928ccfc
...
@@ -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
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment