(WIP) Further updates from WinUAE
This commit is contained in:
parent
f78994df5e
commit
cb80696aa6
6 changed files with 579 additions and 342 deletions
|
@ -372,6 +372,7 @@ static void blitter_done (int hpos)
|
||||||
blitter_done_notify (hpos);
|
blitter_done_notify (hpos);
|
||||||
event2_remevent (ev2_blitter);
|
event2_remevent (ev2_blitter);
|
||||||
unset_special (SPCFLAG_BLTNASTY);
|
unset_special (SPCFLAG_BLTNASTY);
|
||||||
|
blitter_dangerous_bpl = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_INLINE void chipmem_agnus_wput2 (uaecptr addr, uae_u32 w)
|
STATIC_INLINE void chipmem_agnus_wput2 (uaecptr addr, uae_u32 w)
|
||||||
|
@ -1133,6 +1134,22 @@ void maybe_blit2 (int hack)
|
||||||
blitter_handler (0);
|
blitter_handler (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void check_is_blit_dangerous(uaecptr *bplpt, int planes, int words)
|
||||||
|
{
|
||||||
|
blitter_dangerous_bpl = 0;
|
||||||
|
if (bltstate == BLT_done || !blitter_cycle_exact)
|
||||||
|
return;
|
||||||
|
// too simple but better than nothing
|
||||||
|
for (int i = 0; i < planes; i++) {
|
||||||
|
uaecptr bpl = bplpt[i];
|
||||||
|
uaecptr dpt = bltdpt & chipmem_bank.mask;
|
||||||
|
if (dpt >= bpl - 2 * words && dpt < bpl + 2 * words) {
|
||||||
|
blitter_dangerous_bpl = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int blitnasty (void)
|
int blitnasty (void)
|
||||||
{
|
{
|
||||||
int cycles, ccnt;
|
int cycles, ccnt;
|
||||||
|
|
849
src/custom.cpp
849
src/custom.cpp
File diff suppressed because it is too large
Load diff
|
@ -21,6 +21,17 @@ int is_syncline;
|
||||||
frame_time_t vsyncmintime, vsyncmaxtime, vsyncwaittime;
|
frame_time_t vsyncmintime, vsyncmaxtime, vsyncwaittime;
|
||||||
int vsynctimebase;
|
int vsynctimebase;
|
||||||
|
|
||||||
|
static void events_fast(void)
|
||||||
|
{
|
||||||
|
cycles_do_special();
|
||||||
|
}
|
||||||
|
|
||||||
|
void events_reset_syncline(void)
|
||||||
|
{
|
||||||
|
is_syncline = 0;
|
||||||
|
events_fast();
|
||||||
|
}
|
||||||
|
|
||||||
void events_schedule(void)
|
void events_schedule(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -36,6 +47,24 @@ void events_schedule(void)
|
||||||
nextevent = currcycle + mintime;
|
nextevent = currcycle + mintime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool event_check_vsync(void)
|
||||||
|
{
|
||||||
|
/* Keep only CPU emulation running while waiting for sync point. */
|
||||||
|
if (is_syncline) {
|
||||||
|
int rpt = read_processor_time();
|
||||||
|
int v = rpt - vsyncmintime;
|
||||||
|
if (v > vsynctimebase || v < -vsynctimebase) {
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
if (v < speedup_timelimit) {
|
||||||
|
regs.pissoff = pissoff_value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
events_reset_syncline();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void do_cycles_cpu_fastest (unsigned long cycles_to_add)
|
void do_cycles_cpu_fastest (unsigned long cycles_to_add)
|
||||||
{
|
{
|
||||||
if ((regs.pissoff -= cycles_to_add) > 0)
|
if ((regs.pissoff -= cycles_to_add) > 0)
|
||||||
|
|
|
@ -26,7 +26,9 @@ extern enum blitter_states {
|
||||||
|
|
||||||
extern struct bltinfo blt_info;
|
extern struct bltinfo blt_info;
|
||||||
|
|
||||||
extern int blit_interrupt;
|
extern int blitter_nasty, blit_interrupt, blitter_dangerous_bpl;
|
||||||
|
|
||||||
|
extern void check_is_blit_dangerous(uaecptr *bplpt, int planes, int words);
|
||||||
|
|
||||||
extern uae_u16 bltsize;
|
extern uae_u16 bltsize;
|
||||||
extern uae_u16 bltcon0,bltcon1;
|
extern uae_u16 bltcon0,bltcon1;
|
||||||
|
|
|
@ -87,10 +87,7 @@ STATIC_INLINE void send_interrupt (int num)
|
||||||
INTREQ_0 (0x8000 | (1 << num));
|
INTREQ_0 (0x8000 | (1 << num));
|
||||||
}
|
}
|
||||||
extern void rethink_uae_int(void);
|
extern void rethink_uae_int(void);
|
||||||
STATIC_INLINE uae_u16 INTREQR (void)
|
extern uae_u16 INTREQR(void);
|
||||||
{
|
|
||||||
return intreq;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* maximums for statically allocated tables */
|
/* maximums for statically allocated tables */
|
||||||
#ifdef UAE_MINI
|
#ifdef UAE_MINI
|
||||||
|
@ -126,8 +123,8 @@ extern int maxhpos, maxhpos_short;
|
||||||
extern int maxvpos, maxvpos_nom, maxvpos_display;
|
extern int maxvpos, maxvpos_nom, maxvpos_display;
|
||||||
extern int hsyncstartpos, hsyncendpos;
|
extern int hsyncstartpos, hsyncendpos;
|
||||||
extern int minfirstline, vblank_endline, numscrlines;
|
extern int minfirstline, vblank_endline, numscrlines;
|
||||||
extern double vblank_hz, fake_vblank_hz;
|
extern float vblank_hz, fake_vblank_hz;
|
||||||
extern double hblank_hz;
|
extern float hblank_hz;
|
||||||
extern int vblank_skip, doublescan;
|
extern int vblank_skip, doublescan;
|
||||||
extern bool programmedmode;
|
extern bool programmedmode;
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ typedef void (*do_cycles_func)(unsigned long);
|
||||||
extern do_cycles_func do_cycles;
|
extern do_cycles_func do_cycles;
|
||||||
void do_cycles_cpu_fastest (unsigned long cycles_to_add);
|
void do_cycles_cpu_fastest (unsigned long cycles_to_add);
|
||||||
void do_cycles_cpu_norm (unsigned long cycles_to_add);
|
void do_cycles_cpu_norm (unsigned long cycles_to_add);
|
||||||
|
extern void events_reset_syncline(void);
|
||||||
|
|
||||||
typedef unsigned long int evt;
|
typedef unsigned long int evt;
|
||||||
|
|
||||||
|
@ -88,20 +89,20 @@ STATIC_INLINE void do_extra_cycles (unsigned long cycles_to_add)
|
||||||
regs.pissoff -= cycles_to_add;
|
regs.pissoff -= cycles_to_add;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_INLINE unsigned long int get_cycles (void)
|
STATIC_INLINE unsigned long int get_cycles(void)
|
||||||
{
|
{
|
||||||
return currcycle;
|
return currcycle;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_INLINE void set_cycles (unsigned long int x)
|
STATIC_INLINE void set_cycles(unsigned long int x)
|
||||||
{
|
{
|
||||||
currcycle = x;
|
currcycle = x;
|
||||||
eventtab[ev_hsync].oldcycles = x;
|
eventtab[ev_hsync].oldcycles = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_INLINE int current_hpos (void)
|
STATIC_INLINE int current_hpos(void)
|
||||||
{
|
{
|
||||||
int hp = (get_cycles () - eventtab[ev_hsync].oldcycles) / CYCLE_UNIT;
|
int hp = (get_cycles() - eventtab[ev_hsync].oldcycles) / CYCLE_UNIT;
|
||||||
return hp;
|
return hp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue