syncing 2.3.0

parent 332ed3d1
...@@ -226,7 +226,7 @@ static int mungepacket (uae_u8 *packet, int len) ...@@ -226,7 +226,7 @@ static int mungepacket (uae_u8 *packet, int len)
return ret; return ret;
} }
static int getfunc (struct devstruct *dev, uae_u8 *d, int *len) static int getfunc (struct s2devstruct *dev, uae_u8 *d, int *len)
{ {
int tlen; int tlen;
...@@ -250,7 +250,7 @@ static int mcfilter (const uae_u8 *data) ...@@ -250,7 +250,7 @@ static int mcfilter (const uae_u8 *data)
return 1; // just allow everything return 1; // just allow everything
} }
static void gotfunc (struct devstruct *dev, const uae_u8 *data2, int len) static void gotfunc (struct s2devstruct *dev, const uae_u8 *data2, int len)
{ {
int i; int i;
int size, insize, first; int size, insize, first;
......
...@@ -1226,23 +1226,23 @@ static void freenativescsi (void) ...@@ -1226,23 +1226,23 @@ static void freenativescsi (void)
static void addnativescsi (void) static void addnativescsi (void)
{ {
int i, j; int i, j;
int devices[MAX_TOTAL_DEVICES]; int devices[MAX_TOTAL_SCSI_DEVICES];
int types[MAX_TOTAL_DEVICES]; int types[MAX_TOTAL_SCSI_DEVICES];
struct device_info dis[MAX_TOTAL_DEVICES]; struct device_info dis[MAX_TOTAL_SCSI_DEVICES];
freenativescsi (); freenativescsi ();
i = 0; i = 0;
while (i < MAX_TOTAL_DEVICES) { while (i < MAX_TOTAL_SCSI_DEVICES) {
types[i] = -1; types[i] = -1;
devices[i] = -1; devices[i] = -1;
if (sys_command_open (DF_SCSI, i)) { if (sys_command_open (i)) {
if (sys_command_info (DF_SCSI, i, &dis[i])) { if (sys_command_info (i, &dis[i], 0)) {
devices[i] = i; devices[i] = i;
types[i] = 100 - i; types[i] = 100 - i;
if (dis[i].type == INQ_ROMD) if (dis[i].type == INQ_ROMD)
types[i] = 1000 - i; types[i] = 1000 - i;
} }
sys_command_close (DF_SCSI, i); sys_command_close (i);
} }
i++; i++;
} }
......
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* Arcadia emulation * Arcadia emulation
* *
* Copyright 2005-2007 Toni Wilen * Copyright 2005-2007 Toni Wilen
* *
* *
*/ */
#ifdef ARCADIA #ifdef ARCADIA
#include "sysconfig.h" #include "sysconfig.h"
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
#define MAX_EV ~0ul #define MAX_EV ~0ul
//#define DEBUG_AUDIO //#define DEBUG_AUDIO
#define DEBUG_CHANNEL_MASK 2 #define DEBUG_CHANNEL_MASK 15
//#define TEST_AUDIO //#define TEST_AUDIO
#define PERIOD_MIN 4 #define PERIOD_MIN 4
...@@ -64,7 +64,7 @@ static bool debugchannel (int ch) ...@@ -64,7 +64,7 @@ static bool debugchannel (int ch)
STATIC_INLINE bool usehacks (void) STATIC_INLINE bool usehacks (void)
{ {
return currprefs.cpu_model >= 68020 && !currprefs.cpu_cycle_exact; return currprefs.cpu_model >= 68020 || currprefs.m68k_speed != 0;
} }
#define SINC_QUEUE_MAX_AGE 2048 #define SINC_QUEUE_MAX_AGE 2048
...@@ -204,8 +204,10 @@ void audio_sampleripper (int mode) ...@@ -204,8 +204,10 @@ void audio_sampleripper (int mode)
rs->changed = 0; rs->changed = 0;
fetch_ripperpath (path, sizeof (path)); fetch_ripperpath (path, sizeof (path));
name[0] = 0; name[0] = 0;
if (currprefs.dfxtype[0] >= 0) if (currprefs.floppyslots[0].dfxtype >= 0)
_tcscpy (name, currprefs.df[0]); _tcscpy (name, currprefs.floppyslots[0].df);
else if (currprefs.cdslots[0].inuse)
_tcscpy (name, currprefs.cdslots[0].name);
if (!name[0]) if (!name[0])
underline[0] = 0; underline[0] = 0;
namesplit (name); namesplit (name);
...@@ -1036,13 +1038,18 @@ static int audio_work_to_do; ...@@ -1036,13 +1038,18 @@ static int audio_work_to_do;
static void zerostate (int nr) static void zerostate (int nr)
{ {
struct audio_channel_data *cdp = audio_channel + nr; struct audio_channel_data *cdp = audio_channel + nr;
#ifdef DEBUG_AUDIO
write_log ("%d: ZEROSTATE\n", nr);
#endif
cdp->state = 0; cdp->state = 0;
cdp->evtime = MAX_EV; cdp->evtime = MAX_EV;
cdp->intreq2 = 0; cdp->intreq2 = 0;
cdp->dsr = cdp->dr = false; cdp->dsr = cdp->dr = false;
cdp->dmaenstore = false;
#ifdef TEST_AUDIO #ifdef TEST_AUDIO
cdp->have_dat = false; cdp->have_dat = false;
#endif #endif
} }
static void schedule_audio (void) static void schedule_audio (void)
...@@ -1262,33 +1269,56 @@ static void audio_state_channel2 (int nr, bool perfin) ...@@ -1262,33 +1269,56 @@ static void audio_state_channel2 (int nr, bool perfin)
{ {
struct audio_channel_data *cdp = audio_channel + nr; struct audio_channel_data *cdp = audio_channel + nr;
bool chan_ena = (dmacon & DMA_MASTER) && (dmacon & (1 << nr)); bool chan_ena = (dmacon & DMA_MASTER) && (dmacon & (1 << nr));
bool old_dma = cdp->dmaenstore;
int audav = adkcon & (0x01 << nr); int audav = adkcon & (0x01 << nr);
int audap = adkcon & (0x10 << nr); int audap = adkcon & (0x10 << nr);
int napnav = (!audav && !audap) || audav; int napnav = (!audav && !audap) || audav;
int hpos = current_hpos (); int hpos = current_hpos ();
#ifdef DEBUG_AUDIO cdp->dmaenstore = chan_ena;
if (debugchannel (nr)) {
if (cdp->dmaenstore != chan_ena) { if (currprefs.produce_sound == 0) {
cdp->dmaenstore = chan_ena; zerostate (nr);
write_log ("%d:DMA=%d IRQ=%d PC=%08x\n", nr, chan_ena, isirq (nr) ? 1 : 0, M68K_GETPC); return;
}
} }
audio_activate ();
if ((cdp->state == 2 || cdp->state == 3) && usehacks () && !chan_ena && old_dma) {
// DMA switched off, state=2/3 and "too fast CPU": kill DMA instantly
// or CPU timed DMA wait routines in common tracker players will lose notes
#ifdef DEBUG_AUDIO
write_log ("%d: INSTADMAOFF\n", nr, M68K_GETPC);
#endif #endif
if (currprefs.produce_sound == 0) { newsample (nr, (cdp->dat2 >> 0) & 0xff);
if (napnav)
setirq (nr, 91);
zerostate (nr); zerostate (nr);
return; return;
} }
#ifdef DEBUG_AUDIO
if (debugchannel (nr) && old_dma != chan_ena) {
write_log ("%d:DMA=%d IRQ=%d PC=%08x\n", nr, chan_ena, isirq (nr) ? 1 : 0, M68K_GETPC);
}
#endif
switch (cdp->state) switch (cdp->state)
{ {
case 0: case 0:
if (chan_ena) { if (chan_ena) {
cdp->evtime = MAX_EV; cdp->evtime = MAX_EV;
cdp->state = 1; cdp->state = 1;
cdp->dsr = true;
cdp->dr = true; cdp->dr = true;
cdp->drhpos = hpos; cdp->drhpos = hpos;
cdp->wlen = cdp->len; cdp->wlen = cdp->len;
// too fast CPU and some tracker players: enable DMA, CPU delay, update AUDxPT with loop position
if (usehacks ()) {
// copy AUDxPT - 2 to internal latch instantly
cdp->pt = cdp->lc - 2;
cdp->dsr = false;
} else {
// normal hardware behavior: latch it after first DMA fetch comes
cdp->dsr = true;
}
#ifdef TEST_AUDIO #ifdef TEST_AUDIO
cdp->have_dat = false; cdp->have_dat = false;
#endif #endif
...@@ -1300,7 +1330,7 @@ static void audio_state_channel2 (int nr, bool perfin) ...@@ -1300,7 +1330,7 @@ static void audio_state_channel2 (int nr, bool perfin)
cdp->state = 2; cdp->state = 2;
setirq (nr, 0); setirq (nr, 0);
loaddat (nr); loaddat (nr);
if (currprefs.cpu_model >= 68020 && !currprefs.cpu_cycle_exact && cdp->per < 10 * CYCLE_UNIT) { if (usehacks () && cdp->per < 10 * CYCLE_UNIT) {
// make sure audio.device AUDxDAT startup returns to idle state before DMA is enabled // make sure audio.device AUDxDAT startup returns to idle state before DMA is enabled
newsample (nr, (cdp->dat2 >> 0) & 0xff); newsample (nr, (cdp->dat2 >> 0) & 0xff);
zerostate (nr); zerostate (nr);
...@@ -1314,6 +1344,7 @@ static void audio_state_channel2 (int nr, bool perfin) ...@@ -1314,6 +1344,7 @@ static void audio_state_channel2 (int nr, bool perfin)
} }
break; break;
case 1: case 1:
cdp->evtime = MAX_EV;
if (!cdp->dat_written) if (!cdp->dat_written)
return; return;
#ifdef TEST_AUDIO #ifdef TEST_AUDIO
...@@ -1322,13 +1353,14 @@ static void audio_state_channel2 (int nr, bool perfin) ...@@ -1322,13 +1353,14 @@ static void audio_state_channel2 (int nr, bool perfin)
cdp->have_dat = false; cdp->have_dat = false;
cdp->losample = cdp->hisample = false; cdp->losample = cdp->hisample = false;
#endif #endif
setirq (nr, 1); setirq (nr, 10);
setdr (nr); setdr (nr);
if (cdp->wlen != 1) if (cdp->wlen != 1)
cdp->wlen = (cdp->wlen - 1) & 0xffff; cdp->wlen = (cdp->wlen - 1) & 0xffff;
cdp->state = 5; cdp->state = 5;
break; break;
case 5: case 5:
cdp->evtime = MAX_EV;
if (!cdp->dat_written) if (!cdp->dat_written)
return; return;
#ifdef DEBUG_AUDIO #ifdef DEBUG_AUDIO
...@@ -1650,11 +1682,13 @@ void set_audio (void) ...@@ -1650,11 +1682,13 @@ void set_audio (void)
sample_prehandler = anti_prehandler; sample_prehandler = anti_prehandler;
} }
audio_activate ();
if (currprefs.produce_sound == 0) { if (currprefs.produce_sound == 0) {
eventtab[ev_audio].active = 0; eventtab[ev_audio].active = 0;
events_schedule (); events_schedule ();
} else {
audio_activate ();
schedule_audio ();
events_schedule ();
} }
config_changed = 1; config_changed = 1;
} }
...@@ -1740,8 +1774,13 @@ void update_audio (void) ...@@ -1740,8 +1774,13 @@ void update_audio (void)
} }
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (audio_channel[i].evtime == 0) if (audio_channel[i].evtime == 0) {
audio_state_channel (i, true); audio_state_channel (i, true);
if (audio_channel[i].evtime == 0) {
write_log ("evtime==0 sound bug channel %d\n");
audio_channel[i].evtime = MAX_EV;
}
}
} }
} }
end: end:
...@@ -1922,7 +1961,6 @@ int init_audio (void) ...@@ -1922,7 +1961,6 @@ int init_audio (void)
return init_sound (); return init_sound ();
} }
void led_filter_audio (void) void led_filter_audio (void)
{ {
led_filter_on = 0; led_filter_on = 0;
...@@ -1930,13 +1968,53 @@ void led_filter_audio (void) ...@@ -1930,13 +1968,53 @@ void led_filter_audio (void)
led_filter_on = 1; led_filter_on = 1;
} }
void audio_vsync (void)
{
#if SOUNDSTUFF > 0
int max, min;
int vsync = isfullscreen () > 0 && currprefs.gfx_avsync;
static int lastdir;
if (!vsync) {
extrasamples = 0;
return;
}
min = -10 * 10;
max = vsync ? 10 * 10 : 20 * 10;
extrasamples = 0;
if (gui_data.sndbuf < min) { // +1
extrasamples = (min - gui_data.sndbuf) / 10;
lastdir = 1;
} else if (gui_data.sndbuf > max) { // -1
extrasamples = (max - gui_data.sndbuf) / 10;
} else if (gui_data.sndbuf > 1 * 50 && lastdir < 0) {
extrasamples--;
} else if (gui_data.sndbuf < -1 * 50 && lastdir > 0) {
extrasamples++;
} else {
lastdir = 0;
}
if (extrasamples > 99)
extrasamples = 99;
if (extrasamples < -99)
extrasamples = -99;
#endif
}
int audio_setup (void) { return setup_sound (); }
void audio_close (void) { close_sound (); }
void audio_pause (void) { pause_sound (); }
void audio_resume (void) { resume_sound (); }
void audio_volume (int volume) { sound_volume (volume); }
#ifdef SAVESTATE #ifdef SAVESTATE
uae_u8 *restore_audio (int i, uae_u8 *src) uae_u8 *restore_audio (int nr, uae_u8 *src)
{ {
struct audio_channel_data *acd; struct audio_channel_data *acd = audio_channel + nr;
uae_u16 p; uae_u16 p;
acd = audio_channel + i;
acd->state = restore_u8 (); acd->state = restore_u8 ();
acd->vol = restore_u8 (); acd->vol = restore_u8 ();
acd->intreq2 = restore_u8 () ? true : false; acd->intreq2 = restore_u8 () ? true : false;
...@@ -1951,37 +2029,34 @@ uae_u8 *restore_audio (int i, uae_u8 *src) ...@@ -1951,37 +2029,34 @@ uae_u8 *restore_audio (int i, uae_u8 *src)
acd->wlen = restore_u16 (); acd->wlen = restore_u16 ();
p = restore_u16 (); p = restore_u16 ();
acd->per = p ? p * CYCLE_UNIT : PERIOD_MAX; acd->per = p ? p * CYCLE_UNIT : PERIOD_MAX;
p = restore_u16 (); acd->dat = acd->dat2 = restore_u16 ();
acd->lc = restore_u32 (); acd->lc = restore_u32 ();
acd->pt = restore_u32 (); acd->pt = restore_u32 ();
acd->evtime = restore_u32 (); acd->evtime = restore_u32 ();
last_cycles = get_cycles () - 1; acd->dmaenstore = (dmacon & DMA_MASTER) && (dmacon & (1 << nr));
return src; return src;
} }
#endif /* SAVESTATE */ #endif /* SAVESTATE */
#if defined SAVESTATE || defined DEBUGGER #if defined SAVESTATE || defined DEBUGGER
uae_u8 *save_audio (int i, int *len, uae_u8 *dstptr) uae_u8 *save_audio (int nr, int *len, uae_u8 *dstptr)
{ {
struct audio_channel_data *acd; struct audio_channel_data *acd = audio_channel + nr;
uae_u8 *dst, *dstbak; uae_u8 *dst, *dstbak;
uae_u16 p;
if (dstptr) if (dstptr)
dstbak = dst = dstptr; dstbak = dst = dstptr;
else else
dstbak = dst = (uae_u8*)malloc (100); dstbak = dst = xmalloc (uae_u8, 100);
acd = audio_channel + i; save_u8 (acd->state);
save_u8 ((uae_u8)acd->state);
save_u8 (acd->vol); save_u8 (acd->vol);
save_u8 (acd->intreq2); save_u8 (acd->intreq2);
save_u8 ((acd->dr ? 1 : 0) | (acd->dsr ? 2 : 0)); save_u8 ((acd->dr ? 1 : 0) | (acd->dsr ? 2 : 0));
save_u16 (acd->len); save_u16 (acd->len);
save_u16 (acd->wlen); save_u16 (acd->wlen);
p = acd->per == PERIOD_MAX ? 0 : acd->per / CYCLE_UNIT; save_u16 (acd->per == PERIOD_MAX ? 0 : acd->per / CYCLE_UNIT);
save_u16 (p); save_u16 (acd->dat);
save_u16 (acd->dat2);
save_u32 (acd->lc); save_u32 (acd->lc);
save_u32 (acd->pt); save_u32 (acd->pt);
save_u32 (acd->evtime); save_u32 (acd->evtime);
...@@ -1989,63 +2064,3 @@ uae_u8 *save_audio (int i, int *len, uae_u8 *dstptr) ...@@ -1989,63 +2064,3 @@ uae_u8 *save_audio (int i, int *len, uae_u8 *dstptr)
return dstbak; return dstbak;
} }
#endif /* SAVESTATE || DEBUGGER */ #endif /* SAVESTATE || DEBUGGER */
void audio_vsync (void)
{
#if SOUNDSTUFF > 0
int max, min;
int vsync = isfullscreen () > 0 && currprefs.gfx_avsync;
static int lastdir;
if (!vsync) {
extrasamples = 0;
return;
}
min = -10 * 10;
max = vsync ? 10 * 10 : 20 * 10;
extrasamples = 0;
if (gui_data.sndbuf < min) { // +1
extrasamples = (min - gui_data.sndbuf) / 10;
lastdir = 1;
} else if (gui_data.sndbuf > max) { // -1
extrasamples = (max - gui_data.sndbuf) / 10;
} else if (gui_data.sndbuf > 1 * 50 && lastdir < 0) {
extrasamples--;
} else if (gui_data.sndbuf < -1 * 50 && lastdir > 0) {
extrasamples++;
} else {
lastdir = 0;
}
if (extrasamples > 99)
extrasamples = 99;
if (extrasamples < -99)
extrasamples = -99;
#endif
}
int audio_setup (void)
{
return setup_sound ();
}
void audio_close (void)
{
close_sound ();
}
void audio_pause (void)
{
pause_sound ();
}
void audio_resume (void)
{
resume_sound ();
}
void audio_volume (int volume)
{
sound_volume (volume);
}
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* AutoConfig devices * AutoConfig devices
* *
* Copyright 1995, 1996 Bernd Schmidt * Copyright 1995, 1996 Bernd Schmidt
* Copyright 1996 Ed Hanway * Copyright 1996 Ed Hanway
*/ */
#include "sysconfig.h" #include "sysconfig.h"
#include "sysdeps.h" #include "sysdeps.h"
......
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* bsdsocket.library emulation machine-independent part * bsdsocket.library emulation machine-independent part
* *
* Copyright 1997, 1998 Mathias Ortmann * Copyright 1997, 1998 Mathias Ortmann
* *
* Library initialization code (c) Tauno Taipaleenmaki * Library initialization code (c) Tauno Taipaleenmaki
*/ */
#include "sysconfig.h" #include "sysconfig.h"
#include "sysdeps.h" #include "sysdeps.h"
...@@ -34,13 +34,13 @@ struct socketbase *socketbases; ...@@ -34,13 +34,13 @@ struct socketbase *socketbases;
static uae_u32 SockLibBase; static uae_u32 SockLibBase;
#define SOCKPOOLSIZE 128 #define SOCKPOOLSIZE 128
#define UNIQUE_ID (-1) #define UNIQUE_ID (-1)
/* ObtainSocket()/ReleaseSocket() public socket pool */ /* ObtainSocket()/ReleaseSocket() public socket pool */
struct sockd { struct sockd {
long sockpoolids[SOCKPOOLSIZE]; long sockpoolids[SOCKPOOLSIZE];
SOCKET_TYPE sockpoolsocks[SOCKPOOLSIZE]; SOCKET_TYPE sockpoolsocks[SOCKPOOLSIZE];
uae_u32 sockpoolflags[SOCKPOOLSIZE]; uae_u32 sockpoolflags[SOCKPOOLSIZE];
}; };
static long curruniqid = 65536; static long curruniqid = 65536;
...@@ -48,25 +48,25 @@ static struct sockd *sockdata; ...@@ -48,25 +48,25 @@ static struct sockd *sockdata;
uae_u32 strncpyha (uae_u32 dst, const uae_char *src, int size) uae_u32 strncpyha (uae_u32 dst, const uae_char *src, int size)
{ {
uae_u32 res = dst; uae_u32 res = dst;
if (!addr_valid ("strncpyha", dst, size)) if (!addr_valid ("strncpyha", dst, size))
return res; return res;
while (size--) { while (size--) {
put_byte (dst++, *src); put_byte (dst++, *src);
if (!*src++) if (!*src++)
return res; return res;
} }
return res; return res;
} }
uae_u32 addstr (uae_u32 * dst, const TCHAR *src) uae_u32 addstr (uae_u32 * dst, const TCHAR *src)
{ {
uae_u32 res = *dst; uae_u32 res = *dst;
int len; int len;
len = strlen (src) + 1; len = strlen (src) + 1;
strcpyha_safe (*dst, src); strcpyha_safe (*dst, src);
(*dst) += len; (*dst) += len;
return res; return res;
} }
uae_u32 addstr_ansi (uae_u32 * dst, const uae_char *src) uae_u32 addstr_ansi (uae_u32 * dst, const uae_char *src)
{ {
...@@ -80,83 +80,83 @@ uae_u32 addstr_ansi (uae_u32 * dst, const uae_char *src) ...@@ -80,83 +80,83 @@ uae_u32 addstr_ansi (uae_u32 * dst, const uae_char *src)
uae_u32 addmem (uae_u32 * dst, const uae_char *src, int len) uae_u32 addmem (uae_u32 * dst, const uae_char *src, int len)
{ {
uae_u32 res = *dst; uae_u32 res = *dst;
if (!src) if (!src)
return 0; return 0;
memcpyha_safe (*dst, (uae_u8*)src, len); memcpyha_safe (*dst, (uae_u8*)src, len);
(*dst) += len; (*dst) += len;
return res; return res;
} }
/* Get current task */ /* Get current task */
static uae_u32 gettask (TrapContext *context) static uae_u32 gettask (TrapContext *context)
{ {
uae_u32 currtask, a1 = m68k_areg (regs, 1); uae_u32 currtask, a1 = m68k_areg (regs, 1);
m68k_areg (regs, 1) = 0; m68k_areg (regs, 1) = 0;
currtask = CallLib (context, get_long (4), -0x126); /* FindTask */ currtask = CallLib (context, get_long (4), -0x126); /* FindTask */
m68k_areg (regs, 1) = a1; m68k_areg (regs, 1) = a1;
BSDTRACE (("[%s] ", get_real_address (get_long (currtask + 10)))); BSDTRACE (("[%s] ", get_real_address (get_long (currtask + 10))));
return currtask; return currtask;
} }
/* errno/herrno setting */ /* errno/herrno setting */
void bsdsocklib_seterrno (SB, int sb_errno) void bsdsocklib_seterrno (SB, int sb_errno)
{ {
sb->sb_errno = sb_errno; sb->sb_errno = sb_errno;
if (sb->sb_errno >= 1001 && sb->sb_errno <= 1005) if (sb->sb_errno >= 1001 && sb->sb_errno <= 1005)
bsdsocklib_setherrno (sb, sb->sb_errno - 1000); bsdsocklib_setherrno(sb,sb->sb_errno-1000);
if (sb->errnoptr) { if (sb->errnoptr) {
switch (sb->errnosize) { switch (sb->errnosize) {
case 1: case 1:
put_byte (sb->errnoptr, sb_errno); put_byte (sb->errnoptr, sb_errno);
break; break;
case 2: case 2:
put_word (sb->errnoptr, sb_errno); put_word (sb->errnoptr, sb_errno);
break; break;
case 4: case 4:
put_long (sb->errnoptr, sb_errno); put_long (sb->errnoptr, sb_errno);
} }
} }
} }
void bsdsocklib_setherrno (SB, int sb_herrno) void bsdsocklib_setherrno (SB, int sb_herrno)
{ {
sb->sb_herrno = sb_herrno; sb->sb_herrno = sb_herrno;
if (sb->herrnoptr) { if (sb->herrnoptr) {
switch (sb->herrnosize) { switch (sb->herrnosize) {
case 1: case 1:
put_byte (sb->herrnoptr, sb_herrno); put_byte (sb->herrnoptr, sb_herrno);
break; break;
case 2: case 2:
put_word (sb->herrnoptr, sb_herrno); put_word (sb->herrnoptr, sb_herrno);
break; break;
case 4: case 4:
put_long (sb->herrnoptr, sb_herrno); put_long (sb->herrnoptr, sb_herrno);
} }
} }
} }
BOOL checksd (SB, int sd) BOOL checksd(SB, int sd)
{ {
int iCounter; int iCounter;
SOCKET s; SOCKET s;
s = getsock (sb, sd); s = getsock(sb,sd);
if (s != INVALID_SOCKET) { if (s != INVALID_SOCKET) {
for (iCounter = 1; iCounter <= sb->dtablesize; iCounter++) { for (iCounter = 1; iCounter <= sb->dtablesize; iCounter++) {
if (iCounter != sd) { if (iCounter != sd) {
if (getsock (sb, iCounter) == s) { if (getsock(sb,iCounter) == s) {
releasesock (sb, sd); releasesock(sb,sd);
return 1; return 1;
} }
} }
} }
for (iCounter = 0; iCounter < SOCKPOOLSIZE; iCounter++) { for (iCounter = 0; iCounter < SOCKPOOLSIZE; iCounter++) {
if (s == sockdata->sockpoolsocks[iCounter]) if (s == sockdata->sockpoolsocks[iCounter])
...@@ -169,38 +169,38 @@ BOOL checksd (SB, int sd) ...@@ -169,38 +169,38 @@ BOOL checksd (SB, int sd)
void setsd(SB, int sd, SOCKET_TYPE s) void setsd(SB, int sd, SOCKET_TYPE s)
{ {
sb->dtable[sd - 1] = s; sb->dtable[sd - 1] = s;
} }
/* Socket descriptor/opaque socket handle management */ /* Socket descriptor/opaque socket handle management */
int getsd (SB, SOCKET_TYPE s) int getsd (SB, SOCKET_TYPE s)
{ {
int i; int i;
SOCKET_TYPE *dt = sb->dtable; SOCKET_TYPE *dt = sb->dtable;
/* return socket descriptor if already exists */ /* return socket descriptor if already exists */
for (i = sb->dtablesize; i--;) for (i = sb->dtablesize; i--;)
if (dt[i] == s) if (dt[i] == s)
return i + 1; return i + 1;
/* create new table entry */ /* create new table entry */
for (i = 0; i < sb->dtablesize; i++) for (i = 0; i < sb->dtablesize; i++)
if (dt[i] == -1) { if (dt[i] == -1) {
dt[i] = s; dt[i] = s;
sb->ftable[i] = SF_BLOCKING; sb->ftable[i] = SF_BLOCKING;
return i + 1; return i + 1;
} }
/* descriptor table full. */ /* descriptor table full. */
bsdsocklib_seterrno (sb, 24); /* EMFILE */ bsdsocklib_seterrno (sb, 24); /* EMFILE */
return -1; return -1;
} }
SOCKET_TYPE getsock (SB, int sd) SOCKET_TYPE getsock (SB, int sd)
{ {
if ((unsigned int) (sd - 1) >= (unsigned int) sb->dtablesize) { if ((unsigned int) (sd - 1) >= (unsigned int) sb->dtablesize) {
BSDTRACE (("Invalid Socket Descriptor (%d, %d)\n", sd - 1, sb->dtablesize)); BSDTRACE (("Invalid Socket Descriptor (%d, %d)\n", sd - 1, sb->dtablesize));
bsdsocklib_seterrno (sb, 38); /* ENOTSOCK */ bsdsocklib_seterrno (sb, 38); /* ENOTSOCK */
return -1; return -1;
} }
if (sb->dtable[sd - 1] == INVALID_SOCKET) { if (sb->dtable[sd - 1] == INVALID_SOCKET) {
...@@ -226,14 +226,14 @@ SOCKET_TYPE getsock (SB, int sd) ...@@ -226,14 +226,14 @@ SOCKET_TYPE getsock (SB, int sd)
} }
nsb = sb1->next; nsb = sb1->next;
} }
} }
return sb->dtable[sd - 1]; return sb->dtable[sd - 1];
} }
void releasesock (SB, int sd) void releasesock (SB, int sd)
{ {
if ((unsigned int) (sd - 1) < (unsigned int) sb->dtablesize) if ((unsigned int) (sd - 1) < (unsigned int) sb->dtablesize)
sb->dtable[sd - 1] = -1; sb->dtable[sd - 1] = -1;
} }
/* Signal queue */ /* Signal queue */
......
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* CD32 FMV cartridge * CD32 FMV cartridge
* *
* Copyright 2008 Toni Wilen * Copyright 2008-2010 Toni Wilen
* *
*/ */
#include "sysconfig.h" #include "sysconfig.h"
#include "sysdeps.h" #include "sysdeps.h"
...@@ -19,35 +19,48 @@ ...@@ -19,35 +19,48 @@
#include "cd32_fmv.h" #include "cd32_fmv.h"
#include "uae.h" #include "uae.h"
//#define FMV_DEBUG #define FMV_DEBUG 1
/*
0x200000 - 0x23FFFF ROM
0x240000 io/status (single word register?)
0x2500xx L64111 audio decoder (word registers)
0x2700xx CL450 video decoder (word registers)
0x280000 - 0x2FFFFF RAM
*/
#define IO_BASE 0x040000
#define L64111_BASE 0x050000
#define CL450_BASE 0x070000
#define VRAM_BASE 0x080000
#define BANK_MASK 0x0F0000
#define FMV_BASE 0x40000 #define IO_IRQ_L641111 0x4000
#define AUDIO_BASE 0x50000 #define IO_IRQ_CL450 0x8000
#define VIDEO_BASE 0x70000
#define VIDEO_RAM 0x80000
// L64111 registers (from datasheet) // L64111 registers (from datasheet)
#define A_DATA 0 #define A_DATA 0 //0
#define A_CONTROL1 2 #define A_CONTROL1 1 //2
#define A_CONTROL2 4 #define A_CONTROL2 2 //4
#define A_CONTROL3 6 #define A_CONTROL3 3 //6
#define A_INT1 8 #define A_INT1 4 //8
#define A_INT2 10 #define A_INT2 5 //10
#define A_TCR 12 #define A_TCR 6 //12
#define A_TORH 14 #define A_TORH 7 //14
#define A_TORL 16 #define A_TORL 8 //16
#define A_PARAM1 18 #define A_PARAM1 9 //18
#define A_PARAM2 20 #define A_PARAM2 10 //20
#define A_PARAM3 22 #define A_PARAM3 11 //22
#define A_PRESENT1 24 #define A_PRESENT1 12 //24
#define A_PRESENT2 26 #define A_PRESENT2 13 //26
#define A_PRESENT3 28 #define A_PRESENT3 14 //28
#define A_PRESENT4 30 #define A_PRESENT4 15 //30
#define A_PRESENT5 32 #define A_PRESENT5 16 //32
#define A_FIFO 34 #define A_FIFO 17 //34
#define A_CB_STATUS 36 #define A_CB_STATUS 18 //36
#define A_CB_WRITE 38 #define A_CB_WRITE 19 //38
#define A_CB_READ 40 #define A_CB_READ 20 //40
static int fmv_mask; static int fmv_mask;
static uae_u8 *rom; static uae_u8 *rom;
...@@ -55,51 +68,191 @@ static int rom_size = 262144; ...@@ -55,51 +68,191 @@ static int rom_size = 262144;
static uaecptr fmv_start = 0x00200000; static uaecptr fmv_start = 0x00200000;
static int fmv_size = 1048576; static int fmv_size = 1048576;
static uae_u8 fmv_bget2 (uaecptr addr) static uae_u16 l64111regs[32];
static uae_u16 l64111intmask1, l64111intmask2, l64111intstatus1, l64111intstatus2;
static uae_u16 io_reg;
static int isdebug (uaecptr addr)
{ {
#ifdef FMV_DEBUG #if FMV_DEBUG > 2
write_log ("fmv_bget2 %08X PC=%8X\n", addr, M68K_GETPC); if (M68K_GETPC >= 0x200100)
return 1;
return 0;
#endif
#if (FMV_DEBUG == 2)
if (M68K_GETPC >= 0x200100 && (addr & fmv_mask) >= VRAM_BASE)
return 1;
return 0;
#endif #endif
if (addr >= rom_size && addr < 0x80000) { return 0;
write_log ("fmv_bget2 %08X PC=%8X\n", addr, M68K_GETPC); }
static uae_u8 io_bget (uaecptr addr)
{
addr &= 0xffff;
write_log ("FMV: IO byte read access %08x!\n", addr);
return 0;
}
static uae_u16 io_wget (uaecptr addr)
{
addr &= 0xffff;
if (addr != 0)
return 0; return 0;
return io_reg;
}
static void io_bput (uaecptr addr, uae_u8 v)
{
addr &= 0xffff;
write_log ("FMV: IO byte write access %08x!\n", addr);
}
static void io_wput (uaecptr addr, uae_u16 v)
{
addr &= 0xffff;
if (addr != 0)
return;
write_log ("FMV: IO=%04x\n", v);
io_reg = v;
}
static uae_u8 l64111_bget (uaecptr addr)
{
write_log ("FMV: L64111 byte read access %08x!\n", addr);
return 0;
}
static void l64111_bput (uaecptr addr, uae_u8 v)
{
write_log ("FMV: L64111 byte write access %08x!\n", addr);
}
static uae_u16 l64111_wget (uaecptr addr)
{
addr >>= 1;
addr &= 31;
#if FMV_DEBUG > 0
write_log ("FMV: L64111 read reg %d -> %04x\n", addr, l64111regs[addr]);
#endif
if (addr == 4)
return l64111intstatus1;
if (addr == 5)
return l64111intstatus1;
return l64111regs[addr];
}
static void l64111_wput (uaecptr addr, uae_u16 v)
{
addr >>= 1;
addr &= 31;
#if FMV_DEBUG > 0
write_log ("FMV: L64111 write reg %d = %04x\n", addr, v);
#endif
if (addr == 4) {
l64111intmask1 = v;
return;
}
if (addr == 5) {
l64111intmask2 = v;
return;
} }
l64111regs[addr] = v;
}
static uae_u8 cl450_bget (uaecptr addr)
{
addr &= 0xff;
write_log ("FMV: CL450 byte read access %08x!\n", addr);
return 0;
}
static uae_u16 cl450_wget (uaecptr addr)
{
addr &= 0xff;
addr >>= 1;
write_log ("FMV: CL450 read reg %d\n", addr);
return 0;
}
static void cl450_bput (uaecptr addr, uae_u8 v)
{
addr &= 0xff;
write_log ("FMV: CL450 byte write access %08x!\n", addr);
}
static void cl450_wput (uaecptr addr, uae_u16 v)
{
addr &= 0xff;
write_log ("FMV: CL450 write reg %d = %04x\n", addr, v);
}
static uae_u8 romram_bget (uaecptr addr)
{
#ifdef FMV_DEBUG
if (isdebug (addr))
write_log ("romram_bget %08X PC=%08X\n", addr, M68K_GETPC);
#endif
if (addr >= IO_BASE && addr < VRAM_BASE)
return 0;
return rom[addr]; return rom[addr];
} }
static void fmv_bput2 (uaecptr addr, uae_u8 v) static uae_u16 romram_wget (uaecptr addr)
{ {
if (addr >= rom_size && addr < 0x80000) { #ifdef FMV_DEBUG
write_log ("fmv_bput2 %08X=%02X PC=%8X\n", addr, v & 0xff, M68K_GETPC); if (isdebug (addr))
write_log ("romram_wget %08X PC=%08X\n", addr, M68K_GETPC);
#endif
if (addr >= IO_BASE && addr < VRAM_BASE)
return 0;
return (rom[addr] << 8) | (rom[addr + 1] << 0);
}
static void ram_bput (uaecptr addr, uae_u8 v)
{
if (addr < VRAM_BASE)
return;
rom[addr] = v;
if (isdebug (addr)) {
write_log ("ram_bput %08X=%02X PC=%08X\n", addr, v & 0xff, M68K_GETPC);
}
}
static void ram_wput (uaecptr addr, uae_u16 v)
{
if (addr < VRAM_BASE)
return;
rom[addr + 0] = v >> 8;
rom[addr + 1] = v >> 0;
if (isdebug (addr)) {
write_log ("ram_wput %08X=%04X PC=%08X\n", addr, v & 0xffff, M68K_GETPC);
} }
} }
static uae_u32 REGPARAM2 fmv_lget (uaecptr addr) static uae_u32 REGPARAM2 fmv_wget (uaecptr addr)
{ {
uae_u32 v; uae_u32 v;
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= fmv_start & fmv_mask; addr -= fmv_start & fmv_mask;
addr &= fmv_mask; addr &= fmv_mask;
v = (fmv_bget2 (addr) << 24) | (fmv_bget2 (addr + 1) << 16) | int mask = addr & BANK_MASK;
(fmv_bget2 (addr + 2) << 8) | (fmv_bget2 (addr + 3)); if (mask == L64111_BASE)
v = l64111_wget (addr);
else if (mask == CL450_BASE)
v = cl450_wget (addr);
else if (mask == IO_BASE)
v = io_wget (addr);
else
v = romram_wget (addr);
#ifdef FMV_DEBUG #ifdef FMV_DEBUG
write_log ("fmv_lget %08X=%08X PC=%08X\n", addr, v, M68K_GETPC); if (isdebug (addr))
write_log ("fmv_wget %08X=%04X PC=%08X\n", addr, v, M68K_GETPC);
#endif #endif
return v; return v;
} }
static uae_u32 REGPARAM2 fmv_wget (uaecptr addr) static uae_u32 REGPARAM2 fmv_lget (uaecptr addr)
{ {
uae_u32 v; uae_u32 v;
#ifdef JIT v = (fmv_wget (addr) << 16) | (fmv_wget (addr + 2) << 0);
special_mem |= S_READ;
#endif
addr -= fmv_start & fmv_mask;
addr &= fmv_mask;
v = (fmv_bget2 (addr) << 8) | fmv_bget2 (addr + 1);
#ifdef FMV_DEBUG #ifdef FMV_DEBUG
write_log ("fmv_wget %08X=%04X PC=%08X\n", addr, v, M68K_GETPC); if (isdebug (addr))
write_log ("fmv_lget %08X=%08X PC=%08X\n", addr, v, M68K_GETPC);
#endif #endif
return v; return v;
} }
...@@ -107,55 +260,64 @@ static uae_u32 REGPARAM2 fmv_wget (uaecptr addr) ...@@ -107,55 +260,64 @@ static uae_u32 REGPARAM2 fmv_wget (uaecptr addr)
static uae_u32 REGPARAM2 fmv_bget (uaecptr addr) static uae_u32 REGPARAM2 fmv_bget (uaecptr addr)
{ {
uae_u32 v; uae_u32 v;
#ifdef JIT
special_mem |= S_READ;
#endif
addr -= fmv_start & fmv_mask; addr -= fmv_start & fmv_mask;
addr &= fmv_mask; addr &= fmv_mask;
v = fmv_bget2 (addr); int mask = addr & BANK_MASK;
if (mask == L64111_BASE)
v = l64111_bget (addr);
else if (mask == CL450_BASE)
v = cl450_bget (addr);
else if (mask == IO_BASE)
v = io_bget (addr);
else
v = romram_bget (addr);
return v; return v;
} }
static void REGPARAM2 fmv_lput (uaecptr addr, uae_u32 l) static void REGPARAM2 fmv_wput (uaecptr addr, uae_u32 w)
{ {
#ifdef JIT
special_mem |= S_WRITE;
#endif
addr -= fmv_start & fmv_mask; addr -= fmv_start & fmv_mask;
addr &= fmv_mask; addr &= fmv_mask;
#ifdef FMV_DEBUG #ifdef FMV_DEBUG
write_log ("fmv_lput %08X=%08X PC=%08X\n", addr, l, M68K_GETPC); if (isdebug (addr))
write_log ("fmv_wput %04X=%04X PC=%08X\n", addr, w & 65535, M68K_GETPC);
#endif #endif
fmv_bput2 (addr, l >> 24); int mask = addr & BANK_MASK;
fmv_bput2 (addr + 1, l >> 16); if (mask == L64111_BASE)
fmv_bput2 (addr + 2, l >> 8); l64111_wput (addr, w);
fmv_bput2 (addr + 3, l); else if (mask == CL450_BASE)
cl450_wput (addr, w);
else if (mask == IO_BASE)
io_wput (addr, w);
else
ram_wput (addr, w);
} }
static void REGPARAM2 fmv_wput (uaecptr addr, uae_u32 w) static void REGPARAM2 fmv_lput (uaecptr addr, uae_u32 w)
{ {
#ifdef JIT
special_mem |= S_WRITE;
#endif
addr -= fmv_start & fmv_mask;
addr &= fmv_mask;
#ifdef FMV_DEBUG #ifdef FMV_DEBUG
write_log ("fmv_wput %04X=%04X PC=%08X\n", addr, w & 65535, M68K_GETPC); if (isdebug (addr))
write_log ("fmv_lput %08X=%08X PC=%08X\n", addr, w, M68K_GETPC);
#endif #endif
fmv_bput2 (addr, w >> 8); fmv_wput (addr + 0, w >> 16);
fmv_bput2 (addr + 1, w); fmv_wput (addr + 2, w >> 0);
} }
//extern addrbank fmv_bank; extern addrbank fmv_bank;
static void REGPARAM2 fmv_bput (uaecptr addr, uae_u32 b) static void REGPARAM2 fmv_bput (uaecptr addr, uae_u32 w)
{ {
#ifdef JIT
special_mem |= S_WRITE;
#endif
addr -= fmv_start & fmv_mask; addr -= fmv_start & fmv_mask;
addr &= fmv_mask; addr &= fmv_mask;
fmv_bput2 (addr, b); int mask = addr & BANK_MASK;
if (mask == L64111_BASE)
l64111_bput (addr, w);
else if (mask == CL450_BASE)
cl450_bput (addr, w);
else if (mask == IO_BASE)
io_bput (addr, w);
else
ram_bput (addr, w);
} }
static uae_u32 REGPARAM2 fmv_wgeti (uaecptr addr) static uae_u32 REGPARAM2 fmv_wgeti (uaecptr addr)
...@@ -208,7 +370,7 @@ static uae_u8 *REGPARAM2 fmv_xlate (uaecptr addr) ...@@ -208,7 +370,7 @@ static uae_u8 *REGPARAM2 fmv_xlate (uaecptr addr)
return rom + addr; return rom + addr;
} }
static addrbank fmv_bank = { addrbank fmv_bank = {
fmv_lget, fmv_wget, fmv_bget, fmv_lget, fmv_wget, fmv_bget,
fmv_lput, fmv_wput, fmv_bput, fmv_lput, fmv_wput, fmv_bput,
fmv_xlate, fmv_check, NULL, "CD32 FMV module", fmv_xlate, fmv_check, NULL, "CD32 FMV module",
...@@ -240,6 +402,5 @@ void cd32_fmv_init (uaecptr start) ...@@ -240,6 +402,5 @@ void cd32_fmv_init (uaecptr start)
} }
fmv_mask = fmv_size - 1; fmv_mask = fmv_size - 1;
fmv_bank.baseaddr = rom; fmv_bank.baseaddr = rom;
rom[0x282] = 0;
map_banks (&fmv_bank, start >> 16, fmv_size >> 16, 0); map_banks (&fmv_bank, start >> 16, fmv_size >> 16, 0);
} }
This diff is collapsed.
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* CIA chip support * CIA chip support
* *
* Copyright 1995 Bernd Schmidt, Alessandro Bissacco * Copyright 1995 Bernd Schmidt, Alessandro Bissacco
* Copyright 1996, 1997 Stefan Reinauer, Christian Schmitt * Copyright 1996, 1997 Stefan Reinauer, Christian Schmitt
*/ */
#include "sysconfig.h" #include "sysconfig.h"
...@@ -27,14 +27,15 @@ ...@@ -27,14 +27,15 @@
#include "zfile.h" #include "zfile.h"
#include "ar.h" #include "ar.h"
#ifdef PARALLEL_PORT #ifdef PARALLEL_PORT
# include "parallel.h" #include "parallel.h"
#endif #endif
#ifdef CD32 #ifdef CD32
# include "akiko.h" #include "akiko.h"
#include "cdtv.h"
#endif #endif
#include "debug.h" #include "debug.h"
#ifdef ARCADIA #ifdef ARCADIA
# include "arcadia.h" #include "arcadia.h"
#endif #endif
#include "keyboard.h" #include "keyboard.h"
#include "uae.h" #include "uae.h"
...@@ -51,7 +52,7 @@ ...@@ -51,7 +52,7 @@
/* FIXME: Add configure support to enable this. */ /* FIXME: Add configure support to enable this. */
#ifdef HAVE_GETTIMEOFDAY #ifdef HAVE_GETTIMEOFDAY
# define TOD_HACK #define TOD_HACK
#endif #endif
#define DIV10 (10 * CYCLE_UNIT / 2) /* Yes, a bad identifier. */ #define DIV10 (10 * CYCLE_UNIT / 2) /* Yes, a bad identifier. */
...@@ -1218,7 +1219,7 @@ void CIA_reset (void) ...@@ -1218,7 +1219,7 @@ void CIA_reset (void)
DISK_select (ciabprb); DISK_select (ciabprb);
} }
#ifdef CD32 #ifdef CD32
if (savestate_state != STATE_RESTORE) { if (savestate_state != STATE_RESTORE && savestate_state != STATE_DORESTORE) {
akiko_reset (); akiko_reset ();
if (!akiko_init ()) if (!akiko_init ())
currprefs.cs_cd32cd = changed_prefs.cs_cd32cd = 0; currprefs.cs_cd32cd = changed_prefs.cs_cd32cd = 0;
......
This diff is collapsed.
...@@ -42,7 +42,7 @@ void consolehook_config (struct uae_prefs *p) ...@@ -42,7 +42,7 @@ void consolehook_config (struct uae_prefs *p)
p->fastmem_size = 0x00800000; p->fastmem_size = 0x00800000;
p->bogomem_size = 0; p->bogomem_size = 0;
p->nr_floppies = 1; p->nr_floppies = 1;
p->dfxtype[1] = DRV_NONE; p->floppyslots[1].dfxtype = DRV_NONE;
p->floppy_speed = 0; p->floppy_speed = 0;
p->start_gui = 0; p->start_gui = 0;
p->gfx_size_win.width = 320; p->gfx_size_win.width = 320;
......
...@@ -2504,6 +2504,7 @@ static void finish_decisions (void) ...@@ -2504,6 +2504,7 @@ static void finish_decisions (void)
decide_line (hpos); decide_line (hpos);
decide_fetch (hpos); decide_fetch (hpos);
record_color_change2 (hsyncstartpos, 0xffff, 0);
if (thisline_decision.plfleft != -1 && thisline_decision.plflinelen == -1) { if (thisline_decision.plfleft != -1 && thisline_decision.plflinelen == -1) {
if (fetch_state != fetch_not_started) { if (fetch_state != fetch_not_started) {
write_log ("fetch_state=%d plfleft=%d,len=%d,vpos=%d,hpos=%d\n", write_log ("fetch_state=%d plfleft=%d,len=%d,vpos=%d,hpos=%d\n",
...@@ -2747,7 +2748,7 @@ void init_hz (void) ...@@ -2747,7 +2748,7 @@ void init_hz (void)
hzc = 1; hzc = 1;
if (beamcon0 != new_beamcon0) { if (beamcon0 != new_beamcon0) {
write_log ("BEAMCON0 %04x -> %04x\n", beamcon0, new_beamcon0); write_log ("BEAMCON0 %04x -> %04x\n", beamcon0, new_beamcon0);
vpos_count = 0; vpos_count = vpos_count_prev = 0;
} }
beamcon0 = new_beamcon0; beamcon0 = new_beamcon0;
isntsc = (beamcon0 & 0x20) ? 0 : 1; isntsc = (beamcon0 & 0x20) ? 0 : 1;
...@@ -2774,7 +2775,7 @@ void init_hz (void) ...@@ -2774,7 +2775,7 @@ void init_hz (void)
if (vpos_count < 10) if (vpos_count < 10)
vpos_count = 10; vpos_count = 10;
vblank_hz = (15600 + vpos_count - 1) / vpos_count; vblank_hz = (15600 + vpos_count - 1) / vpos_count;
maxvpos_nom = vpos_count; maxvpos_nom = vpos_count - (lof_current ? 1 : 0);
reset_drawing (); reset_drawing ();
} }
if (beamcon0 & 0x80) { if (beamcon0 & 0x80) {
...@@ -2816,7 +2817,7 @@ void init_hz (void) ...@@ -2816,7 +2817,7 @@ void init_hz (void)
else else
hsyncstartpos = maxhpos + hbstrt; hsyncstartpos = maxhpos + hbstrt;
} else { } else {
hsyncstartpos = maxhpos_short + 7; hsyncstartpos = maxhpos_short + 13;
} }
eventtab[ev_hsync].oldcycles = get_cycles (); eventtab[ev_hsync].oldcycles = get_cycles ();
eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME; eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME;
...@@ -3120,7 +3121,8 @@ STATIC_INLINE uae_u16 VHPOSR (void) ...@@ -3120,7 +3121,8 @@ STATIC_INLINE uae_u16 VHPOSR (void)
static int test_copper_dangerous (unsigned int address) static int test_copper_dangerous (unsigned int address)
{ {
if ((address & 0x1fe) < ((copcon & 2) ? ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) ? 0 : 0x40) : 0x80)) { int addr = address & 0x01fe;
if (addr < ((copcon & 2) ? ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) ? 0 : 0x40) : 0x80)) {
cop_state.state = COP_stop; cop_state.state = COP_stop;
copper_enabled_thisline = 0; copper_enabled_thisline = 0;
unset_special (SPCFLAG_COPPER); unset_special (SPCFLAG_COPPER);
...@@ -4250,7 +4252,7 @@ static int custom_wput_copper (int hpos, uaecptr addr, uae_u32 value, int noget) ...@@ -4250,7 +4252,7 @@ static int custom_wput_copper (int hpos, uaecptr addr, uae_u32 value, int noget)
int v; int v;
#ifdef DEBUG #ifdef DEBUG
debug_wputpeekdma (0xdff000 + addr, value); value = debug_wputpeekdma (0xdff000 + addr, value);
#endif #endif
copper_access = 1; copper_access = 1;
v = custom_wput_1 (hpos, addr, value, noget); v = custom_wput_1 (hpos, addr, value, noget);
...@@ -5110,6 +5112,7 @@ static void vsync_handler (void) ...@@ -5110,6 +5112,7 @@ static void vsync_handler (void)
picasso_handle_vsync (); picasso_handle_vsync ();
#endif #endif
audio_vsync (); audio_vsync ();
blkdev_vsync ();
if (quit_program > 0) { if (quit_program > 0) {
/* prevent possible infinite loop at wait_cycles().. */ /* prevent possible infinite loop at wait_cycles().. */
...@@ -5378,6 +5381,8 @@ static void events_dmal (int hp) ...@@ -5378,6 +5381,8 @@ static void events_dmal (int hp)
} }
event2_newevent2 (hp, dmal_hpos + ((dmal & 2) ? 1 : 0), dmal_func); event2_newevent2 (hp, dmal_hpos + ((dmal & 2) ? 1 : 0), dmal_func);
dmal &= ~3; dmal &= ~3;
} else if (currprefs.cachesize) {
dmal_func2 (0);
} else { } else {
event2_newevent2 (hp, 17, dmal_func2); event2_newevent2 (hp, 17, dmal_func2);
} }
...@@ -5642,9 +5647,9 @@ static void hsync_handler (void) ...@@ -5642,9 +5647,9 @@ static void hsync_handler (void)
} }
while (input_recording < 0 && inprec_pstart (INPREC_DISKINSERT)) { while (input_recording < 0 && inprec_pstart (INPREC_DISKINSERT)) {
int drv = inprec_pu8 (); int drv = inprec_pu8 ();
inprec_pstr (currprefs.df[drv]); inprec_pstr (currprefs.floppyslots[drv].df);
_tcscpy (changed_prefs.df[drv], currprefs.df[drv]); _tcscpy (changed_prefs.floppyslots[drv].df, currprefs.floppyslots[drv].df);
disk_insert_force (drv, currprefs.df[drv]); disk_insert_force (drv, currprefs.floppyslots[drv].df);
inprec_pend (); inprec_pend ();
} }
#endif #endif
...@@ -5830,6 +5835,7 @@ void customreset (int hardreset) ...@@ -5830,6 +5835,7 @@ void customreset (int hardreset)
unset_special (~(SPCFLAG_BRK | SPCFLAG_MODE_CHANGE)); unset_special (~(SPCFLAG_BRK | SPCFLAG_MODE_CHANGE));
vpos = 0; vpos = 0;
vpos_count = vpos_count_prev = 0;
inputdevice_reset (); inputdevice_reset ();
timehack_alive = 0; timehack_alive = 0;
...@@ -5848,7 +5854,6 @@ void customreset (int hardreset) ...@@ -5848,7 +5854,6 @@ void customreset (int hardreset)
diwstate = DIW_waiting_start; diwstate = DIW_waiting_start;
set_cycles (0); set_cycles (0);
vpos_count = vpos_count_prev = 0;
dmal = 0; dmal = 0;
init_hz (); init_hz ();
vpos_lpen = -1; vpos_lpen = -1;
......
This diff is collapsed.
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* Emulates simple protection dongles * Emulates simple protection dongles
* *
* Copyright 2009 Toni Wilen * Copyright 2009 Toni Wilen
*/ */
#include "sysconfig.h" #include "sysconfig.h"
......
...@@ -212,7 +212,7 @@ static int bplres; ...@@ -212,7 +212,7 @@ static int bplres;
static int plf1pri, plf2pri, bplxor; static int plf1pri, plf2pri, bplxor;
static uae_u32 plf_sprite_mask; static uae_u32 plf_sprite_mask;
static int sbasecol[2] = { 16, 16 }; static int sbasecol[2] = { 16, 16 };
static int brdsprt, brdblank, brdblank_changed; static int brdsprt, brdblank, brdblank_changed, hposendblank;
bool picasso_requested_on; bool picasso_requested_on;
bool picasso_on; bool picasso_on;
...@@ -674,12 +674,21 @@ STATIC_INLINE uae_u32 merge_2pixel32 (uae_u32 p1, uae_u32 p2) ...@@ -674,12 +674,21 @@ STATIC_INLINE uae_u32 merge_2pixel32 (uae_u32 p1, uae_u32 p2)
return v; return v;
} }
STATIC_INLINE xcolnr getbgc (void)
{
#if 0
if (hposendblank)
return xcolors[0xf00];
#endif
return (brdblank || hposendblank) ? 0 : colors_for_drawing.acolors[0];
}
static void fill_line_16 (uae_u8 *buf, unsigned int start, unsigned int stop) static void fill_line_16 (uae_u8 *buf, unsigned int start, unsigned int stop)
{ {
uae_u16 *b = (uae_u16 *)buf; uae_u16 *b = (uae_u16 *)buf;
unsigned int i; unsigned int i;
unsigned int rem = 0; unsigned int rem = 0;
xcolnr col = brdblank ? 0 : colors_for_drawing.acolors[0]; xcolnr col = getbgc ();
if (((long)&b[start]) & 1) if (((long)&b[start]) & 1)
b[start++] = (uae_u16) col; b[start++] = (uae_u16) col;
if (start >= stop) if (start >= stop)
...@@ -700,7 +709,7 @@ static void fill_line_32 (uae_u8 *buf, unsigned int start, unsigned int stop) ...@@ -700,7 +709,7 @@ static void fill_line_32 (uae_u8 *buf, unsigned int start, unsigned int stop)
{ {
uae_u32 *b = (uae_u32 *)buf; uae_u32 *b = (uae_u32 *)buf;
unsigned int i; unsigned int i;
xcolnr col = brdblank ? 0 : colors_for_drawing.acolors[0]; xcolnr col = getbgc ();
for (i = start; i < stop; i++) for (i = start; i < stop; i++)
b[i] = col; b[i] = col;
} }
...@@ -714,7 +723,7 @@ static void pfield_do_fill_line (int start, int stop) ...@@ -714,7 +723,7 @@ static void pfield_do_fill_line (int start, int stop)
} }
} }
STATIC_INLINE void fill_line_2 (int startpos, int len, int blank) STATIC_INLINE void fill_line2 (int startpos, int len)
{ {
int shift; int shift;
int nints, nrem; int nints, nrem;
...@@ -732,16 +741,16 @@ STATIC_INLINE void fill_line_2 (int startpos, int len, int blank) ...@@ -732,16 +741,16 @@ STATIC_INLINE void fill_line_2 (int startpos, int len, int blank)
nrem = nints & 7; nrem = nints & 7;
nints &= ~7; nints &= ~7;
start = (int *)(((uae_u8*)xlinebuffer) + (startpos << shift)); start = (int *)(((uae_u8*)xlinebuffer) + (startpos << shift));
val = blank ? 0 : colors_for_drawing.acolors[0]; val = getbgc ();
for (; nints > 0; nints -= 8, start += 8) { for (; nints > 0; nints -= 8, start += 8) {
*start = val; *start = val;
*(start + 1) = val; *(start+1) = val;
*(start + 2) = val; *(start+2) = val;
*(start + 3) = val; *(start+3) = val;
*(start + 4) = val; *(start+4) = val;
*(start + 5) = val; *(start+5) = val;
*(start + 6) = val; *(start+6) = val;
*(start + 7) = val; *(start+7) = val;
} }
switch (nrem) { switch (nrem) {
...@@ -762,15 +771,15 @@ STATIC_INLINE void fill_line_2 (int startpos, int len, int blank) ...@@ -762,15 +771,15 @@ STATIC_INLINE void fill_line_2 (int startpos, int len, int blank)
} }
} }
STATIC_INLINE void fill_line (void) static void fill_line (void)
{ {
int endpos = visible_left_border + gfxvidinfo.width; int hs = coord_hw_to_window_x (hsyncstartpos * 2);
int endposh = coord_hw_to_window_x (hsyncstartpos * 2); if (hs > visible_left_border + gfxvidinfo.width || hposendblank) {
if (endpos < endposh) { fill_line2 (visible_left_border, gfxvidinfo.width);
fill_line_2 (visible_left_border, gfxvidinfo.width, brdblank);
} else { } else {
fill_line_2 (visible_left_border, endposh - visible_left_border, brdblank); fill_line2 (visible_left_border, hs);
fill_line_2 (endposh, gfxvidinfo.width - endposh, 1); hposendblank = 1;
fill_line2 (visible_left_border + hs, gfxvidinfo.width - hs);
} }
} }
...@@ -1850,8 +1859,12 @@ static bool isham (uae_u16 bplcon0) ...@@ -1850,8 +1859,12 @@ static bool isham (uae_u16 bplcon0)
return 0; return 0;
} }
static void pfield_expand_dp_bplcon2 (int regno, int v) static void pfield_expand_dp_bplconx (int regno, int v)
{ {
if (regno == 0xffff) {
hposendblank = 1;
return;
}
regno -= 0x1000; regno -= 0x1000;
switch (regno) switch (regno)
{ {
...@@ -1907,8 +1920,6 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun ...@@ -1907,8 +1920,6 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
int i; int i;
int lastpos = visible_left_border; int lastpos = visible_left_border;
int endpos = visible_left_border + gfxvidinfo.width; int endpos = visible_left_border + gfxvidinfo.width;
int diff = 1 << lores_shift;
int endposh = coord_hw_to_window_x (hsyncstartpos * 2);
for (i = dip_for_drawing->first_color_change; i <= dip_for_drawing->last_color_change; i++) { for (i = dip_for_drawing->first_color_change; i <= dip_for_drawing->last_color_change; i++) {
int regno = curr_color_changes[i].regno; int regno = curr_color_changes[i].regno;
...@@ -1927,17 +1938,7 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun ...@@ -1927,17 +1938,7 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
if (nextpos_in_range > lastpos) { if (nextpos_in_range > lastpos) {
if (lastpos < playfield_start) { if (lastpos < playfield_start) {
int t = nextpos_in_range <= playfield_start ? nextpos_in_range : playfield_start; int t = nextpos_in_range <= playfield_start ? nextpos_in_range : playfield_start;
if (t == endpos) { (*worker_border) (lastpos, t);
if (lastpos < endposh)
(*worker_border) (lastpos, endposh);
// start of hsync, blank the rest of display
int blank = brdblank;
brdblank = 1;
(*worker_border) (endposh, endpos);
brdblank = blank;
} else {
(*worker_border) (lastpos, t);
}
lastpos = t; lastpos = t;
} }
} }
...@@ -1949,23 +1950,13 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun ...@@ -1949,23 +1950,13 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
} }
} }
if (nextpos_in_range > lastpos) { if (nextpos_in_range > lastpos) {
if (lastpos >= playfield_end) { if (lastpos >= playfield_end)
if (nextpos_in_range > endposh) { (*worker_border) (lastpos, nextpos_in_range);
(*worker_border) (lastpos, endposh);
// start of hsync, blank the rest of display
int blank = brdblank;
brdblank = 1;
(*worker_border) (endposh, nextpos_in_range);
brdblank = blank;
} else {
(*worker_border) (lastpos, nextpos_in_range);
}
}
lastpos = nextpos_in_range; lastpos = nextpos_in_range;
} }
if (i != dip_for_drawing->last_color_change) { if (i != dip_for_drawing->last_color_change) {
if (regno >= 0x1000) { if (regno >= 0x1000) {
pfield_expand_dp_bplcon2 (regno, value); pfield_expand_dp_bplconx (regno, value);
} else { } else {
color_reg_set (&colors_for_drawing, regno, value); color_reg_set (&colors_for_drawing, regno, value);
colors_for_drawing.acolors[regno] = getxcolor (value); colors_for_drawing.acolors[regno] = getxcolor (value);
...@@ -1975,7 +1966,6 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun ...@@ -1975,7 +1966,6 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
break; break;
} }
} }
enum double_how { enum double_how {
dh_buf, dh_buf,
dh_line, dh_line,
...@@ -2159,11 +2149,11 @@ static void pfield_draw_line (int lineno, int gfx_ypos, int follow_ypos) ...@@ -2159,11 +2149,11 @@ static void pfield_draw_line (int lineno, int gfx_ypos, int follow_ypos)
} else { } else {
xcolnr tmp = colors_for_drawing.acolors[0]; int tmp = hposendblank;
colors_for_drawing.acolors[0] = getxcolor (0); hposendblank = 1;
fill_line (); fill_line ();
do_flush_line (gfx_ypos); do_flush_line (gfx_ypos);
colors_for_drawing.acolors[0] = tmp; hposendblank = tmp;
} }
} }
...@@ -2749,22 +2739,24 @@ void finish_drawing_frame (void) ...@@ -2749,22 +2739,24 @@ void finish_drawing_frame (void)
if (where2 < 0) if (where2 < 0)
continue; continue;
hposendblank = 0;
pfield_draw_line (line, where2, amiga2aspect_line_map[i1 + 1]); pfield_draw_line (line, where2, amiga2aspect_line_map[i1 + 1]);
} }
/* clear possible old garbage at the bottom if emulated area become smaller */ /* clear possible old garbage at the bottom if emulated area become smaller */
for (i = last_max_ypos; i < gfxvidinfo.height; i++) { for (i = last_max_ypos; i < gfxvidinfo.height; i++) {
int i1 = i + min_ypos_for_screen; int i1 = i + min_ypos_for_screen;
int line = i + thisframe_y_adjust_real; int line = i + thisframe_y_adjust_real;
int where2 = amiga2aspect_line_map[i1]; int where2 = amiga2aspect_line_map[i1];
xcolnr tmp;
if (where2 >= gfxvidinfo.height) if (where2 >= gfxvidinfo.height)
break; break;
if (where2 < 0) if (where2 < 0)
continue; continue;
tmp = colors_for_drawing.acolors[0];
colors_for_drawing.acolors[0] = getxcolor (0); hposendblank = i >= last_max_ypos + 16;
xlinebuffer = gfxvidinfo.linemem; xlinebuffer = gfxvidinfo.linemem;
if (xlinebuffer == 0) if (xlinebuffer == 0)
xlinebuffer = row_map[where2]; xlinebuffer = row_map[where2];
...@@ -2772,7 +2764,6 @@ void finish_drawing_frame (void) ...@@ -2772,7 +2764,6 @@ void finish_drawing_frame (void)
fill_line (); fill_line ();
linestate[line] = LINE_UNDECIDED; linestate[line] = LINE_UNDECIDED;
do_flush_line (where2); do_flush_line (where2);
colors_for_drawing.acolors[0] = tmp;
} }
if (currprefs.leds_on_screen) { if (currprefs.leds_on_screen) {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -1229,7 +1229,7 @@ static void allocate_expamem (void) ...@@ -1229,7 +1229,7 @@ static void allocate_expamem (void)
if (allocated_z3chipmem) { if (allocated_z3chipmem) {
z3chipmem = mapped_malloc (allocated_z3chipmem, "z3_chip"); z3chipmem = mapped_malloc (allocated_z3chipmem, "z3_chip");
if (z3chipmem == 0) { if (z3chipmem == 0) {
write_log ("Out of memory for 32 bit fake chip memory.\n"); write_log ("Out of memory for 32 bit chip memory.\n");
allocated_z3chipmem = 0; allocated_z3chipmem = 0;
} }
} }
...@@ -1503,7 +1503,7 @@ void expamem_reset (void) ...@@ -1503,7 +1503,7 @@ void expamem_reset (void)
card_map[cardno++] = expamem_map_clear; card_map[cardno++] = expamem_map_clear;
} }
if (cardno == 0) if (cardno == 0 || savestate_state)
expamem_init_clear_zero (); expamem_init_clear_zero ();
else else
(*card_init[0]) (); (*card_init[0]) ();
......
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* Gayle (and motherboard resources) memory bank * Gayle (and motherboard resources) memory bank
* *
* (c) 2006 - 2008 Toni Wilen * (c) 2006 - 2008 Toni Wilen
*/ */
#ifdef GAYLE #ifdef GAYLE
#define GAYLE_LOG 0 #define GAYLE_LOG 0
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/* /*
* UAE - The Un*x Amiga Emulator * UAE - The Un*x Amiga Emulator
* *
* Sound emulation stuff * Sound emulation stuff
* *
* Copyright 1995, 1996, 1997 Bernd Schmidt * Copyright 1995, 1996, 1997 Bernd Schmidt
*/ */
#define PERIOD_MAX ULONG_MAX #define PERIOD_MAX ULONG_MAX
......
This diff is collapsed.
...@@ -6,6 +6,7 @@ extern addrbank dmac_bank; ...@@ -6,6 +6,7 @@ extern addrbank dmac_bank;
extern void cdtv_init (void); extern void cdtv_init (void);
extern void cdtv_free (void); extern void cdtv_free (void);
extern void CDTV_hsync_handler(void); extern void CDTV_hsync_handler(void);
extern void cdtv_check_banks (void);
extern void cdtv_entergui (void); extern void cdtv_entergui (void);
extern void cdtv_exitgui (void); extern void cdtv_exitgui (void);
...@@ -26,5 +27,7 @@ extern void rethink_cdtv (void); ...@@ -26,5 +27,7 @@ extern void rethink_cdtv (void);
extern void cdtv_scsi_int (void); extern void cdtv_scsi_int (void);
extern void cdtv_scsi_clear_int (void); extern void cdtv_scsi_clear_int (void);
extern bool cdtv_front_panel (int);
#endif #endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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