#if ! defined (_CC_H)
#define _CC_H
#include <sys/queue.h>
#include <amiga/amiga/cc_registers.h>
#ifndef __powerpc__
#include "opt_lev6_defer.h"
#endif
#if ! defined (HIADDR)
#define HIADDR(x) (u_short)((((unsigned long)(x))>>16)&0xffff)
#endif
#if ! defined (LOADDR)
#define LOADDR(x) (u_short)(((unsigned long)(x))&0xffff)
#endif
struct audio_channel {
u_short play_count;
short isaudio;
void (*handler)(int);
};
#ifdef LEV6_DEFER
#define AUCC_MAXINT 3
#define AUCC_ALLINTF (INTF_AUD0|INTF_AUD1|INTF_AUD2)
#else
#define AUCC_MAXINT 4
#define AUCC_ALLINTF (INTF_AUD0|INTF_AUD1|INTF_AUD2|INTF_AUD3)
#endif
#define AUCC_ALLDMAF (DMAF_AUD0|DMAF_AUD1|DMAF_AUD2|DMAF_AUD3)
struct vbl_node {
LIST_ENTRY(vbl_node) link;
short priority;
short flags;
void (*function)(register void *);
void *data;
};
enum vbl_node_bits {
VBLNB_OFF,
VBLNB_TURNOFF,
};
enum vlb_node_flags {
VBLNF_OFF = 1 << VBLNB_OFF,
VBLNF_TURNOFF = 1 << VBLNB_TURNOFF,
};
#define BLT_SHIFT_MASK(shift) (0xf&shift)
#define MAKEBOOL(val) (val ? 1 : 0)
#define DMAADDR(lng) (u_long)(((0x7 & lng) << 16)|(lng & 0xffff))
#define MAKE_BLTCON0(shift_a, use_a, use_b, use_c, use_d, minterm) \
((0x0000) | (BLT_SHIFT_MASK(shift_a) << 12) | \
(use_a << 11) | (use_b << 10) | (use_c << 9) | (use_d << 8) | \
(minterm))
#define MAKE_BLTCON1(shift_b, efe, ife, fc, desc) \
((0x0000) | (BLT_SHIFT_MASK(shift_b) << 12) | (efe << 4) | \
(ife << 3) | (fc << 2) | (desc << 1))
typedef struct copper_list {
union j {
struct k {
u_short opcode;
u_short operand;
} inst;
u_long data;
} cp;
} cop_t;
#define CI_MOVE(x) (0x7ffe & x)
#define CI_WAIT(h,v) (((0x7f&v)<<8)|(0xfe&h)|(0x0001))
#define CI_SKIP(x) (((0x7f&v)<<8)|(0xfe&h)|(0x0001))
#define CD_MOVE(x) (x)
#define CD_WAIT(x) (x & 0xfffe)
#define CD_SKIP(x) (x|0x0001)
#define CBUMP(c) (c++)
#define CMOVE(c,r,v) do { \
c->cp.data=((CI_MOVE(r)<<16)|(CD_MOVE(v))); \
CBUMP (c); \
} while(0)
#define CWAIT(c,h,v) do { \
c->cp.data=((CI_WAIT(h,v) << 16)|CD_WAIT(0xfffe)); \
CBUMP (c); \
} while(0)
#define CSKIP(c,h,v) do { \
c->cp.data=((CI_SKIP(h,v)<<16)|CD_SKIP(0xffff)); \
CBUMP (c); \
} while(0)
#define CEND(c) do { \
c->cp.data=0xfffffffe; \
CBUMP (c); \
} while(0)
struct mem_node {
TAILQ_ENTRY(mem_node) link;
TAILQ_ENTRY(mem_node) free_link;
u_long size;
u_char type;
};
#define MNODE_FREE 0
#define MNODE_USED 1
#define CM_BLOCKSIZE 0x4
#define CM_BLOCKMASK (~(CM_BLOCKSIZE - 1))
#define MNODES_MEM(mn) ((u_char *)(&mn[1]))
#define PREP_DMA_MEM(mem) (void *)((char*)(mem) - CHIPMEMADDR)
extern vaddr_t CHIPMEMADDR;
extern vaddr_t chipmem_start;
extern vaddr_t chipmem_end;
#define CHIPMEMBASE (0x00000000)
#define CHIPMEMTOP (0x00200000)
#define NCHIPMEMPG btoc(CHIPMEMTOP - CHIPMEMBASE)
void custom_chips_init(void);
void cc_init_vbl(void);
void add_vbl_function(struct vbl_node *, short, void *);
void remove_vbl_function(struct vbl_node *);
void turn_vbl_function_off(struct vbl_node *);
void turn_vbl_function_on(struct vbl_node *);
void cc_init_blitter(void);
int is_blitter_busy(void);
void wait_blit(void);
void blitter_handler(void);
void do_blit(u_short);
void set_blitter_control(u_short, u_short);
void set_blitter_mods(u_short, u_short, u_short, u_short);
void set_blitter_masks(u_short, u_short);
void set_blitter_data(u_short, u_short, u_short);
void set_blitter_pointers(void *, void *, void *, void *);
void install_copper_list(cop_t *);
cop_t *find_copper_inst(cop_t *, u_short);
void cc_init_copper(void);
void copper_handler(void);
void cc_init_audio(void);
void play_sample(u_short, u_short *, u_short, u_short, u_short, u_long);
void audio_handler(void);
void cc_init_chipmem(void);
void *alloc_chipmem(u_long);
void free_chipmem(void *);
u_long avail_chipmem(int);
u_long sizeof_chipmem(void *);
void wait_tof(void);
void vbl_handler(void);
void *chipmem_steal(long);
#endif