1
0
mirror of https://github.com/cc65/cc65.git synced 2025-03-13 15:32:09 +00:00

Merge pull request #386 from IrgendwerA8/EasierDisplayLists

Improved display list instruction definition for more comfortable use…
This commit is contained in:
Oliver Schmidt 2017-02-24 20:37:59 +01:00 committed by GitHub
commit 4bf10d87b0
3 changed files with 140 additions and 28 deletions

View File

@ -317,6 +317,49 @@ chip registers.
</descrip><p>
<sect1>Display lists<p>
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
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>

View File

@ -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 */

View File

@ -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 addresses at front and end...
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;
}