1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 04:30:10 +00:00
cc65/include/_suzy.h
2024-11-09 12:01:22 +01:00

337 lines
11 KiB
C

/*****************************************************************************/
/* */
/* _suzy.h */
/* */
/* Atari Lynx, Suzy chip register hardware structures */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/* warranty. In no event will the authors be held liable for any damages */
/* arising from the use of this software. */
/* */
/* Permission is granted to anyone to use this software for any purpose, */
/* including commercial applications, and to alter it and redistribute it */
/* freely, subject to the following restrictions: */
/* */
/* 1. The origin of this software must not be misrepresented; you must not */
/* claim that you wrote the original software. If you use this software */
/* in a product, an acknowledgment in the product documentation would be */
/* appreciated but is not required. */
/* 2. Altered source versions must be plainly marked as such, and must not */
/* be misrepresented as being the original software. */
/* 3. This notice may not be removed or altered from any source */
/* distribution. */
/* */
/*****************************************************************************/
#ifndef __SUZY_H
#define __SUZY_H
/* JOYSTICK bit definitions */
enum {
JOYPAD_RIGHT = 0x10,
JOYPAD_LEFT = 0x20,
JOYPAD_DOWN = 0x40,
JOYPAD_UP = 0x80,
BUTTON_OPTION1 = 0x08,
BUTTON_OPTION2 = 0x04,
BUTTON_INNER = 0x02,
BUTTON_OUTER = 0x01
};
/* SWITCHES bit definitions */
enum {
CART1_IO_INACTIVE = 0x04,
CART0_IO_INACTIVE = 0x02,
BUTTON_PAUSE = 0x01
};
/* SPRCTL0 bit definitions */
enum {
BPP_4 = 0xC0,
BPP_3 = 0x80,
BPP_2 = 0x40,
BPP_1 = 0x00,
HFLIP = 0x20,
VFLIP = 0x10,
TYPE_SHADOW = 0x07,
TYPE_XOR = 0x06,
TYPE_NONCOLL = 0x05,
TYPE_NORMAL = 0x04,
TYPE_BOUNDARY = 0x03,
TYPE_BSHADOW = 0x02,
TYPE_BACKNONCOLL = 0x01,
TYPE_BACKGROUND = 0x00
};
/* SPRCTL1 bit definitions */
enum {
LITERAL = 0x80,
PACKED = 0x00,
ALGO3 = 0x40,
RENONE = 0x00,
REHV = 0x10,
REHVS = 0x20,
REHVST = 0x30,
REUSEPAL = 0x08,
SKIP = 0x04,
DRAWUP = 0x02,
DRAWLEFT = 0x01
};
/* Sprite control block (SCB) definitions */
/* SCB with all attributes */
typedef struct SCB_REHVST_PAL {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned int hsize;
unsigned int vsize;
unsigned int stretch;
unsigned int tilt;
unsigned char penpal[8];
} SCB_REHVST_PAL;
/* SCB without pallette */
typedef struct SCB_REHVST {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned int hsize;
unsigned int vsize;
unsigned int stretch;
unsigned int tilt;
} SCB_REHVST;
/* SCB without stretch/tilt */
typedef struct SCB_REHV {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned int hsize;
unsigned int vsize;
} SCB_REHV;
/* SCB without stretch/tilt, with penpal */
typedef struct SCB_REHV_PAL {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned int hsize;
unsigned int vsize;
unsigned char penpal[8];
} SCB_REHV_PAL;
/* SCB without tilt/penpal */
typedef struct SCB_REHVS {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned int hsize;
unsigned int vsize;
unsigned int stretch;
} SCB_REHVS;
/* SCB without tilt, with penpal */
typedef struct SCB_REHVS_PAL {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned int hsize;
unsigned int vsize;
unsigned int stretch;
unsigned char penpal[8];
} SCB_REHVS_PAL;
/* SCB without size/stretch/tilt/penpal */
typedef struct SCB_RENONE {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
} SCB_RENONE;
/* SCB without size/str/tilt, with penpal */
typedef struct SCB_RENONE_PAL {
unsigned char sprctl0;
unsigned char sprctl1;
unsigned char sprcoll;
char *next;
unsigned char *data;
signed int hpos;
signed int vpos;
unsigned char penpal[8];
} SCB_RENONE_PAL;
typedef struct PENPAL_4 {
unsigned char penpal[8];
} PENPAL_4;
typedef struct PENPAL_3 {
unsigned char penpal[4];
} PENPAL_3;
typedef struct PENPAL_2 {
unsigned char penpal[2];
} PENPAL_2;
typedef struct PENPAL_1 {
unsigned char penpal[1];
} PENPAL_1;
/* SPRGO bit definitions */
enum {
SPRITE_GO = 0x01, // sprite process start bit
EVER_ON = 0x04 // everon detector enable
};
/* SPRSYS bit definitions for write operations */
enum {
SIGNMATH = 0x80, // signed math
ACCUMULATE = 0x40, // accumulate multiplication results
NO_COLLIDE = 0x20, // do not collide with any sprites (also SPRCOLL bit definition)
VSTRETCH = 0x10, // stretch v
LEFTHAND = 0x08,
CLR_UNSAFE = 0x04, // unsafe access reset
SPRITESTOP = 0x02 // request to stop sprite process
};
/* SPRSYS bit definitions for read operations */
enum {
MATHWORKING = 0x80, // math operation in progress
MATHWARNING = 0x40, // accumulator overflow on multiple or divide by zero
MATHCARRY = 0x20, // last carry bit
VSTRETCHING = 0x10,
LEFTHANDED = 0x08,
UNSAFE_ACCESS = 0x04, // unsafe access performed
SPRITETOSTOP = 0x02, // requested to stop
SPRITEWORKING = 0x01 // sprite process is active
};
/* Suzy hardware registers */
struct __suzy {
unsigned char *tmpadr; // 0xFC00 Temporary address
unsigned int tiltacc; // 0xFC02 Tilt accumulator
unsigned int hoff; // 0xFC04 Offset to H edge of screen
unsigned int voff; // 0xFC06 Offset to V edge of screen
unsigned char *sprbase; // 0xFC08 Base address of sprite
unsigned char *colbase; // 0xFC0A Base address of collision buffer
unsigned char *vidadr; // 0xFC0C Current vid buffer address
unsigned char *coladr; // 0xFC0E Current col buffer address
unsigned char *scbnext; // 0xFC10 Address of next SCB
unsigned char *sprdline; // 0xFC12 start of sprite data line address
unsigned int hposstrt; // 0xFC14 start hpos
unsigned int vposstrt; // 0xFC16 start vpos
unsigned int sprhsize; // 0xFC18 sprite h size
unsigned int sprvsize; // 0xFC1A sprite v size
unsigned int stretchl; // 0xFC1C H size adder
unsigned int tilt; // 0xFC1E H pos adder
unsigned int sprdoff; // 0xFC20 offset to next sprite data line
unsigned int sprvpos; // 0xFC22 current vpos
unsigned int colloff; // 0xFC24 offset to collision depository
unsigned int vsizeacc; // 0xFC26 vertical size accumulator
unsigned int hsizeoff; // 0xFC28 horizontal size offset
unsigned int vsizeoff; // 0xFC2A vertical size offset
unsigned char *scbaddr; // 0xFC2C address of current SCB
unsigned char *procaddr; // 0xFC2E address of current spr data proc
unsigned char unused0[32]; // 0xFC30 - 0xFC4F reserved/unused
unsigned char unused1[2]; // 0xFC50 - 0xFC51 do not use
unsigned char mathd; // 0xFC52
unsigned char mathc; // 0xFC53
unsigned char mathb; // 0xFC54
unsigned char matha; // 0xFC55 write starts a multiply operation
unsigned char mathp; // 0xFC56
unsigned char mathn; // 0xFC57
unsigned char unused2[8]; // 0xFC58 - 0xFC5F do not use
unsigned char mathh; // 0xFC60
unsigned char mathg; // 0xFC61
unsigned char mathf; // 0xFC62
unsigned char mathe; // 0xFC63 write starts a divide operation
unsigned char unused3[8]; // 0xFC64 - 0xFC6B do not use
unsigned char mathm; // 0xFC6C
unsigned char mathl; // 0xFC6D
unsigned char mathk; // 0xFC6E
unsigned char mathj; // 0xFC6F
unsigned char unused4[16]; // 0xFC70 - 0xFC7F do not use
unsigned char sprctl0; // 0xFC80 sprite control bits 0
unsigned char sprctl1; // 0xFC81 sprite control bits 1
unsigned char sprcoll; // 0xFC82 sprite collision number
unsigned char sprinit; // 0xFC83 sprite initialization bits
unsigned char unused5[4]; // 0xFC84 - 0xFC87 unused
unsigned char suzyhrev; // 0xFC88 suzy hardware rev
unsigned char suzysrev; // 0xFC89 suzy software rev
unsigned char unused6[6]; // 0xFC8A - 0xFC8F unused
unsigned char suzybusen; // 0xFC90 suzy bus enable
unsigned char sprgo; // 0xFC91 sprite process start bit
unsigned char sprsys; // 0xFC92 sprite system control bits
unsigned char unused7[29]; // 0xFC93 - 0xFCAF unused
unsigned char joystick; // 0xFCB0 joystick and buttons
unsigned char switches; // 0xFCB1 other switches
unsigned char cart0; // 0xFCB2 cart0 r/w
unsigned char cart1; // 0xFCB3 cart1 r/w
unsigned char unused8[8]; // 0xFCB4 - 0xFCBF unused
unsigned char leds; // 0xFCC0 leds
unsigned char unused9; // 0xFCC1 unused
unsigned char parstat; // 0xFCC2 parallel port status
unsigned char pardata; // 0xFCC3 parallel port data
unsigned char howie; // 0xFCC4 howie (?)
// 0xFCC5 - 0xFCFF unused
};
/* Hardware math registers */
#define FACTOR_A *(unsigned int *) 0xFC54
#define FACTOR_B *(unsigned int *) 0xFC52
#define PRODUCT0 *(unsigned int *) 0xFC60
#define PRODUCT1 *(unsigned int *) 0xFC62
#define PRODUCT *(long *) 0xFC60
#define DIVIDEND0 *(unsigned int *) 0xFC60
#define DIVIDEND1 *(unsigned int *) 0xFC62
#define DIVIDEND *(long *) 0xFC60
#define DIVISOR *(unsigned int *) 0xFC56
#define QUOTIENT0 *(unsigned int *) 0xFC52
#define QUOTIENT1 *(unsigned int *) 0xFC54
#define QUOTIENT *(long *) 0xFC52
#define REMAINDER0 *(unsigned int *) 0xFC6C
#define REMAINDER1 *(unsigned int *) 0xFC6E
#define REMAINDER *(long *) 0xFC6C
/* Deprecated definitions */
/* MAPCTL $FFF9 */
#define HIGHSPEED 0x80
#define VECTORSPACE 0x08
#define ROMSPACE 0x04
#define MIKEYSPACE 0x02
#define SUZYSPACE 0x01
#endif