2017-12-04 15:49:40 +01:00
|
|
|
/*
|
|
|
|
* UAE - The Un*x Amiga Emulator
|
|
|
|
*
|
|
|
|
* custom chip support
|
|
|
|
*
|
|
|
|
* (c) 1995 Bernd Schmidt
|
|
|
|
*/
|
2016-11-30 22:25:43 +01:00
|
|
|
|
|
|
|
#ifndef UAE_CUSTOM_H
|
|
|
|
#define UAE_CUSTOM_H
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
#include "uae/types.h"
|
2016-12-09 19:18:42 +01:00
|
|
|
#include "machdep/rpt.h"
|
2016-04-24 09:45:29 +00:00
|
|
|
|
2015-05-13 18:47:23 +00:00
|
|
|
/* These are the masks that are ORed together in the chipset_mask option.
|
2017-12-04 15:49:40 +01:00
|
|
|
* If CSMASK_AGA is set, the ECS bits are guaranteed to be set as well. */
|
2015-05-13 18:47:23 +00:00
|
|
|
#define CSMASK_ECS_AGNUS 1
|
|
|
|
#define CSMASK_ECS_DENISE 2
|
|
|
|
#define CSMASK_AGA 4
|
2016-04-24 09:45:29 +00:00
|
|
|
#define CSMASK_MASK (CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE | CSMASK_AGA)
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2016-08-27 20:39:53 +02:00
|
|
|
#define CHIPSET_CLOCK_PAL 3546895
|
|
|
|
#define CHIPSET_CLOCK_NTSC 3579545
|
|
|
|
|
2016-11-30 22:25:43 +01:00
|
|
|
#define MAXHPOS_ROWS 256
|
|
|
|
#define MAXVPOS_LINES_ECS 2048
|
|
|
|
#define MAXVPOS_LINES_OCS 512
|
|
|
|
#define HPOS_SHIFT 3
|
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern void set_speedup_values(void);
|
|
|
|
extern int custom_init (void);
|
|
|
|
extern void custom_prepare (void);
|
|
|
|
extern void custom_reset (bool hardreset, bool keyboardreset);
|
|
|
|
extern int intlev (void);
|
2017-03-30 21:21:31 +02:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern void do_copper (void);
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern void notice_new_xcolors (void);
|
|
|
|
extern void init_row_map (void);
|
|
|
|
extern void init_hz_normal (void);
|
|
|
|
extern void init_custom (void);
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2017-03-30 21:21:31 +02:00
|
|
|
extern bool picasso_requested_on, picasso_requested_forced_on, picasso_on;
|
2015-05-17 07:52:43 +00:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern unsigned long int hsync_counter;
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
extern uae_u16 dmacon;
|
2017-12-04 15:49:40 +01:00
|
|
|
extern uae_u16 intreq;
|
2017-03-30 21:21:31 +02:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern int vpos;
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
STATIC_INLINE int dmaen (unsigned int dmamask)
|
2016-04-24 09:45:29 +00:00
|
|
|
{
|
2016-11-30 22:25:43 +01:00
|
|
|
return (dmamask & dmacon) && (dmacon & 0x200);
|
2016-04-24 09:45:29 +00:00
|
|
|
}
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
#define SPCFLAG_STOP 2
|
|
|
|
#define SPCFLAG_COPPER 4
|
|
|
|
#define SPCFLAG_INT 8
|
|
|
|
#define SPCFLAG_BRK 16
|
2017-03-30 21:21:31 +02:00
|
|
|
#define SPCFLAG_UAEINT 32
|
2015-05-13 18:47:23 +00:00
|
|
|
#define SPCFLAG_TRACE 64
|
|
|
|
#define SPCFLAG_DOTRACE 128
|
2015-11-16 22:32:10 +01:00
|
|
|
#define SPCFLAG_DOINT 256 /* arg, JIT fails without this.. */
|
2015-05-13 18:47:23 +00:00
|
|
|
#define SPCFLAG_BLTNASTY 512
|
|
|
|
#define SPCFLAG_EXEC 1024
|
|
|
|
#define SPCFLAG_ACTION_REPLAY 2048
|
|
|
|
#define SPCFLAG_TRAP 4096 /* enforcer-hack */
|
|
|
|
#define SPCFLAG_MODE_CHANGE 8192
|
2016-08-27 20:39:53 +02:00
|
|
|
#ifdef JIT
|
2015-05-13 18:47:23 +00:00
|
|
|
#define SPCFLAG_END_COMPILE 16384
|
2016-08-27 20:39:53 +02:00
|
|
|
#endif
|
2017-03-30 21:21:31 +02:00
|
|
|
#define SPCFLAG_CHECK 32768
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
extern uae_u16 adkcon;
|
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern void INTREQ (uae_u16);
|
|
|
|
extern bool INTREQ_0 (uae_u16);
|
|
|
|
extern void INTREQ_f (uae_u16);
|
|
|
|
STATIC_INLINE void send_interrupt (int num)
|
|
|
|
{
|
|
|
|
INTREQ_0 (0x8000 | (1 << num));
|
|
|
|
}
|
2017-03-30 21:21:31 +02:00
|
|
|
extern void rethink_uae_int(void);
|
2017-12-04 15:49:40 +01:00
|
|
|
STATIC_INLINE uae_u16 INTREQR (void)
|
|
|
|
{
|
|
|
|
return intreq;
|
|
|
|
}
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
/* maximums for statically allocated tables */
|
|
|
|
#define MAXHPOS 227
|
2017-12-04 15:49:40 +01:00
|
|
|
#define MAXVPOS 314
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
/* PAL/NTSC values */
|
|
|
|
|
|
|
|
#define MAXHPOS_PAL 227
|
|
|
|
#define MAXHPOS_NTSC 227
|
2016-11-30 22:25:43 +01:00
|
|
|
// short field maxvpos
|
2015-05-13 18:47:23 +00:00
|
|
|
#define MAXVPOS_PAL 312
|
|
|
|
#define MAXVPOS_NTSC 262
|
2016-11-30 22:25:43 +01:00
|
|
|
// following endlines = first visible line
|
2015-11-16 22:32:10 +01:00
|
|
|
#define VBLANK_ENDLINE_PAL 26
|
|
|
|
#define VBLANK_ENDLINE_NTSC 21
|
2016-11-30 22:25:43 +01:00
|
|
|
// line when sprite DMA fetches first control words
|
2015-05-13 18:47:23 +00:00
|
|
|
#define VBLANK_SPRITE_PAL 25
|
|
|
|
#define VBLANK_SPRITE_NTSC 20
|
|
|
|
#define VBLANK_HZ_PAL 50
|
|
|
|
#define VBLANK_HZ_NTSC 60
|
2016-11-30 22:25:43 +01:00
|
|
|
#define VSYNC_ENDLINE_PAL 5
|
|
|
|
#define VSYNC_ENDLINE_NTSC 6
|
2016-04-24 09:45:29 +00:00
|
|
|
#define EQU_ENDLINE_PAL 8
|
|
|
|
#define EQU_ENDLINE_NTSC 10
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern int maxhpos;
|
2016-11-30 22:25:43 +01:00
|
|
|
extern int maxvpos, maxvpos_nom, maxvpos_display;
|
2017-12-04 15:49:40 +01:00
|
|
|
extern int minfirstline;
|
|
|
|
extern float vblank_hz, fake_vblank_hz;
|
|
|
|
extern float hblank_hz;
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
#define DMA_AUD0 0x0001
|
|
|
|
#define DMA_AUD1 0x0002
|
|
|
|
#define DMA_AUD2 0x0004
|
|
|
|
#define DMA_AUD3 0x0008
|
|
|
|
#define DMA_DISK 0x0010
|
|
|
|
#define DMA_SPRITE 0x0020
|
|
|
|
#define DMA_BLITTER 0x0040
|
|
|
|
#define DMA_COPPER 0x0080
|
|
|
|
#define DMA_BITPLANE 0x0100
|
|
|
|
#define DMA_MASTER 0x0200
|
|
|
|
#define DMA_BLITPRI 0x0400
|
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern unsigned long timeframes;
|
2017-03-30 21:21:31 +02:00
|
|
|
|
2015-05-13 18:47:23 +00:00
|
|
|
/* 100 words give you 1600 horizontal pixels. Should be more than enough for
|
2017-12-04 15:49:40 +01:00
|
|
|
* superhires. Don't forget to update the definition in genp2c.c as well.
|
|
|
|
* needs to be larger for superhires support */
|
2015-05-13 18:47:23 +00:00
|
|
|
#define MAX_WORDS_PER_LINE 100
|
|
|
|
|
|
|
|
/* AGA mode color lookup tables */
|
|
|
|
extern unsigned int xredcolors[256], xgreencolors[256], xbluecolors[256];
|
|
|
|
|
|
|
|
#define RES_LORES 0
|
|
|
|
#define RES_HIRES 1
|
|
|
|
#define RES_SUPERHIRES 2
|
2015-11-16 22:32:10 +01:00
|
|
|
#define RES_MAX 2
|
2017-02-28 01:20:30 +01:00
|
|
|
#define VRES_NONDOUBLE 0
|
|
|
|
#define VRES_DOUBLE 1
|
|
|
|
#define VRES_MAX 1
|
2015-05-13 18:47:23 +00:00
|
|
|
|
|
|
|
/* get resolution from bplcon0 */
|
2017-12-04 15:49:40 +01:00
|
|
|
STATIC_INLINE int GET_RES_DENISE (uae_u16 con0)
|
2016-04-24 09:45:29 +00:00
|
|
|
{
|
2017-12-04 15:49:40 +01:00
|
|
|
if ((currprefs.chipset_mask & CSMASK_ECS_DENISE) && ((con0) & 0x40))
|
|
|
|
return RES_SUPERHIRES; // SUPERHIRES
|
|
|
|
return ((con0) & 0x8000) ? RES_HIRES : RES_LORES;
|
2016-04-24 09:45:29 +00:00
|
|
|
}
|
2017-12-04 15:49:40 +01:00
|
|
|
STATIC_INLINE int GET_RES_AGNUS (uae_u16 con0)
|
2016-04-24 09:45:29 +00:00
|
|
|
{
|
2017-12-04 15:49:40 +01:00
|
|
|
if ((currprefs.chipset_mask & CSMASK_ECS_AGNUS) && ((con0) & 0x40))
|
|
|
|
return RES_SUPERHIRES; // SUPERHIRES
|
|
|
|
return ((con0) & 0x8000) ? RES_HIRES : RES_LORES;
|
2016-04-24 09:45:29 +00:00
|
|
|
}
|
2015-05-13 18:47:23 +00:00
|
|
|
/* get sprite width from FMODE */
|
|
|
|
#define GET_SPRITEWIDTH(FMODE) ((((FMODE) >> 2) & 3) == 3 ? 64 : (((FMODE) >> 2) & 3) == 0 ? 16 : 32)
|
|
|
|
/* Compute the number of bitplanes from a value written to BPLCON0 */
|
2016-04-24 09:45:29 +00:00
|
|
|
STATIC_INLINE int GET_PLANES(uae_u16 bplcon0)
|
|
|
|
{
|
2017-12-04 15:49:40 +01:00
|
|
|
if ((bplcon0 & 0x0010) && (bplcon0 & 0x7000))
|
|
|
|
return 0; // >8 planes = 0 planes
|
|
|
|
if (bplcon0 & 0x0010)
|
|
|
|
return 8; // AGA 8-planes bit
|
|
|
|
return (bplcon0 >> 12) & 7; // normal planes bits
|
2016-04-24 09:45:29 +00:00
|
|
|
}
|
2015-05-13 18:47:23 +00:00
|
|
|
|
2017-12-04 15:49:40 +01:00
|
|
|
extern void fpscounter_reset (void);
|
2017-03-30 21:21:31 +02:00
|
|
|
extern unsigned long idletime;
|
2017-12-04 15:49:40 +01:00
|
|
|
|
|
|
|
extern int current_maxvpos (void);
|
|
|
|
extern struct chipset_refresh *get_chipset_refresh (void);
|
2017-03-30 21:21:31 +02:00
|
|
|
|
|
|
|
#endif /* UAE_CUSTOM_H */
|