puae 2.3.1

parent 757a8cc2
PUAE 2.3.0 beta series
PUAE 2.3.1 beta series
============
PUAE tries to continue where E-UAE left off..
PUAE versioning is based on the merged WinUAE version..
......
......@@ -6,7 +6,7 @@ dnl Updated and generally mauled 2008 Mustafa Tufan
dnl
AC_PREREQ(2.55)
AC_INIT(PUAE, 2.3.0, ,puae)
AC_INIT(PUAE, 2.3.1, ,puae)
AC_CONFIG_SRCDIR([bootstrap.sh])
AM_CONFIG_HEADER([src/sysconfig.h])
AC_CANONICAL_TARGET
......
......@@ -134,7 +134,7 @@ 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 \
diskutil.c zfile.c zfile_archive.c cfgfile.c picasso96.c inputdevice.c \
gfxutil.c audio.c sinctable.c drawing.c consolehook.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 \
uaeexe.c uaelib.c uaeresource.c uaeserial.c fdi2raw.c hotkeys.c amax.c \
ar.c driveclick.c enforcer.c misc.c a2065.c gayle.c ncr_scsi.c \
......
This diff is collapsed.
......@@ -706,7 +706,6 @@ static void sys_cddev_close (void)
sys_command_close (unitnum);
}
unitnum = -1;
}
static int command_lengths[] = { 1,2,1,1,12,2,1,1,4,1,-1,-1,-1,-1,-1,-1 };
......@@ -1702,7 +1701,7 @@ int akiko_init (void)
#ifdef SAVESTATE
uae_u8 *save_akiko (int *len)
uae_u8 *save_akiko (int *len, uae_u8 *dstptr)
{
uae_u8 *dstbak, *dst;
int i;
......@@ -1710,7 +1709,10 @@ uae_u8 *save_akiko (int *len)
if (!currprefs.cs_cd32cd)
return NULL;
dstbak = dst = xmalloc (uae_u8, 1000);
if (dstptr)
dstbak = dst = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 1000);
save_u16 (0);
save_u16 (0xCAFE);
save_u32 (cdrom_intreq);
......
......@@ -998,7 +998,7 @@ static void hrtmon_go (void)
old = get_long ((uaecptr)(regs.vbr + 0x8));
put_word (hrtmem_start + 0xc0000, 4);
put_long ((uaecptr)(regs.vbr + 8), get_long (hrtmem_start + 8));
Exception (2, 0);
Exception (2);
put_long ((uaecptr)(regs.vbr + 8), old);
} else if (cart_type == CART_SUPER4) {
uae_u32 v = get_long (hrtmem_start + 0x7c);
......@@ -1077,7 +1077,7 @@ void check_prefs_changed_carts (int in_memory_reset)
void action_replay_reset (void)
{
if (hrtmemory) {
if (savestate_state == STATE_RESTORE) {
if (isrestore ()) {
if (m68k_getpc () >= hrtmem_start && m68k_getpc () <= hrtmem_start + hrtmem_size)
hrtmon_map_banks ();
else
......@@ -1087,7 +1087,7 @@ void action_replay_reset (void)
if (action_replay_flag == ACTION_REPLAY_INACTIVE)
return;
if (savestate_state == STATE_RESTORE) {
if (isrestore ()) {
if (m68k_getpc () >= arrom_start && m68k_getpc () <= arrom_start + arrom_size) {
action_replay_flag = ACTION_REPLAY_ACTIVE;
hide_cart (0);
......
......@@ -49,6 +49,7 @@
//#define TEST_AUDIO
#define PERIOD_MIN 4
#define PERIOD_MIN_NONCE 60
int audio_channel_mask = 15;
......@@ -1073,10 +1074,12 @@ static void audio_event_reset (void)
{
int i;
last_cycles = get_cycles () - 1;
last_cycles = get_cycles ();
next_sample_evtime = scaled_sample_evtime;
for (i = 0; i < 4; i++)
zerostate (i);
if (!isrestore ()) {
for (i = 0; i < 4; i++)
zerostate (i);
}
schedule_audio ();
events_schedule ();
samplecnt = 0;
......@@ -1222,23 +1225,23 @@ STATIC_INLINE void setdr (int nr)
}
}
static void loaddat (int nr)
static void loaddat (int nr, bool modper)
{
struct audio_channel_data *cdp = audio_channel + nr;
int audav = adkcon & (0x01 << nr);
int audap = adkcon & (0x10 << nr);
if (audav || audap) {
if (nr > 3)
if (audav || (modper && audap)) {
if (nr >= 3)
return;
if (audav) {
cdp[1].vol = cdp->dat;
} else if (audap) {
if (modper && audap) {
if (cdp->dat == 0)
cdp[1].per = PERIOD_MAX;
else if (cdp->dat > PERIOD_MIN)
cdp[1].per = cdp->dat * CYCLE_UNIT;
else
cdp[1].per = PERIOD_MIN * CYCLE_UNIT;
} else if (audav) {
cdp[1].vol = cdp->dat;
}
} else {
#ifdef TEST_AUDIO
......@@ -1327,7 +1330,7 @@ static void audio_state_channel2 (int nr, bool perfin)
} else if (cdp->dat_written && !isirq (nr)) {
cdp->state = 2;
setirq (nr, 0);
loaddat (nr);
loaddat (nr, false);
if (usehacks () && cdp->per < 10 * CYCLE_UNIT) {
// make sure audio.device AUDxDAT startup returns to idle state before DMA is enabled
newsample (nr, (cdp->dat2 >> 0) & 0xff);
......@@ -1373,7 +1376,7 @@ static void audio_state_channel2 (int nr, bool perfin)
if (debugchannel (nr))
write_log ("%d:>5: LEN=%d PT=%08X PC=%08X\n", nr, cdp->wlen, cdp->pt, M68K_GETPC);
#endif
loaddat (nr);
loaddat (nr, false);
if (napnav)
setdr (nr);
cdp->state = 2;
......@@ -1395,7 +1398,7 @@ static void audio_state_channel2 (int nr, bool perfin)
if (!perfin)
return;
if (audap)
loaddat (nr);
loaddat (nr, true);
if (chan_ena) {
if (audap)
setdr (nr);
......@@ -1423,7 +1426,7 @@ static void audio_state_channel2 (int nr, bool perfin)
if (!perfin)
return;
if (chan_ena) {
loaddat (nr);
loaddat (nr, false);
if (cdp->intreq2 && napnav)
setirq (nr, 31);
if (napnav)
......@@ -1437,7 +1440,7 @@ static void audio_state_channel2 (int nr, bool perfin)
zerostate (nr);
return;
}
loaddat (nr);
loaddat (nr, false);
if (napnav)
setirq (nr, 32);
}
......@@ -1481,7 +1484,7 @@ void audio_reset (void)
#endif
reset_sound ();
memset (sound_filter_state, 0, sizeof sound_filter_state);
if (savestate_state != STATE_RESTORE) {
if (!isrestore ()) {
for (i = 0; i < 4; i++) {
cdp = &audio_channel[i];
memset (cdp, 0, sizeof *audio_channel);
......@@ -1491,7 +1494,7 @@ void audio_reset (void)
}
}
last_cycles = get_cycles () - 1;
last_cycles = get_cycles ();
next_sample_evtime = scaled_sample_evtime;
schedule_audio ();
events_schedule ();
......@@ -1610,7 +1613,7 @@ void set_audio (void)
}
}
next_sample_evtime = scaled_sample_evtime;
last_cycles = get_cycles () - 1;
last_cycles = get_cycles ();
compute_vsynctime ();
} else {
sound_volume (0);
......@@ -1706,7 +1709,7 @@ void update_audio (void)
if (!isaudio ())
goto end;
if (savestate_state == STATE_RESTORE)
if (isrestore ())
goto end;
if (!is_audio_active ())
goto end;
......@@ -1901,6 +1904,10 @@ void AUDxPER (int nr, uae_u16 v)
/* smaller values would cause extremely high cpu usage */
per = PERIOD_MIN * CYCLE_UNIT;
}
if (per < PERIOD_MIN_NONCE * CYCLE_UNIT && !currprefs.cpu_cycle_exact && (cdp->dmaenstore || cdp->state == 0)) {
/* DMAL emulation and low period can cause very very high cpu usage on slow performance PCs */
per = PERIOD_MIN_NONCE * CYCLE_UNIT;
}
if (cdp->per == PERIOD_MAX - 1 && per != PERIOD_MAX - 1) {
cdp->evtime = CYCLE_UNIT;
......@@ -2016,29 +2023,39 @@ void audio_resume (void) { resume_sound (); }
void audio_volume (int volume) { sound_volume (volume); }
#ifdef SAVESTATE
void restore_audio_finish (void)
{
last_cycles = get_cycles ();
schedule_audio ();
events_schedule ();
}
uae_u8 *restore_audio (int nr, uae_u8 *src)
{
struct audio_channel_data *acd = audio_channel + nr;
uae_u16 p;
zerostate (nr);
acd->state = restore_u8 ();
acd->vol = restore_u8 ();
acd->intreq2 = restore_u8 () ? true : false;
p = restore_u8 ();
uae_u8 flags = restore_u8 ();
acd->dr = acd->dsr = false;
if (p & 1)
if (flags & 1)
acd->dr = true;
if (p & 2)
if (flags & 2)
acd->dsr = true;
acd->drhpos = 1;
acd->len = restore_u16 ();
acd->wlen = restore_u16 ();
p = restore_u16 ();
uae_u16 p = restore_u16 ();
acd->per = p ? p * CYCLE_UNIT : PERIOD_MAX;
acd->dat = acd->dat2 = restore_u16 ();
acd->lc = restore_u32 ();
acd->pt = restore_u32 ();
acd->evtime = restore_u32 ();
if (flags & 0x80)
acd->drhpos = restore_u8 ();
else
acd->drhpos = 1;
acd->dmaenstore = (dmacon & DMA_MASTER) && (dmacon & (1 << nr));
return src;
}
......@@ -2058,7 +2075,7 @@ uae_u8 *save_audio (int nr, int *len, uae_u8 *dstptr)
save_u8 (acd->state);
save_u8 (acd->vol);
save_u8 (acd->intreq2);
save_u8 ((acd->dr ? 1 : 0) | (acd->dsr ? 2 : 0));
save_u8 ((acd->dr ? 1 : 0) | (acd->dsr ? 2 : 0) | 0x80);
save_u16 (acd->len);
save_u16 (acd->wlen);
save_u16 (acd->per == PERIOD_MAX ? 0 : acd->per / CYCLE_UNIT);
......@@ -2066,6 +2083,7 @@ uae_u8 *save_audio (int nr, int *len, uae_u8 *dstptr)
save_u32 (acd->lc);
save_u32 (acd->pt);
save_u32 (acd->evtime);
save_u8 (acd->drhpos);
*len = dst - dstbak;
return dstbak;
}
......
This diff is collapsed.
......@@ -326,7 +326,7 @@ static int play_cdtrack (uae_u8 *p)
end = last_cd_position;
start_found = end_found = 0;
for (j = 0; j < toc.points; j++) {
for (j = toc.first_track_offset; j <= toc.last_track_offset; j++) {
struct cd_toc *s = &toc.toc[j];
if (track_start == s->track) {
start_found++;
......@@ -1769,11 +1769,16 @@ void cdtv_check_banks (void)
#ifdef SAVESTATE
uae_u8 *save_dmac (int *len)
uae_u8 *save_dmac (int *len, uae_u8 *dstptr)
{
uae_u8 *dstbak, *dst;
dstbak = dst = xmalloc (uae_u8, 1000);
if (!currprefs.cs_cdtvcd)
return NULL;
if (dstptr)
dstbak = dst = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 1000);
// model (0=original,1=rev2,2=superdmac)
save_u32 (1);
......@@ -1804,14 +1809,18 @@ uae_u8 *restore_dmac (uae_u8 *src)
return src;
}
uae_u8 *save_cdtv (int *len)
uae_u8 *save_cdtv (int *len, uae_u8 *dstptr)
{
unsigned int i;
uae_u8 *dstbak, *dst;
if (!currprefs.cs_cdtvcd)
return NULL;
dstbak = dst = xmalloc (uae_u8, 1000);
if (dstptr)
dstbak = dst = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 1000);
save_u32 (1);
......
......@@ -4515,13 +4515,6 @@ int built_in_chipset_prefs (struct uae_prefs *p)
void config_check_vsync (void)
{
static int cnt = 0;
if (cnt == 0) {
/* resolution_check_change (); */
DISK_check_change ();
cnt = 5;
}
cnt--;
if (config_changed) {
// if (config_changed == 1)
// write_log ("* configuration check trigger\n");
......
This diff is collapsed.
......@@ -402,7 +402,7 @@ restart:
mmu_fill_atc_l2(addr, super, data, write, l);
}
if (!(data ? l->valid_data : l->valid_inst)) {
D(bug("MMU: non-resident page (%x,%x,%x)!\n", addr, regs.pc, regs.fault_pc));
D(bug("MMU: non-resident page (%x,%x,%x)!\n", addr, regs.pc, regs.instruction_pc));
goto fail;
}
if (write) {
......
This diff is collapsed.
......@@ -904,20 +904,28 @@ struct dma_rec *record_dma (uae_u16 reg, uae_u16 dat, uae_u32 addr, int hpos, in
return dr;
}
static void decode_dma_record (int hpos, int vpos, int toggle)
static void decode_dma_record (int hpos, int vpos, int toggle, bool logfile)
{
struct dma_rec *dr;
int h, i, maxh;
int h, i, maxh, cnt;
uae_u32 cycles;
if (!dma_record[0])
return;
dr = &dma_record[dma_record_toggle ^ toggle][vpos * NR_DMA_REC_HPOS];
console_out_f ("Line: %02X %3d HPOS %02X %3d:\n", vpos, vpos, hpos, hpos);
if (logfile)
write_dlog ("Line: %02X %3d HPOS %02X %3d:\n", vpos, vpos, hpos, hpos);
else
console_out_f ("Line: %02X %3d HPOS %02X %3d:\n", vpos, vpos, hpos, hpos);
h = hpos;
dr += hpos;
maxh = hpos + 80;
if (maxh > maxhpos)
maxh = maxhpos;
cycles = vsync_cycles;
if (toggle)
cycles -= maxvpos * maxhpos * CYCLE_UNIT;
cnt = 0;
while (h < maxh) {
int col = 9;
int cols = 8;
......@@ -925,6 +933,7 @@ static void decode_dma_record (int hpos, int vpos, int toggle)
TCHAR l2[81];
TCHAR l3[81];
TCHAR l4[81];
TCHAR l5[81];
for (i = 0; i < cols && h < maxh; i++, h++, dr++) {
int cl = i * col, cl2;
int r = dr->reg;
......@@ -982,20 +991,39 @@ static void decode_dma_record (int hpos, int vpos, int toggle)
l3[cl2++] = 'I';
if (dr->evt & DMA_EVENT_INTREQ)
l3[cl2++] = 'i';
_stprintf (l5 + cl, "%08X", cycles + (vpos * maxhpos + (hpos + cnt)) * CYCLE_UNIT);
if (i < cols - 1 && h < maxh - 1) {
l1[cl + col - 1] = 32;
l2[cl + col - 1] = 32;
l3[cl + col - 1] = 32;
l4[cl + col - 1] = 32;
l5[cl + col - 1] = 32;
}
cnt++;
}
if (logfile) {
write_dlog ("%s\n", l1);
write_dlog ("%s\n", l2);
write_dlog ("%s\n", l3);
write_dlog ("%s\n", l4);
write_dlog ("%s\n", l5);
write_dlog ("\n");
} else {
console_out_f ("%s\n", l1);
console_out_f ("%s\n", l2);
console_out_f ("%s\n", l3);
console_out_f ("%s\n", l4);
console_out_f ("%s\n", l5);
console_out_f ("\n");
}
console_out_f ("%s\n", l1);
console_out_f ("%s\n", l2);
console_out_f ("%s\n", l3);
console_out_f ("%s\n", l4);
console_out_f ("\n");
}
}
void log_dma_record (void)
{
if (!debug_dma)
debug_dma = 1;
decode_dma_record (0, 0, 0, true);
}
void record_copper (uaecptr addr, int hpos, int vpos)
{
......@@ -1649,6 +1677,74 @@ static void smc_detector (uaecptr addr, int rwi, int size, uae_u32 *valp)
}
}
uae_u8 *save_debug_memwatch (int *len, uae_u8 *dstptr)
{
uae_u8 *dstbak, *dst;
int total;
unsigned int i;
total = 0;
for (i = 0; i < MEMWATCH_TOTAL; i++) {
if (mwnodes[i].size > 0)
total++;
}
if (!total)
return NULL;
if (dstptr)
dstbak = dst = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 1000);
save_u32 (1);
save_u8 (total);
for (i = 0; i < MEMWATCH_TOTAL; i++) {
struct memwatch_node *m = &mwnodes[i];
if (m->size <= 0)
continue;
save_store_pos ();
save_u8 (i);
save_u8 (m->modval_written);
save_u8 (m->mustchange);
save_u8 (m->frozen);
save_u8 (m->val_enabled);
save_u8 (m->rwi);
save_u32 (m->addr);
save_u32 (m->size);
save_u32 (m->modval);
save_u32 (m->val_mask);
save_u32 (m->val_size);
save_store_size ();
}
*len = dst - dstbak;
return dstbak;
}
uae_u8 *restore_debug_memwatch (uae_u8 *src)
{
if (restore_u32 () != 1)
return src;
int total = restore_u8 ();
unsigned int i;
for (i = 0; i < total; i++) {
restore_store_pos ();
int idx = restore_u8 ();
struct memwatch_node *m = &mwnodes[idx];
m->modval_written = restore_u8 ();
m->mustchange = restore_u8 ();
m->frozen = restore_u8 ();
m->val_enabled = restore_u8 ();
m->rwi = restore_u8 ();
m->addr = restore_u32 ();
m->size = restore_u32 ();
m->modval = restore_u32 ();
m->val_mask = restore_u32 ();
m->val_size = restore_u32 ();
restore_store_size ();
}
return src;
}
static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp)
{
int i, brk;
......@@ -2070,7 +2166,7 @@ void memwatch_dump2 (TCHAR *buf, int bufsize, int num)
if (mwn->frozen)
buf = buf_out (buf, &bufsize, "F");
if (mwn->val_enabled)
buf = buf_out (buf, &bufsize, " =%X", mwn->val);
buf = buf_out (buf, &bufsize, " =%X%s", mwn->val, getsizechar (mwn->val_size));
if (mwn->modval_written)
buf = buf_out (buf, &bufsize, " =M");
if (mwn->mustchange)
......@@ -2381,9 +2477,63 @@ static void show_exec_tasks (void)
static void show_exec_lists (TCHAR t)
{
unsigned int i, j;
uaecptr execbase = get_long (4);
uaecptr list = 0, node;
if (_totupper (t) == 'I') {
static const int it[] = { 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0 };
static const int it2[] = { 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7 };
list = execbase + 84;
for (i = 0; i < 16; i++) {
console_out_f ("%2d %d: %08x\n", i + 1, it2[i], list);
if (it[i]) {
console_out_f (" [H] %08x\n", get_long (list));
node = get_long (list + 8);
if (node) {
uae_u8 *addr = get_real_address (get_long (node + 10));
TCHAR *name = addr ? ((char*)addr) : "<null>";
console_out_f (" %08x (C=%08X D=%08X) '%s'\n", node, get_long (list + 4), get_long (list), name);
xfree (name);
}
} else {
int cnt = 0;
node = get_long (list);
node = get_long (node);
while (get_long (node)) {
uae_u8 *addr = get_real_address (get_long (node + 10));
TCHAR *name = addr ? ((char*)addr) : "<null>";
console_out_f (" [S] %08x (C=%08x D=%08X) '%s'\n", node, get_long (node + 18), get_long (node + 14), name);
if (i == 4 - 1 || i == 14 - 1) {
if (!_tcsicmp (name, "cia-a") || !_tcsicmp (name, "cia-b")) {
static const TCHAR *ciai[] = { "A", "B", "ALRM", "SP", "FLG" };
uaecptr cia = node + 22;
for (j = 0; j < 5; j++) {
uaecptr ciap = get_long (cia);
console_out_f (" %5s: %08x", ciai[j], ciap);
if (ciap) {
uae_u8 *addr2 = get_real_address (get_long (ciap + 10));
TCHAR *name2 = addr ? ((char*)addr2) : "<null>";
console_out_f (" (C=%08x D=%08X) '%s'", get_long (ciap + 18), get_long (ciap + 14), name2);
xfree (name2);
}
console_out_f ("\n");
cia += 4;
}
}
}
xfree (name);
node = get_long (node);
cnt++;
}
if (!cnt)
console_out_f (" [S] <none>\n");
}
list += 12;
}
return;
}
switch (_totupper (t))
{
case 'R':
......@@ -2647,9 +2797,9 @@ static void searchmem (TCHAR **cc)
console_out ("\n");
}
#ifdef SAVESTATE
static int staterecorder (TCHAR **cc)
{
#if 0
TCHAR nc;
if (!more_params (cc)) {
......@@ -2664,9 +2814,9 @@ static int staterecorder (TCHAR **cc)
savestate_listrewind ();
return 0;
}
#endif
return 0;
}
#endif
static int debugtest_modes[DEBUGTEST_MAX];
static const TCHAR *debugtest_names[] = {
......@@ -2718,7 +2868,7 @@ static void debugtest_set (TCHAR **inptr)
else
debugtest_modes[val] = val2;
console_out_f ("Debugtest '%s': %s. break = %s\n",
debugtest_names[val], debugtest_modes[val] ? "on" :L"off", val2 == 2 ? "on" : "off");
debugtest_names[val], debugtest_modes[val] ? "on" :"off", val2 == 2 ? "on" : "off");
}
}
......@@ -2971,7 +3121,7 @@ static void m68k_modify (TCHAR **inptr)
regs.isp = v;
} else if (!_tcscmp (parm, "PC")) {
m68k_setpc (v);
fill_prefetch_slow ();
fill_prefetch ();
} else {
for (i = 0; m2cregs[i].regname; i++) {
if (!_tcscmp (parm, m2cregs[i].regname))
......@@ -3149,7 +3299,7 @@ static void debug_1 (void)
case 'g':
if (more_params (&inptr)) {
m68k_setpc (readhex (&inptr));
fill_prefetch_slow ();
fill_prefetch ();
}
deactivate_debugger();
return;
......@@ -3269,7 +3419,7 @@ static void debug_1 (void)
if (more_params (&inptr))
v2 = readint (&inptr);
if (debug_dma) {
decode_dma_record (v2, v1, cmd == 'v');
decode_dma_record (v2, v1, cmd == 'v', false);
} else {
debug_dma = v1 < 0 ? -v1 : 1;
console_out_f ("DMA debugger enabled, mode=%d.\n", debug_dma);
......@@ -3293,19 +3443,19 @@ static void debug_1 (void)
break;
case 'U':
if (currprefs.cpu_model && more_params (&inptr)) {
int super, data, i;
int i;
uaecptr addrl = readhex (&inptr);
uaecptr addrp;
console_out_f ("%08X translates to:\n", addrl);
for (i = 0; i < 4; i++) {
super = (i & 2) ? 1 : 0;
data = (i & 1) ? 1 : 0;
bool super = (i & 2) != 0;
bool data = (i & 1) != 0;
console_out_f ("S%dD%d=", super, data);
TRY(prb) {
addrp = mmu_translate (addrl, super, data, 0);
addrp = mmu_translate (addrl, super, data, false);
console_out_f ("%08X", addrp);
TRY(prb2) {
addrp = mmu_translate (addrl, super, data, 1);
addrp = mmu_translate (addrl, super, data, true);
console_out_f (" RW");
} CATCH(prb2) {
console_out_f (" RO");
......@@ -3476,26 +3626,22 @@ void debug (void)
skipins = 0xffffffff;
skipaddr_doskip = 0;
exception_debugging = 0;
#ifdef SAVESTATE
debug_rewind = 0;
processptr = 0;
#if 0
if (!currprefs.statecapture) {
changed_prefs.statecapture = currprefs.statecapture = 1;
savestate_init ();
}
#endif
debug_1 ();
#ifdef SAVESTATE
if (!debug_rewind
#ifdef JIT
&& !currprefs.cachesize
#endif
if (!debug_rewind && !currprefs.cachesize
#ifdef FILESYS
&& nr_units () == 0
#endif
) {
savestate_capture (1);
}
#endif
for (i = 0; i < BREAKPOINT_TOTAL; i++) {
if (bpnodes[i].enabled)
do_skip = 1;
......@@ -3583,7 +3729,7 @@ void mmu_do_hit (void)
}
MakeSR ();
m68k_setpc (mmu_callback);
fill_prefetch_slow ();
fill_prefetch ();
if (currprefs.cpu_model > 68000) {
for (i = 0 ; i < 9; i++) {
......
This diff is collapsed.
This diff is collapsed.
......@@ -196,14 +196,14 @@ static void ersatz_init (void)
disk_eject (0);
m68k_setpc (0xFC0002);
fill_prefetch_slow ();
fill_prefetch ();
uae_reset (0);
ersatzkickfile = 0;
return;
}
m68k_setpc (0x400C);
fill_prefetch_slow ();
fill_prefetch ();
/* Init the hardware */
put_long (0x3000, 0xFFFFFFFEul);
......
This diff is collapsed.
......@@ -156,7 +156,7 @@ read 1 byte to stop reset */
#define IDE_GAYLE 0
#define IDE_ADIDE 1
#define MAX_IDE_MULTIPLE_SECTORS 128
#define MAX_IDE_MULTIPLE_SECTORS 64
#define SECBUF_SIZE (512 * (MAX_IDE_MULTIPLE_SECTORS * 2))
struct ide_hdf
......@@ -284,7 +284,7 @@ static void gayle_cs_change (uae_u8 mask, int onoff)
if (gayle_irq & GAYLE_IRQ_RESET)
uae_reset (0);
if (gayle_irq & GAYLE_IRQ_BERR)
Exception (2, 0);
Exception (2);
}
}
}
......@@ -1185,10 +1185,10 @@ static uae_u32 gayle2_read (uaecptr addr)
addr &= 0xffff;
if (addr == 0x1000) {
/* Gayle ID */
if ((gayle_id_cnt & 3) == 2)
v = 0x7f;
else
if (gayle_id_cnt == 0 || gayle_id_cnt == 1 || gayle_id_cnt == 3 || ((currprefs.chipset_mask & CSMASK_AGA) && gayle_id_cnt == 7))
v = 0x80;
else
v = 0x00;
gayle_id_cnt++;
}
return v;
......@@ -1902,7 +1902,7 @@ static void initide (void)
int i;
alloc_ide_mem (idedrive, 4);
if (savestate_state == STATE_RESTORE)
if (isrestore ())
return;
ide_error = 1;
ide_sector = ide_nsector = 1;
......@@ -1953,13 +1953,16 @@ uae_u8 *restore_gayle (uae_u8 *src)
return src;
}
uae_u8 *save_gayle (int *len)
uae_u8 *save_gayle (int *len, uae_u8 *dstptr)
{
uae_u8 *dstbak, *dst;
if (currprefs.cs_ide <= 0)
return NULL;
dstbak = dst = xmalloc (uae_u8, 1000);
if (dstptr)
dstbak = dst = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 1000);
save_u8 (currprefs.cs_ide);
save_u8 (gayle_int);
save_u8 (gayle_irq);
......@@ -1970,7 +1973,7 @@ uae_u8 *save_gayle (int *len)
return dstbak;
}
uae_u8 *save_ide (int num, int *len)
uae_u8 *save_ide (int num, int *len, uae_u8 *dstptr)
{
uae_u8 *dstbak, *dst;
struct ide_hdf *ide;
......@@ -1982,7 +1985,10 @@ uae_u8 *save_ide (int num, int *len)
ide = idedrive[num];
if (ide->hdhfd.size == 0)
return NULL;
dstbak = dst = xmalloc (uae_u8, 1000);
if (dstptr)
dstbak = dst = dstptr;
else
dstbak = dst = xmalloc (uae_u8, 1000);
save_u32 (num);
save_u64 (ide->hdhfd.size);
save_string (ide->hdhfd.path);
......
This diff is collapsed.
......@@ -2415,14 +2415,14 @@ void gui_handle_events (void)
break;
case UAECMD_SAVESTATE_LOAD:
uae_sem_wait (&gui_sem);
savestate_initsave (gui_sstate_name, 0, 0);
savestate_initsave (gui_sstate_name, 0, 0, 0);
savestate_state = STATE_DORESTORE;
write_log ("Restoring state from '%s'...\n", gui_sstate_name);
uae_sem_post (&gui_sem);
break;
case UAECMD_SAVESTATE_SAVE:
uae_sem_wait (&gui_sem);
savestate_initsave (gui_sstate_name, 0, 0);
savestate_initsave (gui_sstate_name, 0, 0, 0);
save_state (gui_sstate_name, "puae");
write_log ("Saved state to '%s'...\n", gui_sstate_name);
uae_sem_post (&gui_sem);
......
......@@ -122,6 +122,7 @@ typedef int (*rawread_func) (int, uae_u8*, int, int, int, uae_u32);
typedef int (*write_func) (int, uae_u8*, int, int);
typedef int (*isatapi_func) (int);
typedef int (*ismedia_func) (int, int);
typedef int (*scsiemu_func) (int, uae_u8*);
struct device_functions {
const TCHAR *name;
......@@ -147,6 +148,8 @@ struct device_functions {
isatapi_func isatapi;
ismedia_func ismedia;
scsiemu_func scsiemu;
};
extern struct device_functions *device_func[MAX_TOTAL_SCSI_DEVICES];
......
......@@ -7,8 +7,10 @@
*/
extern void CIA_reset (void);
extern void CIA_vsync_handler (int);
extern void CIA_hsync_handler (int);
extern void CIA_vsync_prehandler (void);
extern void CIA_hsync_prehandler (void);
extern void CIA_vsync_posthandler (bool);
extern void CIA_hsync_posthandler (bool);
extern void CIA_handler (void);
extern void diskindex_handler (void);
......@@ -24,6 +26,4 @@ extern int parallel_direct_read_data (uae_u8*);
extern int parallel_direct_write_status (uae_u8, uae_u8);
extern int parallel_direct_read_status (uae_u8*);
extern void CIA_inprec_prepare(void);
extern void rtc_hardreset(void);
extern void rtc_hardreset (void);
This diff is collapsed.
......@@ -18,7 +18,8 @@
uae_u32 get_copper_address (int copno);
extern int custom_init (void);
extern void customreset (int hardreset);
extern void custom_prepare (void);
extern void custom_reset (int hardreset);
extern int intlev (void);
extern void dumpcustom (void);
......@@ -28,7 +29,7 @@ extern void do_copper (void);
extern void notice_new_xcolors (void);
extern void notice_screen_contents_lost (void);
extern void init_row_map (void);
extern void init_hz (void);
extern void init_hz_full (void);
extern void init_custom (void);
extern bool picasso_requested_on;
......@@ -38,7 +39,7 @@ extern void set_picasso_hack_rate (int hz);
/* Set to 1 to leave out the current frame in average frame time calculation.
* Useful if the debugger was active. */
extern int bogusframe;
extern unsigned long hsync_counter;
extern unsigned long int hsync_counter, vsync_counter;
extern uae_u16 dmacon;
extern uae_u16 intena, intreq, intreqr;
......@@ -52,7 +53,7 @@ extern int n_frames;
STATIC_INLINE int dmaen (unsigned int dmamask)
{
return (dmamask & dmacon) && (dmacon & 0x200);
return (dmamask & dmacon) && (dmacon & 0x200);
}
#define SPCFLAG_STOP 2
......@@ -178,26 +179,26 @@ extern int xbluecolor_s, xbluecolor_b, xbluecolor_m;
/* get resolution from bplcon0 */
STATIC_INLINE int GET_RES_DENISE (uae_u16 con0)
{
if (!(currprefs.chipset_mask & CSMASK_ECS_DENISE))
con0 &= ~0x40;
return ((con0) & 0x8000) ? RES_HIRES : ((con0) & 0x40) ? RES_SUPERHIRES : RES_LORES;
if (!(currprefs.chipset_mask & CSMASK_ECS_DENISE))
con0 &= ~0x40; // SUPERHIRES
return ((con0) & 0x8000) ? RES_HIRES : ((con0) & 0x40) ? RES_SUPERHIRES : RES_LORES;
}
STATIC_INLINE int GET_RES_AGNUS (uae_u16 con0)
{
if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS))
con0 &= ~0x40;
return ((con0) & 0x8000) ? RES_HIRES : ((con0) & 0x40) ? RES_SUPERHIRES : RES_LORES;
if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS))
con0 &= ~0x40; // SUPERHIRES
return ((con0) & 0x8000) ? RES_HIRES : ((con0) & 0x40) ? RES_SUPERHIRES : RES_LORES;
}
/* get sprite width from FMODE */
#define GET_SPRITEWIDTH(FMODE) ((((FMODE) >> 2) & 3) == 3 ? 64 : (((FMODE) >> 2) & 3) == 0 ? 16 : 32)
/* Compute the number of bitplanes from a value written to BPLCON0 */
STATIC_INLINE int GET_PLANES(uae_u16 bplcon0)
{
if ((bplcon0 & 0x0010) && (bplcon0 & 0x7000))
return 0;
if (bplcon0 & 0x0010)
return 8;
return (bplcon0 >> 12) & 7;
if ((bplcon0 & 0x0010) && (bplcon0 & 0x7000))
return 0; // >8 planes = 0 planes
if (bplcon0 & 0x0010)
return 8; // AGA 8-planes bit
return (bplcon0 >> 12) & 7; // normal planes bits
}
extern void fpscounter_reset (void);
......@@ -205,12 +206,13 @@ extern unsigned long idletime;
extern int lightpen_x, lightpen_y, lightpen_cx, lightpen_cy;
struct customhack {
uae_u16 v;
int vpos, hpos;
uae_u16 v;
int vpos, hpos;
};
void customhack_put (struct customhack *ch, uae_u16 v, int hpos);
uae_u16 customhack_get (struct customhack *ch, int hpos);
extern void alloc_cycle_ext (int, int);
extern bool ispal (void);
extern int current_maxvpos (void);
#define HSYNCTIME (maxhpos * CYCLE_UNIT);
......@@ -39,6 +39,7 @@ extern uaecptr dumpmem2 (uaecptr addr, TCHAR *out, int osize);
extern void update_debug_info (void);
extern int instruction_breakpoint (TCHAR **c);
extern int debug_bankchange (int);
extern void log_dma_record (void);
#define BREAKPOINT_TOTAL 8
struct breakpoint_node {
......
......@@ -14,12 +14,13 @@ typedef enum { DRV_NONE = -1, DRV_35_DD = 0, DRV_35_HD, DRV_525_SD, DRV_35_DD_ES
extern void DISK_init (void);
extern void DISK_free (void);
extern void DISK_select (uae_u8 data);
extern void DISK_select_set (uae_u8 data);
extern uae_u8 DISK_status (void);
extern void disk_eject (int num);
extern int disk_empty (int num);
extern void disk_insert (int num, const TCHAR *name);
extern void disk_insert_force (int num, const TCHAR *name);
extern void DISK_check_change (void);
extern void disk_insert_force (int num, const TCHAR *name, bool writeprotected);
extern void DISK_vsync (void);
//extern int DISK_validate_filename (const TCHAR *fname, int leave_open, bool *wrprot, uae_u32 *crc32, struct zfile **zf);
extern void DISK_handler (uae_u32);
extern void DISK_update (unsigned int hpos);
......
......@@ -277,6 +277,7 @@ extern void notice_interlace_seen (void);
extern void frame_drawn (void);
extern void redraw_frame (void);
extern int get_custom_limits (int *pw, int *ph, int *pdx, int *pdy);
extern void putpixel (uae_u8 *buf, int bpp, int x, xcolnr c8, int opaq);
/* Finally, stuff that shouldn't really be shared. */
......
......@@ -37,13 +37,12 @@ extern volatile frame_time_t vsynctime, vsyncmintime;
extern void reset_frame_rate_hack (void);
extern int rpt_available;
extern frame_time_t syncbase;
extern unsigned long int vsync_cycles;
extern unsigned long start_cycles;
extern void compute_vsynctime (void);
extern void init_eventtab (void);
extern void do_cycles_ce (long cycles);
extern void do_cycles_ce020 (int clocks);
extern void do_cycles_ce020_mem (int clocks);
extern void do_cycles_ce000 (int clocks);
extern void do_cycles_ce (unsigned long cycles);
extern int is_cycle_ce (void);
extern unsigned long currcycle, nextevent, is_lastline;
......
......@@ -51,6 +51,7 @@ STATIC_INLINE unsigned long int get_cycles (void)
STATIC_INLINE void set_cycles (unsigned long int x)
{
currcycle = x;
eventtab[ev_hsync].oldcycles = x;
#ifdef EVT_DEBUG
if (currcycle & (CYCLE_UNIT - 1))
write_log ("%x\n", currcycle);
......@@ -96,18 +97,3 @@ STATIC_INLINE void do_cycles_slow (unsigned long cycles_to_add)
#define do_cycles do_cycles_slow
#define countdown pissoff
/* This is a special-case function. Normally, all events should lie in the
future; they should only ever be active at the current cycle during
do_cycles. However, a snapshot is saved during do_cycles, and so when
restoring it, we may have other events pending. */
STATIC_INLINE void handle_active_events (void)
{
int i;
for (i = 0; i < ev_max; i++) {
if (eventtab[i].active && eventtab[i].evtime == currcycle) {
(*eventtab[i].handler)();
}
}
}
......@@ -126,8 +126,6 @@ INPUTEVENT_END
extern void handle_cd32_joystick_cia (uae_u8, uae_u8);
extern uae_u8 handle_parport_joystick (int port, uae_u8 pra, uae_u8 dra);
extern uae_u8 handle_joystick_buttons (uae_u8, uae_u8);
extern int getbuttonstate (int joy, int button);
extern int getjoystate (int joy);
#define MAGICMOUSE_BOTH 0
#define MAGICMOUSE_NATIVE_ONLY 1
......@@ -154,7 +152,6 @@ extern void inputdevice_devicechange (struct uae_prefs *prefs);
extern int inputdevice_translatekeycode (int keyboard, int scancode, int state);
extern void inputdevice_setkeytranslation (struct uae_input_device_kbr_default *trans, int **kbmaps);
extern int handle_input_event (int nr, int state, int max, int autofire);
extern void inputdevice_do_keyboard (int code, int state);
extern int inputdevice_iskeymapped (int keyboard, int scancode);
extern int inputdevice_synccapslock (int, int*);
......@@ -175,6 +172,8 @@ extern uae_u16 POT1DAT (void);
extern void JOYTEST (uae_u16 v);
extern uae_u16 JOY0DAT (void);
extern uae_u16 JOY1DAT (void);
extern void JOYSET (int num, uae_u16 v);
extern uae_u16 JOYGET (int num);
extern void inputdevice_vsync (void);
extern void inputdevice_hsync (void);
......@@ -211,10 +210,11 @@ extern void inputdevice_tablet_strobe (void);
#define JSEM_MODE_DEFAULT 0
#define JSEM_MODE_MOUSE 1
#define JSEM_MODE_JOYSTICK 2
#define JSEM_MODE_JOYSTICK_ANALOG 3
#define JSEM_MODE_MOUSE_CDTV 4
#define JSEM_MODE_JOYSTICK_CD32 5
#define JSEM_MODE_LIGHTPEN 6
#define JSEM_MODE_GAMEPAD 3
#define JSEM_MODE_JOYSTICK_ANALOG 4
#define JSEM_MODE_MOUSE_CDTV 5
#define JSEM_MODE_JOYSTICK_CD32 6
#define JSEM_MODE_LIGHTPEN 7
#define JSEM_KBDLAYOUT 0
#define JSEM_JOYS 100
......@@ -237,32 +237,6 @@ extern int jsem_iskbdjoy (int port, const struct uae_prefs *p);
extern int inputdevice_uaelib (TCHAR *, TCHAR *);
#define INPREC_JOYPORT 1
#define INPREC_JOYBUTTON 2
#define INPREC_KEY 3
#define INPREC_DISKINSERT 4
#define INPREC_DISKREMOVE 5
#define INPREC_VSYNC 6
#define INPREC_CIAVSYNC 7
#define INPREC_END 0xff
#define INPREC_QUIT 0xfe
extern int input_recording;
extern void inprec_close (void);
extern int inprec_open (TCHAR*, int);
extern void inprec_rend (void);
extern void inprec_rstart (uae_u8);
extern void inprec_ru8 (uae_u8);
extern void inprec_ru16 (uae_u16);
extern void inprec_ru32 (uae_u32);
extern void inprec_rstr (const TCHAR*);
extern int inprec_pstart (uae_u8);
extern void inprec_pend (void);
extern uae_u8 inprec_pu8 (void);
extern uae_u16 inprec_pu16 (void);
extern uae_u32 inprec_pu32 (void);
extern int inprec_pstr (TCHAR*);
extern int inputdevice_testread (int*, int*, int*);
extern int inputdevice_istest (void);
extern void inputdevice_settest (int);
......
This diff is collapsed.
......@@ -9,7 +9,7 @@
#define UAEMAJOR 2
#define UAEMINOR 3
#define UAESUBREV 0
#define UAESUBREV 1
typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES, KBD_LANG_TR } KbdLang;
......@@ -53,6 +53,7 @@ struct uae_input_device {
};
#define MAX_JPORTS 4
#define NORMAL_JPORTS 2
#define MAX_JPORTNAME 128
struct jport {
int id;
......@@ -126,6 +127,14 @@ enum { CP_GENERIC = 1, CP_CDTV, CP_CD32, CP_A500, CP_A500P, CP_A600, CP_A1000,
#define GFX_FULLSCREEN 1
#define GFX_FULLWINDOW 2
#define AUTOSCALE_NONE 0
#define AUTOSCALE_STATIC_AUTO 1
#define AUTOSCALE_STATIC_NOMINAL 2
#define AUTOSCALE_STATIC_MAX 3
#define AUTOSCALE_NORMAL 4
#define AUTOSCALE_RESIZE 5
#define AUTOSCALE_CENTER 6
struct uae_prefs {
struct strlist *all_lines;
......@@ -198,8 +207,8 @@ struct uae_prefs {
struct wh gfx_size_win;
struct wh gfx_size_fs;
struct wh gfx_size;
struct wh gfx_size_win_xtra[4];
struct wh gfx_size_fs_xtra[4];
struct wh gfx_size_win_xtra[6];
struct wh gfx_size_fs_xtra[6];
bool gfx_autoresolution;
bool gfx_scandoubler;
int gfx_refreshrate;
......@@ -320,6 +329,8 @@ struct uae_prefs {
struct cdslot cdslots[MAX_TOTAL_SCSI_DEVICES];
TCHAR quitstatefile[MAX_DPATH];
TCHAR statefile[MAX_DPATH];
TCHAR inprecfile[MAX_DPATH];
bool inprec_autoplay;
#ifndef WIN32
char scsi_device[256];
#endif
......@@ -362,6 +373,7 @@ struct uae_prefs {
bool filesys_custom_uaefsdb;
bool mmkeyboard;
int uae_hide;
bool clipboard_sharing;
struct uaedev_mount_info *mountinfo;
int mountitems;
......@@ -474,6 +486,7 @@ struct uae_prefs {
struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
int dongle;
int input_contact_bounce;
};
extern int config_changed;
......
This diff is collapsed.
/*
* E-UAE - The portable Amiga Emulator
* PUAE - The portable Amiga Emulator
*
* Version/revision info.
*
* (c) 2006 Richard Drummond
* (c) 2010 Mustafa TUFAN
*/
#ifndef EUAE_VERSION_H
......@@ -18,7 +19,7 @@
#define UAEMAJOR 2
#define UAEMINOR 3
#define UAESUBREV 0
#define UAESUBREV 1
#define UAEVERSION (256*65536L*UAEMAJOR + 65536L*UAEMINOR + UAESUBREV)
......
......@@ -16,12 +16,11 @@ extern xcolnr xcolors_16[4096];
extern xcolnr xcolors_32[4096];
extern uae_u32 p96_rgbx16[65536];
extern int vsync_switchmode (int, int);
extern bool vsync_switchmode (int, int);
extern void doflashscreen (void);
extern int flashscreen;
extern int debuggable (void);
extern void togglemouse (void);
extern void LED (int);
extern void screenshot (int,int);
......@@ -76,6 +75,8 @@ struct vidbuf_description
int maxblocklines; /* Set to 0 if you want calls to flush_line after each drawn line, or the number of
* lines that flush_block wants to/can handle (it isn't really useful to use another
* value than maxline here). */
int gfx_resolution_reserved; // reserved space for currprefs.gfx_resolution
int gfx_vresolution_reserved; // reserved space for currprefs.gfx_resolution
};
#define MAXBLOCKLINES_MAX INT_MAX;
......@@ -122,7 +123,7 @@ extern void graphics_close (void);
extern void graphics_notify_state (int state);
extern void handle_events (void);
extern int is_fullscreen (void);
extern int is_vsync (void);
//extern int is_vsync (void);
extern void toggle_fullscreen (int mode);
extern void toggle_mousegrab (void);
......
This diff is collapsed.
......@@ -77,14 +77,6 @@ int record_key_direct (int kc)
kc ^= AK_CTRL << 1;
}
#ifdef INPREC
if (input_recording > 0) {
inprec_rstart(INPREC_KEY);
inprec_ru8(kc);
inprec_rend();
}
#endif
keybuf[kpb_first] = kc;
kpb_first = kpb_next;
return 1;
......@@ -95,24 +87,3 @@ void keybuf_init (void)
kpb_first = kpb_last = 0;
inputdevice_updateconfig (&currprefs);
}
#ifdef SAVESTATE
uae_u8 *save_keyboard (int *len)
{
uae_u8 *dst, *t;
dst = t = xmalloc (uae_u8, 8);
save_u32 (getcapslockstate () ? 1 : 0);
save_u32 (0);
*len = 8;
return t;
}
uae_u8 *restore_keyboard (uae_u8 *src)
{
setcapslockstate (restore_u32 ());
restore_u32 ();
return src;
}
#endif /* SAVESTATE */
This diff is collapsed.
......@@ -2397,7 +2397,7 @@ void map_overlay (int chip)
map_banks (rb, 0, size, 0x80000);
}
fill_ce_banks ();
if (savestate_state != STATE_RESTORE && savestate_state != STATE_REWIND && valid_address (regs.pc, 4))
if (!isrestore () && valid_address (regs.pc, 4))
m68k_setpc (m68k_getpc ());
}
......
This diff is collapsed.
......@@ -28,8 +28,8 @@
<key>CFBundleName</key>
<string>PUAE</string>
<key>CFBundleGetInfoString</key>
<string>2.3.0</string>
<string>2.3.1</string>
<key>CFBundleVersion</key>
<string>2.3.0</string>
<string>2.3.1</string>
</dict>
</plist>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment