summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/atari.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/includes/atari.h')
-rw-r--r--src/mame/includes/atari.h665
1 files changed, 665 insertions, 0 deletions
diff --git a/src/mame/includes/atari.h b/src/mame/includes/atari.h
new file mode 100644
index 00000000000..98fac97c203
--- /dev/null
+++ b/src/mame/includes/atari.h
@@ -0,0 +1,665 @@
+/******************************************************************************
+
+ Atari 400/800
+
+ ANTIC video controller
+ GTIA graphics television interface adapter
+
+ Juergen Buchmueller, June 1998
+
+******************************************************************************/
+
+#ifndef ATARI_H
+#define ATARI_H
+
+/*----------- defined in machine/atari.c -----------*/
+
+typedef struct {
+ int serout_count;
+ int serout_offs;
+ UINT8 serout_buff[512];
+ UINT8 serout_chksum;
+ int serout_delay;
+
+ int serin_count;
+ int serin_offs;
+ UINT8 serin_buff[512];
+ UINT8 serin_chksum;
+ int serin_delay;
+} ATARI_FDC;
+extern ATARI_FDC atari_fdc;
+
+MACHINE_START( a400 );
+MACHINE_START( a800 );
+MACHINE_START( a600xl );
+MACHINE_START( a800xl );
+MACHINE_START( a5200 );
+
+#ifdef MESS
+DEVICE_LOAD( a800_floppy );
+
+DEVICE_LOAD( a800_cart );
+DEVICE_UNLOAD( a800_cart );
+
+DEVICE_LOAD( a800xl_cart );
+DEVICE_UNLOAD( a800xl_cart );
+
+DEVICE_LOAD( a5200_cart );
+DEVICE_UNLOAD( a5200_cart );
+#endif
+
+ READ8_HANDLER ( atari_serin_r );
+WRITE8_HANDLER ( atari_serout_w );
+void atari_interrupt_cb(int mask);
+
+void a800_handle_keyboard(void);
+void a5200_handle_keypads(void);
+
+/* video */
+
+/* Enable this to make the video code use readmem16 to retrieve data */
+/* Otherwise the RAM memory array is accessed and thus, if a display list would */
+/* point to memory mapped IO, the result is different from a real machine */
+#define ACCURATE_ANTIC_READMEM 1
+
+
+#define CYCLES_PER_LINE 114 /* total number of cpu cycles per scanline (incl. hblank) */
+#define CYCLES_REFRESH 9 /* number of cycles lost for ANTICs RAM refresh using DMA */
+#define CYCLES_HSTART 32 /* where does the ANTIC DMA fetch start */
+#define CYCLES_DLI_NMI 7 /* number of cycles until the CPU recognizes a DLI */
+#define CYCLES_HSYNC 104 /* where does the HSYNC position of a scanline start */
+
+#define VBL_END 8 /* vblank ends in this scanline */
+#define VDATA_START 11 /* video display begins in this scanline */
+#define VDATA_END 244 /* video display ends in this scanline */
+#define VBL_START 248 /* vblank starts in this scanline */
+
+/* total number of lines per frame (incl. vblank) */
+#define TOTAL_LINES_60HZ 262
+#define TOTAL_LINES_50HZ 312
+
+/* frame rates */
+#define FRAME_RATE_50HZ (double)1789790/114/TOTAL_LINES_50HZ
+#define FRAME_RATE_60HZ (double)1789790/114/TOTAL_LINES_60HZ
+
+#define HWIDTH 48 /* total characters per line */
+#define HCHARS 44 /* visible characters per line */
+#define VHEIGHT 32
+#define VCHARS (VDATA_END-VDATA_START+7)/8
+#define BUF_OFFS0 (HWIDTH-HCHARS)/2
+#define MIN_X ((HWIDTH-42)/2)*8
+#define MAX_X MIN_X+42*8-1
+#define MIN_Y VDATA_START
+#define MAX_Y VDATA_END-8-1
+
+#define PMOFFSET 32 /* # of pixels to adjust p/m hpos */
+
+#define VPAGE 0xf000 /* 4K page mask for video data src */
+#define VOFFS 0x0fff /* 4K offset mask for video data src */
+#define DPAGE 0xfc00 /* 1K page mask for display list */
+#define DOFFS 0x03ff /* 1K offset mask for display list */
+
+#define DLI_NMI 0x80 /* 10000000b bit mask for display list interrupt */
+#define VBL_NMI 0x40 /* 01000000b bit mask for vertical blank interrupt */
+
+#define ANTIC_DLI 0x80 /* 10000000b cmds with display list intr */
+#define ANTIC_LMS 0x40 /* 01000000b cmds with load memory scan */
+#define ANTIC_VSCR 0x20 /* 00100000b cmds with vertical scroll */
+#define ANTIC_HSCR 0x10 /* 00010000b cmds with horizontal scroll */
+#define ANTIC_MODE 0x0f /* 00001111b cmd mode mask */
+
+#define DMA_ANTIC 0x20 /* 00100000b ANTIC DMA enable */
+#define DMA_PM_DBLLINE 0x10 /* 00010000b double line player/missile */
+#define DMA_PLAYER 0x08 /* 00001000b player DMA enable */
+#define DMA_MISSILE 0x04 /* 00000100b missile DMA enable */
+
+#define OFS_MIS_SINGLE 3*256 /* offset missiles single line DMA */
+#define OFS_PL0_SINGLE 4*256 /* offset player 0 single line DMA */
+#define OFS_PL1_SINGLE 5*256 /* offset player 1 single line DMA */
+#define OFS_PL2_SINGLE 6*256 /* offset player 2 single line DMA */
+#define OFS_PL3_SINGLE 7*256 /* offset player 3 single line DMA */
+
+#define OFS_MIS_DOUBLE 3*128 /* offset missiles double line DMA */
+#define OFS_PL0_DOUBLE 4*128 /* offset player 0 double line DMA */
+#define OFS_PL1_DOUBLE 5*128 /* offset player 1 double line DMA */
+#define OFS_PL2_DOUBLE 6*128 /* offset player 2 double line DMA */
+#define OFS_PL3_DOUBLE 7*128 /* offset player 3 double line DMA */
+
+#define PFD 0x00 /* 00000000b playfield default color */
+
+#define PBK 0x00 /* 00000000b playfield background */
+#define PF0 0x01 /* 00000001b playfield color #0 */
+#define PF1 0x02 /* 00000010b playfield color #1 */
+#define PF2 0x04 /* 00000100b playfield color #2 */
+#define PF3 0x08 /* 00001000b playfield color #3 */
+#define PL0 0x11 /* 00010001b player #0 */
+#define PL1 0x12 /* 00010010b player #1 */
+#define PL2 0x14 /* 00010100b player #2 */
+#define PL3 0x18 /* 00011000b player #3 */
+#define MI0 0x21 /* 00100001b missile #0 */
+#define MI1 0x22 /* 00100010b missile #1 */
+#define MI2 0x24 /* 00100100b missile #2 */
+#define MI3 0x28 /* 00101000b missile #3 */
+#define T00 0x40 /* 01000000b text mode pixels 00 */
+#define P000 0x48 /* 01001000b player #0 pixels 00 */
+#define P100 0x4a /* 01001010b player #1 pixels 00 */
+#define P200 0x4c /* 01001100b player #2 pixels 00 */
+#define P300 0x4e /* 01001110b player #3 pixels 00 */
+#define P400 0x4f /* 01001111b missiles pixels 00 */
+#define T01 0x50 /* 01010000b text mode pixels 01 */
+#define P001 0x58 /* 01011000b player #0 pixels 01 */
+#define P101 0x5a /* 01011010b player #1 pixels 01 */
+#define P201 0x5c /* 01011100b player #2 pixels 01 */
+#define P301 0x5e /* 01011110b player #3 pixels 01 */
+#define P401 0x5f /* 01011111b missiles pixels 01 */
+#define T10 0x60 /* 01100000b text mode pixels 10 */
+#define P010 0x68 /* 01101000b player #0 pixels 10 */
+#define P110 0x6a /* 01101010b player #1 pixels 10 */
+#define P210 0x6c /* 01101100b player #2 pixels 10 */
+#define P310 0x6e /* 01101110b player #3 pixels 10 */
+#define P410 0x6f /* 01101111b missiles pixels 10 */
+#define T11 0x70 /* 01110000b text mode pixels 11 */
+#define P011 0x78 /* 01111000b player #0 pixels 11 */
+#define P111 0x7a /* 01111010b player #1 pixels 11 */
+#define P211 0x7c /* 01111100b player #2 pixels 11 */
+#define P311 0x7e /* 01111110b player #3 pixels 11 */
+#define P411 0x7f /* 01111111b missiles pixels 11 */
+#define G00 0x80 /* 10000000b hires gfx pixels 00 */
+#define G01 0x90 /* 10010000b hires gfx pixels 01 */
+#define G10 0xa0 /* 10100000b hires gfx pixels 10 */
+#define G11 0xb0 /* 10110000b hires gfx pixels 11 */
+#define GT1 0xc0 /* 11000000b gtia mode 1 */
+#define GT2 0xd0 /* 11010000b gtia mode 2 */
+#define GT3 0xe0 /* 11100000b gtia mode 3 */
+#define ILL 0xfe /* 11111110b illegal priority */
+#define EOR 0xff /* 11111111b EOR mode color */
+
+#define LUM 0x0f /* 00001111b luminance bits */
+#define HUE 0xf0 /* 11110000b hue bits */
+
+#define TRIGGER_VBLANK 64715
+#define TRIGGER_STEAL 64716
+#define TRIGGER_HSYNC 64717
+
+#define GTIA_MISSILE 0x01
+#define GTIA_PLAYER 0x02
+#define GTIA_TRIGGER 0x04
+
+#ifdef LSB_FIRST
+
+/* make a UINT32 from four bytes */
+#define MKD(b0,b1,b2,b3) ((b0)|((b1)<<8)|((b2)<<16)|((b3)<<24))
+
+#define BYTE0 0x000000ff
+#define BYTE1 0x0000ff00
+#define BYTE2 0x00ff0000
+#define BYTE3 0xff000000
+
+#else
+
+/* make a UINT32 from four bytes */
+#define MKD(b0,b1,b2,b3) (((b0)<<24)|((b1)<<16)|((b2)<<8)|(b3))
+
+#define BYTE0 0xff000000
+#define BYTE1 0x00ff0000
+#define BYTE2 0x0000ff00
+#define BYTE3 0x000000ff
+
+#endif
+
+/* make a qUINT16 from eight bytes */
+#define MKQ(b0,b1,b2,b3,b4,b5,b6,b7) MKD(b0,b1,b2,b3), MKD(b4,b5,b6,b7)
+
+/* make two UINT32s from 4 bytes by doubling them */
+#define MKDD(b0,b1,b2,b3) MKD(b0,b0,b1,b1), MKD(b2,b2,b3,b3)
+
+/* make a four UINT32s from 4 bytes by quadrupling them */
+#define MKQD(b0,b1,b2,b3) MKD(b0,b0,b0,b0), MKD(b1,b1,b1,b1), MKD(b2,b2,b2,b2), MKD(b3,b3,b3,b3)
+
+/*****************************************************************************
+ * If your memcpy does not expand too well if you use it with constant
+ * size_t field, you might want to define these macros somehow different.
+ * NOTE: dst is not necessarily UINT32 aligned (because of horz scrolling)!
+ *****************************************************************************/
+#define COPY4(dst,s1) *dst++ = s1
+#define COPY8(dst,s1,s2) *dst++ = s1; *dst++ = s2
+#define COPY16(dst,s1,s2,s3,s4) *dst++ = s1; *dst++ = s2; *dst++ = s3; *dst++ = s4
+
+typedef struct {
+ UINT8 antic00; /* 00 nothing */
+ UINT8 antic01; /* 01 nothing */
+ UINT8 antic02; /* 02 nothing */
+ UINT8 antic03; /* 03 nothing */
+ UINT8 antic04; /* 04 nothing */
+ UINT8 antic05; /* 05 nothing */
+ UINT8 antic06; /* 06 nothing */
+ UINT8 antic07; /* 07 nothing */
+ UINT8 antic08; /* 08 nothing */
+ UINT8 antic09; /* 09 nothing */
+ UINT8 antic0a; /* 0a nothing */
+ UINT8 vcount; /* 0b vertical (scanline) counter */
+ UINT8 penh; /* 0c light pen horizontal pos */
+ UINT8 penv; /* 0d light pen vertical pos */
+ UINT8 antic0e; /* 0e nothing */
+ UINT8 nmist; /* 0f NMI status */
+} ANTIC_R; /* read registers */
+
+typedef struct {
+ UINT8 dmactl; /* 00 write DMA control */
+ UINT8 chactl; /* 01 write character control */
+ UINT8 dlistl; /* 02 display list low */
+ UINT8 dlisth; /* 03 display list high */
+ UINT8 hscrol; /* 04 horz scroll */
+ UINT8 vscrol; /* 05 vert scroll */
+ UINT8 pmbasl; /* 06 player/missile base addr low */
+ UINT8 pmbash; /* 07 player/missile base addr high */
+ UINT8 chbasl; /* 08 character generator base addr low */
+ UINT8 chbash; /* 09 character generator base addr high */
+ UINT8 wsync; /* 0a wait for hsync */
+ UINT8 antic0b; /* 0b nothing */
+ UINT8 antic0c; /* 0c nothing */
+ UINT8 antic0d; /* 0d nothing */
+ UINT8 nmien; /* 0e NMI enable */
+ UINT8 nmires; /* 0f NMI reset */
+} ANTIC_W; /* write registers */
+
+/* per scanline buffer for video data (and optimization variables) */
+typedef struct {
+ UINT32 cmd; /* antic command for this scanline */
+ UINT16 data[HWIDTH]; /* graphics data buffer (text through chargen) */
+} VIDEO;
+
+typedef struct {
+ UINT32 cmd; /* currently executed display list command */
+ UINT32 steal_cycles; /* steal how many cpu cycles for this line ? */
+ UINT32 vscrol_old; /* old vscrol value */
+ UINT32 hscrol_old; /* old hscrol value */
+ INT32 modelines; /* number of lines for current ANTIC mode */
+ UINT32 chbase; /* character mode source base */
+ UINT32 chand; /* character and mask (chactl) */
+ UINT32 chxor; /* character xor mask (chactl) */
+ UINT32 scanline; /* current scan line */
+ UINT32 pfwidth; /* playfield width */
+ UINT32 dpage; /* display list address page */
+ UINT32 doffs; /* display list offset into page */
+ UINT32 vpage; /* video data source page */
+ UINT32 voffs; /* video data offset into page */
+ UINT32 pmbase_s; /* p/m graphics single line source base */
+ UINT32 pmbase_d; /* p/m graphics double line source base */
+ ANTIC_R r; /* ANTIC read registers */
+ ANTIC_W w; /* ANTIC write registers */
+ UINT8 cclock[256+32]; /* color clock buffer filled by ANTIC */
+ UINT8 pmbits[256+32]; /* player missile buffer filled by GTIA */
+ UINT16 color_lookup[256]; /* color lookup table */
+ UINT8 *prio_table[64]; /* player/missile priority tables */
+ VIDEO *video[312]; /* video buffer */
+ UINT32 *cclk_expand; /* shared buffer for the following: */
+ UINT32 *pf_21; /* 1cclk 2 color txt 2,3 */
+ UINT32 *pf_x10b; /* 1cclk 4 color txt 4,5, gfx D,E */
+ UINT32 *pf_3210b2; /* 1cclk 5 color txt 6,7, gfx 9,B,C */
+ UINT32 *pf_210b4; /* 4cclk 4 color gfx 8 */
+ UINT32 *pf_210b2; /* 2cclk 4 color gfx A */
+ UINT32 *pf_1b; /* 1cclk hires gfx F */
+ UINT32 *pf_gtia1; /* 1cclk gtia mode 1 */
+ UINT32 *pf_gtia2; /* 1cclk gtia mode 2 */
+ UINT32 *pf_gtia3; /* 1cclk gtia mode 3 */
+ UINT8 *used_colors; /* shared buffer for the following: */
+ UINT8 *uc_21; /* used colors for txt (2,3) */
+ UINT8 *uc_x10b; /* used colors for txt 4,5, gfx D,E */
+ UINT8 *uc_3210b2; /* used colors for txt 6,7, gfx 9,B,C */
+ UINT8 *uc_210b4; /* used colors for gfx 8 */
+ UINT8 *uc_210b2; /* used colors for gfx A */
+ UINT8 *uc_1b; /* used colors for gfx F */
+ UINT8 *uc_g1; /* used colors for gfx GTIA 1 */
+ UINT8 *uc_g2; /* used colors for gfx GTIA 2 */
+ UINT8 *uc_g3; /* used colors for gfx GTIA 3 */
+} ANTIC;
+
+#if ACCURATE_ANTIC_READMEM
+#define RDANTIC() cpunum_read_byte(0, antic.dpage+antic.doffs)
+#define RDVIDEO(o) cpunum_read_byte(0, antic.vpage+((antic.voffs+(o))&VOFFS))
+#define RDCHGEN(o) cpunum_read_byte(0, antic.chbase+(o))
+#define RDPMGFXS(o) cpunum_read_byte(0, antic.pmbase_s+(o)+(antic.scanline>>1))
+#define RDPMGFXD(o) cpunum_read_byte(0, antic.pmbase_d+(o)+antic.scanline)
+#else
+#define RDANTIC() (memory_region(REGION_CPU1))[antic.dpage+antic.doffs]
+#define RDVIDEO(o) (memory_region(REGION_CPU1))[antic.vpage+((antic.voffs+(o))&VOFFS)]
+#define RDCHGEN(o) (memory_region(REGION_CPU1))[antic.chbase+(o)]
+#define RDPMGFXS(o) (memory_region(REGION_CPU1))[antic.pmbase_s+(o)+(antic.scanline>>1)]
+#define RDPMGFXD(o) (memory_region(REGION_CPU1))[antic.pmbase_d+(o)+antic.scanline]
+#endif
+
+#define PREPARE() \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]
+
+#define PREPARE_TXT2(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ { \
+ UINT16 ch = RDVIDEO(i) << 3; \
+ if( ch & 0x400 ) \
+ { \
+ ch = RDCHGEN((ch & 0x3f8) + antic.w.chbasl); \
+ ch = (ch ^ antic.chxor) & antic.chand; \
+ } \
+ else \
+ { \
+ ch = RDCHGEN(ch + antic.w.chbasl); \
+ } \
+ video->data[i] = ch; \
+ }
+
+#define PREPARE_TXT3(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ { \
+ UINT16 ch = RDVIDEO(i) << 3; \
+ if( ch & 0x400 ) \
+ { \
+ ch &= 0x3f8; \
+ if( (ch & 0x300) == 0x300 ) \
+ { \
+ if (antic.w.chbasl < 2) /* first two lines empty */ \
+ ch = 0x00; \
+ else /* lines 2..7 are standard, 8&9 are 0&1 */ \
+ ch = RDCHGEN(ch + (antic.w.chbasl & 7)); \
+ } \
+ else \
+ { \
+ if (antic.w.chbasl > 7) /* last two lines empty */ \
+ ch = 0x00; \
+ else /* lines 0..7 are standard */ \
+ ch = RDCHGEN(ch + antic.w.chbasl); \
+ } \
+ ch = (ch ^ antic.chxor) & antic.chand; \
+ } \
+ else \
+ { \
+ if( (ch & 0x300) == 0x300 ) \
+ { \
+ if (antic.w.chbasl < 2) /* first two lines empty */ \
+ ch = 0x00; \
+ else /* lines 2..7 are standard, 8&9 are 0&1 */ \
+ ch = RDCHGEN(ch + (antic.w.chbasl & 7)); \
+ } \
+ else \
+ { \
+ if (antic.w.chbasl > 7) /* last two lines empty */ \
+ ch = 0x00; \
+ else /* lines 0..7 are standard */ \
+ ch = RDCHGEN(ch + antic.w.chbasl); \
+ } \
+ } \
+ video->data[i] = ch; \
+ }
+
+#define PREPARE_TXT45(width,shift) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ { \
+ UINT16 ch = RDVIDEO(i) << 3; \
+ ch = ((ch>>2)&0x100)|RDCHGEN((ch&0x3f8)+(antic.w.chbasl>>shift)); \
+ video->data[i] = ch; \
+ }
+
+
+#define PREPARE_TXT67(width,shift) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ { \
+ UINT16 ch = RDVIDEO(i) << 3; \
+ ch = (ch&0x600)|(RDCHGEN((ch&0x1f8)+(antic.w.chbasl>>shift))<<1); \
+ video->data[i] = ch; \
+ }
+
+#define PREPARE_GFX8(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i) << 2
+
+#define PREPARE_GFX9BC(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i) << 1
+
+#define PREPARE_GFXA(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i) << 1
+
+#define PREPARE_GFXDE(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i)
+
+#define PREPARE_GFXF(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i)
+
+#define PREPARE_GFXG1(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i)
+
+#define PREPARE_GFXG2(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i)
+
+#define PREPARE_GFXG3(width) \
+ UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ int i; \
+ for( i = 0; i < width; i++ ) \
+ video->data[i] = RDVIDEO(i)
+
+/******************************************************************
+ * common end of a single antic/gtia mode emulation function
+ ******************************************************************/
+#define POST() \
+ --antic.modelines
+
+#define POST_GFX(width) \
+ antic.steal_cycles += width; \
+ if( --antic.modelines == 0 ) \
+ antic.voffs = (antic.voffs + width) & VOFFS
+
+#define POST_TXT(width) \
+ antic.steal_cycles += width; \
+ if( --antic.modelines == 0 ) \
+ antic.voffs = (antic.voffs + width) & VOFFS; \
+ else \
+ if( antic.w.chactl & 4 ) \
+ antic.w.chbasl--; \
+ else \
+ antic.w.chbasl++
+
+/* erase a number of color clocks to background color PBK */
+#define ERASE4 { \
+ *dst++ = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ *dst++ = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ *dst++ = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ *dst++ = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ }
+
+#define ZAP48() \
+ dst = (UINT32 *)&antic.cclock[PMOFFSET]; \
+ dst[ 0] = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ dst[ 1] = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ dst[ 2] = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ dst[45] = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ dst[46] = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK; \
+ dst[47] = (PBK << 24) | (PBK << 16) | (PBK << 8) | PBK
+
+#define ERASE8 \
+ ERASE4; \
+ ERASE4
+
+#define REP08(FUNC) \
+ ERASE8; \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ ERASE8
+
+#define REP10(FUNC) \
+ ERASE4; \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); \
+ ERASE4
+
+#define REP12(FUNC) \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11)
+
+#define REP16(FUNC) \
+ ERASE8; \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11); \
+ FUNC(12); FUNC(13); FUNC(14); FUNC(15); \
+ ERASE8
+
+#define REP20(FUNC) \
+ ERASE4; \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11); \
+ FUNC(12); FUNC(13); FUNC(14); FUNC(15); \
+ FUNC(16); FUNC(17); FUNC(18); FUNC(19); \
+ ERASE4
+
+#define REP24(FUNC) \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11); \
+ FUNC(12); FUNC(13); FUNC(14); FUNC(15); \
+ FUNC(16); FUNC(17); FUNC(18); FUNC(19); \
+ FUNC(20); FUNC(21); FUNC(22); FUNC(23)
+
+#define REP32(FUNC) \
+ ERASE8; \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11); \
+ FUNC(12); FUNC(13); FUNC(14); FUNC(15); \
+ FUNC(16); FUNC(17); FUNC(18); FUNC(19); \
+ FUNC(20); FUNC(21); FUNC(22); FUNC(23); \
+ FUNC(24); FUNC(25); FUNC(26); FUNC(27); \
+ FUNC(28); FUNC(29); FUNC(30); FUNC(31); \
+ ERASE8
+
+#define REP40(FUNC) \
+ ERASE4; \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11); \
+ FUNC(12); FUNC(13); FUNC(14); FUNC(15); \
+ FUNC(16); FUNC(17); FUNC(18); FUNC(19); \
+ FUNC(20); FUNC(21); FUNC(22); FUNC(23); \
+ FUNC(24); FUNC(25); FUNC(26); FUNC(27); \
+ FUNC(28); FUNC(29); FUNC(30); FUNC(31); \
+ FUNC(32); FUNC(33); FUNC(34); FUNC(35); \
+ FUNC(36); FUNC(37); FUNC(38); FUNC(39); \
+ ERASE4
+
+#define REP48(FUNC) \
+ FUNC( 0); FUNC( 1); FUNC( 2); FUNC( 3); \
+ FUNC( 4); FUNC( 5); FUNC( 6); FUNC( 7); \
+ FUNC( 8); FUNC( 9); FUNC(10); FUNC(11); \
+ FUNC(12); FUNC(13); FUNC(14); FUNC(15); \
+ FUNC(16); FUNC(17); FUNC(18); FUNC(19); \
+ FUNC(20); FUNC(21); FUNC(22); FUNC(23); \
+ FUNC(24); FUNC(25); FUNC(26); FUNC(27); \
+ FUNC(28); FUNC(29); FUNC(30); FUNC(31); \
+ FUNC(32); FUNC(33); FUNC(34); FUNC(35); \
+ FUNC(36); FUNC(37); FUNC(38); FUNC(39); \
+ FUNC(40); FUNC(41); FUNC(42); FUNC(43); \
+ FUNC(44); FUNC(45); FUNC(46); FUNC(47);
+
+typedef void (*renderer_function)(VIDEO *video);
+
+/*----------- defined in video/antic.c -----------*/
+
+extern ANTIC antic;
+
+void antic_reset(void);
+
+ READ8_HANDLER ( atari_antic_r );
+WRITE8_HANDLER ( atari_antic_w );
+
+void antic_mode_0_xx(VIDEO *video);
+void antic_mode_2_32(VIDEO *video);
+void antic_mode_2_40(VIDEO *video);
+void antic_mode_2_48(VIDEO *video);
+void antic_mode_3_32(VIDEO *video);
+void antic_mode_3_40(VIDEO *video);
+void antic_mode_3_48(VIDEO *video);
+void antic_mode_4_32(VIDEO *video);
+void antic_mode_4_40(VIDEO *video);
+void antic_mode_4_48(VIDEO *video);
+void antic_mode_5_32(VIDEO *video);
+void antic_mode_5_40(VIDEO *video);
+void antic_mode_5_48(VIDEO *video);
+void antic_mode_6_32(VIDEO *video);
+void antic_mode_6_40(VIDEO *video);
+void antic_mode_6_48(VIDEO *video);
+void antic_mode_7_32(VIDEO *video);
+void antic_mode_7_40(VIDEO *video);
+void antic_mode_7_48(VIDEO *video);
+void antic_mode_8_32(VIDEO *video);
+void antic_mode_8_40(VIDEO *video);
+void antic_mode_8_48(VIDEO *video);
+void antic_mode_9_32(VIDEO *video);
+void antic_mode_9_40(VIDEO *video);
+void antic_mode_9_48(VIDEO *video);
+void antic_mode_a_32(VIDEO *video);
+void antic_mode_a_40(VIDEO *video);
+void antic_mode_a_48(VIDEO *video);
+void antic_mode_b_32(VIDEO *video);
+void antic_mode_b_40(VIDEO *video);
+void antic_mode_b_48(VIDEO *video);
+void antic_mode_c_32(VIDEO *video);
+void antic_mode_c_40(VIDEO *video);
+void antic_mode_c_48(VIDEO *video);
+void antic_mode_d_32(VIDEO *video);
+void antic_mode_d_40(VIDEO *video);
+void antic_mode_d_48(VIDEO *video);
+void antic_mode_e_32(VIDEO *video);
+void antic_mode_e_40(VIDEO *video);
+void antic_mode_e_48(VIDEO *video);
+void antic_mode_f_32(VIDEO *video);
+void antic_mode_f_40(VIDEO *video);
+void antic_mode_f_48(VIDEO *video);
+
+/*----------- defined in video/atari.c -----------*/
+
+extern char atari_frame_message[64+1];
+extern int atari_frame_counter;
+
+extern VIDEO_START( atari );
+extern VIDEO_UPDATE( atari );
+
+void a400_interrupt(void);
+void a800_interrupt(void);
+void a800xl_interrupt(void);
+void a5200_interrupt(void);
+
+/*----------- defined in drivers/maxaflex.c -----------*/
+
+int atari_input_disabled(void);
+
+#endif /* ATARI_H */
+