1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * custom chip support
5 *
6 * (c) 1995 Bernd Schmidt
7 */
8 
9 #ifndef UAE_CUSTOM_H
10 #define UAE_CUSTOM_H
11 
12 #include "uae/types.h"
13 #ifdef FSUAE
14 #include "uae/inline.h"
15 #include "options.h"
16 #else
17 #include "machdep/rpt.h"
18 #endif
19 
20 /* These are the masks that are ORed together in the chipset_mask option.
21 * If CSMASK_AGA is set, the ECS bits are guaranteed to be set as well.  */
22 #define CSMASK_ECS_AGNUS 1
23 #define CSMASK_ECS_DENISE 2
24 #define CSMASK_AGA 4
25 #define CSMASK_MASK (CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE | CSMASK_AGA)
26 
27 #define CHIPSET_CLOCK_PAL  3546895
28 #define CHIPSET_CLOCK_NTSC 3579545
29 
30 #define MAXHPOS_ROWS 256
31 #define MAXVPOS_LINES_ECS 2048
32 #define MAXVPOS_LINES_OCS 512
33 #define HPOS_SHIFT 3
34 
35 uae_u32 get_copper_address (int copno);
36 
37 extern int custom_init (void);
38 extern void custom_prepare (void);
39 extern void custom_reset (bool hardreset, bool keyboardreset);
40 extern int intlev (void);
41 extern void dumpcustom (void);
42 
43 extern void do_disk (void);
44 extern void do_copper (void);
45 
46 extern void notice_new_xcolors (void);
47 extern void notice_screen_contents_lost (void);
48 extern void init_row_map (void);
49 extern void init_hz_normal (void);
50 extern void init_custom (void);
51 
52 extern bool picasso_requested_on;
53 extern bool picasso_on;
54 extern void set_picasso_hack_rate (int hz);
55 
56 /* Set to 1 to leave out the current frame in average frame time calculation.
57 * Useful if the debugger was active.  */
58 extern int bogusframe;
59 extern unsigned long int hsync_counter, vsync_counter;
60 
61 #ifdef FSUAE // NL
62 extern int g_uae_vsync_counter;
63 // extern int g_uae_hsync_counter;
64 #endif
65 
66 extern uae_u16 dmacon;
67 extern uae_u16 intena, intreq, intreqr;
68 
69 extern int vpos, lof_store;
70 
71 extern int find_copper_record (uaecptr, int *, int *);
72 
73 extern int n_frames;
74 
dmaen(unsigned int dmamask)75 STATIC_INLINE int dmaen (unsigned int dmamask)
76 {
77 	return (dmamask & dmacon) && (dmacon & 0x200);
78 }
79 
80 #define SPCFLAG_STOP 2
81 #define SPCFLAG_COPPER 4
82 #define SPCFLAG_INT 8
83 #define SPCFLAG_BRK 16
84 #define SPCFLAG_TRACE 64
85 #define SPCFLAG_DOTRACE 128
86 #define SPCFLAG_DOINT 256 /* arg, JIT fails without this.. */
87 #define SPCFLAG_BLTNASTY 512
88 #define SPCFLAG_EXEC 1024
89 #define SPCFLAG_ACTION_REPLAY 2048
90 #define SPCFLAG_TRAP 4096 /* enforcer-hack */
91 #define SPCFLAG_MODE_CHANGE 8192
92 #ifdef JIT
93 #define SPCFLAG_END_COMPILE 16384
94 #endif
95 #define SPCFLAG_CHECK 32768
96 
97 extern uae_u16 adkcon;
98 
99 extern unsigned int joy0dir, joy1dir;
100 extern int joy0button, joy1button;
101 
102 extern void INTREQ (uae_u16);
103 extern bool INTREQ_0 (uae_u16);
104 extern void INTREQ_f (uae_u16);
105 extern void send_interrupt (int num, int delay);
106 extern uae_u16 INTREQR (void);
107 
108 /* maximums for statically allocated tables */
109 #ifdef UAE_MINI
110 /* absolute minimums for basic A500/A1200-emulation */
111 #define MAXHPOS 227
112 #define MAXVPOS 312
113 #else
114 #define MAXHPOS 256
115 #define MAXVPOS 592
116 #endif
117 
118 /* PAL/NTSC values */
119 
120 #define MAXHPOS_PAL 227
121 #define MAXHPOS_NTSC 227
122 // short field maxvpos
123 #define MAXVPOS_PAL 312
124 #define MAXVPOS_NTSC 262
125 // following endlines = first visible line
126 #define VBLANK_ENDLINE_PAL 26
127 #define VBLANK_ENDLINE_NTSC 21
128 // line when sprite DMA fetches first control words
129 #define VBLANK_SPRITE_PAL 25
130 #define VBLANK_SPRITE_NTSC 20
131 #define VBLANK_HZ_PAL 50
132 #define VBLANK_HZ_NTSC 60
133 #define VSYNC_ENDLINE_PAL 5
134 #define VSYNC_ENDLINE_NTSC 6
135 #define EQU_ENDLINE_PAL 8
136 #define EQU_ENDLINE_NTSC 10
137 
138 extern int maxhpos, maxhpos_short;
139 extern int maxvpos, maxvpos_nom, maxvpos_display;
140 extern int hsyncstartpos, hsyncendpos;
141 extern int minfirstline, vblank_endline, numscrlines;
142 extern double vblank_hz, fake_vblank_hz;
143 extern double hblank_hz;
144 extern int vblank_skip, doublescan;
145 extern bool programmedmode;
146 
147 #define DMA_AUD0      0x0001
148 #define DMA_AUD1      0x0002
149 #define DMA_AUD2      0x0004
150 #define DMA_AUD3      0x0008
151 #define DMA_DISK      0x0010
152 #define DMA_SPRITE    0x0020
153 #define DMA_BLITTER   0x0040
154 #define DMA_COPPER    0x0080
155 #define DMA_BITPLANE  0x0100
156 #define DMA_MASTER    0x0200
157 #define DMA_BLITPRI   0x0400
158 
159 #define CYCLE_REFRESH	1
160 #define CYCLE_STROBE	2
161 #define CYCLE_MISC		3
162 #define CYCLE_SPRITE	4
163 #define CYCLE_COPPER	5
164 #define CYCLE_BLITTER	6
165 #define CYCLE_CPU		7
166 #define CYCLE_CPUNASTY	8
167 #define CYCLE_COPPER_SPECIAL 0x10
168 
169 #define CYCLE_MASK 0x0f
170 
171 extern unsigned long frametime, timeframes;
172 extern uae_u16 htotal, vtotal, beamcon0;
173 
174 /* 100 words give you 1600 horizontal pixels. Should be more than enough for
175 * superhires. Don't forget to update the definition in genp2c.c as well.
176 * needs to be larger for superhires support */
177 #ifdef CUSTOM_SIMPLE
178 #define MAX_WORDS_PER_LINE 50
179 #else
180 #define MAX_WORDS_PER_LINE 100
181 #endif
182 
183 extern uae_u32 hirestab_h[256][2];
184 extern uae_u32 lorestab_h[256][4];
185 
186 extern uae_u32 hirestab_l[256][1];
187 extern uae_u32 lorestab_l[256][2];
188 
189 /* AGA mode color lookup tables */
190 extern unsigned int xredcolors[256], xgreencolors[256], xbluecolors[256];
191 extern int xredcolor_s, xredcolor_b, xredcolor_m;
192 extern int xgreencolor_s, xgreencolor_b, xgreencolor_m;
193 extern int xbluecolor_s, xbluecolor_b, xbluecolor_m;
194 
195 #define RES_LORES 0
196 #define RES_HIRES 1
197 #define RES_SUPERHIRES 2
198 #define RES_MAX 2
199 #define VRES_NONDOUBLE 0
200 #define VRES_DOUBLE 1
201 #define VRES_QUAD 2
202 #define VRES_MAX 1
203 
204 /* calculate shift depending on resolution (replaced "decided_hires ? 4 : 8") */
205 #define RES_SHIFT(res) ((res) == RES_LORES ? 8 : (res) == RES_HIRES ? 4 : 2)
206 
207 /* get resolution from bplcon0 */
GET_RES_DENISE(uae_u16 con0)208 STATIC_INLINE int GET_RES_DENISE (uae_u16 con0)
209 {
210 	if (!(currprefs.chipset_mask & CSMASK_ECS_DENISE))
211 		con0 &= ~0x40; // SUPERHIRES
212 	return ((con0) & 0x40) ? RES_SUPERHIRES : ((con0) & 0x8000) ? RES_HIRES : RES_LORES;
213 }
GET_RES_AGNUS(uae_u16 con0)214 STATIC_INLINE int GET_RES_AGNUS (uae_u16 con0)
215 {
216 	if (!(currprefs.chipset_mask & CSMASK_ECS_AGNUS))
217 		con0 &= ~0x40; // SUPERHIRES
218 	return ((con0) & 0x40) ? RES_SUPERHIRES : ((con0) & 0x8000) ? RES_HIRES : RES_LORES;
219 }
220 /* get sprite width from FMODE */
221 #define GET_SPRITEWIDTH(FMODE) ((((FMODE) >> 2) & 3) == 3 ? 64 : (((FMODE) >> 2) & 3) == 0 ? 16 : 32)
222 /* Compute the number of bitplanes from a value written to BPLCON0  */
GET_PLANES(uae_u16 bplcon0)223 STATIC_INLINE int GET_PLANES(uae_u16 bplcon0)
224 {
225 	if ((bplcon0 & 0x0010) && (bplcon0 & 0x7000))
226 		return 0; // >8 planes = 0 planes
227 	if (bplcon0 & 0x0010)
228 		return 8; // AGA 8-planes bit
229 	return (bplcon0 >> 12) & 7; // normal planes bits
230 }
231 
232 extern void fpscounter_reset (void);
233 extern unsigned long idletime;
234 extern int lightpen_x, lightpen_y, lightpen_cx, lightpen_cy, lightpen_active, lightpen_enabled;
235 
236 struct customhack {
237 	uae_u16 v;
238 	int vpos, hpos;
239 };
240 void customhack_put (struct customhack *ch, uae_u16 v, int hpos);
241 uae_u16 customhack_get (struct customhack *ch, int hpos);
242 extern void alloc_cycle_ext (int, int);
243 extern void alloc_cycle_blitter (int hpos, uaecptr *ptr, int);
244 extern bool ispal (void);
245 extern bool isvga (void);
246 extern int current_maxvpos (void);
247 extern struct chipset_refresh *get_chipset_refresh (void);
248 extern void compute_framesync (void);
249 extern void getsyncregisters(uae_u16 *phsstrt, uae_u16 *phsstop, uae_u16 *pvsstrt, uae_u16 *pvsstop);
250 int is_bitplane_dma (int hpos);
251 
252 #endif /* UAE_CUSTOM_H */
253