From ae7fa8f2ea25dbd96a062284ef77ff7b15423489 Mon Sep 17 00:00:00 2001
From: IrgendwerA8 <c.krueger.b@web.de>
Date: Fri, 24 Feb 2017 00:10:02 +0100
Subject: [PATCH 1/3] Improved display list instruction definition for more
 comfortable use within void data definition.

---
 doc/atari.sgml                   | 43 ++++++++++++++++++++
 include/_antic.h                 | 56 +++++++++++++-------------
 testcode/lib/atari/displaylist.c | 69 ++++++++++++++++++++++++++++++++
 3 files changed, 140 insertions(+), 28 deletions(-)
 create mode 100644 testcode/lib/atari/displaylist.c

diff --git a/doc/atari.sgml b/doc/atari.sgml
index a0dbe2f47..1b084324f 100644
--- a/doc/atari.sgml
+++ b/doc/atari.sgml
@@ -317,6 +317,49 @@ chip registers.
 
 </descrip><p>
 
+<sect1>Display lists<p>
+
+An major feature of the Atari graphics chip "ANTIC" is to
+process instructions for the display generation.
+cc65 supports constructing these display lists by offering defines
+for the instructions. In conjunction with the "void"-variable extension
+of cc65, display lists can be created quite comfortable:
+
+<verb>
+...
+unsigned char ScreenMemory[100];
+
+void DisplayList =
+{
+	DL_BLK8,
+	DL_BLK8,
+	DL_BLK8,
+	DL_LMS(DL_CHR20x8x2),
+	ScreenMemory,
+	DL_CHR20x8x2,
+	DL_CHR20x8x2,
+	DL_CHR20x8x2,
+	DL_BLK4,
+	DL_CHR20x8x2,
+	DL_JVB
+};
+...
+POKEW(560,(unsigned int)&amp;DisplayList);		// SDLSTL
+...
+</verb>
+
+Please inspect the <tt/_antic.h/ header file to detemine the supported
+instruction names. Modifiers on instructions can be nested without need
+for an order:
+
+<tt/DL_LMS(DL_HSCROL(DL_VSCROL(DL_DLI(DL_MAP80x4x2))))/
+
+Please mind that ANTIC has memory alignment requirements for "player
+missile graphics"-data, font data, display lists and screen memory. Creation
+of a special linker configuration with appropriate aligned segments and
+switching to that segment in the c-code is usually neccessary. A more memory
+hungry solution consists in using the "<tt/posix_memalign()/" function in
+conjunction with copying your data to the allocated memory.
 
 <sect1>Character mapping<p>
 
diff --git a/include/_antic.h b/include/_antic.h
index ab0cd9664..23a72609c 100644
--- a/include/_antic.h
+++ b/include/_antic.h
@@ -57,42 +57,42 @@ struct __antic {
 /* antic instruction set */
 
 /* absolute instructions (non mode lines) */
-#define DL_JMP  1
-#define DL_JVB  65
+#define DL_JMP  (unsigned char) 1
+#define DL_JVB  (unsigned char) 65
 
-#define DL_BLK1 0
-#define DL_BLK2 16
-#define DL_BLK3 32
-#define DL_BLK4 48
-#define DL_BLK5 64
-#define DL_BLK6 80
-#define DL_BLK7 96
-#define DL_BLK8 112
+#define DL_BLK1 (unsigned char) 0
+#define DL_BLK2 (unsigned char) 16
+#define DL_BLK3 (unsigned char) 32
+#define DL_BLK4 (unsigned char) 48
+#define DL_BLK5 (unsigned char) 64
+#define DL_BLK6 (unsigned char) 80
+#define DL_BLK7 (unsigned char) 96
+#define DL_BLK8 (unsigned char) 112
 
 /* absolute instructions (mode lines) */
-#define DL_CHR40x8x1    2       /* monochrome, 40 character & 8 scanlines per mode line (GR. 0) */
-#define DL_CHR40x10x1   3       /* monochrome, 40 character & 10 scanlines per mode line */
-#define DL_CHR40x8x4    4       /* colour, 40 character & 8 scanlines per mode line (GR. 12) */
-#define DL_CHR40x16x4   5       /* colour, 40 character & 16 scanlines per mode line (GR. 13) */
-#define DL_CHR20x8x2    6       /* colour (duochrome per character), 20 character & 8 scanlines per mode line (GR. 1) */
-#define DL_CHR20x16x2   7       /* colour (duochrome per character), 20 character & 16 scanlines per mode line (GR. 2) */
+#define DL_CHR40x8x1    (unsigned char) 2       /* monochrome, 40 character & 8 scanlines per mode line (GR. 0) */
+#define DL_CHR40x10x1   (unsigned char) 3       /* monochrome, 40 character & 10 scanlines per mode line */
+#define DL_CHR40x8x4    (unsigned char) 4       /* colour, 40 character & 8 scanlines per mode line (GR. 12) */
+#define DL_CHR40x16x4   (unsigned char) 5       /* colour, 40 character & 16 scanlines per mode line (GR. 13) */
+#define DL_CHR20x8x2    (unsigned char) 6       /* colour (duochrome per character), 20 character & 8 scanlines per mode line (GR. 1) */
+#define DL_CHR20x16x2   (unsigned char) 7       /* colour (duochrome per character), 20 character & 16 scanlines per mode line (GR. 2) */
 
-#define DL_MAP40x8x4    8       /* colour, 40 pixel & 8 scanlines per mode line (GR. 3) */
-#define DL_MAP80x4x2    9       /* 'duochrome', 80 pixel & 4 scanlines per mode line (GR.4) */
-#define DL_MAP80x4x4    10      /* colour, 80 pixel & 4 scanlines per mode line (GR.5) */
-#define DL_MAP160x2x2   11      /* 'duochrome', 160 pixel & 2 scanlines per mode line (GR.6) */
-#define DL_MAP160x1x2   12      /* 'duochrome', 160 pixel & 1 scanline per mode line (GR.14) */
-#define DL_MAP160x2x4   13      /* 4 colours, 160 pixel & 2 scanlines per mode line (GR.7) */
-#define DL_MAP160x1x4   14      /* 4 colours, 160 pixel & 1 scanline per mode line (GR.15) */
-#define DL_MAP320x1x1   15      /* monochrome, 320 pixel & 1 scanline per mode line (GR.8) */
+#define DL_MAP40x8x4    (unsigned char) 8       /* colour, 40 pixel & 8 scanlines per mode line (GR. 3) */
+#define DL_MAP80x4x2    (unsigned char) 9       /* 'duochrome', 80 pixel & 4 scanlines per mode line (GR.4) */
+#define DL_MAP80x4x4    (unsigned char) 10      /* colour, 80 pixel & 4 scanlines per mode line (GR.5) */
+#define DL_MAP160x2x2   (unsigned char) 11      /* 'duochrome', 160 pixel & 2 scanlines per mode line (GR.6) */
+#define DL_MAP160x1x2   (unsigned char) 12      /* 'duochrome', 160 pixel & 1 scanline per mode line (GR.14) */
+#define DL_MAP160x2x4   (unsigned char) 13      /* 4 colours, 160 pixel & 2 scanlines per mode line (GR.7) */
+#define DL_MAP160x1x4   (unsigned char) 14      /* 4 colours, 160 pixel & 1 scanline per mode line (GR.15) */
+#define DL_MAP320x1x1   (unsigned char) 15      /* monochrome, 320 pixel & 1 scanline per mode line (GR.8) */
 
 /* modifiers on mode lines */
-#define DL_HSCROL       16
-#define DL_VSCROL       32
-#define DL_LMS          64
+#define DL_HSCROL(x)    (unsigned char)((x) | 16)
+#define DL_VSCROL(x)    (unsigned char)((x) | 32)
+#define DL_LMS(x)       (unsigned char)((x) | 64)
 
 /* general modifier */
-#define DL_DLI          128
+#define DL_DLI(x)       (unsigned char)((x) | 128)
 
 /* End of _antic.h */
 #endif /* #ifndef __ANTIC_H */
diff --git a/testcode/lib/atari/displaylist.c b/testcode/lib/atari/displaylist.c
new file mode 100644
index 000000000..869b5bb65
--- /dev/null
+++ b/testcode/lib/atari/displaylist.c
@@ -0,0 +1,69 @@
+/*
+** testprogram for ANTIC instructions as defined in "_antic.h"
+**
+** 23-Feb-2017, Christian Krueger
+*/
+
+#include <conio.h>
+#include <atari.h>
+#include <peekpoke.h>
+#include <string.h>
+
+// code is only for testing purposes, as screen and display list are not aligned
+// and jumps not set!
+
+unsigned char DummyScreen[400];
+
+void DisplayList = {
+	DL_BLK1,
+	DL_BLK2,
+	DL_BLK3,
+	DL_BLK4,
+	DL_BLK5,
+	DL_BLK6,
+	DL_BLK7,
+	DL_DLI(DL_BLK8),
+	DL_LMS(DL_CHR40x8x1),
+	DummyScreen,
+	DL_HSCROL(DL_CHR40x10x1),
+	DL_VSCROL(DL_CHR40x8x4),
+	DL_CHR40x16x4,
+	DL_LMS(DL_HSCROL(DL_VSCROL(DL_DLI(DL_CHR20x8x2)))),
+	DummyScreen+120,
+	DL_CHR20x16x2,
+	DL_MAP40x8x4,
+	DL_MAP80x4x2,
+	DL_MAP80x4x4,
+	DL_MAP160x2x2,
+	DL_MAP160x1x2,
+	DL_MAP160x2x4,
+	DL_MAP160x1x4,
+ 	DL_MAP320x1x1, 
+	DL_JVB,
+	DL_JMP
+};
+
+unsigned char dlend = 0;
+
+
+int
+main(void)
+{
+    // unfortunately "sizeof()" doesn't work with void data
+    // (Error: Size of data type is unknown)
+    // so we trick with the adresses at front and behind...
+
+    int returnValue = (((unsigned int)&dlend-(unsigned int)&DisplayList) != 28);  // assure only one byte per instruction!
+
+    clrscr();
+    if (returnValue)
+        cputs("Test FAILED!");
+    else
+        cputs("Test passed.");
+
+    cputs("\n\rHit any key to exit...");
+    cgetc();
+
+    return returnValue;
+}
+

From f55d334435a1c1d845e1850021b23d83638cae29 Mon Sep 17 00:00:00 2001
From: Irgendwer <C.Krueger.B@web.de>
Date: Fri, 24 Feb 2017 11:19:33 +0100
Subject: [PATCH 2/3] Update atari.sgml

---
 doc/atari.sgml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/doc/atari.sgml b/doc/atari.sgml
index 1b084324f..6cbff6208 100644
--- a/doc/atari.sgml
+++ b/doc/atari.sgml
@@ -319,7 +319,7 @@ chip registers.
 
 <sect1>Display lists<p>
 
-An major feature of the Atari graphics chip "ANTIC" is to
+A major feature of the Atari graphics chip "ANTIC" is to
 process instructions for the display generation.
 cc65 supports constructing these display lists by offering defines
 for the instructions. In conjunction with the "void"-variable extension

From e5af45b913f2cf40cd234f7c249b23e8e79c0870 Mon Sep 17 00:00:00 2001
From: Irgendwer <C.Krueger.B@web.de>
Date: Fri, 24 Feb 2017 11:21:56 +0100
Subject: [PATCH 3/3] Update displaylist.c

---
 testcode/lib/atari/displaylist.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/testcode/lib/atari/displaylist.c b/testcode/lib/atari/displaylist.c
index 869b5bb65..04c599878 100644
--- a/testcode/lib/atari/displaylist.c
+++ b/testcode/lib/atari/displaylist.c
@@ -51,7 +51,7 @@ main(void)
 {
     // unfortunately "sizeof()" doesn't work with void data
     // (Error: Size of data type is unknown)
-    // so we trick with the adresses at front and behind...
+    // so we trick with the addresses at front and end...
 
     int returnValue = (((unsigned int)&dlend-(unsigned int)&DisplayList) != 28);  // assure only one byte per instruction!