// Atari 8-bit ANTIC hardware

#if not(ATARI_8)
#warn a8_antic module should be used only on Atari computer-compatible targets
#endif

// ANTIC Display List Instruction Set
// THE DISPLAY LIST CANNOT CROSS A 1K BYTE MEMORY BOUNDARY UNLESS A JUMP INSTRUCTION IS USED!
const byte LMS     = $40          // Load memory scan 12-bit counter, $0-$fff boundary.
const byte DLI     = $80          // Display list interrupt - Interrupt CPU at beginning of last scan line.
const byte HSCROL  = $10          // Enable horizontal scrolling.
const byte VSCROL  = $20          // Enable vertical scrolling.
const byte JMP     = 1            // Jump command - followed by two bytes indicating the new instruction pointer for the display list.
const byte JVB     = $41          // Jump and wait for Vertical Blank - suspends the display list until vertical blank and then jumps.

                                  //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                  //+  BASIC  + colors + resolution + display mode + scan lines per row + screen memory + bytes per line + bits per pixel +
const byte MODE_2  = 2            //+    0    +    2   +   40x24    +     text     +        8           +     960 B     +       40       +      8         +
const byte MODE_3  = 3            //+    -    +    2   +   40x24    +     text     +       10           +     760 B     +       40       +      8         +
const byte MODE_4  = 4            //+   12    +    5   +   40x24    +     text     +        8           +     960 B     +       40       +      8         +
const byte MODE_5  = 5            //+   13    +    5   +   40x12    +     text     +       16           +     480 B     +       40       +      8         +
const byte MODE_6  = 6            //+    1    +    5   +   20x24    +     text     +        8           +     480 B     +       20       +      8         +
const byte MODE_7  = 7            //+    2    +    5   +   20x12    +     text     +       16           +     240 B     +       20       +      8         +
const byte MODE_8  = 8            //+    3    +    4   +   40x24    +   graphics   +        8           +     240 B     +       10       +      2         +
const byte MODE_9  = 9            //+    4    +    2   +   80x48    +   graphics   +        4           +     480 B     +       10       +      1         +
const byte MODE_A  = $a           //+    5    +    4   +   80x48    +   graphics   +        4           +     960 B     +       20       +      2         +
const byte MODE_B  = $b           //+    6    +    2   +  160x96    +   graphics   +        2           +    1920 B     +       20       +      1         +
const byte MODE_C  = $c           //+   14    +    2   +  160x192   +   graphics   +        1           +    3840 B     +       20       +      1         +
const byte MODE_D  = $d           //+    7    +    4   +  160x96    +   graphics   +        2           +    3840 B     +       40       +      2         +
const byte MODE_E  = $e           //+   15    +    4   +  160x192   +   graphics   +        1           +    7680 B     +       40       +      2         +
const byte MODE_F  = $f           //+8,9,10,11+    2   +  320x192   +   graphics   +        1           +    7680 B     +       40       +      1         +
                                  //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

const byte BLANK_1 = 0
const byte BLANK_2 = $10
const byte BLANK_3 = $20
const byte BLANK_4 = $30
const byte BLANK_5 = $40
const byte BLANK_6 = $50
const byte BLANK_7 = $60
const byte BLANK_8 = $70

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

volatile byte antic_dmactl @$D400 // direct memory access control
volatile byte antic_chactl @$D401 // character mode control
volatile word antic_dlist  @$D402 // display list pointer
volatile byte antic_dlistl @$D402 // display list pointer low-byte
volatile byte antic_dlisth @$D403 // display list pointer high-byte
volatile byte antic_hscrol @$D404 // horizontal scroll enable
volatile byte antic_vscrol @$D405 // vertical scroll enable
volatile byte antic_unuse0 @$D406 // unused
volatile byte antic_pmbase @$D407 // msb of p/m base address
volatile byte antic_unuse1 @$D408 // unused
volatile byte antic_chbase @$D409 // character base address
volatile byte antic_wsync  @$D40A // wait for horizontal synchronization
volatile byte antic_vcount @$D40B // vertical line counter
volatile byte antic_penh   @$D40C // light pen horizontal position
volatile byte antic_penv   @$D40D // light pen vertical position
volatile byte antic_nmien  @$D40E // non-maskable interrupt enable
volatile byte antic_nmist  @$D40F // (R) NMI status; holds cause for the NMI interrupt, corresponding to the same bits in NMIEN
volatile byte antic_nmires @$D40F // (W) Reset for NMIST; clears the interrupt request register
