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
b7de61b2
Commit
b7de61b2
authored
Nov 20, 2010
by
Mustafa 'GnoStiC' TUFAN
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
puae 2.3.1
parent
9f992501
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
434 additions
and
512 deletions
+434
-512
Makefile.am
src/Makefile.am
+1
-1
cia.c
src/cia.c
+0
-2
custom.c
src/custom.c
+0
-20
debug.c
src/debug.c
+1
-1
disk.c
src/disk.c
+0
-4
drawing.c
src/drawing.c
+2
-1
inputrecord.h
src/include/inputrecord.h
+1
-1
keyboard.h
src/include/keyboard.h
+26
-25
zarchive.h
src/include/zarchive.h
+1
-0
zfile.h
src/include/zfile.h
+2
-0
inputdevice.c
src/inputdevice.c
+240
-381
inputevents.def
src/inputevents.def
+11
-7
inputrecord.c
src/inputrecord.c
+20
-15
keybuf.c
src/keybuf.c
+0
-4
main.c
src/main.c
+27
-2
misc.c
src/misc.c
+60
-2
newcpu.c
src/newcpu.c
+0
-16
savestate.c
src/savestate.c
+0
-18
zfile.c
src/zfile.c
+42
-12
No files found.
src/Makefile.am
View file @
b7de61b2
...
...
@@ -132,7 +132,7 @@ EXTRA_DIST = \
uae_SOURCES
=
\
main.c newcpu.c memory.c rommgr.c custom.c serial.c dongle.c cia.c
\
blitter.c autoconf.c traps.c ersatz.c keybuf.c expansion.c
\
blitter.c autoconf.c traps.c ersatz.c keybuf.c expansion.c
inputrecord.c
\
diskutil.c zfile.c zfile_archive.c cfgfile.c picasso96.c inputdevice.c
\
gfxutil.c audio.c sinctable.c statusline.c drawing.c consolehook.c
\
native2amiga.c disk.c crc32.c savestate.c arcadia.c cdtv.c cd32_fmv.c
\
...
...
src/cia.c
View file @
b7de61b2
...
...
@@ -673,14 +673,12 @@ static uae_u8 ReadCIAA (unsigned int addr)
if
(
notinrom
())
write_log
(
"BFE001 R %02X %s
\n
"
,
tmp
,
debuginfo
(
0
));
#endif
#if INPREC
if
(
inputrecord_debug
&
2
)
{
if
(
input_record
>
0
)
inprec_recorddebug_cia
(
tmp
,
div10
,
m68k_getpc
());
else
if
(
input_play
>
0
)
inprec_playdebug_cia
(
tmp
,
div10
,
m68k_getpc
());
}
#endif
return
tmp
;
case
1
:
#ifdef PARALLEL_PORT
...
...
src/custom.c
View file @
b7de61b2
...
...
@@ -5716,25 +5716,6 @@ static void hsync_handler_post (bool isvsync)
do_sprites
(
0
);
#endif
#ifdef INPREC
while
(
input_recording
<
0
&&
inprec_pstart
(
INPREC_KEY
))
{
record_key_direct
(
inprec_pu8
());
inprec_pend
();
}
while
(
input_recording
<
0
&&
inprec_pstart
(
INPREC_DISKREMOVE
))
{
disk_eject
(
inprec_pu8
());
inprec_pend
();
}
while
(
input_recording
<
0
&&
inprec_pstart
(
INPREC_DISKINSERT
))
{
int
drv
=
inprec_pu8
();
inprec_pstr
(
currprefs
.
floppyslots
[
drv
].
df
);
_tcscpy
(
changed_prefs
.
floppyslots
[
drv
].
df
,
currprefs
.
floppyslots
[
drv
].
df
);
disk_insert_force
(
drv
,
currprefs
.
floppyslots
[
drv
].
df
);
inprec_pend
();
}
#endif
inputdevice_hsync
();
#ifdef GAYLE
gayle_hsync
();
#endif
...
...
@@ -7118,7 +7099,6 @@ uae_u8 *save_custom_event_delay (int *len, uae_u8 *dstptr)
save_u8
(
1
);
save_u64
(
e
->
evtime
-
get_cycles
());
save_u32
(
e
->
data
);
}
}
...
...
src/debug.c
View file @
b7de61b2
...
...
@@ -3640,7 +3640,7 @@ void debug (void)
&&
nr_units
()
==
0
#endif
)
{
savestate_capture
(
1
);
//
savestate_capture (1);
}
for
(
i
=
0
;
i
<
BREAKPOINT_TOTAL
;
i
++
)
{
if
(
bpnodes
[
i
].
enabled
)
...
...
src/disk.c
View file @
b7de61b2
...
...
@@ -931,10 +931,8 @@ static int drive_insert (drive * drv, struct uae_prefs *p, int dnum, const TCHAR
return
0
;
}
#ifdef INPREC
if
(
!
fake
)
inprec_recorddiskchange
(
dnum
,
fname
,
drv
->
wrprot
);
#endif
_tcsncpy
(
currprefs
.
floppyslots
[
dnum
].
df
,
fname
,
255
);
currprefs
.
floppyslots
[
dnum
].
df
[
255
]
=
0
;
...
...
@@ -2049,9 +2047,7 @@ static void drive_eject (drive * drv)
drive_settype_id
(
drv
);
/* Back to 35 DD */
if
(
disk_debug_logging
>
0
)
write_log
(
"eject drive %d
\n
"
,
drv
-
&
floppy
[
0
]);
#ifdef INPREC
inprec_recorddiskchange
(
drv
-
floppy
,
NULL
,
false
);
#endif
}
/* We use this function if we have no Kickstart ROM.
...
...
src/drawing.c
View file @
b7de61b2
...
...
@@ -2668,7 +2668,8 @@ void vsync_handle_redraw (int long_frame, int lof_changed)
#ifdef SAVESTATE
if
(
!
savestate_state
)
{
if
(
currprefs
.
quitstatefile
[
0
])
{
savestate_initsave
(
currprefs
.
quitstatefile
,
1
,
1
,
true
);
write_log
(
"Draw: Save_State"
);
savestate_initsave
(
currprefs
.
quitstatefile
,
1
,
1
,
true
);
save_state
(
currprefs
.
quitstatefile
,
""
);
}
}
...
...
src/include/inputrecord.h
View file @
b7de61b2
...
...
@@ -52,5 +52,5 @@ extern void inprec_playdebug_cia (uae_u32, uae_u32, uae_u32);
extern
int
inprec_getposition
(
void
);
extern
void
inprec_setposition
(
int
offset
,
int
replaycounter
);
extern
bool
inprec_realtime
(
void
);
extern
bool
inprec_realtime
v
(
void
);
extern
void
inprec_getstatus
(
TCHAR
*
);
\ No newline at end of file
src/include/keyboard.h
View file @
b7de61b2
...
...
@@ -133,33 +133,34 @@
#define KBLED_SCROLLLOCKM (1 << KBLED_SCROLLLOCKB)
enum
aks
{
AKS_ENTERGUI
=
0x200
,
AKS_SCREENSHOT_FILE
,
AKS_SCREENSHOT_CLIPBOARD
,
AKS_FREEZEBUTTON
,
AKS_FLOPPY0
,
AKS_FLOPPY1
,
AKS_FLOPPY2
,
AKS_FLOPPY3
,
AKS_EFLOPPY0
,
AKS_EFLOPPY1
,
AKS_EFLOPPY2
,
AKS_EFLOPPY3
,
AKS_FLOPPY0
,
AKS_FLOPPY1
,
AKS_FLOPPY2
,
AKS_FLOPPY3
,
AKS_EFLOPPY0
,
AKS_EFLOPPY1
,
AKS_EFLOPPY2
,
AKS_EFLOPPY3
,
AKS_TOGGLEDEFAULTSCREEN
,
AKS_TOGGLEWINDOWEDFULLSCREEN
,
AKS_TOGGLEFULLWINDOWFULLSCREEN
,
AKS_TOGGLEWINDOWFULLWINDOW
,
AKS_TOGGLEWINDOWEDFULLSCREEN
,
AKS_TOGGLEFULLWINDOWFULLSCREEN
,
AKS_TOGGLEWINDOWFULLWINDOW
,
AKS_ENTERDEBUGGER
,
AKS_IRQ7
,
AKS_PAUSE
,
AKS_WARP
,
AKS_INHIBITSCREEN
,
AKS_STATEREWIND
,
AKS_VOLDOWN
,
AKS_VOLUP
,
AKS_VOLMUTE
,
AKS_MVOLDOWN
,
AKS_MVOLUP
,
AKS_MVOLMUTE
,
AKS_QUIT
,
AKS_HARDRESET
,
AKS_SOFTRESET
,
AKS_STATESAVEQUICK
,
AKS_STATERESTOREQUICK
,
AKS_STATESAVEQUICK1
,
AKS_STATERESTOREQUICK1
,
AKS_STATESAVEQUICK2
,
AKS_STATERESTOREQUICK2
,
AKS_STATESAVEQUICK3
,
AKS_STATERESTOREQUICK3
,
AKS_STATESAVEQUICK4
,
AKS_STATERESTOREQUICK4
,
AKS_STATESAVEQUICK5
,
AKS_STATERESTOREQUICK5
,
AKS_STATESAVEQUICK6
,
AKS_STATERESTOREQUICK6
,
AKS_STATESAVEQUICK7
,
AKS_STATERESTOREQUICK7
,
AKS_STATESAVEQUICK8
,
AKS_STATERESTOREQUICK8
,
AKS_STATESAVEQUICK9
,
AKS_STATERESTOREQUICK9
,
AKS_STATESAVEDIALOG
,
AKS_STATERESTOREDIALOG
,
AKS_DECREASEREFRESHRATE
,
AKS_INCREASEREFRESHRATE
,
AKS_ARCADIADIAGNOSTICS
,
AKS_ARCADIAPLY1
,
AKS_ARCADIAPLY2
,
AKS_ARCADIACOIN1
,
AKS_ARCADIACOIN2
,
AKS_TOGGLEMOUSEGRAB
,
AKS_SWITCHINTERPOL
,
AKS_INPUT_CONFIG_1
,
AKS_INPUT_CONFIG_2
,
AKS_INPUT_CONFIG_3
,
AKS_INPUT_CONFIG_4
,
AKS_DISKSWAPPER_NEXT
,
AKS_DISKSWAPPER_PREV
,
AKS_DISKSWAPPER_INSERT0
,
AKS_DISKSWAPPER_INSERT1
,
AKS_DISKSWAPPER_INSERT2
,
AKS_DISKSWAPPER_INSERT3
,
AKS_PAUSE
,
AKS_WARP
,
AKS_INHIBITSCREEN
,
AKS_STATEREWIND
,
AKS_STATECURRENT
,
AKS_STATECAPTURE
,
AKS_VOLDOWN
,
AKS_VOLUP
,
AKS_VOLMUTE
,
AKS_MVOLDOWN
,
AKS_MVOLUP
,
AKS_MVOLMUTE
,
AKS_QUIT
,
AKS_HARDRESET
,
AKS_SOFTRESET
,
AKS_STATESAVEQUICK
,
AKS_STATERESTOREQUICK
,
AKS_STATESAVEQUICK1
,
AKS_STATERESTOREQUICK1
,
AKS_STATESAVEQUICK2
,
AKS_STATERESTOREQUICK2
,
AKS_STATESAVEQUICK3
,
AKS_STATERESTOREQUICK3
,
AKS_STATESAVEQUICK4
,
AKS_STATERESTOREQUICK4
,
AKS_STATESAVEQUICK5
,
AKS_STATERESTOREQUICK5
,
AKS_STATESAVEQUICK6
,
AKS_STATERESTOREQUICK6
,
AKS_STATESAVEQUICK7
,
AKS_STATERESTOREQUICK7
,
AKS_STATESAVEQUICK8
,
AKS_STATERESTOREQUICK8
,
AKS_STATESAVEQUICK9
,
AKS_STATERESTOREQUICK9
,
AKS_STATESAVEDIALOG
,
AKS_STATERESTOREDIALOG
,
AKS_DECREASEREFRESHRATE
,
AKS_INCREASEREFRESHRATE
,
AKS_ARCADIADIAGNOSTICS
,
AKS_ARCADIAPLY1
,
AKS_ARCADIAPLY2
,
AKS_ARCADIACOIN1
,
AKS_ARCADIACOIN2
,
AKS_TOGGLEMOUSEGRAB
,
AKS_SWITCHINTERPOL
,
AKS_INPUT_CONFIG_1
,
AKS_INPUT_CONFIG_2
,
AKS_INPUT_CONFIG_3
,
AKS_INPUT_CONFIG_4
,
AKS_DISKSWAPPER_NEXT
,
AKS_DISKSWAPPER_PREV
,
AKS_DISKSWAPPER_INSERT0
,
AKS_DISKSWAPPER_INSERT1
,
AKS_DISKSWAPPER_INSERT2
,
AKS_DISKSWAPPER_INSERT3
,
AKS_DISK_PREV0
,
AKS_DISK_PREV1
,
AKS_DISK_PREV2
,
AKS_DISK_PREV3
,
AKS_DISK_NEXT0
,
AKS_DISK_NEXT1
,
AKS_DISK_NEXT2
,
AKS_DISK_NEXT3
,
AKS_CDTV_FRONT_PANEL_STOP
,
AKS_CDTV_FRONT_PANEL_PLAYPAUSE
,
AKS_CDTV_FRONT_PANEL_PREV
,
...
...
src/include/zarchive.h
View file @
b7de61b2
...
...
@@ -14,6 +14,7 @@ struct zfile {
int
archiveid
;
uae_s64
size
;
// real size
uae_s64
datasize
;
// available size (not yet unpacked completely?)
uae_s64
allocsize
;
// memory allocated before realloc() needed again
uae_s64
seek
;
// seek position
int
deleteafterclose
;
int
textmode
;
...
...
src/include/zfile.h
View file @
b7de61b2
...
...
@@ -69,6 +69,7 @@ extern int zfile_convertimage (const TCHAR *src, const TCHAR *dst);
//extern struct zfile *zuncompress (struct znode*, struct zfile *z, int dodefault, int mask, int *retcode, int index);
extern
void
zfile_seterror
(
const
TCHAR
*
format
,
...);
extern
TCHAR
*
zfile_geterror
(
void
);
extern
int
zfile_truncate
(
struct
zfile
*
z
,
uae_s64
size
);
#define ZFD_NONE 0
#define ZFD_ARCHIVE 1 //zip/lha..
...
...
@@ -120,3 +121,4 @@ extern unsigned int zfile_read_archive (struct zfile *d, void *b, unsigned int s
extern
void
zfile_close_archive
(
struct
zfile
*
d
);
extern
struct
zfile
*
zfile_open_archive
(
const
TCHAR
*
path
,
int
flags
);
extern
int
zfile_exists_archive
(
const
TCHAR
*
path
,
const
TCHAR
*
rel
);
extern
bool
zfile_needwrite
(
struct
zfile
*
);
\ No newline at end of file
src/inputdevice.c
View file @
b7de61b2
...
...
@@ -46,6 +46,7 @@
#include "cia.h"
#include "autoconf.h"
#include "dongle.h"
#include "cdtv.h"
#include <ctype.h>
extern
int
bootrom_header
,
bootrom_items
;
...
...
@@ -101,7 +102,9 @@ static uae_u8 scancodeused[MAX_INPUT_DEVICES][256];
// fire/left mouse button pullup resistors enabled?
static
bool
mouse_pullup
=
true
;
static
bool
joystick_pullup
=
false
;
static
int
joymodes
[
MAX_JPORTS
];
static
int
*
joyinputs
[
MAX_JPORTS
];
static
int
input_acquired
;
static
int
testmode
,
testmode_read
,
testmode_toggle
;
...
...
@@ -118,258 +121,13 @@ static int testmode_count;
static
struct
teststore
testmode_data
[
TESTMODE_MAX
];
static
struct
teststore
testmode_wait
[
TESTMODE_MAX
];
static
uae_u8
*
inprec_buffer
,
*
inprec_p
;
static
struct
zfile
*
inprec_zf
;
static
int
inprec_size
;
int
input_recording
=
0
;
static
uae_u8
*
inprec_plast
,
*
inprec_plastptr
;
static
int
inprec_div
;
static
uae_u32
oldbuttons
[
4
];
static
uae_u16
oldjoy
[
2
];
static
int
bouncy
;
static
signed
long
bouncy_cycles
;
#define BOUNCY_CYCLES 30
#ifdef INPREC
int
inprec_open
(
TCHAR
*
fname
,
int
record
)
{
uae_u32
t
=
(
uae_u32
)
time
(
0
);
int
i
;
static
int
handle_input_event
(
int
nr
,
int
state
,
int
max
,
int
autofire
,
bool
canstoprecord
,
bool
playbackevent
);
inprec_close
();
inprec_zf
=
zfile_fopen
(
fname
,
record
>
0
?
"wb"
:
"rb"
,
ZFD_NORMAL
);
if
(
inprec_zf
==
NULL
)
return
0
;
inprec_size
=
10000
;
inprec_div
=
1
;
if
(
record
<
0
)
{
uae_u32
id
;
zfile_fseek
(
inprec_zf
,
0
,
SEEK_END
);
inprec_size
=
zfile_ftell
(
inprec_zf
);
zfile_fseek
(
inprec_zf
,
0
,
SEEK_SET
);
inprec_buffer
=
inprec_p
=
xmalloc
(
uae_u8
,
inprec_size
);
zfile_fread
(
inprec_buffer
,
inprec_size
,
1
,
inprec_zf
);
inprec_plastptr
=
inprec_buffer
;
id
=
inprec_pu32
();
if
(
id
!=
'
UAE
\
0
'
)
{
inprec_close
();
return
0
;
}
inprec_pu32
();
t
=
inprec_pu32
();
i
=
inprec_pu32
();
while
(
i
--
>
0
)
inprec_pu8
();
inprec_p
=
inprec_plastptr
;
if
(
inprec_pstart
(
INPREC_STATEFILE
))
{
inprec_pstr
(
savestate_fname
);
savestate_state
=
STATE_RESTORE
;
inprec_pend
();
}
oldbuttons
[
0
]
=
oldbuttons
[
1
]
=
oldbuttons
[
2
]
=
oldbuttons
[
3
]
=
0
;
oldjoy
[
0
]
=
oldjoy
[
1
]
=
0
;
if
(
record
<
-
1
)
inprec_div
=
maxvpos
;
}
else
if
(
record
>
0
)
{
inprec_buffer
=
inprec_p
=
xmalloc
(
uae_u8
,
inprec_size
);
inprec_ru32
(
'
UAE
\
0
'
);
inprec_ru8
(
1
);
inprec_ru8
(
UAEMAJOR
);
inprec_ru8
(
UAEMINOR
);
inprec_ru8
(
UAESUBREV
);
inprec_ru32
(
t
);
inprec_ru32
(
0
);
// extra header size
if
(
savestate_state
==
STATE_DORESTORE
)
{
inprec_rstart
(
INPREC_STATEFILE
);
inprec_rstr
(
savestate_fname
);
inprec_rend
();
}
}
else
{
return
0
;
}
input_recording
=
record
;
srand
(
t
);
CIA_inprec_prepare
();
write_log
(
"inprec initialized '%s', mode=%d
\n
"
,
fname
,
input_recording
);
return
1
;
}
void
inprec_close
(
void
)
{
if
(
!
inprec_zf
)
return
;
if
(
inprec_buffer
&&
input_recording
>
0
)
{
hsync_counter
++
;
inprec_rstart
(
INPREC_END
);
inprec_rend
();
hsync_counter
--
;
zfile_fwrite
(
inprec_buffer
,
inprec_p
-
inprec_buffer
,
1
,
inprec_zf
);
inprec_p
=
inprec_buffer
;
}
zfile_fclose
(
inprec_zf
);
inprec_zf
=
NULL
;
xfree
(
inprec_buffer
);
inprec_buffer
=
NULL
;
input_recording
=
0
;
write_log
(
"inprec finished
\n
"
);
}
void
inprec_ru8
(
uae_u8
v
)
{
*
inprec_p
++=
v
;
}
void
inprec_ru16
(
uae_u16
v
)
{
inprec_ru8
((
uae_u8
)(
v
>>
8
));
inprec_ru8
((
uae_u8
)
v
);
}
void
inprec_ru32
(
uae_u32
v
)
{
inprec_ru16
((
uae_u16
)(
v
>>
16
));
inprec_ru16
((
uae_u16
)
v
);
}
void
inprec_rstr
(
const
TCHAR
*
src
)
{
char
*
s
=
ua
(
src
);
while
(
*
s
)
{
inprec_ru8
(
*
s
);
s
++
;
}
inprec_ru8
(
0
);
xfree
(
s
);
}
void
inprec_rstart
(
uae_u8
type
)
{
write_log
(
"INPREC: %08X: %d
\n
"
,
hsync_counter
,
type
);
inprec_ru32
(
hsync_counter
);
inprec_ru8
(
0
);
inprec_plast
=
inprec_p
;
inprec_ru8
(
0xff
);
inprec_ru8
(
type
);
}
void
inprec_rend
(
void
)
{
*
inprec_plast
=
inprec_p
-
(
inprec_plast
+
2
);
if
(
inprec_p
>=
inprec_buffer
+
inprec_size
-
256
)
{
zfile_fwrite
(
inprec_buffer
,
inprec_p
-
inprec_buffer
,
1
,
inprec_zf
);
inprec_p
=
inprec_buffer
;
}
}
int
inprec_pstart
(
uae_u8
type
)
{
uae_u8
*
p
=
inprec_p
;
uae_u32
hc
=
hsync_counter
;
static
uae_u8
*
lastp
;
uae_u32
hc_orig
,
hc2_orig
;
if
(
savestate_state
)
return
0
;
if
(
p
[
5
+
1
]
==
INPREC_END
)
{
inprec_close
();
return
0
;
}
else
if
(
p
[
5
+
1
]
==
INPREC_QUIT
)
{
inprec_close
();
uae_quit
();
return
0
;
}
hc_orig
=
hc
;
hc
/=
inprec_div
;
hc
*=
inprec_div
;
for
(;;)
{
uae_u32
hc2
=
(
p
[
0
]
<<
24
)
|
(
p
[
1
]
<<
16
)
|
(
p
[
2
]
<<
8
)
|
p
[
3
];
if
(
p
>
lastp
)
{
write_log
(
"INPREC: Next %08x (%08x=%d): %d (%d)
\n
"
,
hc2
,
hc
,
hc2
-
hc
,
p
[
5
+
1
],
p
[
5
]);
lastp
=
p
;
}
hc2_orig
=
hc2
;
hc2
/=
inprec_div
;
hc2
*=
inprec_div
;
if
(
hc
>
hc2
)
{
write_log
(
"INPREC: %08x > %08x: %d (%d) missed!
\n
"
,
hc
,
hc2
,
p
[
5
+
1
],
p
[
5
]);
inprec_close
();
return
0
;
}
if
(
hc2
!=
hc
)
{
lastp
=
p
;
break
;
}
if
(
p
[
5
+
1
]
==
type
)
{
write_log
(
"INPREC: %08x: %d (%d) (%+d)
\n
"
,
hc
,
type
,
p
[
5
],
hc_orig
-
hc2_orig
);
inprec_plast
=
p
;
inprec_plastptr
=
p
+
5
+
2
;
return
1
;
}
p
+=
5
+
2
+
p
[
5
];
}
inprec_plast
=
NULL
;
return
0
;
}
void
inprec_pend
(
void
)
{
uae_u8
*
p
=
inprec_p
;
uae_u32
hc
=
hsync_counter
;
if
(
!
inprec_plast
)
return
;
inprec_plast
[
5
+
1
]
=
0
;
inprec_plast
=
NULL
;
inprec_plastptr
=
NULL
;
hc
/=
inprec_div
;
hc
*=
inprec_div
;
for
(;;)
{
uae_u32
hc2
=
(
p
[
0
]
<<
24
)
|
(
p
[
1
]
<<
16
)
|
(
p
[
2
]
<<
8
)
|
p
[
3
];
hc2
/=
inprec_div
;
hc2
*=
inprec_div
;
if
(
hc2
!=
hc
)
break
;
if
(
p
[
5
+
1
]
!=
0
)
return
;
p
+=
5
+
2
+
p
[
5
];
}
inprec_p
=
p
;
if
(
p
[
5
+
1
]
==
INPREC_END
)
inprec_close
();
}
uae_u8
inprec_pu8
(
void
)
{
return
*
inprec_plastptr
++
;
}
uae_u16
inprec_pu16
(
void
)
{
uae_u16
v
=
inprec_pu8
()
<<
8
;
v
|=
inprec_pu8
();
return
v
;
}
uae_u32
inprec_pu32
(
void
)
{
uae_u32
v
=
inprec_pu16
()
<<
16
;
v
|=
inprec_pu16
();
return
v
;
}
int
inprec_pstr
(
TCHAR
*
dst
)
{
char
tmp
[
MAX_DPATH
];
char
*
s
;
int
len
=
0
;
s
=
tmp
;
for
(;;)
{
uae_u8
v
=
inprec_pu8
();
*
s
++
=
v
;
if
(
!
v
)
break
;
len
++
;
}
au_copy
(
dst
,
MAX_DPATH
,
tmp
);
return
len
;
}
#endif
static
int
isdevice
(
const
struct
uae_input_device
*
id
)
static
int
isdevice
(
struct
uae_input_device
*
id
)
{
int
i
,
j
;
for
(
i
=
0
;
i
<
MAX_INPUT_DEVICE_EVENTS
;
i
++
)
{
...
...
@@ -387,7 +145,7 @@ int inputdevice_uaelib (TCHAR *s, TCHAR *parm)
for
(
i
=
1
;
events
[
i
].
name
;
i
++
)
{
if
(
!
_tcscmp
(
s
,
events
[
i
].
confname
))
{
handle_input_event
(
i
,
_tstol
(
parm
),
1
,
0
);
handle_input_event
(
i
,
_tstol
(
parm
),
1
,
0
,
false
,
false
);
return
1
;
}
}
...
...
@@ -773,6 +531,7 @@ void write_inputdevice_config (struct uae_prefs *p, struct zfile *f)
cfgfile_write
(
f
,
"input.analog_joystick_offset"
,
"%d"
,
p
->
input_analog_joystick_offset
);
cfgfile_write
(
f
,
"input.mouse_speed"
,
"%d"
,
p
->
input_mouse_speed
);
cfgfile_write
(
f
,
"input.autofire_speed"
,
"%d"
,
p
->
input_autofire_linecnt
);
cfgfile_dwrite
(
f
,
"input.contact_bounce"
,
"%d"
,
p
->
input_contact_bounce
);
for
(
id
=
0
;
id
<
MAX_INPUT_SETTINGS
;
id
++
)
{
for
(
i
=
0
;
i
<
MAX_INPUT_DEVICES
;
i
++
)
write_config
(
f
,
id
,
i
,
"joystick"
,
&
p
->
joystick_settings
[
id
][
i
],
&
joysticks2
[
i
],
&
idev
[
IDTYPE_JOYSTICK
]);
...
...
@@ -1805,37 +1564,9 @@ STATIC_INLINE int adjust (int val)
return
val
;
}
int
getbuttonstate
(
int
joy
,
int
button
)
static
int
getbuttonstate
(
int
joy
,
int
button
)
{
#ifdef INPREC
int
v
;
v
=
(
joybutton
[
joy
]
&
(
1
<<
button
))
?
1
:
0
;
if
(
input_recording
>
0
&&
((
joybutton
[
joy
]
^
oldbuttons
[
joy
])
&
(
1
<<
button
)))
{
oldbuttons
[
joy
]
&=
~
(
1
<<
button
);
if
(
v
)
oldbuttons
[
joy
]
|=
1
<<
button
;
inprec_rstart
(
INPREC_JOYBUTTON
);
inprec_ru8
(
joy
);
inprec_ru8
(
button
);
inprec_ru8
(
v
);
inprec_rend
();
}
else
if
(
input_recording
<
0
)
{
while
(
inprec_pstart
(
INPREC_JOYBUTTON
))
{
uae_u8
j
=
inprec_pu8
();
uae_u8
but
=
inprec_pu8
();
uae_u8
vv
=
inprec_pu8
();
inprec_pend
();
oldbuttons
[
j
]
&=
~
(
1
<<
but
);
if
(
vv
)
oldbuttons
[
j
]
|=
1
<<
but
;
}
v
=
(
oldbuttons
[
joy
]
&
(
1
<<
button
))
?
1
:
0
;
}
return
v
;
#else
return
(
joybutton
[
joy
]
&
(
1
<<
button
))
?
1
:
0
;
#endif
}
static
int
getvelocity
(
int
num
,
int
subnum
,
int
pct
)
...
...
@@ -1954,27 +1685,24 @@ static void readinput (void)
uae_u32
totalvpos
;
int
diff
;
totalvpos
=
input_frame
*
maxvpos
+
vpos
;
totalvpos
=
input_frame
*
current_maxvpos
()
+
vpos
;
diff
=
totalvpos
-
input_vpos
;
if
(
diff
>
0
)
{
if
(
diff
<
10
)
{
mouseupdate
(
0
,
0
);
}
else
{
mouseupdate
(
diff
*
1000
/
maxvpos
,
0
);
mouseupdate
(
diff
*
1000
/
current_maxvpos
()
,
0
);
}
}
input_vpos
=
totalvpos
;
}
int
getjoystate
(
int
joy
)
static
uae_u16
getjoystate
(
int
joy
)
{
int
left
=
1
,
right
=
1
,
top
=
1
,
bot
=
1
;
uae_u16
v
;
if
(
inputdevice_logging
&
2
)
write_log
(
"JOY%dDAT %08x
\n
"
,
joy
,
M68K_GETPC
);
readinput
();
if
(
joydir
[
joy
]
&
DIR_LEFT
)
left
=
0
;
if
(
joydir
[
joy
]
&
DIR_RIGHT
)
...
...
@@ -1999,27 +1727,15 @@ int getjoystate (int joy)
if
(
notinrom
())
write_log
(
"JOY%dDAT %04X %s
\n
"
,
joy
,
v
,
debuginfo
(
0
));
#endif
#ifdef INPREC
if
(
input_recording
>
0
&&
oldjoy
[
joy
]
!=
v
)
{
oldjoy
[
joy
]
=
v
;
inprec_rstart
(
INPREC_JOYPORT
);
inprec_ru16
(
v
);
inprec_rend
();
}
else
if
(
input_recording
<
0
)
{
v
=
oldjoy
[
joy
];
if
(
inprec_pstart
(
INPREC_JOYPORT
))
{
v
=
inprec_pu16
();
inprec_pend
();
}
oldjoy
[
joy
]
=
v
;
}
#endif
if
(
inputdevice_logging
&
2
)
write_log
(
"JOY%dDAT=%04x %08x
\n
"
,
joy
,
v
,
M68K_GETPC
);
return
v
;
}
uae_u16
JOY0DAT
(
void
)
{
uae_u16
v
;
readinput
();
v
=
getjoystate
(
0
);
v
=
dongle_joydat
(
0
,
v
);
return
v
;
...
...
@@ -2031,14 +1747,14 @@ uae_u16 JOY1DAT (void)
readinput
();
v
=
getjoystate
(
1
);
v
=
dongle_joydat
(
1
,
v
);
#ifdef INPREC
if
(
inputrecord_debug
&
2
)
{
if
(
input_record
>
0
)
inprec_recorddebug_cia
(
v
,
-
1
,
m68k_getpc
());
else
if
(
input_play
>
0
)
inprec_playdebug_cia
(
v
,
-
1
,
m68k_getpc
());
}
#endif
return
v
;
}
...
...
@@ -2126,6 +1842,14 @@ static bool cd32padmode (uae_u16 p5dir, uae_u16 p5dat)
return
true
;
}
static
bool
is_joystick_pullup
(
int
joy
)
{
return
joymodes
[
joy
]
==
JSEM_MODE_GAMEPAD
;
}
static
bool
is_mouse_pullup
(
int
joy
)
{
return
mouse_pullup
;
}
static
void
charge_cap
(
int
joy
,
int
idx
,
int
charge
)
{
...
...
@@ -2171,13 +1895,13 @@ static void cap_check (void)
joypot
=
joydirpot
[
joy
][
i
];
if
(
analog_port
[
joy
][
i
]
&&
pot_cap
[
joy
][
i
]
<
joypot
)
charge
=
1
;
// slow charge via pot variable resistor
if
((
(
joystick_pullup
&&
digital_port
[
joy
][
i
])
||
(
mouse_pullup
&&
mouse_port
[
joy
]
&&
digital_port
[
joy
][
i
])
))
if
((
is_joystick_pullup
(
joy
)
&&
digital_port
[
joy
][
i
])
||
(
is_mouse_pullup
(
joy
)
&&
mouse_port
[
joy
]
))
charge
=
1
;
// slow charge via pull-up resistor
}
if
(
!
(
potgo_value
&
pdir
))
{
// input?
if
(
pot_dat_act
[
joy
][
i
])
pot_dat
[
joy
][
i
]
++
;
/* first 8 lines after potgo has been started = discharge cap */
/* first
7 or
8 lines after potgo has been started = discharge cap */
if
(
pot_dat_act
[
joy
][
i
]
==
1
)
{
if
(
pot_dat
[
joy
][
i
]
<
(
currprefs
.
ntscmode
?
POTDAT_DELAY_NTSC
:
POTDAT_DELAY_PAL
))
{
charge
=
-
2
;
/* fast discharge delay */
...
...
@@ -2219,13 +1943,13 @@ static void cap_check (void)
/* official Commodore mouse has pull-up resistors in button lines
* NOTE: 3rd party mice may not have pullups! */
if
(
dong
<
0
&&
(
mouse_pullup
&&
mouse_port
[
joy
]
&&
digital_port
[
joy
][
i
])
&&
charge
==
0
)
if
(
dong
<
0
&&
(
is_mouse_pullup
(
joy
)
&&
mouse_port
[
joy
]
&&
digital_port
[
joy
][
i
])
&&
charge
==
0
)
charge
=
2
;
/* emulate pullup resistor if button mapped because there too many broken
* programs that read second button in input-mode (and most 2+ button pads have
* pullups)
*/
if
(
dong
<
0
&&
(
joystick_pullup
&&
digital_port
[
joy
][
i
])
&&
charge
==
0
)
if
(
dong
<
0
&&
(
is_joystick_pullup
(
joy
)
&&
digital_port
[
joy
][
i
])
&&
charge
==
0
)
charge
=
2
;
charge_cap
(
joy
,
i
,
charge
);
...
...
@@ -2263,8 +1987,12 @@ uae_u8 handle_joystick_buttons (uae_u8 pra, uae_u8 dra)
}
}
if
(
inputdevice_logging
&
4
)
write_log
(
"BFE001: %02X:%02X %x
\n
"
,
dra
,
but
,
M68K_GETPC
);
if
(
inputdevice_logging
&
4
)
{
static
uae_u8
old
;
if
(
but
!=
old
)
write_log
(
"BFE001: %02X:%02X %x
\n
"
,
dra
,
but
,
M68K_GETPC
);
old
=
but
;
}
return
but
;
}
...
...
@@ -2369,7 +2097,7 @@ void inputdevice_hsync (void)
iq
->
state
=
0
;
else
iq
->
state
=
iq
->
storedstate
;
handle_input_event
(
iq
->
event
,
iq
->
state
,
iq
->
max
,
0
);
handle_input_event
(
iq
->
event
,
iq
->
state
,
iq
->
max
,
0
,
false
,
true
);
iq
->
linecnt
=
iq
->
nextlinecnt
;
}
}
...
...
@@ -2378,12 +2106,27 @@ void inputdevice_hsync (void)
if
(
bouncy
&&
get_cycles
()
>
bouncy_cycles
)
bouncy
=
0
;
if
((
++
cnt
&
63
)
==
63
)
{
inputdevice_read
();
}
else
if
(
inputdelay
>
0
)
{
inputdelay
--
;
if
(
inputdelay
==
0
)
if
(
input_record
&&
input_record
!=
INPREC_RECORD_PLAYING
)
{
if
(
vpos
==
0
)
inputdevice_read
();
inputdelay
=
0
;
}
if
(
input_play
)
{
inprec_playdiskchange
();
int
nr
,
state
,
max
,
autofire
;
while
(
inprec_playevent
(
&
nr
,
&
state
,
&
max
,
&
autofire
))
handle_input_event
(
nr
,
state
,
max
,
autofire
,
false
,
true
);
//if (vpos == 0)
//handle_msgpump ();
}
if
(
!
input_record
&&
!
input_play
)
{
if
((
++
cnt
&
63
)
==
63
)
{
inputdevice_read
();
}
else
if
(
inputdelay
>
0
)
{
inputdelay
--
;
if
(
inputdelay
==
0
)
inputdevice_read
();
}
}
}
...
...
@@ -2490,7 +2233,7 @@ static void queue_input_event (int event, int state, int max, int linecnt, int a
iq
->
linecnt
=
-
1
;
iq
->
event
=
0
;
if
(
iq
->
state
==
0
)
handle_input_event
(
event
,
0
,
1
,
0
);
handle_input_event
(
event
,
0
,
1
,
0
,
false
,
false
);
}
else
if
(
i
<
0
)
{
for
(
i
=
0
;
i
<
INPUT_QUEUE_SIZE
;
i
++
)
{
iq
=
&
input_queue
[
i
];
...
...
@@ -2566,15 +2309,47 @@ void inputdevice_do_keyboard (int code, int state)
inputdevice_add_inputcode
(
code
,
state
);
}
// these need cpu trace data
static
bool
needcputrace
(
int
code
)
{
switch
(
code
)
{
case
AKS_ENTERGUI
:
case
AKS_STATECAPTURE
:
case
AKS_STATESAVEQUICK
:
case
AKS_STATESAVEQUICK1
:
case
AKS_STATESAVEQUICK2
:
case
AKS_STATESAVEQUICK3
:
case
AKS_STATESAVEQUICK4
:
case
AKS_STATESAVEQUICK5
:
case
AKS_STATESAVEQUICK6
:
case
AKS_STATESAVEQUICK7
:
case
AKS_STATESAVEQUICK8
:
case
AKS_STATESAVEQUICK9
:
case
AKS_STATESAVEDIALOG
:
return
true
;
}
return
false
;
}
void
inputdevice_handle_inputcode
(
void
)
{
static
int
swapperslot
;
int
code
=
inputcode_pending
;
int
state
=
inputcode_pending_state
;
static
int
tracer_enable
;
inputcode_pending
=
0
;
if
(
code
==
0
)
return
;
goto
end
;
if
(
needcputrace
(
code
)
&&
can_cpu_tracer
()
==
true
&&
is_cpu_tracer
()
==
false
&&
!
input_play
&&
!
input_record
)
{
if
(
set_cpu_tracer
(
true
))
{
tracer_enable
=
1
;
return
;
// wait for next frame
}
}
inputcode_pending
=
0
;
if
(
vpos
!=
0
)
write_log
(
"inputcode=%d but vpos = %d"
,
code
,
vpos
);
...
...
@@ -2660,9 +2435,15 @@ void inputdevice_handle_inputcode (void)
break
;
#ifdef SAVESTATE
case
AKS_STATEREWIND
:
savestate_dorewind
(
1
);
#endif
savestate_dorewind
(
-
2
);
break
;
case
AKS_STATECURRENT
:
savestate_dorewind
(
-
1
);
break
;
case
AKS_STATECAPTURE
:
savestate_capture
(
1
);
break
;
#endif
case
AKS_VOLDOWN
:
sound_volume
(
-
1
);
break
;
...
...
@@ -2834,6 +2615,11 @@ void inputdevice_handle_inputcode (void)
break
;
#endif
}
end:
if
(
tracer_enable
)
{
set_cpu_tracer
(
false
);
tracer_enable
=
0
;
}
}
int
handle_custom_event
(
TCHAR
*
custom
)
...
...
@@ -2864,15 +2650,32 @@ int handle_custom_event (TCHAR *custom)
return
0
;
}
int
handle_input_event
(
int
nr
,
int
state
,
int
max
,
int
autofire
)
static
int
handle_input_event
(
int
nr
,
int
state
,
int
max
,
int
autofire
,
bool
canstopplayback
,
bool
playbackevent
)
{
struct
inputevent
*
ie
;
int
joy
;
bool
isaks
=
false
;
if
(
nr
<=
0
)
return
0
;
ie
=
&
events
[
nr
];
if
(
inputdevice_logging
&
1
)
if
(
ie
->
unit
==
0
&&
ie
->
data
>=
0x200
)
isaks
=
true
;
if
(
!
isaks
)
{
if
(
input_record
&&
input_record
!=
INPREC_RECORD_PLAYING
)
inprec_recordevent
(
nr
,
state
,
max
,
autofire
);
if
(
input_play
&&
state
&&
canstopplayback
)
{
if
(
inprec_realtimev
())
{
if
(
input_record
&&
input_record
!=
INPREC_RECORD_PLAYING
)
inprec_recordevent
(
nr
,
state
,
max
,
autofire
);
}
}
if
(
!
playbackevent
&&
input_play
)
return
0
;
}
if
((
inputdevice_logging
&
1
)
||
input_record
||
input_play
)
write_log
(
"'%s' STATE=%d MAX=%d AF=%d
\n
"
,
ie
->
name
,
state
,
max
,
autofire
);
if
(
autofire
)
{
if
(
state
)
...
...
@@ -2930,9 +2733,11 @@ int handle_input_event (int nr, int state, int max, int autofire)
}
if
(
ie
->
data
==
0
&&
old
!=
(
joybutton
[
joy
]
&
(
1
<<
ie
->
data
))
&&
currprefs
.
cpu_cycle_exact
)
{
// emulate contact bounce, 1st button only, others have capacitors
bouncy
=
1
;
bouncy_cycles
=
get_cycles
()
+
CYCLE_UNIT
*
BOUNCY_CYCLES
;
if
(
!
input_record
&&
!
input_play
&&
currprefs
.
input_contact_bounce
)
{
// emulate contact bounce, 1st button only, others have capacitors
bouncy
=
1
;
bouncy_cycles
=
get_cycles
()
+
CYCLE_UNIT
*
currprefs
.
input_contact_bounce
;
}
}
...
...
@@ -3189,9 +2994,13 @@ void inputdevice_vsync (void)
input_frame
++
;
mouseupdate
(
0
,
1
);
inputdevice_read
();
inputdelay
=
rand
()
%
(
maxvpos
<=
1
?
1
:
maxvpos
-
1
);
if
(
!
input_record
)
{
inputdevice_read
();
if
(
!
input_play
)
inputdelay
=
uaerand
()
%
(
maxvpos
<=
1
?
1
:
maxvpos
-
1
);
}
inputdevice_handle_inputcode
();
if
(
mouseedge_alive
>
0
)
mouseedge_alive
--
;
...
...
@@ -3223,6 +3032,7 @@ void inputdevice_reset (void)
// mousehack_reset ();
if
(
inputdevice_is_tablet
())
mousehack_enable
();
bouncy
=
0
;
}
static
int
getoldport
(
struct
uae_input_device
*
id
)
...
...
@@ -3390,6 +3200,10 @@ static void setbuttonstateall (struct uae_input_device *id, struct uae_input_dev
uae_u32
omask
=
id2
->
buttonmask
&
mask
;
uae_u32
nmask
=
(
state
?
1
:
0
)
<<
button
;
if
(
input_play
&&
state
)
inprec_realtimev
();
if
(
input_play
)
return
;
if
(
!
id
->
enabled
)
{
if
(
state
)
switchdevice
(
id
,
button
,
1
);
...
...
@@ -3404,7 +3218,7 @@ static void setbuttonstateall (struct uae_input_device *id, struct uae_input_dev
int
toggle
=
(
id
->
flags
[
ID_BUTTON_OFFSET
+
button
][
sublevdir
[
state
<=
0
?
1
:
0
][
i
]]
&
ID_FLAG_TOGGLE
)
?
1
:
0
;
if
(
state
<
0
)
{
handle_input_event
(
evt
,
1
,
1
,
0
);
handle_input_event
(
evt
,
1
,
1
,
0
,
true
,
false
);
queue_input_event
(
evt
,
0
,
1
,
1
,
0
);
/* send release event next frame */
if
(
i
==
0
)
process_custom_event
(
id
,
ID_BUTTON_OFFSET
+
button
,
state
);
...
...
@@ -3416,12 +3230,12 @@ static void setbuttonstateall (struct uae_input_device *id, struct uae_input_dev
continue
;
id
->
flags
[
ID_BUTTON_OFFSET
+
button
][
sublevdir
[
state
<=
0
?
1
:
0
][
i
]]
^=
ID_FLAG_TOGGLED
;
toggled
=
(
id
->
flags
[
ID_BUTTON_OFFSET
+
button
][
sublevdir
[
state
<=
0
?
1
:
0
][
i
]]
&
ID_FLAG_TOGGLED
)
?
1
:
0
;
handle_input_event
(
evt
,
toggled
,
1
,
autofire
);
handle_input_event
(
evt
,
toggled
,
1
,
autofire
,
true
,
false
);
if
(
i
==
0
)
process_custom_event
(
id
,
ID_BUTTON_OFFSET
+
button
,
toggled
);
}
else
{
if
((
omask
^
nmask
)
&
mask
)
{
handle_input_event
(
evt
,
state
,
1
,
autofire
);
handle_input_event
(
evt
,
state
,
1
,
autofire
,
true
,
false
);
if
(
i
==
0
)
process_custom_event
(
id
,
ID_BUTTON_OFFSET
+
button
,
state
);
}
...
...
@@ -3501,19 +3315,19 @@ static int isanalog (int ei)
static
int
isdigitalbutton
(
int
ei
)
{
if
(
ei
==
INPUTEVENT_JOY1_2ND_BUTTON
)
{
digital_port
[
0
][
0
]
=
1
;
digital_port
[
0
][
1
]
=
1
;
return
1
;
}
if
(
ei
==
INPUTEVENT_JOY1_3RD_BUTTON
)
{
digital_port
[
0
][
1
]
=
1
;
digital_port
[
0
][
0
]
=
1
;
return
1
;
}
if
(
ei
==
INPUTEVENT_JOY2_2ND_BUTTON
)
{
digital_port
[
1
][
0
]
=
1
;
digital_port
[
1
][
1
]
=
1
;
return
1
;
}
if
(
ei
==
INPUTEVENT_JOY2_3RD_BUTTON
)
{
digital_port
[
1
][
1
]
=
1
;
digital_port
[
1
][
0
]
=
1
;
return
1
;
}
return
0
;
...
...
@@ -3530,7 +3344,7 @@ static void scanevents (struct uae_prefs *p)
parport_joystick_enabled
=
0
;
mouse_port
[
0
]
=
mouse_port
[
1
]
=
0
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
i
=
0
;
i
<
NORMAL_JPORTS
;
i
++
)
{
for
(
j
=
0
;
j
<
2
;
j
++
)
{
digital_port
[
i
][
j
]
=
0
;
analog_port
[
i
][
j
]
=
0
;
...
...
@@ -3538,9 +3352,6 @@ static void scanevents (struct uae_prefs *p)
}
}
for
(
i
=
0
;
i
<
MAX_INPUT_DEVICE_EVENTS
;
i
++
)
joydir
[
i
]
=
0
;
for
(
i
=
0
;
i
<
MAX_INPUT_DEVICES
;
i
++
)
{
use_joysticks
[
i
]
=
0
;
use_mice
[
i
]
=
0
;
...
...
@@ -3714,6 +3525,16 @@ static int ip_joy2[] = {
INPUTEVENT_JOY2_FIRE_BUTTON
,
INPUTEVENT_JOY2_2ND_BUTTON
,
-
1
};
static
int
ip_joypad1
[]
=
{
INPUTEVENT_JOY1_LEFT
,
INPUTEVENT_JOY1_RIGHT
,
INPUTEVENT_JOY1_UP
,
INPUTEVENT_JOY1_DOWN
,
INPUTEVENT_JOY1_FIRE_BUTTON
,
INPUTEVENT_JOY1_2ND_BUTTON
,
INPUTEVENT_JOY1_3RD_BUTTON
,
-
1
};
static
int
ip_joypad2
[]
=
{
INPUTEVENT_JOY2_LEFT
,
INPUTEVENT_JOY2_RIGHT
,
INPUTEVENT_JOY2_UP
,
INPUTEVENT_JOY2_DOWN
,
INPUTEVENT_JOY2_FIRE_BUTTON
,
INPUTEVENT_JOY2_2ND_BUTTON
,
INPUTEVENT_JOY2_3RD_BUTTON
,
-
1
};
static
int
ip_joycd321
[]
=
{
INPUTEVENT_JOY1_LEFT
,
INPUTEVENT_JOY1_RIGHT
,
INPUTEVENT_JOY1_UP
,
INPUTEVENT_JOY1_DOWN
,
INPUTEVENT_JOY1_CD32_RED
,
INPUTEVENT_JOY1_CD32_BLUE
,
INPUTEVENT_JOY1_CD32_GREEN
,
INPUTEVENT_JOY1_CD32_YELLOW
,
...
...
@@ -3803,6 +3624,8 @@ static void checkcompakb (int *kb, int *srcmap)
}
j
++
;
}
if
(
srcmap
[
k
]
<
0
)
break
;
j
++
;
k
++
;
}
...
...
@@ -3902,9 +3725,6 @@ static void setcompakb (int *kb, int *srcmap, int index, int af)
}
}
static
int
joymodes
[
MAX_JPORTS
];
static
int
*
joyinputs
[
MAX_JPORTS
];
int
inputdevice_get_compatibility_input
(
struct
uae_prefs
*
prefs
,
int
index
,
int
*
typelist
,
int
**
inputlist
,
int
**
at
)
{
if
(
index
>=
MAX_JPORTS
||
joymodes
[
index
]
<
0
)
...
...
@@ -4151,6 +3971,9 @@ static void setjoyinputs (struct uae_prefs *prefs, int port)
else
joyinputs
[
port
]
=
port
==
1
?
ip_joy2
:
ip_joy1
;
break
;
case
JSEM_MODE_GAMEPAD
:
joyinputs
[
port
]
=
port
?
ip_joypad2
:
ip_joypad1
;
break
;
case
JSEM_MODE_JOYSTICK_CD32
:
joyinputs
[
port
]
=
port
?
ip_joycd322
:
ip_joycd321
;
break
;
...
...
@@ -4243,15 +4066,21 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
{
case
JSEM_MODE_DEFAULT
:
case
JSEM_MODE_JOYSTICK
:
case
JSEM_MODE_GAMEPAD
:
case
JSEM_MODE_JOYSTICK_CD32
:
default:
{
bool
iscd32
=
mode
==
JSEM_MODE_JOYSTICK_CD32
||
(
mode
==
JSEM_MODE_DEFAULT
&&
prefs
->
cs_cd32cd
);
joymodes
[
i
]
=
iscd32
?
JSEM_MODE_JOYSTICK_CD32
:
JSEM_MODE_JOYSTICK
;
if
(
!
iscd32
)
joyinputs
[
i
]
=
i
?
ip_joy2
:
ip_joy1
;
else
if
(
iscd32
)
{
joymodes
[
i
]
=
JSEM_MODE_JOYSTICK_CD32
;
joyinputs
[
i
]
=
i
?
ip_joycd322
:
ip_joycd321
;
}
else
if
(
mode
==
JSEM_MODE_GAMEPAD
)
{
joymodes
[
i
]
=
JSEM_MODE_GAMEPAD
;
joyinputs
[
i
]
=
i
?
ip_joypad2
:
ip_joypad1
;
}
else
{
joymodes
[
i
]
=
JSEM_MODE_JOYSTICK
;
joyinputs
[
i
]
=
i
?
ip_joy2
:
ip_joy1
;
}
break
;
}
case
JSEM_MODE_JOYSTICK_ANALOG
:
...
...
@@ -4329,12 +4158,18 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
{
case
JSEM_MODE_DEFAULT
:
case
JSEM_MODE_JOYSTICK
:
case
JSEM_MODE_GAMEPAD
:
case
JSEM_MODE_JOYSTICK_CD32
:
default:
{
bool
iscd32
=
mode
==
JSEM_MODE_JOYSTICK_CD32
||
(
mode
==
JSEM_MODE_DEFAULT
&&
prefs
->
cs_cd32cd
);
input_get_default_joystick
(
joysticks
,
joy
,
i
,
af
,
iscd32
?
JSEM_MODE_JOYSTICK_CD32
:
0
);
joymodes
[
i
]
=
iscd32
?
JSEM_MODE_JOYSTICK_CD32
:
JSEM_MODE_JOYSTICK
;
input_get_default_joystick
(
joysticks
,
joy
,
i
,
af
,
mode
);
if
(
iscd32
)
joymodes
[
i
]
=
JSEM_MODE_JOYSTICK_CD32
;
else
if
(
mode
==
JSEM_MODE_GAMEPAD
)
joymodes
[
i
]
=
JSEM_MODE_GAMEPAD
;
else
joymodes
[
i
]
=
JSEM_MODE_JOYSTICK
;
break
;
}
case
JSEM_MODE_JOYSTICK_ANALOG
:
...
...
@@ -4364,16 +4199,20 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
if
(
gameports
)
{
// replace possible old mappings with default keyboard mapping
for
(
i
=
KBR_DEFAULT_MAP_
NP
;
i
<=
KBR_DEFAULT_MAP_SE
;
i
++
)
{
for
(
i
=
KBR_DEFAULT_MAP_
FIRST
;
i
<=
KBR_DEFAULT_MAP_LAST
;
i
++
)
{
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_joy2
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_joy1
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_joypad2
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_joypad1
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_parjoy2
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_parjoy1
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_mouse2
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_mouse1
);
}
checkcompakb
(
keyboard_default_kbmaps
[
5
],
ip_joycd321
);
checkcompakb
(
keyboard_default_kbmaps
[
5
],
ip_joycd322
);
for
(
i
=
KBR_DEFAULT_MAP_CD32_FIRST
;
i
<=
KBR_DEFAULT_MAP_CD32_LAST
;
i
++
)
{
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_joycd321
);
checkcompakb
(
keyboard_default_kbmaps
[
i
],
ip_joycd322
);
}
}
for
(
i
=
0
;
i
<
2
;
i
++
)
{
...
...
@@ -4387,16 +4226,22 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
if
(
JSEM_ISNUMPAD
(
i
,
prefs
))
{
if
(
cd32
)
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_CD32_NP
];
else
if
(
mode
==
JSEM_MODE_GAMEPAD
)
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_NP3
];
else
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_NP
];
}
else
if
(
JSEM_ISCURSOR
(
i
,
prefs
))
{
if
(
cd32
)
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_CD32_CK
];
else
if
(
mode
==
JSEM_MODE_GAMEPAD
)
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_CK3
];
else
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_CK
];
}
else
if
(
JSEM_ISSOMEWHEREELSE
(
i
,
prefs
))
{
if
(
cd32
)
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_CD32_SE
];
else
if
(
mode
==
JSEM_MODE_GAMEPAD
)
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_SE3
];
else
kb
=
keyboard_default_kbmaps
[
KBR_DEFAULT_MAP_SE
];
}
else
if
(
JSEM_ISXARCADE1
(
i
,
prefs
))
{
...
...
@@ -4408,11 +4253,15 @@ static void compatibility_copy (struct uae_prefs *prefs, bool gameports)
switch
(
mode
)
{
case
JSEM_MODE_JOYSTICK
:
case
JSEM_MODE_GAMEPAD
:
case
JSEM_MODE_JOYSTICK_CD32
:
case
JSEM_MODE_DEFAULT
:
if
(
cd32
)
{
setcompakb
(
kb
,
i
?
ip_joycd322
:
ip_joycd321
,
i
,
af
);
joymodes
[
i
]
=
JSEM_MODE_JOYSTICK_CD32
;
}
else
if
(
mode
==
JSEM_MODE_GAMEPAD
)
{
setcompakb
(
kb
,
i
?
ip_joypad2
:
ip_joypad1
,
i
,
af
);
joymodes
[
i
]
=
JSEM_MODE_GAMEPAD
;
}
else
{
setcompakb
(
kb
,
i
?
ip_joy2
:
ip_joy1
,
i
,
af
);
joymodes
[
i
]
=
JSEM_MODE_JOYSTICK
;
...
...
@@ -4619,36 +4468,21 @@ bool inputdevice_set_gameports_mapping (struct uae_prefs *prefs, int devnum, int
return
true
;
}
void
inputdevice_updateconfig
(
struct
uae_prefs
*
prefs
)
static
void
resetinput
(
void
)
{
int
i
;
copyjport
(
&
changed_prefs
,
&
currprefs
,
0
);
copyjport
(
&
changed_prefs
,
&
currprefs
,
1
);
copyjport
(
&
changed_prefs
,
&
currprefs
,
2
);
copyjport
(
&
changed_prefs
,
&
currprefs
,
3
);
#ifdef RETROPLATFORM
rp_input_change
(
0
);
rp_input_change
(
1
);
rp_input_change
(
2
);
rp_input_change
(
3
);
for
(
i
=
0
;
i
<
MAX_JPORTS
;
i
++
)
rp_update_gameport
(
i
,
-
1
,
0
);
#endif
joybutton
[
0
]
=
joybutton
[
1
]
=
0
;
joydir
[
0
]
=
joydir
[
1
]
=
0
;
oldmx
[
0
]
=
oldmx
[
1
]
=
-
1
;
oldmy
[
0
]
=
oldmy
[
1
]
=
-
1
;
if
((
input_play
||
input_record
)
&&
hsync_counter
>
0
)
return
;
cd32_shifter
[
0
]
=
cd32_shifter
[
1
]
=
8
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
MAX_JPORTS
;
i
++
)
{
oleft
[
i
]
=
0
;
oright
[
i
]
=
0
;
otop
[
i
]
=
0
;
obot
[
i
]
=
0
;
}
for
(
i
=
0
;
i
<
MAX_INPUT_DEVICES
;
i
++
)
{
oldmx
[
i
]
=
-
1
;
oldmy
[
i
]
=
-
1
;
joybutton
[
i
]
=
0
;
joydir
[
i
]
=
0
;
mouse_deltanoreset
[
i
][
0
]
=
0
;
mouse_delta
[
i
][
0
]
=
0
;
mouse_deltanoreset
[
i
][
1
]
=
0
;
...
...
@@ -4656,8 +4490,7 @@ void inputdevice_updateconfig (struct uae_prefs *prefs)
mouse_deltanoreset
[
i
][
2
]
=
0
;
mouse_delta
[
i
][
2
]
=
0
;
}
memset
(
keybuf
,
0
,
sizeof
(
keybuf
));
memset
(
keybuf
,
0
,
sizeof
keybuf
);
for
(
i
=
0
;
i
<
INPUT_QUEUE_SIZE
;
i
++
)
input_queue
[
i
].
linecnt
=
input_queue
[
i
].
nextlinecnt
=
-
1
;
...
...
@@ -4665,6 +4498,27 @@ void inputdevice_updateconfig (struct uae_prefs *prefs)
sublevdir
[
0
][
i
]
=
i
;
sublevdir
[
1
][
i
]
=
MAX_INPUT_SUB_EVENT
-
i
-
1
;
}
}
void
inputdevice_updateconfig
(
struct
uae_prefs
*
prefs
)
{
int
i
;
copyjport
(
&
changed_prefs
,
&
currprefs
,
0
);
copyjport
(
&
changed_prefs
,
&
currprefs
,
1
);
copyjport
(
&
changed_prefs
,
&
currprefs
,
2
);
copyjport
(
&
changed_prefs
,
&
currprefs
,
3
);
#ifdef RETROPLATFORM
rp_input_change
(
0
);
rp_input_change
(
1
);
rp_input_change
(
2
);
rp_input_change
(
3
);
for
(
i
=
0
;
i
<
MAX_JPORTS
;
i
++
)
rp_update_gameport
(
i
,
-
1
,
0
);
#endif
resetinput
();
joysticks
=
prefs
->
joystick_settings
[
prefs
->
input_selected_setting
];
mice
=
prefs
->
mouse_settings
[
prefs
->
input_selected_setting
];
...
...
@@ -4827,6 +4681,7 @@ static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int state
if
(
!
keyboards
||
scancode
<
0
)
return
handled
;
j
=
0
;
while
(
j
<
MAX_INPUT_DEVICE_EVENTS
&&
na
->
extra
[
j
]
>=
0
)
{
if
(
na
->
extra
[
j
]
==
scancode
)
{
...
...
@@ -4856,9 +4711,9 @@ static int inputdevice_translatekeycode_2 (int keyboard, int scancode, int state
continue
;
na
->
flags
[
j
][
sublevdir
[
state
==
0
?
1
:
0
][
k
]]
^=
ID_FLAG_TOGGLED
;
toggled
=
(
na
->
flags
[
j
][
sublevdir
[
state
==
0
?
1
:
0
][
k
]]
&
ID_FLAG_TOGGLED
)
?
1
:
0
;
handled
|=
handle_input_event
(
evt
,
toggled
,
1
,
autofire
);
handled
|=
handle_input_event
(
evt
,
toggled
,
1
,
autofire
,
true
,
false
);
}
else
{
handled
|=
handle_input_event
(
evt
,
state
,
1
,
autofire
);
handled
|=
handle_input_event
(
evt
,
state
,
1
,
autofire
,
true
,
false
);
}
}
process_custom_event
(
na
,
j
,
state
);
...
...
@@ -4923,9 +4778,7 @@ void inputdevice_close (void)
idev
[
IDTYPE_JOYSTICK
].
close
();
idev
[
IDTYPE_MOUSE
].
close
();
idev
[
IDTYPE_KEYBOARD
].
close
();
#ifdef INPREC
inprec_close
();
#endif
inprec_close
(
true
);
}
static
struct
uae_input_device
*
get_uid
(
const
struct
inputdevice_functions
*
id
,
int
devnum
)
...
...
@@ -5651,13 +5504,17 @@ void setjoystickstate (int joy, int axis, int state, int max)
v2
=
0
;
if
(
v1
==
v2
)
return
;
if
(
input_play
&&
state
)
inprec_realtimev
();
if
(
input_play
)
return
;
if
(
!
joysticks
[
joy
].
enabled
)
{
if
(
v1
)
switchdevice
(
&
joysticks
[
joy
],
axis
*
2
+
(
v1
<
0
?
0
:
1
),
0
);
return
;
}
for
(
i
=
0
;
i
<
MAX_INPUT_SUB_EVENT
;
i
++
)
handle_input_event
(
id
->
eventid
[
ID_AXIS_OFFSET
+
axis
][
i
],
state
,
max
,
id
->
flags
[
ID_AXIS_OFFSET
+
axis
][
i
]
&
ID_FLAG_AUTOFIRE
);
handle_input_event
(
id
->
eventid
[
ID_AXIS_OFFSET
+
axis
][
i
],
state
,
max
,
id
->
flags
[
ID_AXIS_OFFSET
+
axis
][
i
]
&
ID_FLAG_AUTOFIRE
,
true
,
false
);
id2
->
states
[
axis
]
=
state
;
}
int
getjoystickstate
(
int
joy
)
...
...
@@ -5681,6 +5538,8 @@ void setmousestate (int mouse, int axis, int data, int isabs)
inputdevice_testrecord
(
IDTYPE_MOUSE
,
mouse
,
IDEV_WIDGET_AXIS
,
axis
,
0
);
return
;
}
if
(
input_play
)
return
;
if
(
!
mice
[
mouse
].
enabled
)
{
if
(
isabs
&&
currprefs
.
input_tablet
>
0
)
{
if
(
axis
==
0
)
...
...
@@ -5721,7 +5580,7 @@ void setmousestate (int mouse, int axis, int data, int isabs)
v
+=
diff
;
fract
[
mouse
][
axis
]
-=
diff
;
for
(
i
=
0
;
i
<
MAX_INPUT_SUB_EVENT
;
i
++
)
handle_input_event
(
id
->
eventid
[
ID_AXIS_OFFSET
+
axis
][
i
],
v
,
0
,
0
);
handle_input_event
(
id
->
eventid
[
ID_AXIS_OFFSET
+
axis
][
i
],
v
,
0
,
0
,
true
,
false
);
}
int
getmousestate
(
int
joy
)
...
...
src/inputevents.def
View file @
b7de61b2
...
...
@@ -314,7 +314,11 @@ DEFEVENT(SPC_PAUSE,"Pause emulation",AM_K,0,0,AKS_PAUSE)
DEFEVENT(SPC_WARP,"Warp mode",AM_K,0,0,AKS_WARP)
DEFEVENT(SPC_INHIBITSCREEN,"Toggle screen updates",AM_K,0,0,AKS_INHIBITSCREEN)
DEFEVENT(SPC_IRQ7,"Level 7 interrupt",AM_K,0,0,AKS_IRQ7)
DEFEVENT(SPC_STATEREWIND,"Load previous state capture",AM_K,0,0,AKS_STATEREWIND)
DEFEVENT(SPC_STATEREWIND,"Load previous state capture checkpoint",AM_K,0,0,AKS_STATEREWIND)
DEFEVENT(SPC_STATECURRENT,"Load current state capture checkpoint",AM_K,0,0,AKS_STATECURRENT)
DEFEVENT(SPC_STATECAPTURE,"Save state capture checkpoint",AM_K,0,0,AKS_STATECAPTURE)
DEFEVENT(SPC_VOLUME_DOWN,"Decrease volume level",AM_K,0,0,AKS_VOLDOWN)
DEFEVENT(SPC_VOLUME_UP,"Increase volume level",AM_K,0,0,AKS_VOLUP)
DEFEVENT(SPC_VOLUME_MUTE,"Mute/unmute volume",AM_K,0,0,AKS_VOLMUTE)
...
...
@@ -336,12 +340,6 @@ DEFEVENT(SPC_TOGGLEMOUSEGRAB,"Toggle between mouse grabbed and un-grabbed",AM_K,
DEFEVENT(SPC_DECREASE_REFRESHRATE,"Decrease emulation speed",AM_K,0,0,AKS_DECREASEREFRESHRATE)
DEFEVENT(SPC_INCREASE_REFRESHRATE,"Increase emulation speed",AM_K,0,0,AKS_INCREASEREFRESHRATE)
DEFEVENT(SPC_SWITCHINTERPOL,"Switch between audio interpolation methods",AM_K,0,0,AKS_SWITCHINTERPOL)
DEFEVENT(SPC_GLPANLEFT,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANLEFT) /*Koko*/
DEFEVENT(SPC_GLPANRIGHT,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANRIGHT) /*Koko*/
DEFEVENT(SPC_GLPANUP,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANUP) /*Koko*/
DEFEVENT(SPC_GLPANDOWN,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANDOWN) /*Koko*/
DEFEVENT(SPC_GLPANSCANMORE,"ZoomIn opengl texture",AM_K,0,0,AKS_GLPANSCANMORE) /*Koko*/
DEFEVENT(SPC_GLPANSCANLESS,"ZoomOut opengl texture",AM_K,0,0,AKS_GLPANSCANLESS) /*Koko*/
DEFEVENT(SPC_DISKSWAPPER_NEXT,"Next slot in Disk Swapper",AM_K,0,0,AKS_DISKSWAPPER_NEXT)
DEFEVENT(SPC_DISKSWAPPER_PREV,"Previous slot in Disk Swapper",AM_K,0,0,AKS_DISKSWAPPER_PREV)
...
...
@@ -377,3 +375,9 @@ DEFEVENT(SPC_CDTV_FRONT_PANEL_NEXT,"CDTV Front Panel Next",AM_K,0,0,AKS_CDTV_FRO
DEFEVENT(SPC_CDTV_FRONT_PANEL_REW,"CDTV Front Panel Rewind",AM_K,0,0,AKS_CDTV_FRONT_PANEL_REW)
DEFEVENT(SPC_CDTV_FRONT_PANEL_FF,"CDTV Front Panel Fast Forward",AM_K,0,0,AKS_CDTV_FRONT_PANEL_FF)
DEFEVENT(SPC_GLPANLEFT,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANLEFT) /*Koko*/
DEFEVENT(SPC_GLPANRIGHT,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANRIGHT) /*Koko*/
DEFEVENT(SPC_GLPANUP,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANUP) /*Koko*/
DEFEVENT(SPC_GLPANDOWN,"Pan opengl texture to the left",AM_K,0,0,AKS_GLPANDOWN) /*Koko*/
DEFEVENT(SPC_GLPANSCANMORE,"ZoomIn opengl texture",AM_K,0,0,AKS_GLPANSCANMORE) /*Koko*/
DEFEVENT(SPC_GLPANSCANLESS,"ZoomOut opengl texture",AM_K,0,0,AKS_GLPANSCANLESS) /*Koko*/
src/inputrecord.c
View file @
b7de61b2
...
...
@@ -11,6 +11,8 @@
#define ENABLE_DEBUGGER 0
#define HEADERSIZE 12
#define TRUE 1
#define FALSE 0
#include "sysconfig.h"
#include "sysdeps.h"
...
...
@@ -162,6 +164,7 @@ static int inprec_pstart (uae_u8 type)
static
uae_u8
*
lastp
;
uae_u32
hc_orig
,
hc2_orig
;
int
mvp
=
current_maxvpos
();
unsigned
int
i
;
if
(
!
input_play
||
!
inprec_zf
)
return
0
;
...
...
@@ -228,7 +231,7 @@ static int inprec_pstart (uae_u8 type)
if
(
cycles
!=
cycles2
+
cycleoffset
)
{
if
(
warned
>
0
)
{
warned
--
;
for
(
i
nt
i
=
0
;
i
<
7
;
i
++
)
for
(
i
=
0
;
i
<
7
;
i
++
)
write_log
(
"%08x (%08x) "
,
pcs
[
i
],
pcs2
[
i
]);
write_log
(
"
\n
"
);
}
...
...
@@ -316,9 +319,9 @@ static int inprec_pstr (TCHAR *dst)
len
++
;
}
if
(
tmp
[
0
])
{
TCHAR
*
d
=
utf8u
(
tmp
);
_tcscpy
(
dst
,
d
);
xfree
(
d
);
//
TCHAR *d = utf8u (tmp);
_tcscpy
(
dst
,
tmp
);
//
xfree (d);
}
return
len
;
}
...
...
@@ -342,7 +345,7 @@ int inprec_open (const TCHAR *fname, const TCHAR *statefilename)
inprec_close
(
false
);
if
(
fname
==
NULL
)
inprec_zf
=
zfile_fopen_empty
(
NULL
,
"inp"
);
inprec_zf
=
zfile_fopen_empty
(
NULL
,
"inp"
,
false
);
else
inprec_zf
=
zfile_fopen
(
fname
,
input_record
?
"wb"
:
"rb"
,
ZFD_NORMAL
);
if
(
inprec_zf
==
NULL
)
...
...
@@ -516,14 +519,14 @@ void inprec_close (bool clear)
static
void
setwriteprotect
(
const
TCHAR
*
fname
,
bool
readonly
)
{
struct
_
stat64
st
;
struct
stat64
st
;
int
mode
,
oldmode
;
if
(
stat
(
fname
,
&
st
))
return
;
oldmode
=
mode
=
st
.
st_mode
;
mode
&=
~
FILEFLAG_WRITE
;
mode
&=
~
0x04
;
if
(
!
readonly
)
mode
|=
FILEFLAG_WRITE
;
mode
|=
0x04
;
if
(
mode
!=
oldmode
)
chmod
(
fname
,
mode
);
}
...
...
@@ -615,6 +618,8 @@ void inprec_playdebug_cpu (int mode)
{
#if INPUTRECORD_DEBUG > 0
int
err
=
0
;
unsigned
int
i
;
if
(
inprec_pstart
(
INPREC_DEBUG2
))
{
uae_u32
pc1
=
m68k_getpc
();
uae_u32
pc2
=
inprec_pu32
();
...
...
@@ -624,7 +629,7 @@ void inprec_playdebug_cpu (int mode)
if
(
warned
>
0
)
{
warned
--
;
write_log
(
"SYNC ERROR2 PC %08x != %08x
\n
"
,
pc1
,
pc2
);
for
(
i
nt
i
=
0
;
i
<
15
;
i
++
)
for
(
i
=
0
;
i
<
15
;
i
++
)
write_log
(
"%08x "
,
pcs
[
i
]);
write_log
(
"
\n
"
);
...
...
@@ -640,7 +645,7 @@ void inprec_playdebug_cpu (int mode)
if
(
warned
>
0
)
{
warned
--
;
write_log
(
"SYNC ERROR2 %08x != %08x
\n
"
,
v1
,
v2
);
for
(
i
nt
i
=
0
;
i
<
15
;
i
++
)
for
(
i
=
0
;
i
<
15
;
i
++
)
write_log
(
"%08x "
,
pcs
[
i
]);
write_log
(
"
\n
"
);
}
...
...
@@ -757,7 +762,7 @@ void inprec_playtorecord (void)
input_play
=
INPREC_PLAY_RERECORD
;
input_record
=
INPREC_RECORD_PLAYING
;
zfile_fclose
(
inprec_zf
);
inprec_zf
=
zfile_fopen_empty
(
NULL
,
"inp"
);
inprec_zf
=
zfile_fopen_empty
(
NULL
,
"inp"
,
false
);
zfile_fwrite
(
inprec_buffer
,
header_end2
,
1
,
inprec_zf
);
uae_u8
*
p
=
inprec_buffer
+
header_end2
;
uae_u8
*
end
=
inprec_buffer
+
inprec_size
;
...
...
@@ -768,7 +773,7 @@ void inprec_playtorecord (void)
}
zfile_fwrite
(
inprec_buffer
+
header_end2
,
inprec_size
-
header_end2
,
1
,
inprec_zf
);
inprec_realtime
(
false
);
savestate_capture_request
();
//
savestate_capture_request ();
}
void
inprec_setposition
(
int
offset
,
int
replaycounter
)
...
...
@@ -801,7 +806,7 @@ static void savelog (const TCHAR *path, const TCHAR *file)
_tcscpy
(
tmp
,
path
);
_tcscat
(
tmp
,
file
);
_tcscat
(
tmp
,
".log.txt"
);
struct
zfile
*
zfd
=
zfile_fopen
(
tmp
,
"wb"
);
struct
zfile
*
zfd
=
zfile_fopen
(
tmp
,
"wb"
,
0
);
if
(
zfd
)
{
int
loglen
;
uae_u8
*
log
;
...
...
@@ -842,7 +847,7 @@ static int savedisk (const TCHAR *path, const TCHAR *file, uae_u8 *data, uae_u8
_tcscat
(
filename
,
"."
);
getfilepart
(
filename
+
_tcslen
(
filename
),
MAX_DPATH
,
zfile_getname
(
zf
));
_tcscat
(
tmp
,
filename
);
struct
zfile
*
zfd
=
zfile_fopen
(
tmp
,
"wb"
);
struct
zfile
*
zfd
=
zfile_fopen
(
tmp
,
"wb"
,
0
);
if
(
zfd
)
{
int
size
=
zfile_size
(
zf
);
uae_u8
*
data
=
zfile_getdata
(
zf
,
0
,
size
);
...
...
@@ -914,7 +919,7 @@ void inprec_save (const TCHAR *filename, const TCHAR *statefilename)
}
}
bool
inprec_realtime
(
void
)
bool
inprec_realtime
v
(
void
)
{
if
(
input_record
!=
INPREC_RECORD_PLAYING
||
input_play
!=
INPREC_PLAY_RERECORD
)
return
false
;
...
...
src/keybuf.c
View file @
b7de61b2
...
...
@@ -48,11 +48,7 @@ int get_next_key (void)
int
record_key
(
int
kc
)
{
#ifdef INPREC
if
(
input_recording
<
0
||
pause_emulation
)
#else
if
(
pause_emulation
)
#endif
return
0
;
return
record_key_direct
(
kc
);
}
...
...
src/main.c
View file @
b7de61b2
...
...
@@ -77,6 +77,9 @@ TCHAR warning_buffer[256];
TCHAR
optionsfile
[
256
];
static
uae_u32
randseed
;
static
int
oldhcounter
;
static
void
hr
(
void
)
{
write_log
(
"------------------------------------------------------------------------------------
\n
"
);
...
...
@@ -103,9 +106,27 @@ static void show_version_full (void)
hr
();
}
int
uaerand
(
void
)
uae_u32
uaesrand
(
uae_u32
seed
)
{
oldhcounter
=
-
1
;
randseed
=
seed
;
//randseed = 0x12345678;
//write_log (L"seed=%08x\n", randseed);
return
randseed
;
}
uae_u32
uaerand
(
void
)
{
return
rand
();
if
(
oldhcounter
!=
hsync_counter
)
{
srand
(
hsync_counter
^
randseed
);
oldhcounter
=
hsync_counter
;
}
uae_u32
r
=
rand
();
//write_log (L"rand=%08x\n", r);
return
r
;
}
uae_u32
uaerandgetseed
(
void
)
{
return
randseed
;
}
void
discard_prefs
(
struct
uae_prefs
*
p
,
int
type
)
...
...
@@ -452,6 +473,10 @@ static int default_config;
void
uae_reset
(
int
hardreset
)
{
if
(
debug_dma
)
{
record_dma_reset
();
record_dma_reset
();
}
currprefs
.
quitstatefile
[
0
]
=
changed_prefs
.
quitstatefile
[
0
]
=
0
;
if
(
quit_program
==
0
)
{
...
...
src/misc.c
View file @
b7de61b2
...
...
@@ -633,6 +633,48 @@ uae_u8 *save_log (int bootlog, int *len)
return
dst
;
}
void
stripslashes
(
TCHAR
*
p
)
{
while
(
_tcslen
(
p
)
>
0
&&
(
p
[
_tcslen
(
p
)
-
1
]
==
'\\'
||
p
[
_tcslen
(
p
)
-
1
]
==
'/'
))
p
[
_tcslen
(
p
)
-
1
]
=
0
;
}
void
fixtrailing
(
TCHAR
*
p
)
{
if
(
_tcslen
(
p
)
==
0
)
return
;
if
(
p
[
_tcslen
(
p
)
-
1
]
==
'/'
||
p
[
_tcslen
(
p
)
-
1
]
==
'\\'
)
return
;
_tcscat
(
p
,
"
\\
"
);
}
void
getpathpart
(
TCHAR
*
outpath
,
int
size
,
const
TCHAR
*
inpath
)
{
_tcscpy
(
outpath
,
inpath
);
TCHAR
*
p
=
_tcsrchr
(
outpath
,
'\\'
);
if
(
p
)
p
[
0
]
=
0
;
fixtrailing
(
outpath
);
}
void
getfilepart
(
TCHAR
*
out
,
int
size
,
const
TCHAR
*
path
)
{
out
[
0
]
=
0
;
const
TCHAR
*
p
=
_tcsrchr
(
path
,
'\\'
);
if
(
p
)
_tcscpy
(
out
,
p
+
1
);
else
_tcscpy
(
out
,
path
);
}
void
refreshtitle
(
void
)
{
/*
if (isfullscreen () == 0)
setmaintitle (hMainWnd);
*/
}
// win32gui.c
#define MAX_ROM_PATHS 10
int
scan_roms
(
int
show
)
...
...
@@ -802,6 +844,14 @@ void fetch_ripperpath (TCHAR *out, int size)
{
fetch_path
(
"RipperPath"
,
out
,
size
);
}
void
fetch_statefilepath
(
TCHAR
*
out
,
int
size
)
{
fetch_path
(
"StatefilePath"
,
out
,
size
);
}
void
fetch_inputfilepath
(
TCHAR
*
out
,
int
size
)
{
fetch_path
(
"InputPath"
,
out
,
size
);
}
void
fetch_datapath
(
TCHAR
*
out
,
int
size
)
{
fetch_path
(
NULL
,
out
,
size
);
...
...
@@ -854,7 +904,15 @@ void debugger_change (int mode)
// unicode.c
char
*
ua
(
const
TCHAR
*
s
)
{
return
s
;
return
s
;
}
char
*
uutf8
(
const
char
*
s
)
{
return
s
;
}
char
*
utf8u
(
const
char
*
s
)
{
return
s
;
}
// fsdb_mywin32.c
...
...
@@ -1146,7 +1204,7 @@ void my_kbd_handler (int keyboard, int scancode, int newstate)
if
(
specialpressed
())
return
;
write_log
(
"kbd = %d, scancode = %d, state = %d
\n
"
,
keyboard
,
scancode
,
newstate
);
//
write_log ("kbd = %d, scancode = %d, state = %d\n", keyboard, scancode, newstate );
inputdevice_translatekeycode
(
keyboard
,
scancode
,
newstate
);
}
...
...
src/newcpu.c
View file @
b7de61b2
...
...
@@ -828,10 +828,8 @@ bool set_cpu_tracer (bool state)
if
(
cpu_tracer
<
0
)
return
false
;
int
old
=
cpu_tracer
;
#ifdef INPREC
if
(
input_record
)
state
=
true
;
#endif
cpu_tracer
=
0
;
if
(
state
&&
can_cpu_tracer
())
{
cpu_tracer
=
1
;
...
...
@@ -2318,14 +2316,12 @@ STATIC_INLINE void do_interrupt (int nr)
if
(
debug_dma
)
record_dma_event
(
DMA_EVENT_CPUIRQ
,
current_hpos
(),
vpos
);
#endif
#ifdef INPREC
if
(
inputrecord_debug
&
2
)
{
if
(
input_record
>
0
)
inprec_recorddebug_cpu
(
2
);
else
if
(
input_play
>
0
)
inprec_playdebug_cpu
(
2
);
}
#endif
regs
.
stopped
=
0
;
unset_special
(
SPCFLAG_STOP
);
...
...
@@ -3509,14 +3505,12 @@ static void m68k_run_1_ce (void)
cputrace
.
cyclecounter
=
cputrace
.
cyclecounter_pre
=
cputrace
.
cyclecounter_post
=
0
;
cputrace
.
readcounter
=
cputrace
.
writecounter
=
0
;
}
#ifdef INPREC
if
(
inputrecord_debug
&
4
)
{
if
(
input_record
>
0
)
inprec_recorddebug_cpu
(
1
);
else
if
(
input_play
>
0
)
inprec_playdebug_cpu
(
1
);
}
#endif
(
*
cpufunctbl
[
opcode
])(
opcode
);
if
(
cpu_tracer
)
{
...
...
@@ -3837,14 +3831,12 @@ static void m68k_run_2ce (void)
cputrace
.
cyclecounter
=
cputrace
.
cyclecounter_pre
=
cputrace
.
cyclecounter_post
=
0
;
cputrace
.
readcounter
=
cputrace
.
writecounter
=
0
;
}
#ifdef INPREC
if
(
inputrecord_debug
&
4
)
{
if
(
input_record
>
0
)
inprec_recorddebug_cpu
(
1
);
else
if
(
input_play
>
0
)
inprec_playdebug_cpu
(
1
);
}
#endif
docodece020
(
opcode
);
...
...
@@ -3989,7 +3981,6 @@ void m68k_go (int may_quit)
cputrace
.
state
=
-
1
;
#ifdef INPREC
if
(
currprefs
.
inprecfile
[
0
]
&&
input_play
)
{
inprec_open
(
currprefs
.
inprecfile
,
NULL
);
changed_prefs
.
inprecfile
[
0
]
=
currprefs
.
inprecfile
[
0
]
=
0
;
...
...
@@ -3997,7 +3988,6 @@ void m68k_go (int may_quit)
}
if
(
input_play
||
input_record
)
inprec_startup
();
#endif
if
(
quit_program
>
0
)
{
int
hardreset
=
(
quit_program
==
3
?
1
:
0
)
|
hardboot
;
...
...
@@ -4045,12 +4035,9 @@ void m68k_go (int may_quit)
if
(
!
restored
||
hsync_counter
==
0
)
savestate_check
();
#ifdef INPREC
if
(
input_record
==
INPREC_RECORD_START
)
input_record
=
INPREC_RECORD_NORMAL
;
#endif
}
else
{
#ifdef INPREC
if
(
input_record
==
INPREC_RECORD_START
)
{
input_record
=
INPREC_RECORD_NORMAL
;
savestate_init
();
...
...
@@ -4058,13 +4045,10 @@ void m68k_go (int may_quit)
vsync_counter
=
0
;
savestate_check
();
}
#endif
}
#ifdef INPREC
if
(
changed_prefs
.
inprecfile
[
0
]
&&
input_record
)
inprec_prepare_record
(
savestate_fname
[
0
]
?
savestate_fname
:
NULL
);
#endif
set_cpu_tracer
(
false
);
#ifdef DEBUGGER
...
...
src/savestate.c
View file @
b7de61b2
...
...
@@ -708,9 +708,7 @@ void savestate_initsave (const TCHAR *filename, int mode, int nodialogs, bool sa
new_blitter
=
false
;
if
(
save
)
{
savestate_free
();
#ifdef INPREC
inprec_close
(
true
);
#endif
}
}
...
...
@@ -1060,10 +1058,8 @@ void savestate_quick (int slot, int save)
bool
savestate_check
(
void
)
{
if
(
vpos
==
0
&&
!
savestate_state
)
{
#ifdef INPREC
if
(
hsync_counter
==
0
&&
input_play
==
INPREC_PLAY_NORMAL
)
savestate_memorysave
();
#endif
savestate_capture
(
0
);
}
if
(
savestate_state
==
STATE_DORESTORE
)
{
...
...
@@ -1239,9 +1235,7 @@ void savestate_rewind (void)
uae_reset
(
0
);
return
;
}
#ifdef INPREC
inprec_setposition
(
st
->
inprecoffset
,
pos
);
#endif
write_log
(
"state %d restored. (%010d/%03d)
\n
"
,
pos
,
hsync_counter
,
vsync_counter
);
if
(
rewind
)
{
replaycounter
--
;
...
...
@@ -1285,7 +1279,6 @@ void savestate_capture (int force)
#endif
if
(
!
staterecords
)
return
;
#ifdef INPREC
if
(
!
input_record
)
return
;
if
(
currprefs
.
statecapturerate
&&
hsync_counter
==
0
&&
input_record
==
INPREC_RECORD_START
&&
savestate_first_capture
>
0
)
{
...
...
@@ -1296,7 +1289,6 @@ void savestate_capture (int force)
force
=
true
;
firstcapture
=
false
;
}
#endif
if
(
!
force
)
{
if
(
currprefs
.
statecapturerate
<=
0
)
return
;
...
...
@@ -1598,9 +1590,7 @@ retry2:
save_u32_func
(
&
p
,
tlen
);
st
->
end
=
p
;
st
->
inuse
=
1
;
#ifdef INPREC
st
->
inprecoffset
=
inprec_getposition
();
#endif
replaycounter
++
;
if
(
replaycounter
>=
staterecords_max
)
...
...
@@ -1618,19 +1608,13 @@ retry2:
if
(
firstcapture
)
{
savestate_memorysave
();
#ifdef INPREC
input_record
++
;
#endif
for
(
i
=
0
;
i
<
4
;
i
++
)
{
bool
wp
=
true
;
DISK_validate_filename
(
currprefs
.
floppyslots
[
i
].
df
,
false
,
&
wp
,
NULL
,
NULL
);
#ifdef INPREC
inprec_recorddiskchange
(
i
,
currprefs
.
floppyslots
[
i
].
df
,
wp
);
#endif
}
#ifdef INPREC
input_record
--
;
#endif
}
...
...
@@ -1660,7 +1644,6 @@ void savestate_init (void)
staterecords_max
=
currprefs
.
statecapturebuffersize
;
staterecords
=
xcalloc
(
struct
staterecord
*
,
staterecords_max
);
statefile_alloc
=
STATEFILE_ALLOC_SIZE
;
#ifdef INPREC
if
(
input_record
&&
savestate_state
!=
STATE_DORESTORE
)
{
zfile_fclose
(
staterecord_statefile
);
staterecord_statefile
=
NULL
;
...
...
@@ -1668,7 +1651,6 @@ void savestate_init (void)
inprec_open
(
NULL
,
NULL
);
savestate_first_capture
=
1
;
}
#endif
}
...
...
src/zfile.c
View file @
b7de61b2
...
...
@@ -10,6 +10,7 @@
#define ZLIB_WINAPI
#define RECURSIVE_ARCHIVES 1
//#define ZFILE_DEBUG
#define FSDB_DIR_SEPARATOR_S "\\"
#include "sysconfig.h"
#include "sysdeps.h"
...
...
@@ -1839,9 +1840,11 @@ struct zfile *zfile_fopen_empty (struct zfile *prev, const TCHAR *name, uae_u64
}
l
->
size
=
size
;
l
->
datasize
=
size
;
l
->
allocsize
=
size
;
}
else
{
l
->
data
=
xcalloc
(
uae_u8
,
1
);
l
->
data
=
xcalloc
(
uae_u8
,
1
000
);
l
->
size
=
0
;
l
->
allocsize
=
1000
;
}
return
l
;
}
...
...
@@ -1885,6 +1888,24 @@ struct zfile *zfile_fopen_data (const TCHAR *name, uae_u64 size, uae_u8 *data)
return
l
;
}
int
zfile_truncate
(
struct
zfile
*
z
,
uae_s64
size
)
{
if
(
z
->
data
)
{
if
(
z
->
size
>
size
)
{
z
->
size
=
size
;
if
(
z
->
datasize
>
z
->
size
)
z
->
datasize
=
z
->
size
;
if
(
z
->
seek
>
z
->
size
)
z
->
seek
=
z
->
size
;
return
1
;
}
return
0
;
}
else
{
/* !!! */
return
0
;
}
}
uae_s64
zfile_size
(
struct
zfile
*
z
)
{
return
z
->
size
;
...
...
@@ -1983,12 +2004,25 @@ size_t zfile_fwrite (void *b, size_t l1, size_t l2, struct zfile *z)
return
0
;
if
(
z
->
data
)
{
int
off
=
z
->
seek
+
l1
*
l2
;
if
(
off
>
z
->
size
)
{
z
->
data
=
xrealloc
(
uae_u8
,
z
->
data
,
off
);
if
(
z
->
allocsize
==
0
)
{
write_log
(
"zfile_fwrite(data,%s) but allocsize=0!
\n
"
,
z
->
name
);
return
0
;
}
if
(
off
>
z
->
allocsize
)
{
if
(
z
->
allocsize
<
off
)
z
->
allocsize
=
off
;
z
->
allocsize
+=
z
->
size
/
2
;
if
(
z
->
allocsize
<
10000
)
z
->
allocsize
=
10000
;
z
->
data
=
xrealloc
(
uae_u8
,
z
->
data
,
z
->
allocsize
);
z
->
datasize
=
z
->
size
=
off
;
}
memcpy
(
z
->
data
+
z
->
seek
,
b
,
l1
*
l2
);
z
->
seek
+=
l1
*
l2
;
if
(
z
->
seek
>
z
->
size
)
z
->
size
=
z
->
seek
;
if
(
z
->
size
>
z
->
datasize
)
z
->
datasize
=
z
->
size
;
return
l2
;
}
return
fwrite
(
b
,
l1
,
l2
,
z
->
f
);
...
...
@@ -2089,7 +2123,7 @@ int zfile_ferror (struct zfile *z)
uae_u8
*
zfile_getdata
(
struct
zfile
*
z
,
uae_s64
offset
,
int
len
)
{
uae_s64
pos
;
uae_s64
pos
=
zfile_ftell
(
z
)
;
uae_u8
*
b
;
if
(
len
<
0
)
{
zfile_fseek
(
z
,
0
,
SEEK_END
);
...
...
@@ -2097,7 +2131,6 @@ uae_u8 *zfile_getdata (struct zfile *z, uae_s64 offset, int len)
zfile_fseek
(
z
,
0
,
SEEK_SET
);
}
b
=
xmalloc
(
uae_u8
,
len
);
pos
=
zfile_ftell
(
z
);
zfile_fseek
(
z
,
offset
,
SEEK_SET
);
zfile_fread
(
b
,
len
,
1
,
z
);
zfile_fseek
(
z
,
pos
,
SEEK_SET
);
...
...
@@ -2206,7 +2239,6 @@ static struct zvolume *zvolume_list;
static
void
recurparent
(
TCHAR
*
newpath
,
struct
znode
*
zn
,
int
recurse
)
{
TCHAR
tmp
[
2
]
=
{
FSDB_DIR_SEPARATOR
,
0
};
if
(
zn
->
parent
&&
(
&
zn
->
volume
->
root
!=
zn
->
parent
||
zn
->
volume
->
parentz
==
NULL
))
{
if
(
&
zn
->
volume
->
root
==
zn
->
parent
&&
zn
->
volume
->
parentz
==
NULL
&&
!
_tcscmp
(
zn
->
name
,
zn
->
parent
->
name
))
goto
end
;
...
...
@@ -2218,7 +2250,7 @@ static void recurparent (TCHAR *newpath, struct znode *zn, int recurse)
}
end:
if
(
newpath
[
0
])
_tcscat
(
newpath
,
tmp
);
_tcscat
(
newpath
,
FSDB_DIR_SEPARATOR_S
);
_tcscat
(
newpath
,
zn
->
name
);
}
...
...
@@ -2228,7 +2260,6 @@ static struct znode *znode_alloc (struct znode *parent, const TCHAR *name)
TCHAR
tmpname
[
MAX_DPATH
];
struct
znode
*
zn
=
xcalloc
(
struct
znode
,
1
);
struct
znode
*
zn2
;
TCHAR
sep
[]
=
{
FSDB_DIR_SEPARATOR
,
0
};
_tcscpy
(
tmpname
,
name
);
zn2
=
parent
->
child
;
...
...
@@ -2255,7 +2286,7 @@ static struct znode *znode_alloc (struct znode *parent, const TCHAR *name)
fullpath
[
0
]
=
0
;
recurparent
(
fullpath
,
parent
,
0
);
_tcscat
(
fullpath
,
sep
);
_tcscat
(
fullpath
,
FSDB_DIR_SEPARATOR_S
);
_tcscat
(
fullpath
,
tmpname
);
#ifdef ZFILE_DEBUG
write_log
(
"znode_alloc vol='%s' parent='%s' name='%s'
\n
"
,
parent
->
volume
->
root
.
name
,
parent
->
name
,
name
);
...
...
@@ -2657,11 +2688,10 @@ struct znode *znode_adddir (struct znode *parent, const TCHAR *name, struct zarc
{
struct
znode
*
zn
;
TCHAR
path
[
MAX_DPATH
];
TCHAR
sep
[]
=
{
FSDB_DIR_SEPARATOR
,
0
};
path
[
0
]
=
0
;
//
recurparent (path, parent, 0);
_tcscat
(
path
,
sep
);
recurparent
(
path
,
parent
,
0
);
_tcscat
(
path
,
FSDB_DIR_SEPARATOR_S
);
_tcscat
(
path
,
name
);
//zn = get_znode (parent->volume, path, 0);
if
(
zn
)
...
...
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