8bitworkshop/presets/atari7800/atari7800.h

143 lines
5.1 KiB
C

// define basic types for convenience
typedef unsigned char byte; // 8-bit unsigned
typedef signed char sbyte; // 8-bit signed
typedef unsigned short word; // 16-bit signed
typedef enum { false, true } bool; // boolean
/// MEMORY MAPS
typedef struct t_TIA {
byte _00;
byte VBLANK; // input port control
byte _02_07[6];
byte INPT0; // PADDLE CONTROL INPUT 0 WO
byte INPT1; // PADDLE CONTROL INPUT 1 WO
byte INPT2; // PADDLE CONTROL INPUT 2 WO
byte INPT3; // PADDLE CONTROL INPUT 3 WO
byte INPT4; // PLAYER 0 FIRE BUTTON INPUT WO
byte INPT5; // PLAYER 1 FIRE BUTTON INPUT WO
byte _0e_14[7];
byte AUDC0; // AUDIO CONTROL CHANNEL 0 WO
byte AUDC1; // AUDIO CONTROL CHANNEL 1 WO
byte AUDF0; // AUDIO FREQUENCY CHANNEL 0 WO
byte AUDF1; // AUDIO FREQUENCY CHANNEL 1 WO
byte AUDV0; // AUDIO VOLUME CHANNEL 0 WO
byte AUDV1; // AUDIO VOLUME CHANNEL 1 WO
} t_TIA;
typedef struct t_MARIA {
byte BACKGRND ;// X '20' BACKGROUND COLOR R/W
byte P0C1 ;// X '21' PALETTE 0 - COLOR 1 R/W
byte P0C2 ;// X '22' - COLOR 2 R/W
byte P0C3 ;// X '23' - COLOR 3 R/W
byte WSYNC ;// X '24' WAIT FOR SYNC STROBE
byte P1C1 ;// X '25' PALETTE 1 - COLOR 1 R/W
byte P1C2 ;// X '26' - COLOR 2 R/W
byte P1C3 ;// X '27' - COLOR 3 R/W
byte MSTAT ;// X '28' MARIA STATUS RO
byte P2C1 ;// X '29' PALETTE 2 - COLOR 1 R/W
byte P2C2 ;// X '2A' - COLOR 2 R/W
byte P2C3 ;// X '2B' - COLOR 3 R/W
byte DPPH ;// X '2C' DISPLAY LIST LIST POINT HIGH WO
byte P3C1 ;// X '2D' PALETTE 3 - COLOR 1 R/W
byte P3C2 ;// X '2E' - COLOR 2 R/W
byte P3C3 ;// X '2F' - COLOR 3 R/W
byte DPPL ;// X '30' DISPLAY LIST LIST POINT LOW WO
byte P4C1 ;// X '31' PALETTE 4 - COLOR 1 R/W
byte P4C2 ;// X '32' - COLOR 2 R/W
byte P4C3 ;// X '33' - COLOR 3 R/W
byte CHARBASE ;// X '34' CHARACTER BASE ADDRESS WO
byte P5C1 ;// X '35' PALETTE 5 - COLOR 1 R/W
byte P5C2 ;// X '36' - COLOR 2 R/W
byte P5C3 ;// X '37' - COLOR 3 R/W
byte OFFSET ;// X '38' FOR FUTURE EXPANSION -STORE ZERO HERE R/W
byte P6C1 ;// X '39' PALETTE 6 - COLOR 1 R/W
byte P6C2 ;// X '3A' - COLOR 2 R/W
byte P6C3 ;// X '3B' - COLOR 3 R/W
byte CTRL ;// X '3C' MARIA CONTROL REGISTER WO
byte P7C1 ;// X '3D' PALETTE 7 - COLOR 1 R/W
byte P7C2 ;// X '3E' - COLOR 2 R/W
byte P7C3 ;// X '3F' - COLOR 3 R/W
} t_MARIA;
typedef struct t_P6532 {
byte SWCHA; // P0,P1 JOYSTICK DIRECTIONAL INPUT R/W
byte CTLSWA; // CONSOLE SWITCHES RO
byte SWCHB; // I/O CONTROL FOR SWCHA R/W
byte CTLSWB; // I/O CONTROL FOR SWCHB R/W
} t_P6532;
typedef struct DLLEntry {
byte offset_flags;
/*
unsigned int offset:4;
unsigned int _unused:1;
unsigned int h8:1;
unsigned int h16:1;
unsigned int dli:1;
*/
byte dl_hi;
byte dl_lo;
} DLLEntry;
typedef struct DL4Entry {
byte data_lo;
byte width_pal;
/*
unsigned int width:5;
unsigned int palette:3;
*/
byte data_hi;
byte xpos;
} DL4Entry;
typedef struct DL5Entry {
byte data_lo;
byte flags;
byte data_hi;
byte width_pal;
/*
unsigned int width:5;
unsigned int palette:3;
*/
byte xpos;
} DL5Entry;
/// CONSTANTS
#define DLL_DLI 0x80 // Display List Interrupt flag
#define DLL_H16 0x40 // Holey DMA 4k flag
#define DLL_H8 0x20 // Holey DMA 2k flag
#define DL5_WM 0x80 // Write Mode
#define DL5_DIRECT 0x40 // Direct Mode
#define DL5_INDIRECT 0x60 // Indirect Mode
#define DL_WIDTH(x) (32-(x)) // for width_pal
#define DL_PAL(x) ((x)<<5) // OR them together
#define DL_WP(w,p) (DL_WIDTH(w)|DL_PAL(p))
#define CTRL_COLORKILL 0x80
#define CTRL_DMA_ON 0x40
#define CTRL_DMA_OFF 0x60
#define CTRL_DBLBYTE 0x10
#define CTRL_BLKBORDER 0x08
#define CTRL_KANGAROO 0x04
#define CTRL_160AB 0x00
#define CTRL_320BD 0x02
#define CTRL_320AC 0x03
#define MSTAT_VBLANK 0x80
/// GLOBALS
#define TIA (*((t_TIA*) 0x00))
#define MARIA (*((t_MARIA*) 0x20))
#define P6532 (*((t_P6532*) 0x280))
/// MACROS
#define STROBE(addr) __asm__ ("sta %w", addr)
#define WSYNC() STROBE(0x24)