sync 2.2.1

This commit is contained in:
Mustafa 'GnoStiC' TUFAN 2010-07-07 14:51:09 +03:00
parent 8510c21178
commit 716e8cfae1
39 changed files with 1158 additions and 1065 deletions

6
README
View File

@ -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.

View File

@ -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++;

View File

@ -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;

View File

@ -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)

View File

@ -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 */

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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)
{

View File

@ -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 ();
}

View File

@ -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;

View File

@ -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]) ();

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 ();

View File

@ -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;

View File

@ -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);

View File

@ -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);
}

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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)
{
}

View File

@ -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){}

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -18,7 +18,7 @@
#define UAEMAJOR 2
#define UAEMINOR 2
#define UAESUBREV 0
#define UAESUBREV 1
#define UAEVERSION (256*65536L*UAEMAJOR + 65536L*UAEMINOR + UAESUBREV)

View File

@ -775,6 +775,8 @@ void do_leave_program (void)
void start_program (void)
{
//TODO: remove here!
gui_display (-1);
do_start_program ();
}

View File

@ -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);

View File

@ -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

View File

@ -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;