mirror of
https://github.com/libretro/PUAE.git
synced 2024-11-24 08:19:47 +00:00
sync 2.2.1
This commit is contained in:
parent
8510c21178
commit
716e8cfae1
6
README
6
README
@ -1,4 +1,4 @@
|
||||
PUAE 2.2.00
|
||||
PUAE 2.2.1 beta series
|
||||
============
|
||||
PUAE tries to continue where E-UAE left off..
|
||||
PUAE versioning is based on the merged WinUAE version..
|
||||
@ -56,6 +56,10 @@ from which you can legally make a ROM image, a selection of ROM images
|
||||
are available for purchase online from Cloanto (publishers of the
|
||||
Amiga Forever distribution). See http://www.amigaforever.com/
|
||||
|
||||
What's new since PUAE 2.x.x
|
||||
======================
|
||||
* trying to sync with winuae :}
|
||||
|
||||
What's new since PUAE 0.0.0
|
||||
======================
|
||||
* Some many changes that i can't begin to mention here and now.
|
||||
|
@ -159,7 +159,7 @@ static void i2c_do (void)
|
||||
bitcounter = -1;
|
||||
}
|
||||
} else {
|
||||
//write_log (L"NVRAM received bit %d, offset %d\n", sda_out, bitcounter);
|
||||
//write_log ("NVRAM received bit %d, offset %d\n", sda_out, bitcounter);
|
||||
nvram_byte <<= 1;
|
||||
nvram_byte |= sda_out;
|
||||
bitcounter++;
|
||||
|
627
src/audio.c
627
src/audio.c
@ -45,7 +45,10 @@
|
||||
|
||||
#define MAX_EV ~0ul
|
||||
//#define DEBUG_AUDIO
|
||||
#define DEBUG_CHANNEL_MASK 15
|
||||
#define DEBUG_CHANNEL_MASK 2
|
||||
//#define TEST_AUDIO
|
||||
|
||||
#define PERIOD_MIN 4
|
||||
|
||||
int audio_channel_mask = 15;
|
||||
|
||||
@ -78,7 +81,13 @@ typedef struct {
|
||||
struct audio_channel_data {
|
||||
unsigned long adk_mask;
|
||||
unsigned long evtime;
|
||||
uae_u8 dmaen, intreq2;
|
||||
bool dmaenstore;
|
||||
bool intreq2;
|
||||
bool dr;
|
||||
bool dsr;
|
||||
bool pbufldl;
|
||||
int drhpos;
|
||||
bool dat_written;
|
||||
uaecptr lc, pt;
|
||||
int current_sample, last_sample;
|
||||
int state;
|
||||
@ -86,12 +95,15 @@ struct audio_channel_data {
|
||||
int vol;
|
||||
int len, wlen;
|
||||
uae_u16 dat, dat2;
|
||||
int request_word, request_word_skip;
|
||||
int vpos;
|
||||
int sample_accum, sample_accum_time;
|
||||
int sinc_output_state;
|
||||
sinc_queue_t sinc_queue[SINC_QUEUE_LENGTH];
|
||||
int sinc_queue_length;
|
||||
#ifdef TEST_AUDIO
|
||||
bool hisample, losample;
|
||||
bool have_dat;
|
||||
int per_original;
|
||||
#endif
|
||||
};
|
||||
|
||||
static int samplecnt;
|
||||
@ -1021,11 +1033,35 @@ static void sample16si_rh_handler (void)
|
||||
|
||||
static int audio_work_to_do;
|
||||
|
||||
static void zerostate (struct audio_channel_data *cdp)
|
||||
static void zerostate (int nr)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
cdp->state = 0;
|
||||
cdp->evtime = MAX_EV;
|
||||
cdp->request_word = 0;
|
||||
cdp->intreq2 = 0;
|
||||
cdp->dsr = cdp->dr = false;
|
||||
#ifdef TEST_AUDIO
|
||||
cdp->have_dat = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void schedule_audio (void)
|
||||
{
|
||||
unsigned long best = MAX_EV;
|
||||
int i;
|
||||
|
||||
eventtab[ev_audio].active = 0;
|
||||
eventtab[ev_audio].oldcycles = get_cycles ();
|
||||
for (i = 0; i < 4; i++) {
|
||||
struct audio_channel_data *cdp = audio_channel + i;
|
||||
if (cdp->evtime != MAX_EV) {
|
||||
if (best > cdp->evtime) {
|
||||
best = cdp->evtime;
|
||||
eventtab[ev_audio].active = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
eventtab[ev_audio].evtime = get_cycles () + best;
|
||||
}
|
||||
|
||||
static void audio_event_reset (void)
|
||||
@ -1034,10 +1070,8 @@ static void audio_event_reset (void)
|
||||
|
||||
last_cycles = get_cycles () - 1;
|
||||
next_sample_evtime = scaled_sample_evtime;
|
||||
for (i = 0; i < 4; i++) {
|
||||
struct audio_channel_data *cdp = audio_channel + i;
|
||||
zerostate (cdp);
|
||||
}
|
||||
for (i = 0; i < 4; i++)
|
||||
zerostate (i);
|
||||
schedule_audio ();
|
||||
events_schedule ();
|
||||
samplecnt = 0;
|
||||
@ -1075,23 +1109,24 @@ STATIC_INLINE int is_audio_active (void)
|
||||
return audio_work_to_do;
|
||||
}
|
||||
|
||||
void schedule_audio (void)
|
||||
uae_u16 audio_dmal (void)
|
||||
{
|
||||
unsigned long best = MAX_EV;
|
||||
int i;
|
||||
|
||||
eventtab[ev_audio].active = 0;
|
||||
eventtab[ev_audio].oldcycles = get_cycles ();
|
||||
for (i = 0; i < 4; i++) {
|
||||
struct audio_channel_data *cdp = audio_channel + i;
|
||||
if (cdp->evtime != MAX_EV) {
|
||||
if (best > cdp->evtime) {
|
||||
best = cdp->evtime;
|
||||
eventtab[ev_audio].active = 1;
|
||||
unsigned int nr;
|
||||
uae_u16 dmal = 0;
|
||||
for (nr = 0; nr < 4; nr++) {
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
// hpos offset hack, no need for expensive event
|
||||
if (cdp->drhpos > 0 && cdp->drhpos < maxhpos - 4) {
|
||||
if (cdp->dr)
|
||||
dmal |= 1 << (nr * 2);
|
||||
if (cdp->dsr)
|
||||
dmal |= 1 << (nr * 2 + 1);
|
||||
cdp->dr = cdp->dsr = false;
|
||||
} else {
|
||||
cdp->drhpos = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
eventtab[ev_audio].evtime = get_cycles () + best;
|
||||
return dmal;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1142,18 +1177,20 @@ static int isirq (int nr)
|
||||
|
||||
static void setirq (int nr, int which)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("SETIRQ %d (%d) %08X\n", nr, which, M68K_GETPC);
|
||||
write_log ("SETIRQ%d (%d,%d) PC=%08X\n", nr, which, isirq (nr) ? 1 : 0, M68K_GETPC);
|
||||
#endif
|
||||
INTREQ (0x8000 | (0x80 << nr));
|
||||
INTREQ_0 (0x8000 | (0x80 << nr));
|
||||
}
|
||||
|
||||
static void newsample (int nr, sample8_t sample)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (!debugchannel (nr)) sample = 0;
|
||||
if (!debugchannel (nr))
|
||||
sample = 0;
|
||||
#endif
|
||||
if (!(audio_channel_mask & (1 << nr)))
|
||||
sample = 0;
|
||||
@ -1161,164 +1198,238 @@ static void newsample (int nr, sample8_t sample)
|
||||
cdp->current_sample = sample;
|
||||
}
|
||||
|
||||
static void state23 (struct audio_channel_data *cdp)
|
||||
STATIC_INLINE void setdr (int nr)
|
||||
{
|
||||
if (!cdp->dmaen)
|
||||
return;
|
||||
if (cdp->request_word >= 0)
|
||||
return;
|
||||
cdp->request_word = 0;
|
||||
if (cdp->wlen == 1) {
|
||||
cdp->wlen = cdp->len;
|
||||
cdp->pt = cdp->lc;
|
||||
cdp->intreq2 = 1;
|
||||
if (sampleripper_enabled)
|
||||
do_samplerip (cdp);
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (cdp - audio_channel))
|
||||
write_log ("Channel %d looped, LC=%08X LEN=%d\n", cdp - audio_channel, cdp->pt, cdp->wlen);
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
#ifdef TEST_AUDIO
|
||||
if (cdp->dr)
|
||||
write_log ("%d: DR already active (STATE=%d)\n", nr, cdp->state);
|
||||
#endif
|
||||
cdp->drhpos = current_hpos ();
|
||||
cdp->dr = true;
|
||||
if (cdp->wlen == 1) {
|
||||
cdp->dsr = true;
|
||||
cdp->drhpos++;
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("DSR%d PT=%08X PC=%08X\n", nr, cdp->pt, M68K_GETPC);
|
||||
#endif
|
||||
} else {
|
||||
cdp->wlen = (cdp->wlen - 1) & 0xFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
static void audio_handler (int nr)
|
||||
static void loaddat (int nr)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
int audav = adkcon & (0x01 << nr);
|
||||
int audap = adkcon & (0x10 << nr);
|
||||
if (audav || audap) {
|
||||
if (nr > 3)
|
||||
return;
|
||||
if (audav) {
|
||||
cdp[1].vol = cdp->dat;
|
||||
} else if (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 {
|
||||
#ifdef TEST_AUDIO
|
||||
if (cdp->hisample || cdp->losample)
|
||||
write_log ("%d: high or low sample not used\n", nr);
|
||||
cdp->hisample = cdp->losample = true;
|
||||
if (!cdp->have_dat)
|
||||
write_log ("%d: dat not updated. STATE=%d\n", nr, cdp->state);
|
||||
cdp->have_dat = false;
|
||||
#endif
|
||||
cdp->dat2 = cdp->dat;
|
||||
}
|
||||
}
|
||||
|
||||
STATIC_INLINE void loadper (int nr)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
|
||||
cdp->evtime = cdp->per;
|
||||
if (cdp->evtime < CYCLE_UNIT)
|
||||
write_log ("loadper%d bug %d\n", nr, cdp->evtime);
|
||||
}
|
||||
|
||||
|
||||
static void audio_state_channel2 (int nr, bool perfin)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
bool chan_ena = (dmacon & DMA_MASTER) && (dmacon & (1 << nr));
|
||||
int audav = adkcon & (0x01 << nr);
|
||||
int audap = adkcon & (0x10 << nr);
|
||||
int napnav = (!audav && !audap) || audav;
|
||||
int evtime = cdp->evtime;
|
||||
int hpos = current_hpos ();
|
||||
|
||||
audio_activate ();
|
||||
cdp->evtime = MAX_EV;
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr)) {
|
||||
if (cdp->dmaenstore != chan_ena) {
|
||||
cdp->dmaenstore = chan_ena;
|
||||
write_log ("%d:DMA=%d IRQ=%d PC=%08x\n", nr, chan_ena, isirq (nr) ? 1 : 0, M68K_GETPC);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (currprefs.produce_sound == 0) {
|
||||
zerostate (nr);
|
||||
return;
|
||||
}
|
||||
switch (cdp->state)
|
||||
{
|
||||
case 0:
|
||||
cdp->intreq2 = 0;
|
||||
cdp->vpos = vpos;
|
||||
if (cdp->dmaen) {
|
||||
if (chan_ena) {
|
||||
cdp->evtime = MAX_EV;
|
||||
cdp->state = 1;
|
||||
cdp->dsr = true;
|
||||
cdp->dr = true;
|
||||
cdp->drhpos = hpos;
|
||||
cdp->wlen = cdp->len;
|
||||
/* there are too many stupid sound routines that fail on "too" fast cpus.. */
|
||||
if (usehacks ())
|
||||
cdp->pt = cdp->lc;
|
||||
#ifdef TEST_AUDIO
|
||||
cdp->have_dat = false;
|
||||
#endif
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("%d:0>1: LEN=%d\n", nr, cdp->wlen);
|
||||
write_log ("%d:0>1: LEN=%d PC=%08x\n", nr, cdp->wlen, M68K_GETPC);
|
||||
#endif
|
||||
cdp->request_word = 0;
|
||||
cdp->request_word_skip = 0;
|
||||
audio_handler (nr);
|
||||
return;
|
||||
} else if (!cdp->dmaen && cdp->request_word < 0 && !isirq (nr)) {
|
||||
cdp->evtime = 0;
|
||||
} else if (cdp->dat_written && !isirq (nr)) {
|
||||
cdp->state = 2;
|
||||
setirq (nr, 0);
|
||||
audio_handler (nr);
|
||||
return;
|
||||
}
|
||||
cdp->request_word = 0;
|
||||
cdp->request_word_skip = 0;
|
||||
return;
|
||||
|
||||
case 1:
|
||||
if (!cdp->dmaen) {
|
||||
cdp->state = 0;
|
||||
return;
|
||||
}
|
||||
cdp->state = 5;
|
||||
if (cdp->wlen != 1)
|
||||
cdp->wlen = (cdp->wlen - 1) & 0xFFFF;
|
||||
cdp->request_word = 2;
|
||||
/* "mysterious" delay for Mission Elevator */
|
||||
//if (cdp->vpos == vpos)
|
||||
if (current_hpos () > maxhpos - 20)
|
||||
cdp->request_word_skip = 1;
|
||||
return;
|
||||
|
||||
case 5:
|
||||
if (!cdp->request_word) {
|
||||
cdp->request_word = 2;
|
||||
return;
|
||||
}
|
||||
setirq (nr, 5);
|
||||
if (!cdp->dmaen) {
|
||||
cdp->state = 0;
|
||||
cdp->request_word = 0;
|
||||
return;
|
||||
}
|
||||
cdp->state = 2;
|
||||
cdp->request_word = 3;
|
||||
if (napnav)
|
||||
cdp->request_word = 2;
|
||||
cdp->dat = cdp->dat2;
|
||||
return;
|
||||
|
||||
case 2:
|
||||
if (currprefs.produce_sound == 0)
|
||||
cdp->per = PERIOD_MAX;
|
||||
|
||||
if (!cdp->dmaen && isirq (nr) && (evtime == 0 || evtime == MAX_EV || evtime == cdp->per)) {
|
||||
zerostate (cdp);
|
||||
return;
|
||||
}
|
||||
|
||||
state23 (cdp);
|
||||
cdp->state = 3;
|
||||
cdp->evtime = cdp->per;
|
||||
newsample (nr, (cdp->dat >> 8) & 0xff);
|
||||
cdp->dat <<= 8;
|
||||
/* Period attachment? */
|
||||
if (audap) {
|
||||
if (cdp->intreq2 && cdp->dmaen)
|
||||
setirq (nr, 2);
|
||||
cdp->intreq2 = 0;
|
||||
cdp->request_word = 1;
|
||||
cdp->dat = cdp->dat2;
|
||||
if (nr < 3) {
|
||||
if (cdp->dat == 0)
|
||||
(cdp+1)->per = PERIOD_MAX;
|
||||
else if (cdp->dat < maxhpos * CYCLE_UNIT / 2 && currprefs.produce_sound < 3)
|
||||
(cdp+1)->per = maxhpos * CYCLE_UNIT / 2;
|
||||
else
|
||||
(cdp+1)->per = cdp->dat * CYCLE_UNIT;
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
case 3:
|
||||
if (currprefs.produce_sound == 0)
|
||||
cdp->per = PERIOD_MAX;
|
||||
|
||||
state23 (cdp);
|
||||
cdp->state = 2;
|
||||
cdp->evtime = cdp->per;
|
||||
newsample (nr, (cdp->dat >> 8) & 0xff);
|
||||
cdp->dat <<= 8;
|
||||
cdp->dat = cdp->dat2;
|
||||
if (cdp->dmaen) {
|
||||
if (napnav)
|
||||
cdp->request_word = 1;
|
||||
if (cdp->intreq2 && napnav)
|
||||
setirq (nr, 3);
|
||||
loaddat (nr);
|
||||
if (currprefs.cpu_model >= 68020 && !currprefs.cpu_cycle_exact && 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);
|
||||
zerostate (nr);
|
||||
} else {
|
||||
if (napnav) {
|
||||
setirq (nr, 4);
|
||||
loadper (nr);
|
||||
cdp->pbufldl = true;
|
||||
audio_state_channel2 (nr, false);
|
||||
}
|
||||
} else {
|
||||
zerostate (nr);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (!cdp->dat_written)
|
||||
return;
|
||||
#ifdef TEST_AUDIO
|
||||
if (!cdp->have_dat)
|
||||
write_log ("%d: state 1 but no have_dat\n", nr);
|
||||
cdp->have_dat = false;
|
||||
cdp->losample = cdp->hisample = false;
|
||||
#endif
|
||||
setirq (nr, 1);
|
||||
setdr (nr);
|
||||
if (cdp->wlen != 1)
|
||||
cdp->wlen = (cdp->wlen - 1) & 0xffff;
|
||||
cdp->state = 5;
|
||||
break;
|
||||
case 5:
|
||||
if (!cdp->dat_written)
|
||||
return;
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("%d:>5: LEN=%d PT=%08X PC=%08X\n", nr, cdp->wlen, cdp->pt, M68K_GETPC);
|
||||
#endif
|
||||
loaddat (nr);
|
||||
if (napnav)
|
||||
setdr (nr);
|
||||
cdp->state = 2;
|
||||
loadper (nr);
|
||||
cdp->pbufldl = true;
|
||||
cdp->intreq2 = 0;
|
||||
|
||||
/* Volume attachment? */
|
||||
if (audav) {
|
||||
if (nr < 3) {
|
||||
(cdp+1)->vol = cdp->dat;
|
||||
audio_state_channel2 (nr, false);
|
||||
break;
|
||||
case 2:
|
||||
if (cdp->pbufldl) {
|
||||
#ifdef TEST_AUDIO
|
||||
if (cdp->hisample == false)
|
||||
write_log ("%d: high sample used twice\n", nr);
|
||||
cdp->hisample = false;
|
||||
#endif
|
||||
newsample (nr, (cdp->dat2 >> 8) & 0xff);
|
||||
cdp->pbufldl = false;
|
||||
}
|
||||
if (!perfin)
|
||||
return;
|
||||
if (audap)
|
||||
loaddat (nr);
|
||||
if (chan_ena) {
|
||||
if (audap)
|
||||
setdr (nr);
|
||||
if (cdp->intreq2 && audap)
|
||||
setirq (nr, 21);
|
||||
} else {
|
||||
if (audap)
|
||||
setirq (nr, 22);
|
||||
}
|
||||
loadper (nr);
|
||||
cdp->pbufldl = true;
|
||||
cdp->state = 3;
|
||||
audio_state_channel2 (nr, false);
|
||||
break;
|
||||
case 3:
|
||||
if (cdp->pbufldl) {
|
||||
#ifdef TEST_AUDIO
|
||||
if (cdp->losample == false)
|
||||
write_log ("%d: low sample used twice\n", nr);
|
||||
cdp->losample = false;
|
||||
#endif
|
||||
newsample (nr, (cdp->dat2 >> 0) & 0xff);
|
||||
cdp->pbufldl = false;
|
||||
}
|
||||
if (!perfin)
|
||||
return;
|
||||
if (chan_ena) {
|
||||
loaddat (nr);
|
||||
if (cdp->intreq2 && napnav)
|
||||
setirq (nr, 31);
|
||||
if (napnav)
|
||||
setdr (nr);
|
||||
} else {
|
||||
if (isirq (nr)) {
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("%d: IDLE\n", nr);
|
||||
#endif
|
||||
zerostate (nr);
|
||||
return;
|
||||
}
|
||||
loaddat (nr);
|
||||
if (napnav)
|
||||
setirq (nr, 32);
|
||||
}
|
||||
cdp->intreq2 = 0;
|
||||
loadper (nr);
|
||||
cdp->pbufldl = true;
|
||||
cdp->state = 2;
|
||||
audio_state_channel2 (nr, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void audio_state_channel (int nr, bool perfin)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
audio_state_channel2 (nr, perfin);
|
||||
cdp->dat_written = 0;
|
||||
}
|
||||
|
||||
void audio_state_machine (void)
|
||||
{
|
||||
unsigned int nr;
|
||||
update_audio ();
|
||||
for (nr = 0; nr < 4; nr++) {
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
audio_state_channel2 (nr, false);
|
||||
cdp->dat_written = 0;
|
||||
}
|
||||
schedule_audio ();
|
||||
events_schedule ();
|
||||
}
|
||||
|
||||
void audio_reset (void)
|
||||
@ -1340,14 +1451,9 @@ void audio_reset (void)
|
||||
cdp->vol = 0;
|
||||
cdp->evtime = MAX_EV;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < 4; i++) {
|
||||
cdp = &audio_channel[i];
|
||||
cdp->dmaen = (dmacon & DMA_MASTER) && (dmacon & (1 << i));
|
||||
}
|
||||
}
|
||||
|
||||
last_cycles = get_cycles ();
|
||||
last_cycles = get_cycles () - 1;
|
||||
next_sample_evtime = scaled_sample_evtime;
|
||||
schedule_audio ();
|
||||
events_schedule ();
|
||||
@ -1403,23 +1509,24 @@ static float rc_calculate_a0 (int sample_rate, int cutoff_freq)
|
||||
void check_prefs_changed_audio (void)
|
||||
{
|
||||
int ch;
|
||||
#ifdef DRIVESOUND
|
||||
driveclick_check_prefs ();
|
||||
#endif
|
||||
if (!sound_available)
|
||||
return;
|
||||
|
||||
if (sound_available) {
|
||||
ch = sound_prefs_changed ();
|
||||
if (!ch)
|
||||
return;
|
||||
if (ch > 0) {
|
||||
#ifdef AVIOUTPUT
|
||||
AVIOutput_Restart ();
|
||||
#endif
|
||||
clear_sound_buffers ();
|
||||
}
|
||||
if (ch) {
|
||||
set_audio ();
|
||||
audio_activate ();
|
||||
}
|
||||
}
|
||||
#ifdef DRIVESOUND
|
||||
driveclick_check_prefs ();
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_audio (void)
|
||||
{
|
||||
@ -1634,7 +1741,7 @@ void update_audio (void)
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (audio_channel[i].evtime == 0)
|
||||
audio_handler (i);
|
||||
audio_state_channel (i, true);
|
||||
}
|
||||
}
|
||||
end:
|
||||
@ -1647,118 +1754,68 @@ void audio_evhandler (void)
|
||||
schedule_audio ();
|
||||
}
|
||||
|
||||
void audio_hsync (int hpos)
|
||||
void audio_hsync (void)
|
||||
{
|
||||
int nr, handle;
|
||||
static int old_dma;
|
||||
int dmaaction = hpos < 0;
|
||||
|
||||
if (!isaudio ())
|
||||
return;
|
||||
|
||||
if (old_dma != (dmacon & (DMA_MASTER | 15))) {
|
||||
old_dma = dmacon & (DMA_MASTER | 15);
|
||||
audio_activate ();
|
||||
}
|
||||
|
||||
if (audio_work_to_do > 0 && currprefs.sound_auto) {
|
||||
audio_work_to_do--;
|
||||
if (audio_work_to_do == 0)
|
||||
audio_deactivate ();
|
||||
}
|
||||
|
||||
if (!is_audio_active ())
|
||||
return;
|
||||
|
||||
update_audio ();
|
||||
handle = 0;
|
||||
/* Sound data is fetched at the beginning of each line */
|
||||
for (nr = 0; nr < 4; nr++) {
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
int chan_ena = (dmacon & DMA_MASTER) && (dmacon & (1 << nr));
|
||||
int handle2 = 0;
|
||||
|
||||
if (dmaaction && cdp->request_word > 0) {
|
||||
|
||||
if (cdp->request_word_skip) {
|
||||
cdp->request_word_skip = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cdp->state == 5) {
|
||||
cdp->pt = cdp->lc;
|
||||
void AUDxDAT (int nr, uae_u16 v, uaecptr addr)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
int chan_ena = (dmacon & DMA_MASTER) && (dmacon & (1 << nr));
|
||||
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr) && (!chan_ena || addr == 0xffffffff || (cdp->state != 2 && cdp->state != 3)))
|
||||
write_log ("AUD%dDAT: %04X ADDR=%08X LEN=%d/%d %d,%d,%d %06X\n", nr,
|
||||
v, addr, cdp->wlen, cdp->len, cdp->state, chan_ena, isirq (nr) ? 1 : 0, M68K_GETPC);
|
||||
#endif
|
||||
cdp->dat = v;
|
||||
cdp->dat_written = true;
|
||||
#ifdef TEST_AUDIO
|
||||
if (cdp->have_dat)
|
||||
write_log ("%d: audxdat but old dat not yet used\n", nr);
|
||||
cdp->have_dat = true;
|
||||
#endif
|
||||
if (cdp->state == 2 || cdp->state == 3) {
|
||||
if (chan_ena) {
|
||||
if (cdp->wlen == 1) {
|
||||
cdp->wlen = cdp->len;
|
||||
cdp->intreq2 = true;
|
||||
if (sampleripper_enabled)
|
||||
do_samplerip (cdp);
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("%d:>5: LEN=%d PT=%08X\n", nr, cdp->wlen, cdp->pt);
|
||||
write_log ("AUD%d looped, IRQ=%d, LC=%08X LEN=%d\n", nr, isirq (nr), cdp->pt, cdp->wlen);
|
||||
#endif
|
||||
}
|
||||
cdp->dat2 = last_custom_value1 = chipmem_wget_indirect (cdp->pt);
|
||||
if (cdp->request_word >= 2)
|
||||
handle2 = 1;
|
||||
if (chan_ena) {
|
||||
if (dmaaction) {
|
||||
alloc_cycle_ext (13 + nr * 2, CYCLE_MISC);
|
||||
#ifdef DEBUGGER
|
||||
if (debug_dma)
|
||||
record_dma (0xaa + nr * 16, cdp->dat2, cdp->pt, 13 + nr * 2, vpos, DMARECORD_AUDIO);
|
||||
#endif
|
||||
}
|
||||
if (cdp->request_word == 1 || cdp->request_word == 2)
|
||||
cdp->pt += 2;
|
||||
}
|
||||
cdp->request_word = -1;
|
||||
|
||||
}
|
||||
|
||||
if (cdp->dmaen != chan_ena) {
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("AUD%dDMA %d->%d (%d) LEN=%d/%d %08X\n", nr, cdp->dmaen, chan_ena,
|
||||
cdp->state, cdp->wlen, cdp->len, M68K_GETPC);
|
||||
#endif
|
||||
cdp->dmaen = chan_ena;
|
||||
if (cdp->dmaen)
|
||||
handle2 = 1;
|
||||
}
|
||||
if (handle2)
|
||||
audio_handler (nr);
|
||||
handle |= handle2;
|
||||
}
|
||||
if (handle) {
|
||||
schedule_audio ();
|
||||
events_schedule ();
|
||||
} else {
|
||||
cdp->wlen = (cdp->wlen - 1) & 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
void AUDxDAT (int nr, uae_u16 v)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
write_log ("AUD%dDAT: %04X STATE=%d IRQ=%d %08X\n", nr,
|
||||
v, cdp->state, isirq(nr) ? 1 : 0, M68K_GETPC);
|
||||
#endif
|
||||
} else {
|
||||
audio_activate ();
|
||||
update_audio ();
|
||||
cdp->dat2 = v;
|
||||
if (cdp->request_word >= 2 && cdp->request_word_skip == 0)
|
||||
audio_handler (nr);
|
||||
cdp->request_word = -1;
|
||||
cdp->request_word_skip = 0;
|
||||
/* cpu >= 68020: another "too fast" memory/CPU hack */
|
||||
if (cdp->state == 0 || usehacks ()) {
|
||||
cdp->state = 2;
|
||||
cdp->wlen = cdp->len;
|
||||
cdp->pt = cdp->lc;
|
||||
if (usehacks ())
|
||||
setirq (nr, -1);
|
||||
audio_handler (nr);
|
||||
audio_state_channel (nr, false);
|
||||
schedule_audio ();
|
||||
events_schedule ();
|
||||
}
|
||||
cdp->dat_written = false;
|
||||
}
|
||||
|
||||
uaecptr audio_getpt (int nr, int reset)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
uaecptr p = cdp->pt;
|
||||
cdp->pt += 2;
|
||||
if (reset)
|
||||
cdp->pt = cdp->lc;
|
||||
return p;
|
||||
}
|
||||
|
||||
void AUDxLCH (int nr, uae_u16 v)
|
||||
@ -1795,19 +1852,10 @@ void AUDxPER (int nr, uae_u16 v)
|
||||
if (per == 0)
|
||||
per = PERIOD_MAX - 1;
|
||||
|
||||
#if 0
|
||||
// too fast CPU compatibility hack. KS sets AUDxPER == 8 or 1 when ending the sound, this does not
|
||||
// always work correctly in JIT modes if sound is immediately restarted.
|
||||
if (usehacks () && per < 10 * CYCLE_UNIT && !cdp->dmaen) {
|
||||
zerostate (cdp);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (per < maxhpos * CYCLE_UNIT / 2 && currprefs.produce_sound < 3)
|
||||
per = maxhpos * CYCLE_UNIT / 2;
|
||||
else if (per < 4 * CYCLE_UNIT)
|
||||
if (per < PERIOD_MIN * CYCLE_UNIT) {
|
||||
/* smaller values would cause extremely high cpu usage */
|
||||
per = 4 * CYCLE_UNIT;
|
||||
per = PERIOD_MIN * CYCLE_UNIT;
|
||||
}
|
||||
|
||||
if (cdp->per == PERIOD_MAX - 1 && per != PERIOD_MAX - 1) {
|
||||
cdp->evtime = CYCLE_UNIT;
|
||||
@ -1816,7 +1864,9 @@ void AUDxPER (int nr, uae_u16 v)
|
||||
events_schedule ();
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TEST_AUDIO
|
||||
cdp->per_original = v;
|
||||
#endif
|
||||
cdp->per = per;
|
||||
#ifdef DEBUG_AUDIO
|
||||
if (debugchannel (nr))
|
||||
@ -1840,7 +1890,6 @@ void AUDxVOL (int nr, uae_u16 v)
|
||||
{
|
||||
struct audio_channel_data *cdp = audio_channel + nr;
|
||||
int v2 = v & 64 ? 63 : v & 63;
|
||||
|
||||
audio_activate ();
|
||||
update_audio ();
|
||||
cdp->vol = v2;
|
||||
@ -1850,27 +1899,6 @@ void AUDxVOL (int nr, uae_u16 v)
|
||||
#endif
|
||||
}
|
||||
|
||||
void audio_update_irq (uae_u16 v)
|
||||
{
|
||||
#ifdef DEBUG_AUDIO
|
||||
uae_u16 v2 = intreq, v3 = intreq;
|
||||
int i;
|
||||
if (v & 0x8000)
|
||||
v2 |= v & 0x7FFF;
|
||||
else
|
||||
v2 &= ~v;
|
||||
v2 &= (0x80 | 0x100 | 0x200 | 0x400);
|
||||
v3 &= (0x80 | 0x100 | 0x200 | 0x400);
|
||||
for (i = 0; i < 4; i++) {
|
||||
if ((1 << i) & DEBUG_CHANNEL_MASK) {
|
||||
uae_u16 mask = 0x80 << i;
|
||||
if ((v2 & mask) != (v3 & mask))
|
||||
write_log ("AUD%dINTREQ %d->%d %08X\n", i, !!(v3 & mask), !!(v2 & mask), M68K_GETPC);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void audio_update_adkmasks (void)
|
||||
{
|
||||
static int prevcon = -1;
|
||||
@ -1911,8 +1939,14 @@ uae_u8 *restore_audio (int i, uae_u8 *src)
|
||||
acd = audio_channel + i;
|
||||
acd->state = restore_u8 ();
|
||||
acd->vol = restore_u8 ();
|
||||
acd->intreq2 = restore_u8 ();
|
||||
acd->request_word = restore_u8 ();
|
||||
acd->intreq2 = restore_u8 () ? true : false;
|
||||
p = restore_u8 ();
|
||||
acd->dr = acd->dsr = false;
|
||||
if (p & 1)
|
||||
acd->dr = true;
|
||||
if (p & 2)
|
||||
acd->dsr = true;
|
||||
acd->drhpos = 1;
|
||||
acd->len = restore_u16 ();
|
||||
acd->wlen = restore_u16 ();
|
||||
p = restore_u16 ();
|
||||
@ -1921,6 +1955,7 @@ uae_u8 *restore_audio (int i, uae_u8 *src)
|
||||
acd->lc = restore_u32 ();
|
||||
acd->pt = restore_u32 ();
|
||||
acd->evtime = restore_u32 ();
|
||||
last_cycles = get_cycles () - 1;
|
||||
return src;
|
||||
}
|
||||
|
||||
@ -1941,7 +1976,7 @@ uae_u8 *save_audio (int i, int *len, uae_u8 *dstptr)
|
||||
save_u8 ((uae_u8)acd->state);
|
||||
save_u8 (acd->vol);
|
||||
save_u8 (acd->intreq2);
|
||||
save_u8 (acd->request_word);
|
||||
save_u8 ((acd->dr ? 1 : 0) | (acd->dsr ? 2 : 0));
|
||||
save_u16 (acd->len);
|
||||
save_u16 (acd->wlen);
|
||||
p = acd->per == PERIOD_MAX ? 0 : acd->per / CYCLE_UNIT;
|
||||
|
@ -760,7 +760,7 @@ void blitter_handler (uae_u32 data)
|
||||
static int blitter_stuck;
|
||||
|
||||
if (!dmaen (DMA_BLITTER)) {
|
||||
event2_newevent (ev2_blitter, 10);
|
||||
event2_newevent (ev2_blitter, 10, 0);
|
||||
blitter_stuck++;
|
||||
if (blitter_stuck < 20000 || !currprefs.immediate_blits)
|
||||
return; /* gotta come back later. */
|
||||
@ -771,7 +771,7 @@ void blitter_handler (uae_u32 data)
|
||||
}
|
||||
blitter_stuck = 0;
|
||||
if (blit_slowdown > 0 && !currprefs.immediate_blits) {
|
||||
event2_newevent (ev2_blitter, blit_slowdown);
|
||||
event2_newevent (ev2_blitter, blit_slowdown, 0);
|
||||
blit_slowdown = -1;
|
||||
return;
|
||||
}
|
||||
@ -1365,7 +1365,7 @@ static void do_blitter2 (int hpos, int copper)
|
||||
|
||||
blit_waitcyclecounter = 0;
|
||||
blit_cyclecounter = cycles * (blit_dmacount2 + (blit_nod ? 0 : 1));
|
||||
event2_newevent (ev2_blitter, blit_cyclecounter);
|
||||
event2_newevent (ev2_blitter, blit_cyclecounter, 0);
|
||||
}
|
||||
|
||||
void do_blitter (int hpos, int copper)
|
||||
|
@ -276,7 +276,7 @@ static int execscsicmd (int unitnum, const uae_u8 *data, int len, uae_u8 *inbuf,
|
||||
|
||||
DEBUG_LOG ("SCSIDEV: sending command: 0x%2x\n", scmd->cdb.g0_cdb.cmd);
|
||||
|
||||
gui_cd_led (1);
|
||||
gui_flicker_led (LED_CD, 0, 1);
|
||||
|
||||
scg_cmd (scgp);
|
||||
|
||||
@ -349,7 +349,7 @@ static int execscsicmd_direct (int unitnum, uaecptr acmd)
|
||||
DEBUG_LOG ("SCSIDEV: result: %d %d %s\n", scmd->error, scmd->ux_errno,\
|
||||
scgp->errstr);
|
||||
|
||||
gui_cd_led (1);
|
||||
gui_flicker_led (LED_CD, 0, 1);
|
||||
|
||||
put_word (acmd + 18, scmd->error == SCG_FATAL
|
||||
? 0 : scsi_cmd_len); /* fake scsi_CmdActual */
|
||||
|
@ -100,6 +100,12 @@ void sys_command_setunit (int unitnum)
|
||||
int sys_command_open (int mode, int unitnum)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (forcedunit >= 0) {
|
||||
if (unitnum != forcedunit)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mode == DF_SCSI || !have_ioctl) {
|
||||
if (device_func[DF_SCSI] != NULL)
|
||||
ret = device_func[DF_SCSI]->opendev (unitnum);
|
||||
|
@ -148,8 +148,7 @@ static const TCHAR *guimode1[] = { "no", "yes", "nowait", 0 };
|
||||
static const TCHAR *guimode2[] = { "false", "true", "nowait", 0 };
|
||||
static const TCHAR *guimode3[] = { "0", "1", "nowait", 0 };
|
||||
static const TCHAR *csmode[] = { "ocs", "ecs_agnus", "ecs_denise", "ecs", "aga", 0 };
|
||||
static const TCHAR *linemode1[] = { "none", "double", "scanlines", 0 };
|
||||
static const TCHAR *linemode2[] = { "n", "d", "s", 0 };
|
||||
static const TCHAR *linemode[] = { "none", "none", "double", "scanlines", 0 };
|
||||
static const TCHAR *speedmode[] = { "max", "real", 0 };
|
||||
static const TCHAR *colormode1[] = { "8bit", "15bit", "16bit", "8bit_dither", "4bit_dither", "32bit", 0 };
|
||||
static const TCHAR *colormode2[] = { "8", "15", "16", "8d", "4d", "32", 0 };
|
||||
@ -763,7 +762,7 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
|
||||
cfgfile_write_str (f, "gfx_resolution", lorestype1[p->gfx_resolution]);
|
||||
cfgfile_write_str (f, "gfx_lores_mode", loresmode[p->gfx_lores_mode]);
|
||||
cfgfile_write_bool (f, "gfx_flickerfixer", p->gfx_scandoubler);
|
||||
cfgfile_write_str (f, "gfx_linemode", linemode1[p->gfx_linedbl]);
|
||||
cfgfile_write_str (f, "gfx_linemode", linemode[p->gfx_vresolution * 2 + p->gfx_scanlines]);
|
||||
cfgfile_write_str (f, "gfx_fullscreen_amiga", fullmodes[p->gfx_afullscreen]);
|
||||
cfgfile_write_str (f, "gfx_fullscreen_picasso", fullmodes[p->gfx_pfullscreen]);
|
||||
cfgfile_write_str (f, "gfx_center_horizontal", centermode1[p->gfx_xcenter]);
|
||||
@ -1371,8 +1370,6 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value)
|
||||
|| cfgfile_strval (option, value, "gfx_lores_mode", &p->gfx_lores_mode, loresmode, 0)
|
||||
|| cfgfile_strval (option, value, "gfx_fullscreen_amiga", &p->gfx_afullscreen, fullmodes, 0)
|
||||
|| cfgfile_strval (option, value, "gfx_fullscreen_picasso", &p->gfx_pfullscreen, fullmodes, 0)
|
||||
|| cfgfile_strval (option, value, "gfx_linemode", &p->gfx_linedbl, linemode1, 1)
|
||||
|| cfgfile_strval (option, value, "gfx_linemode", &p->gfx_linedbl, linemode2, 0)
|
||||
|| cfgfile_strval (option, value, "gfx_center_horizontal", &p->gfx_xcenter, centermode1, 1)
|
||||
|| cfgfile_strval (option, value, "gfx_center_vertical", &p->gfx_ycenter, centermode1, 1)
|
||||
|| cfgfile_strval (option, value, "gfx_center_horizontal", &p->gfx_xcenter, centermode2, 0)
|
||||
@ -2715,15 +2712,13 @@ static void parse_gfx_specs (struct uae_prefs *p, const TCHAR *spec)
|
||||
p->gfx_resolution = _tcschr (x2, 'l') != 0 ? 1 : 0;
|
||||
p->gfx_xcenter = _tcschr (x2, 'x') != 0 ? 1 : _tcschr (x2, 'X') != 0 ? 2 : 0;
|
||||
p->gfx_ycenter = _tcschr (x2, 'y') != 0 ? 1 : _tcschr (x2, 'Y') != 0 ? 2 : 0;
|
||||
p->gfx_linedbl = _tcschr (x2, 'd') != 0;
|
||||
p->gfx_linedbl += 2 * (_tcschr (x2, 'D') != 0);
|
||||
p->gfx_vresolution = _tcschr (x2, 'd') != 0 ? VRES_DOUBLE : VRES_NONDOUBLE;
|
||||
p->gfx_scanlines = _tcschr (x2, 'D') != 0;
|
||||
if (p->gfx_scanlines)
|
||||
p->gfx_vresolution = VRES_DOUBLE;
|
||||
p->gfx_afullscreen = _tcschr (x2, 'a') != 0;
|
||||
p->gfx_pfullscreen = _tcschr (x2, 'p') != 0;
|
||||
|
||||
if (p->gfx_linedbl == 3) {
|
||||
write_log ("You can't use both 'd' and 'D' modifiers in the display mode specification.\n");
|
||||
}
|
||||
|
||||
free (x0);
|
||||
return;
|
||||
|
||||
@ -3519,8 +3514,8 @@ void default_prefs (struct uae_prefs *p, int type)
|
||||
p->gfx_size_win_xtra[i].width = 0;
|
||||
p->gfx_size_win_xtra[i].height = 0;
|
||||
}
|
||||
p->gfx_resolution = 1;
|
||||
p->gfx_linedbl = 1;
|
||||
p->gfx_resolution = RES_HIRES;
|
||||
p->gfx_vresolution = VRES_DOUBLE;
|
||||
p->gfx_afullscreen = GFX_WINDOW;
|
||||
p->gfx_pfullscreen = GFX_WINDOW;
|
||||
p->gfx_xcenter = 0; p->gfx_ycenter = 0;
|
||||
|
@ -24,7 +24,8 @@ void consolehook_config (struct uae_prefs *p)
|
||||
//p->headless = 1;
|
||||
p->produce_sound = 0;
|
||||
p->gfx_resolution = 0;
|
||||
p->gfx_linedbl = 0;
|
||||
p->gfx_vresolution = 0;
|
||||
p->gfx_scanlines = false;
|
||||
p->gfx_framerate = 10;
|
||||
p->immediate_blits = 1;
|
||||
p->collision_level = 0;
|
||||
|
160
src/custom.c
160
src/custom.c
@ -180,6 +180,7 @@ int maxhpos = MAXHPOS_PAL;
|
||||
int maxhpos_short = MAXHPOS_PAL;
|
||||
int maxvpos = MAXVPOS_PAL;
|
||||
int maxvpos_nom = MAXVPOS_PAL; // nominal value (same as maxvpos but "faked" maxvpos in fake 60hz modes)
|
||||
int hsyncstartpos;
|
||||
static int maxvpos_total = 511;
|
||||
int minfirstline = VBLANK_ENDLINE_PAL;
|
||||
int equ_vblank_endline = EQU_ENDLINE_PAL;
|
||||
@ -392,7 +393,7 @@ STATIC_INLINE int nodraw (void)
|
||||
|
||||
static int doflickerfix (void)
|
||||
{
|
||||
return currprefs.gfx_linedbl && doublescan < 0 && vpos < MAXVPOS;
|
||||
return currprefs.gfx_vresolution && doublescan < 0 && vpos < MAXVPOS;
|
||||
}
|
||||
|
||||
uae_u32 get_copper_address (int copno)
|
||||
@ -1870,7 +1871,7 @@ STATIC_INLINE void decide_line (int hpos)
|
||||
if (hpos <= last_decide_line_hpos)
|
||||
return;
|
||||
|
||||
if (fetch_state == fetch_not_started && diwstate == DIW_waiting_stop) {
|
||||
if (fetch_state == fetch_not_started && (diwstate == DIW_waiting_stop || (currprefs.chipset_mask & CSMASK_ECS_AGNUS))) {
|
||||
int ok = 0;
|
||||
if (last_decide_line_hpos < plfstrt_start && hpos >= plfstrt_start) {
|
||||
if (plf_state == plf_idle)
|
||||
@ -1886,7 +1887,7 @@ STATIC_INLINE void decide_line (int hpos)
|
||||
if (hpos - 2 == ddfstrt_old_hpos)
|
||||
ok = 0;
|
||||
}
|
||||
if (ok) {
|
||||
if (ok && diwstate == DIW_waiting_stop) {
|
||||
if (dmaen (DMA_BITPLANE)) {
|
||||
start_bpl_dma (hpos, plfstrt);
|
||||
estimate_last_fetch_cycle (plfstrt);
|
||||
@ -2734,7 +2735,7 @@ void init_hz (void)
|
||||
int hzc = 0;
|
||||
|
||||
if (vsync_switchmode (-1, 0))
|
||||
currprefs.gfx_avsync = changed_prefs.gfx_avsync = vsync_switchmode (-1, 0);
|
||||
currprefs.gfx_avsync = changed_prefs.gfx_avsync = vsync_switchmode (-1, 0) ? 2 : 0;
|
||||
|
||||
if (!isvsync () && ((currprefs.chipset_refreshrate == 50 && !currprefs.ntscmode) ||
|
||||
(currprefs.chipset_refreshrate == 60 && currprefs.ntscmode))) {
|
||||
@ -2809,6 +2810,14 @@ void init_hz (void)
|
||||
if (vblank_hz > 300)
|
||||
vblank_hz = 300;
|
||||
maxhpos_short = maxhpos;
|
||||
if (beamcon0 & 0x80) {
|
||||
if (hbstrt > maxhpos)
|
||||
hsyncstartpos = hbstrt;
|
||||
else
|
||||
hsyncstartpos = maxhpos + hbstrt;
|
||||
} else {
|
||||
hsyncstartpos = maxhpos_short + 7;
|
||||
}
|
||||
eventtab[ev_hsync].oldcycles = get_cycles ();
|
||||
eventtab[ev_hsync].evtime = get_cycles () + HSYNCTIME;
|
||||
events_schedule ();
|
||||
@ -3261,7 +3270,7 @@ static void DMACON (int hpos, uae_u16 v)
|
||||
unset_special (SPCFLAG_BLTNASTY);
|
||||
|
||||
if (changed & (DMA_MASTER | 0x0f))
|
||||
audio_hsync (hpos);
|
||||
audio_state_machine ();
|
||||
|
||||
if (changed & (DMA_MASTER | DMA_BITPLANE)) {
|
||||
ddf_change = vpos;
|
||||
@ -3275,13 +3284,16 @@ static void DMACON (int hpos, uae_u16 v)
|
||||
|
||||
static void MISC_handler (void)
|
||||
{
|
||||
static bool dorecheck;
|
||||
int i, recheck;
|
||||
evt mintime;
|
||||
evt ct = get_cycles ();
|
||||
static int recursive;
|
||||
|
||||
if (recursive)
|
||||
if (recursive) {
|
||||
dorecheck = true;
|
||||
return;
|
||||
}
|
||||
recursive++;
|
||||
eventtab[ev_misc].active = 0;
|
||||
recheck = 1;
|
||||
@ -3293,8 +3305,10 @@ static void MISC_handler (void)
|
||||
if (eventtab2[i].evtime == ct) {
|
||||
eventtab2[i].active = 0;
|
||||
eventtab2[i].handler (eventtab2[i].data);
|
||||
if (eventtab2[i].active)
|
||||
if (dorecheck || eventtab2[i].active) {
|
||||
recheck = 1;
|
||||
dorecheck = false;
|
||||
}
|
||||
} else {
|
||||
evt eventtime = eventtab2[i].evtime - ct;
|
||||
if (eventtime < mintime)
|
||||
@ -3354,9 +3368,9 @@ STATIC_INLINE void event2_newevent_x (int no, evt t, uae_u32 data, evfunc2 func)
|
||||
event2_newevent_xx (no, t * CYCLE_UNIT, data, func);
|
||||
}
|
||||
|
||||
void event2_newevent (int no, evt t)
|
||||
void event2_newevent (int no, evt t, uae_u32 data)
|
||||
{
|
||||
event2_newevent_x (no, t, 0, eventtab2[no].handler);
|
||||
event2_newevent_x (no, t, data, eventtab2[no].handler);
|
||||
}
|
||||
void event2_newevent2 (evt t, uae_u32 data, evfunc2 func)
|
||||
{
|
||||
@ -3472,9 +3486,6 @@ void INTREQ_0 (uae_u16 v)
|
||||
if (!(v & 0x8000) && old == intreq)
|
||||
return;
|
||||
|
||||
if (v & (0x0080 | 0x0100 | 0x0200 | 0x0400))
|
||||
audio_update_irq (v);
|
||||
|
||||
if (use_eventmode (v)) {
|
||||
event2_newevent_xx (-1, INT_PROCESSING_DELAY, intreq, send_intreq_do);
|
||||
} else {
|
||||
@ -5295,7 +5306,103 @@ static void hsync_scandoubler (void)
|
||||
}
|
||||
}
|
||||
|
||||
void hsync_handler (void)
|
||||
static void events_dmal (int);
|
||||
static uae_u16 dmal, dmal_hpos;
|
||||
|
||||
static void dmal_emu (uae_u32 v)
|
||||
{
|
||||
int hpos = current_hpos ();
|
||||
if (v >= 6) {
|
||||
v -= 6;
|
||||
int nr = v / 2;
|
||||
uaecptr pt = audio_getpt (nr, v & 1);
|
||||
uae_u16 dat = chipmem_wget_indirect (pt);
|
||||
#ifdef DEBUGGER
|
||||
if (debug_dma)
|
||||
record_dma (0xaa + nr * 16, dat, pt, hpos, vpos, DMARECORD_AUDIO);
|
||||
#endif
|
||||
last_custom_value1 = dat;
|
||||
AUDxDAT (nr, dat, pt);
|
||||
} else {
|
||||
uae_u16 dat;
|
||||
int w = v & 1;
|
||||
uaecptr pt = disk_getpt ();
|
||||
// disk_fifostatus() needed in >100% disk speed modes
|
||||
if (w) {
|
||||
if (disk_fifostatus () <= 0) {
|
||||
dat = chipmem_wget_indirect (pt);
|
||||
last_custom_value1 = dat;
|
||||
DSKDAT (dat);
|
||||
}
|
||||
} else {
|
||||
if (disk_fifostatus () >= 0) {
|
||||
dat = DSKDATR ();
|
||||
chipmem_wput_indirect (pt, dat);
|
||||
}
|
||||
}
|
||||
#ifdef DEBUGGER
|
||||
if (debug_dma)
|
||||
record_dma (w ? 0x26 : 0x08, dat, pt, hpos, vpos, DMARECORD_DISK);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static void dmal_func (uae_u32 v)
|
||||
{
|
||||
dmal_emu (v);
|
||||
events_dmal (0);
|
||||
}
|
||||
static void dmal_func2 (uae_u32 v)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < 6 + 8; i += 2) {
|
||||
if (dmal & 3)
|
||||
dmal_emu (dmal_hpos + ((dmal & 2) ? 1 : 0));
|
||||
dmal_hpos += 2;
|
||||
dmal >>= 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void events_dmal (int hp)
|
||||
{
|
||||
int i;
|
||||
if (!dmal)
|
||||
return;
|
||||
if (currprefs.cpu_cycle_exact) {
|
||||
for (i = 0; i < 6 + 8; i += 2) {
|
||||
if (dmal & 3)
|
||||
break;
|
||||
hp += 2;
|
||||
dmal >>= 2;
|
||||
dmal_hpos += 2;
|
||||
}
|
||||
event2_newevent2 (hp, dmal_hpos + ((dmal & 2) ? 1 : 0), dmal_func);
|
||||
dmal &= ~3;
|
||||
} else {
|
||||
event2_newevent2 (hp, 17, dmal_func2);
|
||||
}
|
||||
}
|
||||
|
||||
static void events_dmal_hsync (void)
|
||||
{
|
||||
unsigned int i;
|
||||
if (dmal)
|
||||
write_log ("DMAL error!? %04x\n", dmal);
|
||||
dmal = audio_dmal ();
|
||||
dmal <<= 6;
|
||||
dmal |= disk_dmal ();
|
||||
if (!dmal)
|
||||
return;
|
||||
dmal_hpos = 0;
|
||||
for (i = 0; i < 6 + 8; i += 2) {
|
||||
if (dmal & (3 << i)) {
|
||||
alloc_cycle_ext (i + 7, CYCLE_MISC);
|
||||
}
|
||||
}
|
||||
events_dmal (7);
|
||||
}
|
||||
|
||||
static void hsync_handler (void)
|
||||
{
|
||||
int hpos = current_hpos ();
|
||||
|
||||
@ -5331,7 +5438,7 @@ void hsync_handler (void)
|
||||
CDTV_hsync_handler ();
|
||||
#endif
|
||||
decide_blitter (-1);
|
||||
DISK_hsync (maxhpos);
|
||||
DISK_hsync ();
|
||||
|
||||
#ifdef CPUEMU_12
|
||||
if (currprefs.cpu_cycle_exact || currprefs.blitter_cycle_exact) {
|
||||
@ -5455,7 +5562,9 @@ void hsync_handler (void)
|
||||
|
||||
|
||||
if (currprefs.produce_sound)
|
||||
audio_hsync (-1);
|
||||
audio_hsync ();
|
||||
|
||||
events_dmal_hsync ();
|
||||
|
||||
#ifdef JIT
|
||||
if (currprefs.cachesize) {
|
||||
@ -5480,14 +5589,14 @@ void hsync_handler (void)
|
||||
int lineno = vpos;
|
||||
if (lineno >= MAXVPOS)
|
||||
lineno %= MAXVPOS;
|
||||
if ((bplcon0 & 4) && currprefs.gfx_linedbl)
|
||||
if ((bplcon0 & 4) && currprefs.gfx_vresolution)
|
||||
notice_interlace_seen ();
|
||||
nextline_how = nln_normal;
|
||||
if (doflickerfix () && interlace_seen) {
|
||||
lineno *= 2;
|
||||
} else if (currprefs.gfx_linedbl && (doublescan <= 0 || interlace_seen > 0)) {
|
||||
} else if (currprefs.gfx_vresolution && (doublescan <= 0 || interlace_seen > 0)) {
|
||||
lineno *= 2;
|
||||
nextline_how = currprefs.gfx_linedbl == 1 ? nln_doubled : nln_nblack;
|
||||
nextline_how = currprefs.gfx_vresolution > VRES_NONDOUBLE && currprefs.gfx_scanlines == false ? nln_doubled : nln_nblack;
|
||||
if ((bplcon0 & 4) || (interlace_seen > 0 && !lof_current)) {
|
||||
if (!lof_current) {
|
||||
lineno++;
|
||||
@ -5740,6 +5849,7 @@ void customreset (int hardreset)
|
||||
set_cycles (0);
|
||||
|
||||
vpos_count = vpos_count_prev = 0;
|
||||
dmal = 0;
|
||||
init_hz ();
|
||||
vpos_lpen = -1;
|
||||
|
||||
@ -6157,28 +6267,28 @@ static int REGPARAM2 custom_wput_1 (int hpos, uaecptr addr, uae_u32 value, int n
|
||||
case 0x0A4: AUDxLEN (0, value); break;
|
||||
case 0x0A6: AUDxPER (0, value); break;
|
||||
case 0x0A8: AUDxVOL (0, value); break;
|
||||
case 0x0AA: AUDxDAT (0, value); break;
|
||||
case 0x0AA: AUDxDAT (0, value, 0xffffffff); break;
|
||||
|
||||
case 0x0B0: AUDxLCH (1, value); break;
|
||||
case 0x0B2: AUDxLCL (1, value); break;
|
||||
case 0x0B4: AUDxLEN (1, value); break;
|
||||
case 0x0B6: AUDxPER (1, value); break;
|
||||
case 0x0B8: AUDxVOL (1, value); break;
|
||||
case 0x0BA: AUDxDAT (1, value); break;
|
||||
case 0x0BA: AUDxDAT (1, value, 0xffffffff); break;
|
||||
|
||||
case 0x0C0: AUDxLCH (2, value); break;
|
||||
case 0x0C2: AUDxLCL (2, value); break;
|
||||
case 0x0C4: AUDxLEN (2, value); break;
|
||||
case 0x0C6: AUDxPER (2, value); break;
|
||||
case 0x0C8: AUDxVOL (2, value); break;
|
||||
case 0x0CA: AUDxDAT (2, value); break;
|
||||
case 0x0CA: AUDxDAT (2, value, 0xffffffff); break;
|
||||
|
||||
case 0x0D0: AUDxLCH (3, value); break;
|
||||
case 0x0D2: AUDxLCL (3, value); break;
|
||||
case 0x0D4: AUDxLEN (3, value); break;
|
||||
case 0x0D6: AUDxPER (3, value); break;
|
||||
case 0x0D8: AUDxVOL (3, value); break;
|
||||
case 0x0DA: AUDxDAT (3, value); break;
|
||||
case 0x0DA: AUDxDAT (3, value, 0xffffffff); break;
|
||||
|
||||
case 0x0E0: BPLxPTH (hpos, value, 0); break;
|
||||
case 0x0E2: BPLxPTL (hpos, value, 0); break;
|
||||
@ -6341,12 +6451,6 @@ void REGPARAM2 custom_bput (uaecptr addr, uae_u32 value)
|
||||
} else {
|
||||
custom_wput (addr & ~1, rval);
|
||||
}
|
||||
if (warned < 10) {
|
||||
if (M68K_GETPC < 0xe00000 || M68K_GETPC >= 0x10000000) {
|
||||
write_log ("Byte put to custom register %04X PC=%08X\n", addr, M68K_GETPC);
|
||||
warned++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void REGPARAM2 custom_lput(uaecptr addr, uae_u32 value)
|
||||
|
@ -2573,7 +2573,7 @@ void debug (void)
|
||||
continue;
|
||||
if (bpnodes[i].addr == pc) {
|
||||
bp = 1;
|
||||
console_out (L"Breakpoint at %08X\n", pc);
|
||||
console_out ("Breakpoint at %08X\n", pc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
291
src/disk.c
291
src/disk.c
@ -96,9 +96,6 @@ static uae_u8 writebuffer[544 * MAX_SECTORS];
|
||||
#define DSKREADY_TIME 4
|
||||
#define DSKREADY_DOWN_TIME 10
|
||||
|
||||
static int diskevent_flag;
|
||||
static int disk_sync_cycle;
|
||||
|
||||
#if 0
|
||||
#define MAX_DISK_WORDS_PER_LINE 50 /* depends on floppy_speed */
|
||||
static uae_u32 dma_tab[MAX_DISK_WORDS_PER_LINE + 1];
|
||||
@ -106,9 +103,13 @@ static uae_u32 dma_tab[MAX_DISK_WORDS_PER_LINE + 1];
|
||||
static int dskdmaen, dsklength, dsklength2, dsklen;
|
||||
static uae_u16 dskbytr_val;
|
||||
static uae_u32 dskpt;
|
||||
static bool fifo_filled;
|
||||
static uae_u16 fifo[3];
|
||||
static int fifo_inuse[3];
|
||||
static int dma_enable, bitoffset, syncoffset;
|
||||
static uae_u16 word, dsksync;
|
||||
static unsigned long dsksync_cycles;
|
||||
static int cemode = 1;
|
||||
#define WORDSYNC_TIME 11
|
||||
/* Always carried through to the next line. */
|
||||
static unsigned int disk_hpos;
|
||||
@ -2622,11 +2623,15 @@ static void fetchnextrevolution (drive *drv)
|
||||
}
|
||||
}
|
||||
|
||||
void DISK_handler (void)
|
||||
void DISK_handler (uae_u32 data)
|
||||
{
|
||||
int flag = diskevent_flag;
|
||||
int flag = data & 255;
|
||||
int disk_sync_cycle = data >> 8;
|
||||
int hpos = current_hpos ();
|
||||
|
||||
event2_remevent (ev2_disk);
|
||||
if (disk_sync_cycle >= maxhpos)
|
||||
return;
|
||||
DISK_update (disk_sync_cycle);
|
||||
if (flag & (DISK_REVOLUTION << 0))
|
||||
fetchnextrevolution (&floppy[0]);
|
||||
@ -2640,47 +2645,7 @@ void DISK_handler (void)
|
||||
INTREQ (0x8000 | 0x1000);
|
||||
if (flag & DISK_INDEXSYNC)
|
||||
cia_diskindex ();
|
||||
#if 0
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_FLOPPY_DRIVES; i++) {
|
||||
drive *drv = &floppy[i];
|
||||
if (drv->dskready_time) {
|
||||
drv->dskready_time--;
|
||||
if (drv->dskready_time == 0) {
|
||||
drv->dskready = 1;
|
||||
if (disk_debug_logging > 0)
|
||||
write_log ("%d: %d\n", i, drv->mfmpos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CPUEMU_12
|
||||
extern uae_u8 cycle_line[256];
|
||||
|
||||
static void diskdma (uae_u32 pt, uae_u16 w, int write)
|
||||
{
|
||||
int i, got;
|
||||
|
||||
got = 0;
|
||||
for (i = 7; i <= 11; i += 2) {
|
||||
if (!cycle_line[i]) {
|
||||
cycle_line[i] = CYCLE_MISC;
|
||||
if (debug_dma)
|
||||
record_dma (write ? 0x26 : 0x08, w, pt, i, vpos, DMARECORD_DISK);
|
||||
got = 1;
|
||||
break;
|
||||
}
|
||||
// if (cycle_line[i] != CYCLE_MISC)
|
||||
// write_log ("%d!?\n", cycle_line[i]);
|
||||
}
|
||||
// if (!got)
|
||||
// write_log ("disk dma cycle overflow!?\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
static void disk_doupdate_write (drive * drv, int floppybits)
|
||||
{
|
||||
@ -2704,16 +2669,21 @@ static void disk_doupdate_write (drive * drv, int floppybits)
|
||||
floppy[dr].mfmpos %= drv->tracklen;
|
||||
}
|
||||
}
|
||||
if (dmaen (DMA_DISK) && dskdmaen == 3 && dsklength > 0 && (!(adkcon &0x400) || dma_enable)) {
|
||||
if (dmaen (DMA_DISK) && dskdmaen == 3 && dsklength > 0 && (!(adkcon &0x400) || dma_enable) && fifo_filled) {
|
||||
bitoffset++;
|
||||
bitoffset &= 15;
|
||||
if (!bitoffset) {
|
||||
// fast disk modes, fill the fifo instantly
|
||||
if (currprefs.floppy_speed > 100 && !fifo_inuse[0] && !fifo_inuse[1] && !fifo_inuse[2]) {
|
||||
while (!fifo_inuse[2]) {
|
||||
uae_u16 w = chipmem_wget_indirect (dskpt);
|
||||
DSKDAT (w);
|
||||
dskpt += 2;
|
||||
}
|
||||
}
|
||||
uae_u16 w = DSKDATR ();
|
||||
for (dr = 0; dr < MAX_FLOPPY_DRIVES ; dr++) {
|
||||
drive *drv2 = &floppy[dr];
|
||||
uae_u16 w = chipmem_wget_indirect (dskpt);
|
||||
#ifdef CPUEMU_12
|
||||
diskdma (dskpt, w, 1);
|
||||
#endif
|
||||
if (drives[dr]) {
|
||||
drv2->bigmfmbuf[drv2->mfmpos >> 4] = w;
|
||||
drv2->bigmfmbuf[(drv2->mfmpos >> 4) + 1] = 0x5555;
|
||||
@ -2724,17 +2694,17 @@ static void disk_doupdate_write (drive * drv, int floppybits)
|
||||
amax_diskwrite (w);
|
||||
#endif
|
||||
}
|
||||
dskpt += 2;
|
||||
dsklength--;
|
||||
if (dsklength == 0) {
|
||||
if (dsklength <= 0) {
|
||||
disk_dmafinished ();
|
||||
for (dr = 0; dr < MAX_FLOPPY_DRIVES ; dr++) {
|
||||
drive *drv2 = &floppy[dr];
|
||||
drv2->writtento = 0;
|
||||
if (drives[dr]) {
|
||||
drive_write_data (drv2);
|
||||
//set_steplimit (drv2);
|
||||
}
|
||||
drive *drv = &floppy[dr];
|
||||
drv->writtento = 0;
|
||||
if (drv->motoroff)
|
||||
continue;
|
||||
if (selected & (1 << dr))
|
||||
continue;
|
||||
drive_write_data (drv);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2766,24 +2736,33 @@ static void updatetrackspeed (drive *drv, unsigned int mfmpos)
|
||||
}
|
||||
}
|
||||
|
||||
static void disk_doupdate_predict (drive * drv, int startcycle)
|
||||
static void disk_doupdate_predict (int startcycle)
|
||||
{
|
||||
int is_sync = 0;
|
||||
unsigned int firstcycle = startcycle;
|
||||
uae_u32 tword = word;
|
||||
unsigned int mfmpos = drv->mfmpos;
|
||||
int indexhack = drv->indexhack;
|
||||
int finaleventcycle = maxhpos << 8;
|
||||
int finaleventflag = 0;
|
||||
unsigned int dr;
|
||||
|
||||
diskevent_flag = 0;
|
||||
while (startcycle < (maxhpos << 8) && !diskevent_flag) {
|
||||
int cycle = startcycle >> 8;
|
||||
for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) {
|
||||
drive *drv = &floppy[dr];
|
||||
if (drv->motoroff)
|
||||
continue;
|
||||
if (drv->motoroff || !drv->trackspeed)
|
||||
continue;
|
||||
if (selected & (1 << dr))
|
||||
continue;
|
||||
int diskevent_flag = 0;
|
||||
uae_u32 tword = word;
|
||||
int countcycle = startcycle;
|
||||
int mfmpos = drv->mfmpos;
|
||||
int indexhack = drv->indexhack;
|
||||
while (countcycle < (maxhpos << 8)) {
|
||||
if (drv->tracktiming[0])
|
||||
updatetrackspeed (drv, mfmpos);
|
||||
if (dskdmaen != 3) {
|
||||
tword <<= 1;
|
||||
if (!drive_empty (drv)) {
|
||||
if (unformatted (drv))
|
||||
tword |= (rand() & 0x1000) ? 1 : 0;
|
||||
tword |= (uaerand() & 0x1000) ? 1 : 0;
|
||||
else
|
||||
tword |= getonebit (drv->bigmfmbuf, mfmpos);
|
||||
}
|
||||
@ -2812,15 +2791,41 @@ static void disk_doupdate_predict (drive * drv, int startcycle)
|
||||
}
|
||||
}
|
||||
}
|
||||
startcycle += drv->trackspeed;
|
||||
if (diskevent_flag)
|
||||
break;
|
||||
countcycle += drv->trackspeed;
|
||||
}
|
||||
if (drv->tracktiming[0])
|
||||
updatetrackspeed (drv, drv->mfmpos);
|
||||
if (diskevent_flag) {
|
||||
disk_sync_cycle = startcycle >> 8;
|
||||
event2_newevent (ev2_disk, (startcycle - firstcycle) / CYCLE_UNIT);
|
||||
if (diskevent_flag && countcycle < finaleventcycle) {
|
||||
finaleventcycle = countcycle;
|
||||
finaleventflag = diskevent_flag;
|
||||
}
|
||||
}
|
||||
if (finaleventflag && (finaleventcycle >> 8) < maxhpos) {
|
||||
event2_newevent (ev2_disk, (finaleventcycle - startcycle) >> 8, ((finaleventcycle >> 8) << 8) | finaleventflag);
|
||||
}
|
||||
}
|
||||
|
||||
static bool doreaddma (void)
|
||||
{
|
||||
if (dmaen (DMA_DISK) && bitoffset == 15 && dma_enable && dskdmaen == 2 && dsklength >= 0) {
|
||||
if (dsklength > 0) {
|
||||
// fast disk modes, just flush the fifo
|
||||
if (currprefs.floppy_speed > 100 && fifo_inuse[0] && fifo_inuse[1] && fifo_inuse[2]) {
|
||||
while (fifo_inuse[0]) {
|
||||
uae_u16 w = DSKDATR ();
|
||||
chipmem_wput_indirect (dskpt, w);
|
||||
dskpt += 2;
|
||||
}
|
||||
}
|
||||
DSKDAT (word);
|
||||
dsklength--;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void disk_doupdate_read_nothing (int floppybits)
|
||||
{
|
||||
@ -2828,18 +2833,7 @@ static void disk_doupdate_read_nothing (int floppybits)
|
||||
|
||||
while (floppybits >= get_floppy_speed()) {
|
||||
word <<= 1;
|
||||
if (dmaen (DMA_DISK) && bitoffset == 15 && dma_enable && dskdmaen == 2 && dsklength >= 0) {
|
||||
if (dsklength > 0) {
|
||||
chipmem_wput_indirect (dskpt, word);
|
||||
#ifdef CPUEMU_12
|
||||
diskdma (dskpt, word, 0);
|
||||
#endif
|
||||
dskpt += 2;
|
||||
}
|
||||
dsklength--;
|
||||
if (dsklength <= 0)
|
||||
disk_dmafinished ();
|
||||
}
|
||||
doreaddma ();
|
||||
if ((bitoffset & 7) == 7) {
|
||||
dskbytr_val = word & 0xff;
|
||||
dskbytr_val |= 0x8000;
|
||||
@ -2850,31 +2844,6 @@ static void disk_doupdate_read_nothing (int floppybits)
|
||||
}
|
||||
}
|
||||
|
||||
static bool doreaddma (void)
|
||||
{
|
||||
if (dmaen (DMA_DISK) && bitoffset == 15 && dma_enable && dskdmaen == 2 && dsklength >= 0) {
|
||||
if (dsklength > 0) {
|
||||
chipmem_wput_indirect (dskpt, word);
|
||||
#ifdef CPUEMU_12
|
||||
diskdma (dskpt, word, 0);
|
||||
#endif
|
||||
dskpt += 2;
|
||||
}
|
||||
#if 0
|
||||
dma_tab[j++] = word;
|
||||
if (j == MAX_DISK_WORDS_PER_LINE - 1) {
|
||||
write_log ("Bug: Disk DMA buffer overflow!\n");
|
||||
j--;
|
||||
}
|
||||
#endif
|
||||
dsklength--;
|
||||
if (dsklength <= 0)
|
||||
disk_dmafinished ();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void disk_doupdate_read (drive * drv, int floppybits)
|
||||
{
|
||||
// int j = 0, k = 1, l = 0;
|
||||
@ -3008,8 +2977,11 @@ uae_u16 DSKBYTR (unsigned int hpos)
|
||||
|
||||
static void DISK_start (void)
|
||||
{
|
||||
unsigned int dr;
|
||||
unsigned int dr, i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
fifo_inuse[0] = 0;
|
||||
fifo_filled = 0;
|
||||
for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) {
|
||||
drive *drv = &floppy[dr];
|
||||
if (!(selected & (1 << dr))) {
|
||||
@ -3035,7 +3007,7 @@ static void DISK_start (void)
|
||||
|
||||
static int linecounter;
|
||||
|
||||
void DISK_hsync (unsigned int tohpos)
|
||||
void DISK_hsync (void)
|
||||
{
|
||||
unsigned int dr;
|
||||
|
||||
@ -3050,25 +3022,21 @@ void DISK_hsync (unsigned int tohpos)
|
||||
disk_dmafinished ();
|
||||
return;
|
||||
}
|
||||
DISK_update (tohpos);
|
||||
DISK_update (maxhpos);
|
||||
}
|
||||
|
||||
void DISK_update (unsigned int tohpos)
|
||||
{
|
||||
unsigned int dr;
|
||||
int cycles = (int)((tohpos << 8) - disk_hpos);
|
||||
int cycles;
|
||||
int startcycle = disk_hpos;
|
||||
int didread;
|
||||
|
||||
cycles = (int)((tohpos << 8) - disk_hpos);
|
||||
if (cycles <= 0)
|
||||
return;
|
||||
disk_hpos += cycles;
|
||||
if (disk_hpos >= (maxhpos << 8))
|
||||
disk_hpos -= maxhpos << 8;
|
||||
|
||||
#if 0
|
||||
dodmafetch ();
|
||||
#endif
|
||||
disk_hpos %= 1 << 8;
|
||||
|
||||
for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) {
|
||||
drive *drv = &floppy[dr];
|
||||
@ -3086,7 +3054,7 @@ void DISK_update (unsigned int tohpos)
|
||||
drive_fill_bigbuf (drv, 0);
|
||||
drv->mfmpos %= drv->tracklen;
|
||||
}
|
||||
didread = 0;
|
||||
int didaccess = 0;
|
||||
for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) {
|
||||
drive *drv = &floppy[dr];
|
||||
if (drv->motoroff || !drv->trackspeed)
|
||||
@ -3097,16 +3065,15 @@ void DISK_update (unsigned int tohpos)
|
||||
disk_doupdate_write (drv, drv->floppybitcounter);
|
||||
else
|
||||
disk_doupdate_read (drv, drv->floppybitcounter);
|
||||
disk_doupdate_predict (drv, disk_hpos);
|
||||
drv->floppybitcounter %= drv->trackspeed;
|
||||
didread = 1;
|
||||
break;
|
||||
didaccess = 1;
|
||||
}
|
||||
/* no floppy selected but read dma */
|
||||
if (!didread && dskdmaen == 2) {
|
||||
if (!didaccess && dskdmaen == 2) {
|
||||
disk_doupdate_read_nothing (cycles);
|
||||
}
|
||||
|
||||
disk_doupdate_predict (disk_hpos);
|
||||
}
|
||||
|
||||
void DSKLEN (uae_u16 v, unsigned int hpos)
|
||||
@ -3322,24 +3289,74 @@ void DSKSYNC (unsigned int hpos, uae_u16 v)
|
||||
dsksync = v;
|
||||
}
|
||||
|
||||
STATIC_INLINE bool iswrite (void)
|
||||
{
|
||||
return dskdmaen == 3;
|
||||
}
|
||||
|
||||
void DSKDAT (uae_u16 v)
|
||||
{
|
||||
static int count = 0;
|
||||
#if 0
|
||||
if (dsklen == 0x8000) {
|
||||
if (v == 1)
|
||||
longwritemode = 1;
|
||||
if (fifo_inuse[2]) {
|
||||
write_log ("DSKDAT: FIFO overflow!\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (count < 5) {
|
||||
count++;
|
||||
write_log ("%04X written to DSKDAT. Not good. PC=%08X", v, M68K_GETPC);
|
||||
if (count == 5)
|
||||
write_log ("(further messages suppressed)");
|
||||
|
||||
write_log ("\n");
|
||||
fifo_inuse[2] = fifo_inuse[1];
|
||||
fifo[2] = fifo[1];
|
||||
fifo_inuse[1] = fifo_inuse[0];
|
||||
fifo[1] = fifo[0];
|
||||
fifo_inuse[0] = iswrite () ? 2 : 1;
|
||||
fifo[0] = v;
|
||||
fifo_filled = 1;
|
||||
}
|
||||
uae_u16 DSKDATR (void)
|
||||
{
|
||||
int i;
|
||||
uae_u16 v = 0;
|
||||
for (i = 2; i >= 0; i--) {
|
||||
if (fifo_inuse[i]) {
|
||||
fifo_inuse[i] = 0;
|
||||
v = fifo[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < 0) {
|
||||
write_log ("DSKDATR: FIFO underflow!\n");
|
||||
} else if (dskdmaen > 0 && dskdmaen < 3 && dsklength <= 0 && disk_fifostatus () < 0) {
|
||||
disk_dmafinished ();
|
||||
}
|
||||
return v;
|
||||
}
|
||||
int disk_fifostatus (void)
|
||||
{
|
||||
if (fifo_inuse[0] && fifo_inuse[1] && fifo_inuse[2])
|
||||
return 1;
|
||||
if (!fifo_inuse[0] && !fifo_inuse[1] && !fifo_inuse[2])
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uae_u16 disk_dmal (void)
|
||||
{
|
||||
uae_u16 dmal = 0;
|
||||
if (dskdmaen) {
|
||||
if (dskdmaen == 3) {
|
||||
dmal = (1 + 2) * (fifo_inuse[0] ? 1 : 0) + (4 + 8) * (fifo_inuse[1] ? 1 : 0) + (16 + 32) * (fifo_inuse[2] ? 1 : 0);
|
||||
dmal ^= 63;
|
||||
if (dsklength == 2)
|
||||
dmal &= ~(16 + 32);
|
||||
if (dsklength == 1)
|
||||
dmal &= ~(16 + 32 + 4 + 8);
|
||||
} else {
|
||||
dmal = 16 * (fifo_inuse[0] ? 1 : 0) + 4 * (fifo_inuse[1] ? 1 : 0) + 1 * (fifo_inuse[2] ? 1 : 0);
|
||||
}
|
||||
}
|
||||
return dmal;
|
||||
}
|
||||
uaecptr disk_getpt (void)
|
||||
{
|
||||
uaecptr pt = dskpt;
|
||||
dskpt += 2;
|
||||
return pt;
|
||||
}
|
||||
void DSKPTH (uae_u16 v)
|
||||
{
|
||||
|
@ -382,7 +382,7 @@ int get_custom_limits (int *pw, int *ph, int *pdx, int *pdy)
|
||||
if (minfirstline > y1)
|
||||
y1 = minfirstline;
|
||||
|
||||
dbl2 = dbl1 = currprefs.gfx_linedbl ? 1 : 0;
|
||||
dbl2 = dbl1 = currprefs.gfx_vresolution;
|
||||
if (doublescan > 0 && interlace_seen <= 0) {
|
||||
dbl1--;
|
||||
dbl2--;
|
||||
@ -492,7 +492,7 @@ void get_custom_mouse_limits (int *pw, int *ph, int *pdx, int *pdy, int dbl)
|
||||
|
||||
dx = xshift (dx, res_shift);
|
||||
|
||||
dbl2 = dbl1 = currprefs.gfx_linedbl ? 1 : 0;
|
||||
dbl2 = dbl1 = currprefs.gfx_vresolution;
|
||||
if ((doublescan > 0 || interlace_seen > 0) && !dbl) {
|
||||
dbl1--;
|
||||
dbl2--;
|
||||
@ -714,7 +714,7 @@ static void pfield_do_fill_line (int start, int stop)
|
||||
}
|
||||
}
|
||||
|
||||
STATIC_INLINE void fill_line (void)
|
||||
STATIC_INLINE void fill_line_2 (int startpos, int len, int blank)
|
||||
{
|
||||
int shift;
|
||||
int nints, nrem;
|
||||
@ -728,15 +728,11 @@ STATIC_INLINE void fill_line (void)
|
||||
shift = 2;*/
|
||||
shift = gfxvidinfo.pixbytes >> 1;
|
||||
|
||||
nints = gfxvidinfo.width >> (2 - shift);
|
||||
nints = len >> (2 - shift);
|
||||
nrem = nints & 7;
|
||||
nints &= ~7;
|
||||
start = (int *)(((uae_u8*)xlinebuffer) + (visible_left_border << shift));
|
||||
#ifdef ECS_DENISE
|
||||
val = brdblank ? 0 : colors_for_drawing.acolors[0];
|
||||
#else
|
||||
val = colors_for_drawing.acolors[0];
|
||||
#endif
|
||||
start = (int *)(((uae_u8*)xlinebuffer) + (startpos << shift));
|
||||
val = blank ? 0 : colors_for_drawing.acolors[0];
|
||||
for (; nints > 0; nints -= 8, start += 8) {
|
||||
*start = val;
|
||||
*(start + 1) = val;
|
||||
@ -766,6 +762,17 @@ STATIC_INLINE void fill_line (void)
|
||||
}
|
||||
}
|
||||
|
||||
STATIC_INLINE void fill_line (void)
|
||||
{
|
||||
int endpos = visible_left_border + gfxvidinfo.width;
|
||||
int endposh = coord_hw_to_window_x (hsyncstartpos * 2);
|
||||
if (endpos < endposh) {
|
||||
fill_line_2 (visible_left_border, gfxvidinfo.width, brdblank);
|
||||
} else {
|
||||
fill_line_2 (visible_left_border, endposh - visible_left_border, brdblank);
|
||||
fill_line_2 (endposh, gfxvidinfo.width - endposh, 1);
|
||||
}
|
||||
}
|
||||
|
||||
#define SPRITE_DEBUG 0
|
||||
STATIC_INLINE uae_u8 render_sprites (int pos, int dualpf, uae_u8 apixel, int aga)
|
||||
@ -1675,7 +1682,7 @@ static void init_aspect_maps (void)
|
||||
/* Do nothing if the gfx driver hasn't initialized the screen yet */
|
||||
return;
|
||||
|
||||
linedbld = linedbl = currprefs.gfx_linedbl;
|
||||
linedbld = linedbl = currprefs.gfx_vresolution;
|
||||
if (doublescan > 0 && interlace_seen <= 0) {
|
||||
linedbl = 0;
|
||||
linedbld = 1;
|
||||
@ -1690,8 +1697,8 @@ static void init_aspect_maps (void)
|
||||
amiga2aspect_line_map = xmalloc (int, (MAXVPOS + 1) * 2 + 1);
|
||||
native2amiga_line_map = xmalloc (int, gfxvidinfo.height);
|
||||
|
||||
maxl = (MAXVPOS + 1) * (linedbld ? 2 : 1);
|
||||
min_ypos_for_screen = minfirstline << (linedbl ? 1 : 0);
|
||||
maxl = (MAXVPOS + 1) << linedbld;
|
||||
min_ypos_for_screen = minfirstline << linedbl;
|
||||
max_drawn_amiga_line = -1;
|
||||
for (i = 0; i < maxl; i++) {
|
||||
int v = i - min_ypos_for_screen;
|
||||
@ -1701,12 +1708,11 @@ static void init_aspect_maps (void)
|
||||
v = -1;
|
||||
amiga2aspect_line_map[i] = v;
|
||||
}
|
||||
if (linedbl)
|
||||
max_drawn_amiga_line >>= 1;
|
||||
max_drawn_amiga_line >>= linedbl;
|
||||
|
||||
if (currprefs.gfx_ycenter && !currprefs.gfx_filter_autoscale) {
|
||||
/* @@@ verify maxvpos vs. MAXVPOS */
|
||||
extra_y_adjust = (gfxvidinfo.height - (maxvpos_nom << (linedbl ? 1 : 0))) >> 1;
|
||||
extra_y_adjust = (gfxvidinfo.height - (maxvpos_nom << linedbl)) >> 1;
|
||||
if (extra_y_adjust < 0)
|
||||
extra_y_adjust = 0;
|
||||
}
|
||||
@ -1719,7 +1725,7 @@ static void init_aspect_maps (void)
|
||||
if (amiga2aspect_line_map[i] == -1)
|
||||
continue;
|
||||
for (j = amiga2aspect_line_map[i]; j < gfxvidinfo.height && native2amiga_line_map[j] == -1; j++)
|
||||
native2amiga_line_map[j] = i >> (linedbl ? 1 : 0);
|
||||
native2amiga_line_map[j] = i >> linedbl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1902,6 +1908,7 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
|
||||
int lastpos = visible_left_border;
|
||||
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++) {
|
||||
int regno = curr_color_changes[i].regno;
|
||||
@ -1920,7 +1927,17 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
|
||||
if (nextpos_in_range > lastpos) {
|
||||
if (lastpos < playfield_start) {
|
||||
int t = nextpos_in_range <= playfield_start ? nextpos_in_range : playfield_start;
|
||||
if (t == endpos) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -1932,8 +1949,18 @@ STATIC_INLINE void do_color_changes (line_draw_func worker_border, line_draw_fun
|
||||
}
|
||||
}
|
||||
if (nextpos_in_range > lastpos) {
|
||||
if (lastpos >= playfield_end)
|
||||
if (lastpos >= playfield_end) {
|
||||
if (nextpos_in_range > endposh) {
|
||||
(*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;
|
||||
}
|
||||
if (i != dip_for_drawing->last_color_change) {
|
||||
@ -2163,8 +2190,7 @@ static void center_image (void)
|
||||
if (visible_left_border < prev_x_adjust && prev_x_adjust < min_diwstart && min_diwstart - visible_left_border <= 32)
|
||||
visible_left_border = prev_x_adjust;
|
||||
}
|
||||
} else {
|
||||
if ((beamcon0 & 0x80) && max_diwstop > 0) {
|
||||
} else if ((beamcon0 & 0x80) && max_diwstop > 0) {
|
||||
int w = gfxvidinfo.width;
|
||||
if (max_diwstop - min_diwstart < w)
|
||||
visible_left_border = (max_diwstop - min_diwstart - w) / 2 + min_diwstart;
|
||||
@ -2173,7 +2199,6 @@ static void center_image (void)
|
||||
} else {
|
||||
visible_left_border = max_diwlastword - gfxvidinfo.width;
|
||||
}
|
||||
}
|
||||
if (currprefs.gfx_xcenter_pos >= 0) {
|
||||
int val = currprefs.gfx_xcenter_pos >> RES_MAX;
|
||||
#if 0
|
||||
@ -2236,8 +2261,8 @@ static void center_image (void)
|
||||
if (thisframe_y_adjust < minfirstline)
|
||||
thisframe_y_adjust = minfirstline;
|
||||
}
|
||||
thisframe_y_adjust_real = thisframe_y_adjust << (linedbl ? 1 : 0);
|
||||
tmp = (maxvpos_nom - thisframe_y_adjust) << (linedbl ? 1 : 0);
|
||||
thisframe_y_adjust_real = thisframe_y_adjust << linedbl;
|
||||
tmp = (maxvpos_nom - thisframe_y_adjust) << linedbl;
|
||||
if (tmp != max_ypos_thisframe) {
|
||||
last_max_ypos = tmp;
|
||||
if (last_max_ypos < 0)
|
||||
@ -2273,9 +2298,9 @@ static void init_drawing_frame (void)
|
||||
if ((src->width > 0 && src->height > 0) || (ar && currprefs.gfx_filter > 0)) {
|
||||
int nr = (m & 2) == 0 ? 0 : 1;
|
||||
int nl = (m & 1) == 0 ? 0 : 1;
|
||||
if (changed_prefs.gfx_resolution != nr || changed_prefs.gfx_linedbl != nl) {
|
||||
if (changed_prefs.gfx_resolution != nr || changed_prefs.gfx_vresolution != nl) {
|
||||
changed_prefs.gfx_resolution = nr;
|
||||
changed_prefs.gfx_linedbl = nl;
|
||||
changed_prefs.gfx_vresolution = nl;
|
||||
write_log ("RES -> %d LINE -> %d\n", nr, nl);
|
||||
config_changed = 1;
|
||||
if (ar) {
|
||||
@ -2318,8 +2343,7 @@ static void init_drawing_frame (void)
|
||||
if (thisframe_first_drawn_line > thisframe_last_drawn_line)
|
||||
thisframe_last_drawn_line = thisframe_first_drawn_line;
|
||||
|
||||
maxline = linedbl ? (maxvpos_nom + 1) * 2 + 1 : (maxvpos_nom + 1) + 1;
|
||||
maxline++;
|
||||
maxline = ((maxvpos_nom + 1) << linedbl) + 2;
|
||||
#ifdef SMART_UPDATE
|
||||
for (i = 0; i < maxline; i++) {
|
||||
switch (linestate[i]) {
|
||||
@ -2673,8 +2697,7 @@ static void lightpen_update (void)
|
||||
lightpen_cx = (((lightpen_x + visible_left_border) >> lores_shift) >> 1) + DISPLAY_LEFT_SHIFT - DIW_DDF_OFFSET;
|
||||
|
||||
lightpen_cy = lightpen_y;
|
||||
if (linedbl)
|
||||
lightpen_cy >>= 1;
|
||||
lightpen_cy >>= linedbl;
|
||||
lightpen_cy += minfirstline;
|
||||
|
||||
if (lightpen_cx < 0x18)
|
||||
@ -2845,7 +2868,7 @@ void vsync_handle_redraw (int long_frame, int lof_changed)
|
||||
interlace_seen = -1;
|
||||
} else if (interlace_seen == -1) {
|
||||
interlace_seen = 0;
|
||||
if (currprefs.gfx_scandoubler && currprefs.gfx_linedbl)
|
||||
if (currprefs.gfx_scandoubler && currprefs.gfx_vresolution)
|
||||
notice_screen_contents_lost ();
|
||||
}
|
||||
|
||||
|
@ -204,10 +204,9 @@ void driveclick_init (void)
|
||||
drvs[i][DS_SNATCH].pos = drvs[i][DS_SNATCH].len;
|
||||
}
|
||||
}
|
||||
if (vv > 0) {
|
||||
driveclick_reset ();
|
||||
if (vv > 0)
|
||||
click_initialized = 1;
|
||||
}
|
||||
if (v != 5) { click_initialized= 0; wave_initialized = 0;}
|
||||
}
|
||||
|
||||
@ -236,10 +235,9 @@ void driveclick_free (void)
|
||||
drv_has_disk[i] = 0;
|
||||
}
|
||||
memset (drvs, 0, sizeof (drvs));
|
||||
xfree (clickbuffer);
|
||||
clickbuffer = 0;
|
||||
click_initialized = 0;
|
||||
wave_initialized = 0;
|
||||
driveclick_reset ();
|
||||
}
|
||||
|
||||
static int driveclick_active (void)
|
||||
@ -406,8 +404,11 @@ void driveclick_mix (uae_s16 *sndbuffer, int size, int channelmask)
|
||||
break;
|
||||
case 1:
|
||||
for (i = 0; i < size; i++) {
|
||||
uae_s16 s = clickbuffer[i];
|
||||
if (channelmask & 1)
|
||||
sndbuffer[0] = limit (((sndbuffer[0] + clickbuffer[i]) * 2) / 3);
|
||||
sndbuffer[0] = limit (((sndbuffer[0] + s) * 2) / 3);
|
||||
else
|
||||
sndbuffer[0] = sndbuffer[0] * 2 / 3;
|
||||
sndbuffer++;
|
||||
}
|
||||
break;
|
||||
|
@ -354,7 +354,7 @@ static void REGPARAM2 expamem_bput (uaecptr addr, uae_u32 value)
|
||||
break;
|
||||
|
||||
case 0x4c:
|
||||
write_log (" Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type () == 0xc0 ? L"II" : L"III");
|
||||
write_log (" Card %d (Zorro%s) had no success.\n", ecard + 1, expamem_type () == 0xc0 ? "II" : "III");
|
||||
++ecard;
|
||||
if (ecard < cardno)
|
||||
(*card_init[ecard]) ();
|
||||
|
@ -467,7 +467,7 @@ int graphics_init (void)
|
||||
currprefs.gfx_width = 320;
|
||||
currprefs.gfx_height = 256;
|
||||
currprefs.gfx_lores = 1;
|
||||
currprefs.gfx_linedbl = 0;
|
||||
currprefs.gfx_vresolution = 0;
|
||||
|
||||
gfxvidinfo.width = currprefs.gfx_width;
|
||||
gfxvidinfo.height = currprefs.gfx_height;
|
||||
|
@ -680,7 +680,7 @@ STATIC_INLINE void render_gl_buffer (const struct gl_buffer_t *buffer, int first
|
||||
amiga_real_w = 724;
|
||||
gfx_gl_x_offset = (float) currprefs.gfx_gl_x_offset * 2;
|
||||
}
|
||||
if (currprefs.gfx_linedbl) {
|
||||
if (currprefs.gfx_vresolution) {
|
||||
amiga_real_h = 568;
|
||||
gfx_gl_y_offset = (float) currprefs.gfx_gl_y_offset * 2;
|
||||
} else {
|
||||
@ -1530,7 +1530,7 @@ int check_prefs_changed_gfx (void)
|
||||
|| changed_prefs.gfx_height_fs != currprefs.gfx_height_fs) {
|
||||
fixup_prefs_dimensions (&changed_prefs);
|
||||
} else if (changed_prefs.gfx_lores_mode == currprefs.gfx_lores_mode
|
||||
&& changed_prefs.gfx_linedbl == currprefs.gfx_linedbl
|
||||
&& changed_prefs.gfx_vresolution == currprefs.gfx_vresolution
|
||||
&& changed_prefs.gfx_xcenter == currprefs.gfx_xcenter
|
||||
&& changed_prefs.gfx_ycenter == currprefs.gfx_ycenter
|
||||
&& changed_prefs.gfx_afullscreen == currprefs.gfx_afullscreen
|
||||
@ -1550,7 +1550,7 @@ int check_prefs_changed_gfx (void)
|
||||
currprefs.gfx_width_fs = changed_prefs.gfx_width_fs;
|
||||
currprefs.gfx_height_fs = changed_prefs.gfx_height_fs;
|
||||
currprefs.gfx_lores_mode = changed_prefs.gfx_lores_mode;
|
||||
currprefs.gfx_linedbl = changed_prefs.gfx_linedbl;
|
||||
currprefs.gfx_vresolution = changed_prefs.gfx_vresolution;
|
||||
currprefs.gfx_xcenter = changed_prefs.gfx_xcenter;
|
||||
currprefs.gfx_ycenter = changed_prefs.gfx_ycenter;
|
||||
currprefs.gfx_afullscreen = changed_prefs.gfx_afullscreen;
|
||||
|
@ -1221,7 +1221,7 @@ int check_prefs_changed_gfx (void)
|
||||
|
||||
if (changed_prefs.gfx_width_win == currprefs.gfx_width_win
|
||||
&& changed_prefs.gfx_height_win == currprefs.gfx_height_win
|
||||
&& changed_prefs.gfx_linedbl == currprefs.gfx_linedbl
|
||||
&& changed_prefs.gfx_vresolution == currprefs.gfx_vresolution
|
||||
&& changed_prefs.gfx_xcenter == currprefs.gfx_xcenter
|
||||
&& changed_prefs.gfx_ycenter == currprefs.gfx_ycenter
|
||||
&& changed_prefs.gfx_afullscreen == currprefs.gfx_afullscreen
|
||||
@ -1231,7 +1231,7 @@ int check_prefs_changed_gfx (void)
|
||||
graphics_subshutdown ();
|
||||
currprefs.gfx_width_win = changed_prefs.gfx_width_win;
|
||||
currprefs.gfx_height_win = changed_prefs.gfx_height_win;
|
||||
currprefs.gfx_linedbl = changed_prefs.gfx_linedbl;
|
||||
currprefs.gfx_vresolution = changed_prefs.gfx_vresolution;
|
||||
currprefs.gfx_xcenter = changed_prefs.gfx_xcenter;
|
||||
currprefs.gfx_ycenter = changed_prefs.gfx_ycenter;
|
||||
currprefs.gfx_afullscreen = changed_prefs.gfx_afullscreen;
|
||||
|
@ -104,15 +104,6 @@ int gui_init (void)
|
||||
{
|
||||
}
|
||||
|
||||
int gui_open (void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
void gui_notify_state (int state)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_exit (void)
|
||||
{
|
||||
}
|
||||
@ -144,41 +135,6 @@ void gui_led (int led, int on)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_hd_led (int led)
|
||||
{
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.hd;
|
||||
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.hd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.hd)
|
||||
gui_led (5, gui_data.hd);
|
||||
}
|
||||
|
||||
void gui_cd_led (int led)
|
||||
{
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.cd;
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.cd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.cd)
|
||||
gui_led (6, gui_data.cd);
|
||||
}
|
||||
|
||||
void gui_display (int shortcut)
|
||||
{
|
||||
pause_sound ();
|
||||
|
@ -589,11 +589,6 @@ int gui_init (void)
|
||||
{
|
||||
}
|
||||
|
||||
int gui_open (void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
int gui_update (void)
|
||||
{
|
||||
return 0;
|
||||
@ -617,41 +612,6 @@ void gui_led (int led, int on)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_hd_led (int unitnum, int led)
|
||||
{
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.hd;
|
||||
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.hd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.hd)
|
||||
gui_led (5, gui_data.hd);
|
||||
}
|
||||
|
||||
void gui_cd_led (int unitnum, int led)
|
||||
{
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.cd;
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.cd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.cd)
|
||||
gui_led (6, gui_data.cd);
|
||||
}
|
||||
|
||||
void gui_filename (int num, const char *name)
|
||||
{
|
||||
}
|
||||
@ -664,10 +624,6 @@ void gui_handle_events (void)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_notify_state (int state)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_display (int shortcut)
|
||||
{
|
||||
int result;
|
||||
|
@ -66,7 +66,6 @@ static void cpuspeedpanel_class_init (CpuSpeedPanelClass *class)
|
||||
static void cpuspeedpanel_init (CpuSpeedPanel *cspanel)
|
||||
{
|
||||
GtkWidget *table;
|
||||
/* GtkWidget *hbuttonbox, *button1, *button2; */
|
||||
|
||||
gtk_frame_set_label (GTK_FRAME(cspanel), "Emulation speed");
|
||||
gtk_container_set_border_width (GTK_CONTAINER (cspanel), PANEL_BORDER_WIDTH);
|
||||
|
@ -18,11 +18,17 @@
|
||||
|
||||
static void cputypepanel_init (CpuTypePanel *pathent);
|
||||
static void cputypepanel_class_init (CpuTypePanelClass *class);
|
||||
static void update_state (CpuTypePanel *ctpanel);
|
||||
static void fputypepanel_init (FpuTypePanel *pathent);
|
||||
static void fputypepanel_class_init (FpuTypePanelClass *class);
|
||||
static void update_state_cpu (CpuTypePanel *ctpanel);
|
||||
static void update_state_fpu (FpuTypePanel *ftpanel);
|
||||
static void on_cputype_changed (GtkWidget *w, CpuTypePanel *ctpanel);
|
||||
static void on_addr24bit_toggled (GtkWidget *w, CpuTypePanel *ctpanel);
|
||||
static void on_fpuenabled_toggled (GtkWidget *w, CpuTypePanel *ctpanel);
|
||||
static void on_accuracy_changed (GtkWidget *w, CpuTypePanel *ctpanel);
|
||||
static void on_cpu_morecompat_changed (GtkWidget *w, CpuTypePanel *ctpanel);
|
||||
static void on_mmu40_changed (GtkWidget *w, CpuTypePanel *ctpanel);
|
||||
|
||||
static void on_fputype_changed (GtkWidget *w, FpuTypePanel *ftpanel);
|
||||
static void on_fpu_morecompat_changed (GtkWidget *w, FpuTypePanel *ftpanel);
|
||||
|
||||
guint cputypepanel_get_type ()
|
||||
{
|
||||
@ -44,6 +50,26 @@ guint cputypepanel_get_type ()
|
||||
return cputypepanel_type;
|
||||
}
|
||||
|
||||
guint fputypepanel_get_type ()
|
||||
{
|
||||
static guint fputypepanel_type = 0;
|
||||
|
||||
if (!fputypepanel_type) {
|
||||
static const GtkTypeInfo fputypepanel_info = {
|
||||
(char *) "FpuTypePanel",
|
||||
sizeof (FpuTypePanel),
|
||||
sizeof (FpuTypePanelClass),
|
||||
(GtkClassInitFunc) fputypepanel_class_init,
|
||||
(GtkObjectInitFunc) fputypepanel_init,
|
||||
NULL,
|
||||
NULL,
|
||||
(GtkClassInitFunc) NULL
|
||||
};
|
||||
fputypepanel_type = gtk_type_unique (gtk_frame_get_type (), &fputypepanel_info);
|
||||
}
|
||||
return fputypepanel_type;
|
||||
}
|
||||
|
||||
enum {
|
||||
TYPE_CHANGE_SIGNAL,
|
||||
ADDR24_CHANGE_SIGNAL,
|
||||
@ -51,6 +77,7 @@ enum {
|
||||
};
|
||||
|
||||
static guint cputypepanel_signals[LAST_SIGNAL];
|
||||
static guint fputypepanel_signals[LAST_SIGNAL];
|
||||
|
||||
static void cputypepanel_class_init (CpuTypePanelClass *class)
|
||||
{
|
||||
@ -59,10 +86,23 @@ static void cputypepanel_class_init (CpuTypePanelClass *class)
|
||||
cputypepanel_signals,
|
||||
"cputype-changed",
|
||||
"addr24bit-changed",
|
||||
"cpucompat-changed",
|
||||
"mmu40-changed",
|
||||
(void*)0);
|
||||
class->cputypepanel = NULL;
|
||||
}
|
||||
|
||||
static void fputypepanel_class_init (FpuTypePanelClass *class)
|
||||
{
|
||||
gtkutil_add_signals_to_class ((GtkObjectClass *)class,
|
||||
GTK_STRUCT_OFFSET (FpuTypePanelClass, fputypepanel),
|
||||
fputypepanel_signals,
|
||||
"fputype-changed",
|
||||
"fpucompat-changed",
|
||||
(void*)0);
|
||||
class->fputypepanel = NULL;
|
||||
}
|
||||
|
||||
static void cputypepanel_init (CpuTypePanel *ctpanel)
|
||||
{
|
||||
GtkWidget *table;
|
||||
@ -73,22 +113,13 @@ static void cputypepanel_init (CpuTypePanel *ctpanel)
|
||||
|
||||
gtkutil_add_table (GTK_WIDGET (ctpanel),
|
||||
make_label ("CPU Model"), 1, 1, GTK_FILL,
|
||||
ctpanel->cputype_widget = make_chooser (
|
||||
#ifdef FPUEMU
|
||||
5, "68000", "68010", "68020", "68040", "68060"
|
||||
#else
|
||||
3, "68000", "68010", "68020"
|
||||
#endif
|
||||
), 2, 1, GTK_EXPAND | GTK_FILL,
|
||||
ctpanel->cputype_widget = make_chooser ( 6, "68000", "68010", "68020", "68030", "68040", "68060" ), 2, 1, GTK_EXPAND | GTK_FILL,
|
||||
GTKUTIL_ROW_END,
|
||||
ctpanel->addr24bit_widget = gtk_check_button_new_with_label ("24-bit addressing"), 1, 2, GTK_EXPAND,
|
||||
GTKUTIL_ROW_END,
|
||||
#ifdef FPUEMU
|
||||
ctpanel->fpuenabled_widget = gtk_check_button_new_with_label ("Emulate FPU"), 1, 2, GTK_EXPAND,
|
||||
ctpanel->cpu_morecompat_widget = gtk_check_button_new_with_label ("More Compatible"), 1, 2, GTK_EXPAND,
|
||||
GTKUTIL_ROW_END,
|
||||
#endif
|
||||
make_label ("Accuracy"), 1, 1, GTK_FILL,
|
||||
ctpanel->accuracy_widget = make_chooser (3, "Normal", "Compatible", "Cycle exact"), 2, 1, GTK_EXPAND | GTK_FILL,
|
||||
ctpanel->mmu40_widget = gtk_check_button_new_with_label ("68040 MMU"), 1, 2, GTK_EXPAND,
|
||||
GTKUTIL_ROW_END,
|
||||
GTKUTIL_TABLE_END
|
||||
);
|
||||
@ -99,63 +130,84 @@ static void cputypepanel_init (CpuTypePanel *ctpanel)
|
||||
gtk_signal_connect (GTK_OBJECT (ctpanel->addr24bit_widget), "toggled",
|
||||
GTK_SIGNAL_FUNC (on_addr24bit_toggled),
|
||||
ctpanel);
|
||||
#ifdef FPUEMU
|
||||
gtk_signal_connect (GTK_OBJECT (ctpanel->fpuenabled_widget), "toggled",
|
||||
GTK_SIGNAL_FUNC (on_fpuenabled_toggled),
|
||||
gtk_signal_connect (GTK_OBJECT (ctpanel->cpu_morecompat_widget), "toggled",
|
||||
GTK_SIGNAL_FUNC (on_cpu_morecompat_changed),
|
||||
ctpanel);
|
||||
#endif
|
||||
gtk_signal_connect (GTK_OBJECT (ctpanel->accuracy_widget), "selection-changed",
|
||||
GTK_SIGNAL_FUNC (on_accuracy_changed),
|
||||
gtk_signal_connect (GTK_OBJECT (ctpanel->mmu40_widget), "toggled",
|
||||
GTK_SIGNAL_FUNC (on_mmu40_changed),
|
||||
ctpanel);
|
||||
|
||||
update_state (ctpanel);
|
||||
update_state_cpu (ctpanel);
|
||||
}
|
||||
|
||||
static void update_state (CpuTypePanel *ctpanel)
|
||||
static void fputypepanel_init (FpuTypePanel *ftpanel)
|
||||
{
|
||||
GtkWidget *table;
|
||||
|
||||
gtk_frame_set_label (GTK_FRAME(ftpanel), "FPU Emulation");
|
||||
gtk_container_set_border_width (GTK_CONTAINER (ftpanel), PANEL_BORDER_WIDTH);
|
||||
gtk_frame_set_label_align (GTK_FRAME(ftpanel), 0.01, 0.5);
|
||||
|
||||
gtkutil_add_table (GTK_WIDGET (ftpanel),
|
||||
make_label ("FPU Model"), 1, 1, GTK_FILL,
|
||||
|
||||
ftpanel->fputype_widget = make_chooser (
|
||||
#ifdef FPUEMU
|
||||
4, "None", "68881", "68882", "CPU Internal"
|
||||
#else
|
||||
1, "None"
|
||||
#endif
|
||||
), 2, 1, GTK_EXPAND | GTK_FILL,
|
||||
GTKUTIL_ROW_END,
|
||||
ftpanel->fpu_morecompat_widget = gtk_check_button_new_with_label ("More Compatible"), 1, 2, GTK_EXPAND,
|
||||
GTKUTIL_ROW_END,
|
||||
GTKUTIL_TABLE_END
|
||||
);
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (ftpanel->fputype_widget), "selection-changed",
|
||||
GTK_SIGNAL_FUNC (on_fputype_changed),
|
||||
ftpanel);
|
||||
gtk_signal_connect (GTK_OBJECT (ftpanel->fpu_morecompat_widget), "toggled",
|
||||
GTK_SIGNAL_FUNC (on_fpu_morecompat_changed),
|
||||
ftpanel);
|
||||
|
||||
update_state_fpu (ftpanel);
|
||||
}
|
||||
|
||||
static void update_state_cpu (CpuTypePanel *ctpanel)
|
||||
{
|
||||
guint cpu = ctpanel->cputype;
|
||||
guint addr24 = ctpanel->addr24bit;
|
||||
guint fpu = ctpanel->fpuenabled;
|
||||
guint cpumorecompat = ctpanel->cpumorecompat;
|
||||
|
||||
switch (cpu) {
|
||||
case 0:
|
||||
case 1:
|
||||
addr24 = 1;
|
||||
fpu = 0;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
addr24 = 0;
|
||||
fpu = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
gtk_widget_set_sensitive (ctpanel->addr24bit_widget, cpu == 2);
|
||||
#ifdef FPUEMU
|
||||
gtk_widget_set_sensitive (ctpanel->fpuenabled_widget, cpu == 2);
|
||||
|
||||
if (fpu != ctpanel->fpuenabled) {
|
||||
ctpanel->fpuenabled = fpu;
|
||||
gtk_signal_handler_block_by_data (GTK_OBJECT (ctpanel->fpuenabled_widget), ctpanel );
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctpanel->fpuenabled_widget), fpu);
|
||||
gtk_signal_handler_unblock_by_data (GTK_OBJECT (ctpanel->fpuenabled_widget), ctpanel );
|
||||
}
|
||||
#endif
|
||||
|
||||
if (addr24 != ctpanel->addr24bit) {
|
||||
ctpanel->addr24bit = addr24;
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctpanel->addr24bit_widget), addr24);
|
||||
}
|
||||
}
|
||||
|
||||
static void update_state_fpu (FpuTypePanel *ftpanel)
|
||||
{
|
||||
|
||||
gtk_widget_set_sensitive (ctpanel->accuracy_widget, cpu == 0);
|
||||
if (cpu > 0)
|
||||
chooserwidget_set_choice (CHOOSERWIDGET (ctpanel->accuracy_widget), 0);
|
||||
}
|
||||
|
||||
static void on_cputype_changed (GtkWidget *w, CpuTypePanel *ctpanel)
|
||||
{
|
||||
ctpanel->cputype = CHOOSERWIDGET (w)->choice;
|
||||
update_state (ctpanel);
|
||||
update_state_cpu (ctpanel);
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ctpanel), "cputype-changed");
|
||||
}
|
||||
|
||||
@ -165,30 +217,29 @@ static void on_addr24bit_toggled (GtkWidget *w, CpuTypePanel *ctpanel)
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ctpanel), "addr24bit-changed");
|
||||
}
|
||||
|
||||
#ifdef FPUEMU
|
||||
static void on_fpuenabled_toggled (GtkWidget *w, CpuTypePanel *ctpanel)
|
||||
static void on_cpu_morecompat_changed (GtkWidget *w, CpuTypePanel *ctpanel)
|
||||
{
|
||||
ctpanel->fpuenabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ctpanel->fpuenabled_widget));
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ctpanel), "cputype-changed");
|
||||
}
|
||||
#endif
|
||||
|
||||
static void on_accuracy_changed (GtkWidget *w, CpuTypePanel *ctpanel)
|
||||
{
|
||||
int choice = CHOOSERWIDGET (ctpanel->accuracy_widget)->choice;
|
||||
|
||||
if (choice == 0 ) {
|
||||
ctpanel->compatible = 0;
|
||||
ctpanel->cycleexact = 0;
|
||||
} else if (choice == 1) {
|
||||
ctpanel->compatible = 1;
|
||||
ctpanel->cycleexact = 0;
|
||||
} else {
|
||||
ctpanel->compatible = 0;
|
||||
ctpanel->cycleexact = 1;
|
||||
ctpanel->cpumorecompat = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ctpanel->cpu_morecompat_widget));
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ctpanel), "cpucompat-changed");
|
||||
}
|
||||
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ctpanel), "cputype-changed");
|
||||
static void on_mmu40_changed (GtkWidget *w, CpuTypePanel *ctpanel)
|
||||
{
|
||||
ctpanel->mmu40 = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ctpanel->mmu40_widget));
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ctpanel), "mmu40-changed");
|
||||
}
|
||||
|
||||
static void on_fputype_changed (GtkWidget *w, FpuTypePanel *ftpanel)
|
||||
{
|
||||
ftpanel->fputype = CHOOSERWIDGET (w)->choice;
|
||||
update_state_fpu (ftpanel);
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ftpanel), "fputype-changed");
|
||||
}
|
||||
|
||||
static void on_fpu_morecompat_changed (GtkWidget *w, FpuTypePanel *ftpanel)
|
||||
{
|
||||
ftpanel->fpumorecompat = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ftpanel->fpu_morecompat_widget));
|
||||
gtk_signal_emit_by_name (GTK_OBJECT(ftpanel), "fpucompat-changed");
|
||||
}
|
||||
|
||||
GtkWidget *cputypepanel_new (void)
|
||||
@ -198,9 +249,17 @@ GtkWidget *cputypepanel_new (void)
|
||||
return GTK_WIDGET (w);
|
||||
}
|
||||
|
||||
GtkWidget *fputypepanel_new (void)
|
||||
{
|
||||
CpuTypePanel *w = CPUTYPEPANEL (gtk_type_new (fputypepanel_get_type ()));
|
||||
|
||||
return GTK_WIDGET (w);
|
||||
}
|
||||
|
||||
void cputypepanel_set_cpulevel (CpuTypePanel *ctpanel, guint cpulevel)
|
||||
{
|
||||
guint cputype; guint fpu = ctpanel->fpuenabled;
|
||||
guint cputype;
|
||||
guint fpu = ctpanel->fpuenabled;
|
||||
|
||||
switch (cpulevel) {
|
||||
case 0: cputype = 0; break;
|
||||
@ -214,15 +273,8 @@ void cputypepanel_set_cpulevel (CpuTypePanel *ctpanel, guint cpulevel)
|
||||
if (cputype != ctpanel->cputype) {
|
||||
ctpanel->cputype = cputype;
|
||||
chooserwidget_set_choice (CHOOSERWIDGET (ctpanel->cputype_widget), cputype);
|
||||
|
||||
}
|
||||
#ifdef FPUEMU
|
||||
if (fpu != ctpanel->fpuenabled) {
|
||||
ctpanel->fpuenabled = fpu;
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ctpanel->fpuenabled_widget), fpu);
|
||||
}
|
||||
#endif
|
||||
update_state (ctpanel);
|
||||
update_state_cpu (ctpanel);
|
||||
}
|
||||
|
||||
guint cputypepanel_get_cpulevel (CpuTypePanel *ctpanel)
|
||||
@ -253,15 +305,3 @@ void cputypepanel_set_addr24bit (CpuTypePanel *ctpanel, guint addr24bit)
|
||||
(ctpanel->addr24bit_widget),
|
||||
addr24bit);
|
||||
}
|
||||
|
||||
void cputypepanel_set_compatible (CpuTypePanel *ctpanel, gboolean compatible)
|
||||
{
|
||||
chooserwidget_set_choice (CHOOSERWIDGET (ctpanel->accuracy_widget),
|
||||
compatible ? 1 : 0);
|
||||
}
|
||||
|
||||
void cputypepanel_set_cycleexact (CpuTypePanel *ctpanel, gboolean cycleexact)
|
||||
{
|
||||
chooserwidget_set_choice (CHOOSERWIDGET (ctpanel->accuracy_widget),
|
||||
cycleexact ? 2 : 0);
|
||||
}
|
||||
|
@ -14,21 +14,39 @@ extern "C" {
|
||||
#define CPUTYPEPANEL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, cputypepanel_get_type (), CpuTypePanelClass)
|
||||
#define IS_CPUTYPEPANEL(obj) GTK_CHECK_TYPE (obj, cputype_panel_get_type ())
|
||||
|
||||
#define FPUTYPEPANEL(obj) GTK_CHECK_CAST (obj, fputypepanel_get_type (), FpuTypePanel)
|
||||
#define FPUTYPEPANEL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, fputypepanel_get_type (), FpuTypePanelClass)
|
||||
#define IS_FPUTYPEPANEL(obj) GTK_CHECK_TYPE (obj, fputype_panel_get_type ())
|
||||
|
||||
typedef struct _CpuTypePanel CpuTypePanel;
|
||||
typedef struct _CpuTypePanelClass CpuTypePanelClass;
|
||||
|
||||
typedef struct _FpuTypePanel FpuTypePanel;
|
||||
typedef struct _FpuTypePanelClass FpuTypePanelClass;
|
||||
|
||||
struct _CpuTypePanel
|
||||
{
|
||||
GtkFrame frame;
|
||||
GtkWidget *cputype_widget;
|
||||
GtkWidget *addr24bit_widget;
|
||||
GtkWidget *fpuenabled_widget;
|
||||
GtkWidget *cpu_morecompat_widget;
|
||||
GtkWidget *mmu40_widget;
|
||||
GtkWidget *accuracy_widget;
|
||||
guint cputype;
|
||||
guint addr24bit;
|
||||
guint fpuenabled;
|
||||
guint compatible;
|
||||
guint cpumorecompat;
|
||||
guint mmu40;
|
||||
guint cycleexact;
|
||||
guint fpuenabled;
|
||||
};
|
||||
|
||||
struct _FpuTypePanel
|
||||
{
|
||||
GtkFrame frame;
|
||||
GtkWidget *fputype_widget;
|
||||
GtkWidget *fpu_morecompat_widget;
|
||||
guint fputype;
|
||||
guint fpumorecompat;
|
||||
};
|
||||
|
||||
struct _CpuTypePanelClass
|
||||
@ -38,6 +56,13 @@ struct _CpuTypePanelClass
|
||||
void (* cputypepanel) (CpuTypePanel *cputypepanel );
|
||||
};
|
||||
|
||||
struct _FpuTypePanelClass
|
||||
{
|
||||
GtkFrameClass parent_class;
|
||||
|
||||
void (* fputypepanel) (FpuTypePanel *fputypepanel );
|
||||
};
|
||||
|
||||
guint cputypepanel_get_type (void);
|
||||
GtkWidget* cputypepanel_new (void);
|
||||
void cputypepanel_set_cpulevel (CpuTypePanel *ctpanel, guint cpulevel);
|
||||
@ -46,6 +71,11 @@ guint cputypepanel_get_cpulevel (CpuTypePanel *ctpanel);
|
||||
guint cputypepanel_get_addr24bit (CpuTypePanel *ctpanel);
|
||||
void cputypepanel_set_compatible (CpuTypePanel *ctpanel, gboolean compatible);
|
||||
void cputypepanel_set_cycleexact (CpuTypePanel *ctpanel, gboolean cycleexact);
|
||||
|
||||
guint fputypepanel_get_type (void);
|
||||
GtkWidget* fputypepanel_new (void);
|
||||
void fputypepanel_set_fpulevel (FpuTypePanel *ftpanel, guint fpulevel);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
@ -6,6 +6,7 @@
|
||||
* Copyright 1997, 1998 Bernd Schmidt
|
||||
* Copyright 1998 Michael Krause
|
||||
* Copyright 2003-2007 Richard Drummond
|
||||
* Copyright 2009-2010 Mustafa TUFAN
|
||||
*
|
||||
* The Tk GUI doesn't work.
|
||||
* The X Forms Library isn't available as source, and there aren't any
|
||||
@ -83,6 +84,7 @@ static char *new_disk_string[4];
|
||||
static GtkWidget *power_led;
|
||||
|
||||
static GtkWidget *ctpanel;
|
||||
static GtkWidget *ftpanel;
|
||||
static GtkWidget *cspanel;
|
||||
static GtkWidget *chipsettype_panel;
|
||||
static GtkWidget *chipsetspeed_panel;
|
||||
@ -92,6 +94,7 @@ static GtkWidget *memorypanel;
|
||||
|
||||
static GtkWidget *sound_widget[4], *sound_ch_widget[3], *sound_in_widget[3], *sound_fl_widget[5];
|
||||
static GtkWidget *drvspeed_widget[5];
|
||||
static GtkWidget *cpu_widget[6], *fpu_widget[4];
|
||||
|
||||
#ifdef JIT
|
||||
static GtkWidget *jit_page;
|
||||
@ -216,7 +219,6 @@ static void handle_message_box_request (smp_comm_pipe *msg_pipe);
|
||||
static GtkWidget *make_message_box (const gchar *title, const gchar *message, int modal, uae_sem_t *sem);
|
||||
void on_message_box_quit (GtkWidget *w, gpointer user_data);
|
||||
|
||||
|
||||
static void uae_pause (void)
|
||||
{
|
||||
write_comm_pipe_int (&from_gui_pipe, GUICMD_PAUSE , 1);
|
||||
@ -249,6 +251,7 @@ static void set_mem32_widgets_state (void)
|
||||
|
||||
static void set_cpu_state (void)
|
||||
{
|
||||
/*
|
||||
int i;
|
||||
unsigned int lvl;
|
||||
lvl = (changed_prefs.cpu_model - 68000) / 10;
|
||||
@ -258,13 +261,18 @@ static void set_cpu_state (void)
|
||||
|
||||
cputypepanel_set_cpulevel (CPUTYPEPANEL (ctpanel), lvl);
|
||||
cputypepanel_set_addr24bit (CPUTYPEPANEL (ctpanel), changed_prefs.address_space_24);
|
||||
cputypepanel_set_compatible (CPUTYPEPANEL (ctpanel), changed_prefs.cpu_compatible);
|
||||
cputypepanel_set_cycleexact (CPUTYPEPANEL (ctpanel), changed_prefs.cpu_cycle_exact);
|
||||
|
||||
cpuspeedpanel_set_cpuspeed (CPUSPEEDPANEL (cspanel), changed_prefs.m68k_speed);
|
||||
cpuspeedpanel_set_cpuidle (CPUSPEEDPANEL (cspanel), changed_prefs.cpu_idle);
|
||||
|
||||
set_mem32_widgets_state ();
|
||||
*/
|
||||
}
|
||||
|
||||
static void set_fpu_state (void)
|
||||
{
|
||||
#ifdef FPU
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
static void set_chipset_state (void)
|
||||
@ -527,6 +535,9 @@ static void set_floppy_state( void )
|
||||
static void update_state (void)
|
||||
{
|
||||
set_cpu_state ();
|
||||
#ifdef FPU
|
||||
set_fpu_state ();
|
||||
#endif
|
||||
set_joy_state ();
|
||||
set_sound_state ();
|
||||
#ifdef JIT
|
||||
@ -773,6 +784,14 @@ static void comp_changed (void)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void cpu_changed (void)
|
||||
{
|
||||
}
|
||||
|
||||
static void fpu_changed (void)
|
||||
{
|
||||
}
|
||||
|
||||
static void on_start_clicked (void)
|
||||
{
|
||||
DEBUG_LOG ("Start button clicked.\n");
|
||||
@ -1251,7 +1270,6 @@ static void on_cputype_changed (void)
|
||||
DEBUG_LOG ("called\n");
|
||||
|
||||
changed_prefs.cpu_model = mdl;
|
||||
changed_prefs.cpu_compatible = CPUTYPEPANEL (ctpanel)->compatible;
|
||||
changed_prefs.cpu_cycle_exact = CPUTYPEPANEL (ctpanel)->cycleexact;
|
||||
|
||||
set_mem32_widgets_state ();
|
||||
@ -1268,7 +1286,6 @@ static void on_addr24bit_changed (void)
|
||||
DEBUG_LOG ("called\n");
|
||||
|
||||
changed_prefs.address_space_24 = (cputypepanel_get_addr24bit (CPUTYPEPANEL (ctpanel)) != 0);
|
||||
|
||||
set_mem32_widgets_state ();
|
||||
|
||||
DEBUG_LOG ("address_space_24=%d\n", changed_prefs.address_space_24);
|
||||
@ -1308,13 +1325,18 @@ static void make_cpu_widgets (GtkWidget *vbox)
|
||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
|
||||
gtk_widget_show (ctpanel);
|
||||
|
||||
ftpanel = fputypepanel_new();
|
||||
gtk_table_attach (GTK_TABLE (table), ftpanel, 1, 4, 3, 4,
|
||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
|
||||
gtk_widget_show (ftpanel);
|
||||
|
||||
cspanel = cpuspeedpanel_new();
|
||||
gtk_table_attach (GTK_TABLE (table), cspanel, 1, 4, 3, 4,
|
||||
gtk_table_attach (GTK_TABLE (table), cspanel, 1, 4, 5, 6,
|
||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
|
||||
(GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
|
||||
gtk_widget_show (cspanel);
|
||||
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (ctpanel), "cputype-changed",
|
||||
GTK_SIGNAL_FUNC (on_cputype_changed),
|
||||
NULL);
|
||||
@ -1329,8 +1351,6 @@ static void make_cpu_widgets (GtkWidget *vbox)
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void on_chipset_changed (void)
|
||||
{
|
||||
changed_prefs.chipset_mask = CHIPSETTYPEPANEL (chipsettype_panel)->chipset_mask;
|
||||
@ -1384,6 +1404,42 @@ static void make_chipset_widgets (GtkWidget *vbox)
|
||||
gtk_signal_connect (GTK_OBJECT (chipsetspeed_panel), "immediate-blits-changed", GTK_SIGNAL_FUNC (on_immediate_blits_changed), NULL);
|
||||
}
|
||||
|
||||
static void make_cpu_widgets2 (GtkWidget *vbox)
|
||||
{
|
||||
static const char *cpu_labels[] = {
|
||||
"68000", "68010", "68020", "68030", "68040", "68060", NULL
|
||||
}, *fpu_labels[] = {
|
||||
"None", "68881", "68882", "CPU Internal", NULL
|
||||
};
|
||||
|
||||
GtkWidget *hbox = gtk_hbox_new (FALSE, 10);
|
||||
GtkWidget *frame, *newbox;
|
||||
add_empty_vbox (vbox);
|
||||
|
||||
gtk_widget_show (hbox);
|
||||
add_centered_to_vbox (vbox, hbox);
|
||||
add_empty_vbox (vbox);
|
||||
|
||||
//cpu emulation
|
||||
newbox = make_radio_group_box ("CPU", cpu_labels, cpu_widget, 0, cpu_changed);
|
||||
// gtk_widget_set_sensitive (newbox, sound_available);
|
||||
gtk_widget_show (newbox);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
|
||||
|
||||
newbox = gtk_check_button_new_with_label ("CE");
|
||||
gtk_widget_show (newbox);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
|
||||
|
||||
|
||||
gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
|
||||
|
||||
//fpu mode
|
||||
newbox = make_radio_group_box ("FPU", fpu_labels, fpu_widget, 0, fpu_changed);
|
||||
// gtk_widget_set_sensitive (newbox, sound_available);
|
||||
gtk_widget_show (newbox);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
|
||||
}
|
||||
|
||||
static void make_sound_widgets (GtkWidget *vbox)
|
||||
{
|
||||
static const char *snd_em_labels[] = {
|
||||
@ -2502,14 +2558,6 @@ void gui_message (const char *format,...)
|
||||
write_log (msg);
|
||||
}
|
||||
|
||||
void gui_notify_state (int state)
|
||||
{
|
||||
if (gui_available) {
|
||||
write_comm_pipe_int (&to_gui_pipe, GUICMD_STATE_CHANGE, 1);
|
||||
write_comm_pipe_int (&to_gui_pipe, state, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* do_message_box()
|
||||
*
|
||||
@ -2640,27 +2688,6 @@ static GtkWidget *make_message_box (const gchar *title, const gchar *message, in
|
||||
return dialog;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_open ()
|
||||
*
|
||||
* Called by the main UAE thread during start up to display the GUI.
|
||||
*/
|
||||
int gui_open (void)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
DEBUG_LOG( "Entered\n" );
|
||||
|
||||
if (!gui_available)
|
||||
result = -1;
|
||||
else {
|
||||
/* We have the technology and the will - so tell the GUI to
|
||||
* reveal itself */
|
||||
write_comm_pipe_int (&to_gui_pipe, GUICMD_SHOW, 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int gui_init (void)
|
||||
{
|
||||
uae_thread_id tid;
|
||||
|
@ -289,17 +289,6 @@ int gui_init (void)
|
||||
|
||||
static int have_rexx = 0;
|
||||
|
||||
int gui_open (void)
|
||||
{
|
||||
if (!have_rexx) {
|
||||
have_rexx = rexx_init ();
|
||||
|
||||
if (have_rexx)
|
||||
atexit (rexx_exit);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void gui_exit (void)
|
||||
@ -345,51 +334,6 @@ void gui_handle_events (void)
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void gui_notify_state (int state)
|
||||
{
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void gui_hd_led (int led)
|
||||
{
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.hd;
|
||||
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.hd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.hd)
|
||||
gui_led (5, gui_data.hd);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void gui_cd_led (int led)
|
||||
{
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.cd;
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.cd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.cd)
|
||||
gui_led (6, gui_data.cd);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void gui_fps (int fps, int idle)
|
||||
{
|
||||
gui_data.fps = fps;
|
||||
|
@ -16,15 +16,6 @@ int gui_init (void)
|
||||
{
|
||||
}
|
||||
|
||||
int gui_open (void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
void gui_notify_state (int state)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_fps (int fps, int idle)
|
||||
{
|
||||
gui_data.fps = fps;
|
||||
@ -39,14 +30,6 @@ void gui_led (int led, int on)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_hd_led (int unitnum, int led)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_cd_led (int unitnum, int led)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_filename (int num, const char *name)
|
||||
{
|
||||
}
|
||||
|
@ -321,37 +321,6 @@ void gui_fps (int fps, int idle){
|
||||
}
|
||||
void gui_flicker_led (int led, int unitnum, int status){}
|
||||
void gui_led (int led, int on){}
|
||||
void gui_hd_led (int led){
|
||||
static int resetcounter;
|
||||
int old = gui_data.hd;
|
||||
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.hd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.hd)
|
||||
gui_led (5, gui_data.hd);
|
||||
}
|
||||
|
||||
void gui_cd_led (int led){
|
||||
static int resetcounter;
|
||||
|
||||
int old = gui_data.cd;
|
||||
if (led == 0) {
|
||||
resetcounter--;
|
||||
if (resetcounter > 0)
|
||||
return;
|
||||
}
|
||||
|
||||
gui_data.cd = led;
|
||||
resetcounter = 6;
|
||||
if (old != gui_data.cd)
|
||||
gui_led (6, gui_data.cd);
|
||||
}
|
||||
|
||||
void gui_filename (int num, const char *name){}
|
||||
void gui_handle_events (void){}
|
||||
|
@ -13,22 +13,25 @@ extern void aud1_handler (void);
|
||||
extern void aud2_handler (void);
|
||||
extern void aud3_handler (void);
|
||||
|
||||
extern void AUDxDAT (int nr, uae_u16 value);
|
||||
//extern void AUDxDAT (int nr, uae_u16 value);
|
||||
//extern void AUDxDAT (int nr, uae_u16 value, uaecptr addr);
|
||||
extern void AUDxVOL (int nr, uae_u16 value);
|
||||
extern void AUDxPER (int nr, uae_u16 value);
|
||||
extern void AUDxLCH (int nr, uae_u16 value);
|
||||
extern void AUDxLCL (int nr, uae_u16 value);
|
||||
extern void AUDxLEN (int nr, uae_u16 value);
|
||||
|
||||
extern uae_u16 audio_dmal (void);
|
||||
extern void audio_state_machine (void);
|
||||
extern uaecptr audio_getpt (int nr, int reset);
|
||||
|
||||
extern int init_audio (void);
|
||||
extern void ahi_install (void);
|
||||
extern void audio_reset (void);
|
||||
extern void update_audio (void);
|
||||
extern void schedule_audio (void);
|
||||
extern void audio_evhandler (void);
|
||||
extern void audio_hsync (int);
|
||||
extern void audio_hsync (void);
|
||||
extern void audio_update_adkmasks (void);
|
||||
extern void audio_update_irq (uae_u16);
|
||||
extern void update_sound (int freq, int longframe, int linetoggle);
|
||||
extern void led_filter_audio (void);
|
||||
extern void set_audio (void);
|
||||
|
@ -110,6 +110,7 @@ extern uae_u16 INTREQR (void);
|
||||
|
||||
extern int maxhpos, maxhpos_short;
|
||||
extern int maxvpos, maxvpos_nom;
|
||||
extern int hsyncstartpos;
|
||||
extern int minfirstline, vblank_endline, numscrlines;
|
||||
extern int vblank_hz, fake_vblank_hz, vblank_skip, doublescan;
|
||||
extern frame_time_t syncbase;
|
||||
@ -167,6 +168,9 @@ extern int xbluecolor_s, xbluecolor_b, xbluecolor_m;
|
||||
#define RES_HIRES 1
|
||||
#define RES_SUPERHIRES 2
|
||||
#define RES_MAX 2
|
||||
#define VRES_NONDOUBLE 0
|
||||
#define VRES_DOUBLE 1
|
||||
#define VRES_MAX 1
|
||||
|
||||
/* calculate shift depending on resolution (replaced "decided_hires ? 4 : 8") */
|
||||
#define RES_SHIFT(res) ((res) == RES_LORES ? 8 : (res) == RES_HIRES ? 4 : 2)
|
||||
|
@ -21,10 +21,10 @@ 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 int DISK_validate_filename (const TCHAR *fname, int leave_open, bool *wrprot, uae_u32 *crc32, struct zfile **zf);
|
||||
extern void DISK_handler (void);
|
||||
extern void DISK_handler (uae_u32);
|
||||
extern void DISK_update (unsigned int hpos);
|
||||
extern void DISK_update_adkcon (unsigned int hpos, uae_u16 v);
|
||||
extern void DISK_hsync (unsigned int hpos);
|
||||
extern void DISK_hsync (void);
|
||||
extern void DISK_reset (void);
|
||||
extern int disk_getwriteprotect (const TCHAR *name);
|
||||
extern int disk_setwriteprotect (int num, const TCHAR *name, int protect);
|
||||
@ -40,10 +40,14 @@ extern int disk_prevnext_name (TCHAR *img, int dir);
|
||||
|
||||
extern void DSKLEN (uae_u16 v, unsigned int hpos);
|
||||
extern uae_u16 DSKBYTR (unsigned int hpos);
|
||||
extern void DSKDAT (uae_u16);
|
||||
extern void DSKSYNC (unsigned int, uae_u16);
|
||||
extern void DSKPTL (uae_u16);
|
||||
extern void DSKPTH (uae_u16);
|
||||
extern void DSKDAT (uae_u16);
|
||||
extern uae_u16 DSKDATR (void);
|
||||
extern uae_u16 disk_dmal (void);
|
||||
extern uaecptr disk_getpt (void);
|
||||
extern int disk_fifostatus (void);
|
||||
|
||||
extern int disk_debug_logging;
|
||||
extern int disk_debug_mode;
|
||||
|
@ -80,7 +80,7 @@ enum {
|
||||
extern struct ev eventtab[ev_max];
|
||||
extern struct ev2 eventtab2[ev2_max];
|
||||
|
||||
extern void event2_newevent(int, evt);
|
||||
extern void event2_newevent (int, evt, uae_u32);
|
||||
extern void event2_newevent2 (evt, uae_u32, evfunc2);
|
||||
extern void event2_remevent (int);
|
||||
|
||||
|
@ -15,6 +15,8 @@ extern unsigned int obtainedfreq;
|
||||
|
||||
/* Determine if we can produce any sound at all. This can be only a guess;
|
||||
* if unsure, say yes. Any call to init_sound may change the value. */
|
||||
extern int setup_sound (void);
|
||||
|
||||
extern int init_sound (void);
|
||||
extern void close_sound (void);
|
||||
|
||||
|
@ -7,7 +7,6 @@
|
||||
*/
|
||||
|
||||
extern int gui_init (void);
|
||||
extern int gui_open (void);
|
||||
extern int gui_update (void);
|
||||
extern void gui_exit (void);
|
||||
extern void gui_led (int, int);
|
||||
@ -18,12 +17,9 @@ extern void gui_changesettings (void);
|
||||
extern void gui_lock (void);
|
||||
extern void gui_unlock (void);
|
||||
extern void gui_flicker_led (int, int, int);
|
||||
extern void gui_hd_led (int, int);
|
||||
extern void gui_cd_led (int, int);
|
||||
extern void gui_disk_image_change (int, const TCHAR *);
|
||||
extern unsigned int gui_ledstate;
|
||||
extern void gui_display (int shortcut);
|
||||
extern void gui_notify_state (int state);
|
||||
|
||||
extern bool no_gui, quit_to_gui;
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
#define UAEMAJOR 2
|
||||
#define UAEMINOR 2
|
||||
#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 } KbdLang;
|
||||
|
||||
@ -191,8 +191,9 @@ struct uae_prefs {
|
||||
int gfx_refreshrate;
|
||||
int gfx_avsync, gfx_pvsync;
|
||||
int gfx_resolution;
|
||||
int gfx_vresolution;
|
||||
int gfx_lores_mode;
|
||||
int gfx_linedbl;
|
||||
int gfx_scanlines;
|
||||
int gfx_afullscreen, gfx_pfullscreen;
|
||||
int gfx_xcenter, gfx_ycenter;
|
||||
int gfx_xcenter_pos, gfx_ycenter_pos;
|
||||
|
@ -18,7 +18,7 @@
|
||||
|
||||
#define UAEMAJOR 2
|
||||
#define UAEMINOR 2
|
||||
#define UAESUBREV 0
|
||||
#define UAESUBREV 1
|
||||
|
||||
#define UAEVERSION (256*65536L*UAEMAJOR + 65536L*UAEMINOR + UAESUBREV)
|
||||
|
||||
|
@ -775,6 +775,8 @@ void do_leave_program (void)
|
||||
|
||||
void start_program (void)
|
||||
{
|
||||
//TODO: remove here!
|
||||
gui_display (-1);
|
||||
do_start_program ();
|
||||
}
|
||||
|
||||
|
@ -188,7 +188,7 @@ static int execscsicmd (struct IOContext *ioc, const uae_u8 *cmd_data, int cmd_l
|
||||
|
||||
DEBUG_LOG ("SCSIDEV: sending command: 0x%2x\n", cmd->scsi_Command[0]);
|
||||
|
||||
gui_cd_led (0, 1);
|
||||
gui_flicker_led (LED_CD, 0, 0);
|
||||
|
||||
error = DoIO ((struct IORequest *)ioreq);
|
||||
|
||||
@ -284,7 +284,7 @@ static int execscsicmd_direct (int unitnum, uaecptr acmd)
|
||||
|
||||
DEBUG_LOG ("SCSIDEV: error: %d actual %d\n", io_error, cmd->scsi_Actual);
|
||||
|
||||
gui_cd_led (1);
|
||||
gui_flicker_led (LED_CD, 0, 1);
|
||||
|
||||
put_long (acmd + 8, cmd->scsi_Actual);
|
||||
put_word (acmd + 18, cmd->scsi_CmdActual);
|
||||
|
@ -12,9 +12,9 @@ generated by GNU Autoconf 2.65. Invocation command line was
|
||||
|
||||
hostname = GnoStiC-dv7
|
||||
uname -m = i686
|
||||
uname -r = 2.6.32-22-generic
|
||||
uname -r = 2.6.32-23-generic
|
||||
uname -s = Linux
|
||||
uname -v = #36-Ubuntu SMP Thu Jun 3 22:02:19 UTC 2010
|
||||
uname -v = #37-Ubuntu SMP Fri Jun 11 07:54:58 UTC 2010
|
||||
|
||||
/usr/bin/uname -p = unknown
|
||||
/bin/uname -X = unknown
|
||||
@ -445,7 +445,7 @@ configure:4344: $? = 0
|
||||
configure:4344: result: yes
|
||||
configure:4350: checking for _doprnt
|
||||
configure:4350: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
|
||||
/tmp/ccRLmAmi.o: In function `main':
|
||||
/tmp/ccJt8Zal.o: In function `main':
|
||||
/home/gnostic/puaex/src/tools/conftest.c:67: undefined reference to `_doprnt'
|
||||
collect2: ld returned 1 exit status
|
||||
configure:4350: $? = 1
|
||||
@ -533,7 +533,7 @@ configure:4364: $? = 0
|
||||
configure:4364: result: yes
|
||||
configure:4364: checking for strcmpi
|
||||
configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
|
||||
/tmp/ccWAe3Gy.o: In function `main':
|
||||
/tmp/ccmv4giy.o: In function `main':
|
||||
/home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `strcmpi'
|
||||
collect2: ld returned 1 exit status
|
||||
configure:4364: $? = 1
|
||||
@ -613,7 +613,7 @@ configure: failed program was:
|
||||
configure:4364: result: no
|
||||
configure:4364: checking for stricmp
|
||||
configure:4364: gcc -o conftest -g -O2 -Wall -W -Wno-unused conftest.c >&5
|
||||
/tmp/ccd6el6G.o: In function `main':
|
||||
/tmp/cczfg0cD.o: In function `main':
|
||||
/home/gnostic/puaex/src/tools/conftest.c:69: undefined reference to `stricmp'
|
||||
collect2: ld returned 1 exit status
|
||||
configure:4364: $? = 1
|
||||
|
19
src/tui.c
19
src/tui.c
@ -36,10 +36,6 @@ void gui_led (int led, int on)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_hd_led (int unitnum, int led)
|
||||
{
|
||||
}
|
||||
|
||||
void gui_filename (int num, const char *name)
|
||||
{
|
||||
}
|
||||
@ -235,7 +231,7 @@ static void print_configuration (void)
|
||||
tui_puts (tmp);
|
||||
|
||||
tui_gotoxy (OPTION_COLUMN+7, y++);
|
||||
if (currprefs.gfx_linedbl)
|
||||
if (currprefs.gfx_vresolution)
|
||||
tui_puts ("Doubling lines, ");
|
||||
/* if (currprefs.gfx_correct_aspect)
|
||||
tui_puts ("Aspect corrected");
|
||||
@ -470,11 +466,11 @@ static void VideoOptions (void)
|
||||
currprefs.gfx_ycenter = (currprefs.gfx_ycenter + 1) % 3;
|
||||
break;
|
||||
case 7:
|
||||
currprefs.gfx_linedbl = !currprefs.gfx_linedbl;
|
||||
currprefs.gfx_vresolution = !currprefs.gfx_vresolution;
|
||||
break;
|
||||
case 8:
|
||||
// currprefs.gfx_correct_aspect = !currprefs.gfx_correct_aspect;
|
||||
break;
|
||||
/* case 8:
|
||||
currprefs.gfx_correct_aspect = !currprefs.gfx_correct_aspect;
|
||||
break;*/
|
||||
case 9:
|
||||
currprefs.gfx_framerate++;
|
||||
if (currprefs.gfx_framerate > 9)
|
||||
@ -691,11 +687,6 @@ static int do_gui (int mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gui_open (void)
|
||||
{
|
||||
return do_gui (1);
|
||||
}
|
||||
|
||||
int gui_update (void)
|
||||
{
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user