summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/antic.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/antic.c')
-rw-r--r--src/mame/video/antic.c592
1 files changed, 592 insertions, 0 deletions
diff --git a/src/mame/video/antic.c b/src/mame/video/antic.c
new file mode 100644
index 00000000000..516c8b2a011
--- /dev/null
+++ b/src/mame/video/antic.c
@@ -0,0 +1,592 @@
+/******************************************************************************
+ Atari 400/800
+
+ ANTIC video controller
+
+ Juergen Buchmueller, June 1998
+******************************************************************************/
+
+#include "driver.h"
+#include "cpu/m6502/m6502.h"
+#include "includes/atari.h"
+
+#ifdef MAME_DEBUG
+#define VERBOSE 1
+#else
+#define VERBOSE 0
+#endif
+
+#if VERBOSE
+#define LOG(x) logerror x
+#else
+#define LOG(x) /* x */
+#endif
+
+ANTIC antic;
+
+/**************************************************************
+ *
+ * Reset ANTIC
+ *
+ **************************************************************/
+
+void antic_reset(void)
+{
+ /* reset the ANTIC read / write registers */
+ memset(&antic.r, 0, sizeof(antic.r));
+ memset(&antic.w, 0, sizeof(antic.w));
+ antic.r.antic00 = 0xff;
+ antic.r.antic01 = 0xff;
+ antic.r.antic02 = 0xff;
+ antic.r.antic03 = 0xff;
+ antic.r.antic04 = 0xff;
+ antic.r.antic05 = 0xff;
+ antic.r.antic06 = 0xff;
+ antic.r.antic07 = 0xff;
+ antic.r.antic08 = 0xff;
+ antic.r.antic09 = 0xff;
+ antic.r.antic0a = 0xff;
+ antic.r.penh = 0x00;
+ antic.r.penv = 0x00;
+ antic.r.antic0e = 0xff;
+ antic.r.nmist = 0x1f;
+}
+
+/**************************************************************
+ *
+ * Read ANTIC hardware registers
+ *
+ **************************************************************/
+READ8_HANDLER ( atari_antic_r )
+{
+ UINT8 data = 0xff;
+
+ switch (offset & 15)
+ {
+ case 0: /* nothing */
+ data = antic.r.antic00;
+ break;
+ case 1: /* nothing */
+ data = antic.r.antic01;
+ break;
+ case 2: /* nothing */
+ data = antic.r.antic02;
+ break;
+ case 3: /* nothing */
+ data = antic.r.antic03;
+ break;
+ case 4: /* nothing */
+ data = antic.r.antic04;
+ break;
+ case 5: /* nothing */
+ data = antic.r.antic05;
+ break;
+ case 6: /* nothing */
+ data = antic.r.antic06;
+ break;
+ case 7: /* nothing */
+ data = antic.r.antic07;
+ break;
+ case 8: /* nothing */
+ data = antic.r.antic08;
+ break;
+ case 9: /* nothing */
+ data = antic.r.antic09;
+ break;
+ case 10: /* WSYNC read */
+ cpunum_spinuntil_trigger(0, TRIGGER_HSYNC);
+ antic.w.wsync = 1;
+ data = antic.r.antic0a;
+ break;
+ case 11: /* vert counter (scanline / 2) */
+ data = antic.r.vcount = antic.scanline >> 1;
+ break;
+ case 12: /* light pen horz pos */
+ data = antic.r.penh;
+ break;
+ case 13: /* light pen vert pos */
+ data = antic.r.penv;
+ break;
+ case 14: /* NMI enable */
+ data = antic.r.antic0e;
+ break;
+ case 15: /* NMI status */
+ data = antic.r.nmist;
+ break;
+ }
+ return data;
+}
+
+/**************************************************************
+ *
+ * Write ANTIC hardware registers
+ *
+ **************************************************************/
+
+WRITE8_HANDLER ( atari_antic_w )
+{
+ int temp;
+
+ switch (offset & 15)
+ {
+ case 0:
+ if( data == antic.w.dmactl )
+ break;
+ LOG(("ANTIC 00 write DMACTL $%02X\n", data));
+ antic.w.dmactl = data;
+ switch (data & 3)
+ {
+ case 0: antic.pfwidth = 0; break;
+ case 1: antic.pfwidth = 32; break;
+ case 2: antic.pfwidth = 40; break;
+ case 3: antic.pfwidth = 48; break;
+ }
+ break;
+ case 1:
+ if( data == antic.w.chactl )
+ break;
+ LOG(("ANTIC 01 write CHACTL $%02X\n", data));
+ antic.w.chactl = data;
+ antic.chand = (data & 1) ? 0x00 : 0xff;
+ antic.chxor = (data & 2) ? 0xff : 0x00;
+ break;
+ case 2:
+ LOG(("ANTIC 02 write DLISTL $%02X\n", data));
+ antic.w.dlistl = data;
+ temp = (antic.w.dlisth << 8) + antic.w.dlistl;
+ antic.dpage = temp & DPAGE;
+ antic.doffs = temp & DOFFS;
+ break;
+ case 3:
+ LOG(("ANTIC 03 write DLISTH $%02X\n", data));
+ antic.w.dlisth = data;
+ temp = (antic.w.dlisth << 8) + antic.w.dlistl;
+ antic.dpage = temp & DPAGE;
+ antic.doffs = temp & DOFFS;
+ break;
+ case 4:
+ if( data == antic.w.hscrol )
+ break;
+ LOG(("ANTIC 04 write HSCROL $%02X\n", data));
+ antic.w.hscrol = data & 15;
+ break;
+ case 5:
+ if( data == antic.w.vscrol )
+ break;
+ LOG(("ANTIC 05 write VSCROL $%02X\n", data));
+ antic.w.vscrol = data & 15;
+ break;
+ case 6:
+ if( data == antic.w.pmbasl )
+ break;
+ LOG(("ANTIC 06 write PMBASL $%02X\n", data));
+ /* antic.w.pmbasl = data; */
+ break;
+ case 7:
+ if( data == antic.w.pmbash )
+ break;
+ LOG(("ANTIC 07 write PMBASH $%02X\n", data));
+ antic.w.pmbash = data;
+ antic.pmbase_s = (data & 0xfc) << 8;
+ antic.pmbase_d = (data & 0xf8) << 8;
+ break;
+ case 8:
+ if( data == antic.w.chbasl )
+ break;
+ LOG(("ANTIC 08 write CHBASL $%02X\n", data));
+ /* antic.w.chbasl = data; */
+ break;
+ case 9:
+ if( data == antic.w.chbash )
+ break;
+ LOG(("ANTIC 09 write CHBASH $%02X\n", data));
+ antic.w.chbash = data;
+ break;
+ case 10: /* WSYNC write */
+ LOG(("ANTIC 0A write WSYNC $%02X\n", data));
+ cpunum_spinuntil_trigger(0, TRIGGER_HSYNC);
+ antic.w.wsync = 1;
+ break;
+ case 11:
+ if( data == antic.w.antic0b )
+ break;
+ LOG(("ANTIC 0B write ?????? $%02X\n", data));
+ antic.w.antic0b = data;
+ break;
+ case 12:
+ if( data == antic.w.antic0c )
+ break;
+ LOG(("ANTIC 0C write ?????? $%02X\n", data));
+ antic.w.antic0c = data;
+ break;
+ case 13:
+ if( data == antic.w.antic0d )
+ break;
+ LOG(("ANTIC 0D write ?????? $%02X\n", data));
+ antic.w.antic0d = data;
+ break;
+ case 14:
+ if( data == antic.w.nmien )
+ break;
+ LOG(("ANTIC 0E write NMIEN $%02X\n", data));
+ antic.w.nmien = data;
+ break;
+ case 15:
+ LOG(("ANTIC 0F write NMIRES $%02X\n", data));
+ antic.r.nmist = 0x1f;
+ antic.w.nmires = data;
+ break;
+ }
+}
+
+/************* ANTIC mode 00: *********************************
+ * generate 1-8 empty scanlines
+ ***************************************************************/
+void antic_mode_0_xx(VIDEO *video)
+{
+ PREPARE();
+ memset(dst, PBK, HWIDTH*4);
+ POST();
+}
+
+/************* ANTIC mode 01: *********************************
+ * display list jump, eventually wait for vsync
+ ***************************************************************/
+
+
+/************* ANTIC mode 02: *********************************
+ * character mode 8x8:2 (32/40/48 byte per line)
+ ***************************************************************/
+#define MODE2(s) COPY4(dst, antic.pf_21[video->data[s]])
+
+void antic_mode_2_32(VIDEO *video)
+{
+ PREPARE_TXT2(32);
+ REP32(MODE2);
+ POST_TXT(32);
+}
+void antic_mode_2_40(VIDEO *video)
+{
+ PREPARE_TXT2(40);
+ REP40(MODE2);
+ POST_TXT(40);
+}
+void antic_mode_2_48(VIDEO *video)
+{
+ PREPARE_TXT2(48);
+ REP48(MODE2);
+ POST_TXT(48);
+}
+
+/************* ANTIC mode 03: *********************************
+ * character mode 8x10:2 (32/40/48 byte per line)
+ ***************************************************************/
+#define MODE3(s) COPY4(dst, antic.pf_21[video->data[s]])
+
+void antic_mode_3_32(VIDEO *video)
+{
+ PREPARE_TXT3(32);
+ REP32(MODE3);
+ POST_TXT(32);
+}
+void antic_mode_3_40(VIDEO *video)
+{
+ PREPARE_TXT3(40);
+ REP40(MODE3);
+ POST_TXT(40);
+}
+void antic_mode_3_48(VIDEO *video)
+{
+ PREPARE_TXT3(48);
+ REP48(MODE3);
+ POST_TXT(48);
+}
+
+/************* ANTIC mode 04: *********************************
+ * character mode 8x8:4 multi color (32/40/48 byte per line)
+ ***************************************************************/
+#define MODE4(s) COPY4(dst, antic.pf_x10b[video->data[s]])
+
+void antic_mode_4_32(VIDEO *video)
+{
+ PREPARE_TXT45(32,0);
+ REP32(MODE4);
+ POST_TXT(32);
+}
+void antic_mode_4_40(VIDEO *video)
+{
+ PREPARE_TXT45(40,0);
+ REP40(MODE4);
+ POST_TXT(40);
+}
+void antic_mode_4_48(VIDEO *video)
+{
+ PREPARE_TXT45(48,0);
+ REP48(MODE4);
+ POST_TXT(48);
+}
+
+/************* ANTIC mode 05: *********************************
+ * character mode 8x16:4 multi color (32/40/48 byte per line)
+ ***************************************************************/
+#define MODE5(s) COPY4(dst, antic.pf_x10b[video->data[s]])
+
+void antic_mode_5_32(VIDEO *video)
+{
+ PREPARE_TXT45(32,1);
+ REP32(MODE5);
+ POST_TXT(32);
+}
+void antic_mode_5_40(VIDEO *video)
+{
+ PREPARE_TXT45(40,1);
+ REP40(MODE5);
+ POST_TXT(40);
+}
+void antic_mode_5_48(VIDEO *video)
+{
+ PREPARE_TXT45(48,1);
+ REP48(MODE5);
+ POST_TXT(48);
+}
+
+/************* ANTIC mode 06: *********************************
+ * character mode 16x8:5 single color (16/20/24 byte per line)
+ ***************************************************************/
+#define MODE6(s) COPY8(dst, antic.pf_3210b2[video->data[s]], antic.pf_3210b2[video->data[s]+1])
+
+void antic_mode_6_32(VIDEO *video)
+{
+ PREPARE_TXT67(16,0);
+ REP16(MODE6);
+ POST_TXT(16);
+}
+void antic_mode_6_40(VIDEO *video)
+{
+ PREPARE_TXT67(20,0);
+ REP20(MODE6);
+ POST_TXT(20);
+}
+void antic_mode_6_48(VIDEO *video)
+{
+ PREPARE_TXT67(24,0);
+ REP24(MODE6);
+ POST_TXT(24);
+}
+
+/************* ANTIC mode 07: *********************************
+ * character mode 16x16:5 single color (16/20/24 byte per line)
+ ***************************************************************/
+#define MODE7(s) COPY8(dst, antic.pf_3210b2[video->data[s]], antic.pf_3210b2[video->data[s]+1])
+
+void antic_mode_7_32(VIDEO *video)
+{
+ PREPARE_TXT67(16,1);
+ REP16(MODE7);
+ POST_TXT(16);
+}
+void antic_mode_7_40(VIDEO *video)
+{
+ PREPARE_TXT67(20,1);
+ REP20(MODE7);
+ POST_TXT(20);
+}
+void antic_mode_7_48(VIDEO *video)
+{
+ PREPARE_TXT67(24,1);
+ REP24(MODE7);
+ POST_TXT(24);
+}
+
+/************* ANTIC mode 08: *********************************
+ * graphics mode 8x8:4 (8/10/12 byte per line)
+ ***************************************************************/
+#define MODE8(s) COPY16(dst, antic.pf_210b4[video->data[s]],antic.pf_210b4[video->data[s]+1],antic.pf_210b4[video->data[s]+2],antic.pf_210b4[video->data[s]+3])
+
+void antic_mode_8_32(VIDEO *video)
+{
+ PREPARE_GFX8(8);
+ REP08(MODE8);
+ POST_GFX(8);
+}
+void antic_mode_8_40(VIDEO *video)
+{
+ PREPARE_GFX8(10);
+ REP10(MODE8);
+ POST_GFX(10);
+}
+void antic_mode_8_48(VIDEO *video)
+{
+ PREPARE_GFX8(12);
+ REP12(MODE8);
+ POST_GFX(12);
+}
+
+/************* ANTIC mode 09: *********************************
+ * graphics mode 4x4:2 (8/10/12 byte per line)
+ ***************************************************************/
+#define MODE9(s) COPY8(dst, antic.pf_3210b2[video->data[s]], antic.pf_3210b2[video->data[s]+1])
+
+void antic_mode_9_32(VIDEO *video)
+{
+ PREPARE_GFX9BC(16);
+ REP16(MODE9);
+ POST_GFX(16);
+}
+void antic_mode_9_40(VIDEO *video)
+{
+ PREPARE_GFX9BC(20);
+ REP20(MODE9);
+ POST_GFX(20);
+}
+void antic_mode_9_48(VIDEO *video)
+{
+ PREPARE_GFX9BC(24);
+ REP24(MODE9);
+ POST_GFX(24);
+}
+
+/************* ANTIC mode 0A: *********************************
+ * graphics mode 4x4:4 (16/20/24 byte per line)
+ ***************************************************************/
+#define MODEA(s) COPY8(dst, antic.pf_210b2[video->data[s]], antic.pf_210b2[video->data[s]+1])
+
+void antic_mode_a_32(VIDEO *video)
+{
+ PREPARE_GFXA(16);
+ REP16(MODEA);
+ POST_GFX(16);
+}
+void antic_mode_a_40(VIDEO *video)
+{
+ PREPARE_GFXA(20);
+ REP20(MODEA);
+ POST_GFX(20);
+}
+void antic_mode_a_48(VIDEO *video)
+{
+ PREPARE_GFXA(24);
+ REP24(MODEA);
+ POST_GFX(24);
+}
+
+/************* ANTIC mode 0B: *********************************
+ * graphics mode 2x2:2 (16/20/24 byte per line)
+ ***************************************************************/
+#define MODEB(s) COPY8(dst, antic.pf_3210b2[video->data[s]], antic.pf_3210b2[video->data[s]+1])
+
+void antic_mode_b_32(VIDEO *video)
+{
+ PREPARE_GFX9BC(16);
+ REP16(MODEB);
+ POST_GFX(16);
+}
+void antic_mode_b_40(VIDEO *video)
+{
+ PREPARE_GFX9BC(20);
+ REP20(MODEB);
+ POST_GFX(20);
+}
+void antic_mode_b_48(VIDEO *video)
+{
+ PREPARE_GFX9BC(24);
+ REP24(MODEB);
+ POST_GFX(24);
+}
+
+/************* ANTIC mode 0C: *********************************
+ * graphics mode 2x1:2 (16/20/24 byte per line)
+ ***************************************************************/
+#define MODEC(s) COPY8(dst, antic.pf_3210b2[video->data[s]], antic.pf_3210b2[video->data[s]+1])
+
+void antic_mode_c_32(VIDEO *video)
+{
+ PREPARE_GFX9BC(16);
+ REP16(MODEC);
+ POST_GFX(16);
+}
+void antic_mode_c_40(VIDEO *video)
+{
+ PREPARE_GFX9BC(20);
+ REP20(MODEC);
+ POST_GFX(20);
+}
+void antic_mode_c_48(VIDEO *video)
+{
+ PREPARE_GFX9BC(24);
+ REP24(MODEC);
+ POST_GFX(24);
+}
+
+/************* ANTIC mode 0D: *********************************
+ * graphics mode 2x2:4 (32/40/48 byte per line)
+ ***************************************************************/
+#define MODED(s) COPY4(dst, antic.pf_x10b[video->data[s]])
+
+void antic_mode_d_32(VIDEO *video)
+{
+ PREPARE_GFXDE(32);
+ REP32(MODED);
+ POST_GFX(32);
+}
+void antic_mode_d_40(VIDEO *video)
+{
+ PREPARE_GFXDE(40);
+ REP40(MODED);
+ POST_GFX(40);
+}
+void antic_mode_d_48(VIDEO *video)
+{
+ PREPARE_GFXDE(48);
+ REP48(MODED);
+ POST_GFX(48);
+}
+
+/************* ANTIC mode 0E: *********************************
+ * graphics mode 2x1:4 (32/40/48 byte per line)
+ ***************************************************************/
+#define MODEE(s) COPY4(dst, antic.pf_x10b[video->data[s]])
+
+void antic_mode_e_32(VIDEO *video)
+{
+ PREPARE_GFXDE(32);
+ REP32(MODEE);
+ POST_GFX(32);
+}
+void antic_mode_e_40(VIDEO *video)
+{
+ PREPARE_GFXDE(40);
+ REP40(MODEE);
+ POST_GFX(40);
+}
+void antic_mode_e_48(VIDEO *video)
+{
+ PREPARE_GFXDE(48);
+ REP48(MODEE);
+ POST_GFX(48);
+}
+
+/************* ANTIC mode 0F: *********************************
+ * graphics mode 1x1:2 (32/40/48 byte per line)
+ ***************************************************************/
+#define MODEF(s) COPY4(dst, antic.pf_1b[video->data[s]])
+
+void antic_mode_f_32(VIDEO *video)
+{
+ PREPARE_GFXF(32);
+ REP32(MODEF);
+ POST_GFX(32);
+}
+void antic_mode_f_40(VIDEO *video)
+{
+ PREPARE_GFXF(40);
+ REP40(MODEF);
+ POST_GFX(40);
+}
+void antic_mode_f_48(VIDEO *video)
+{
+ PREPARE_GFXF(48);
+ REP48(MODEF);
+ POST_GFX(48);
+}
+