Blame ld10k1/src/ld10k1.h

Packit 427e91
/*
Packit 427e91
 *  EMU10k1 loader
Packit 427e91
 *
Packit 427e91
 *  Copyright (c) 2003,2004 by Peter Zubaj
Packit 427e91
 *
Packit 427e91
 *   This program is free software; you can redistribute it and/or modify
Packit 427e91
 *   it under the terms of the GNU General Public License as published by
Packit 427e91
 *   the Free Software Foundation; either version 2 of the License, or
Packit 427e91
 *   (at your option) any later version.
Packit 427e91
 *
Packit 427e91
 *   This program is distributed in the hope that it will be useful,
Packit 427e91
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 427e91
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 427e91
 *   GNU General Public License for more details.
Packit 427e91
 *
Packit 427e91
 *   You should have received a copy of the GNU General Public License
Packit 427e91
 *   along with this program; if not, write to the Free Software
Packit 427e91
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit 427e91
 *
Packit 427e91
 */
Packit 427e91
Packit 427e91
#ifndef __LD10K1_H
Packit 427e91
#define __LD10K1_H
Packit 427e91
Packit 427e91
#define MAX_CONST_COUNT 0x220
Packit 427e91
#define MAX_GPR_COUNT 0x200
Packit 427e91
#define MAX_TRAM_COUNT 0x100
Packit 427e91
Packit 427e91
/* instructions */
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int used: 1,
Packit 427e91
		modified: 1;
Packit 427e91
	unsigned int op_code;
Packit 427e91
	unsigned int arg[4];
Packit 427e91
} ld10k1_instr_t;
Packit 427e91
Packit 427e91
/* tram */
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int used: 1,
Packit 427e91
		type: 2,
Packit 427e91
		req_pos: 2,
Packit 427e91
		pos: 2;
Packit 427e91
	unsigned int size;
Packit 427e91
	unsigned int offset;
Packit 427e91
	int acc_count;
Packit 427e91
} ld10k1_tram_grp_t;
Packit 427e91
Packit 427e91
#define TRAM_OP_NULL 0
Packit 427e91
#define TRAM_OP_READ 1
Packit 427e91
#define TRAM_OP_WRITE 2
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int used: 1,
Packit 427e91
		modified: 1;
Packit 427e91
	unsigned int op;
Packit 427e91
	unsigned int addr_val;
Packit 427e91
	unsigned int data_val;
Packit 427e91
} ld10k1_tram_hwacc_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int used: 1,
Packit 427e91
		type: 2;
Packit 427e91
	unsigned int offset;
Packit 427e91
	unsigned int hwacc;
Packit 427e91
	unsigned int grp;
Packit 427e91
} ld10k1_tram_acc_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int size;
Packit 427e91
	unsigned int max_hwacc;
Packit 427e91
	ld10k1_tram_hwacc_t *hwacc;
Packit 427e91
	unsigned int used_hwacc;
Packit 427e91
} ld10k1_tram_t;
Packit 427e91
Packit 427e91
#define MAX_CONN_PER_POINT 15
Packit 427e91
#define MAX_INSTR_PER_POINT 7
Packit 427e91
Packit 427e91
#define INSERT_BEFORE_OWNER 0
Packit 427e91
#define INSERT_AFTER_OWNER 1
Packit 427e91
Packit 427e91
typedef struct ld10k1_conn_point_tag
Packit 427e91
{
Packit 427e91
	struct ld10k1_conn_point_tag *next;
Packit 427e91
Packit 427e91
	int id;
Packit 427e91
	int con_count; /* count of io connected to this point */
Packit 427e91
	unsigned int con_gpr_idx;
Packit 427e91
	int type[MAX_CONN_PER_POINT];
Packit 427e91
	struct ld10k1_patch_tag *patch[MAX_CONN_PER_POINT];
Packit 427e91
	int io[MAX_CONN_PER_POINT];
Packit 427e91
	unsigned int out_gpr_idx[MAX_CONN_PER_POINT];
Packit 427e91
Packit 427e91
	int simple;
Packit 427e91
Packit 427e91
	int reserved_gpr;
Packit 427e91
	int reserved_instr;
Packit 427e91
Packit 427e91
	struct ld10k1_patch_tag *owner;
Packit 427e91
	int position;
Packit 427e91
Packit 427e91
	unsigned int out_instr_offset;
Packit 427e91
	ld10k1_instr_t out_instr[MAX_INSTR_PER_POINT];
Packit 427e91
} ld10k1_conn_point_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	char *name;
Packit 427e91
	ld10k1_conn_point_t *point;
Packit 427e91
} ld10k1_p_in_out_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int gpr_idx;
Packit 427e91
	unsigned int const_val;
Packit 427e91
} ld10k1_p_const_sta_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int gpr_idx;
Packit 427e91
} ld10k1_p_dyn_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int reg_idx;
Packit 427e91
	unsigned int gpr_idx;
Packit 427e91
} ld10k1_p_hw_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int grp_type;
Packit 427e91
	unsigned int grp_size;
Packit 427e91
	unsigned int grp_pos;
Packit 427e91
	unsigned int grp_idx;
Packit 427e91
} ld10k1_p_tram_grp_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int acc_type;
Packit 427e91
	unsigned int acc_offset;
Packit 427e91
	unsigned int acc_idx;
Packit 427e91
	unsigned int grp;
Packit 427e91
} ld10k1_p_tram_acc_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	char name[44];
Packit 427e91
	int index;
Packit 427e91
	int want_index;
Packit 427e91
	unsigned int vcount;		/* count of GPR (1..32) */
Packit 427e91
	unsigned int count;			/* count of GPR (1..32) */
Packit 427e91
	unsigned int gpr_idx[32];	/* GPR number(s) */
Packit 427e91
	unsigned int value[32];
Packit 427e91
	unsigned int min;			/* minimum range */
Packit 427e91
	unsigned int max;			/* maximum range */
Packit 427e91
	unsigned int translation;	/* typ - 0 - bool, num 1 - enum */
Packit 427e91
} ld10k1_ctl_t;
Packit 427e91
Packit 427e91
typedef struct ld10k1_ctl_list_item_tag {
Packit 427e91
	struct ld10k1_ctl_list_item_tag *next;
Packit 427e91
	ld10k1_ctl_t ctl;
Packit 427e91
} ld10k1_ctl_list_item_t;
Packit 427e91
Packit 427e91
typedef struct ld10k1_patch_tag {
Packit 427e91
	char *patch_name;
Packit 427e91
	int order;
Packit 427e91
	int id;
Packit 427e91
Packit 427e91
	unsigned int in_count;
Packit 427e91
	ld10k1_p_in_out_t *ins;
Packit 427e91
Packit 427e91
	unsigned int out_count;
Packit 427e91
	ld10k1_p_in_out_t *outs;
Packit 427e91
Packit 427e91
	unsigned int const_count;
Packit 427e91
	ld10k1_p_const_sta_t *consts;
Packit 427e91
Packit 427e91
	unsigned int sta_count;
Packit 427e91
	ld10k1_p_const_sta_t *stas;
Packit 427e91
Packit 427e91
	unsigned int dyn_count;
Packit 427e91
	ld10k1_p_dyn_t *dyns;
Packit 427e91
Packit 427e91
	unsigned int hw_count;
Packit 427e91
	ld10k1_p_hw_t *hws;
Packit 427e91
Packit 427e91
	unsigned int tram_count;
Packit 427e91
	ld10k1_p_tram_grp_t *tram_grp;
Packit 427e91
Packit 427e91
	unsigned int tram_acc_count;
Packit 427e91
	ld10k1_p_tram_acc_t *tram_acc;
Packit 427e91
Packit 427e91
	unsigned int ctl_count;
Packit 427e91
	ld10k1_ctl_t *ctl;
Packit 427e91
Packit 427e91
	unsigned int instr_count;
Packit 427e91
	unsigned int instr_offset;
Packit 427e91
	ld10k1_instr_t *instr;
Packit 427e91
} ld10k1_patch_t;
Packit 427e91
Packit 427e91
#define EMU10K1_PATCH_MAX 128
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int gpr_idx;
Packit 427e91
	unsigned int const_val;
Packit 427e91
	unsigned int hw;
Packit 427e91
	unsigned int ref;
Packit 427e91
	unsigned int used: 1;
Packit 427e91
} ld10k1_dsp_const_t;
Packit 427e91
Packit 427e91
#define GPR_USAGE_NONE 0
Packit 427e91
#define GPR_USAGE_NORMAL 1
Packit 427e91
#define GPR_USAGE_CONST 2
Packit 427e91
#define GPR_USAGE_DYNAMIC 3
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	unsigned int gpr_usage;
Packit 427e91
	unsigned int val;
Packit 427e91
	unsigned int ref;
Packit 427e91
	unsigned int modified: 1,
Packit 427e91
		used: 1;
Packit 427e91
} ld10k1_dsp_gpr_t;
Packit 427e91
Packit 427e91
/* reserved ctls - for example AC97 */
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	char name[44];
Packit 427e91
	unsigned int index;
Packit 427e91
} ld10k1_reserved_ctl_t;
Packit 427e91
Packit 427e91
typedef struct ld10k1_reserved_ctl_list_item_tag {
Packit 427e91
	struct ld10k1_reserved_ctl_list_item_tag *next;
Packit 427e91
	ld10k1_reserved_ctl_t res_ctl;
Packit 427e91
} ld10k1_reserved_ctl_list_item_t;
Packit 427e91
Packit 427e91
typedef struct {
Packit 427e91
	int audigy;
Packit 427e91
	const char *card_id;
Packit 427e91
Packit 427e91
	/* registers */
Packit 427e91
	unsigned int fx_count;
Packit 427e91
	ld10k1_p_in_out_t fxs[0x40];
Packit 427e91
Packit 427e91
	unsigned int in_count;
Packit 427e91
	ld10k1_p_in_out_t ins[0x20];
Packit 427e91
Packit 427e91
	unsigned int out_count;
Packit 427e91
	ld10k1_p_in_out_t outs[0x40];
Packit 427e91
Packit 427e91
	unsigned int consts_max_count;
Packit 427e91
	ld10k1_dsp_const_t consts[MAX_CONST_COUNT];
Packit 427e91
Packit 427e91
	unsigned int regs_max_count;
Packit 427e91
	ld10k1_dsp_gpr_t regs[MAX_GPR_COUNT];
Packit 427e91
Packit 427e91
	/* instructions */
Packit 427e91
	unsigned int instr_count;
Packit 427e91
	ld10k1_instr_t instr[1024];
Packit 427e91
Packit 427e91
	unsigned int instr_free;
Packit 427e91
Packit 427e91
	/* internal tram */
Packit 427e91
	ld10k1_tram_t i_tram;
Packit 427e91
Packit 427e91
	/* external tram */
Packit 427e91
	ld10k1_tram_t e_tram;
Packit 427e91
Packit 427e91
	unsigned int max_tram_grp;
Packit 427e91
	ld10k1_tram_grp_t tram_grp[MAX_TRAM_COUNT];
Packit 427e91
Packit 427e91
	unsigned int max_tram_acc;
Packit 427e91
	ld10k1_tram_acc_t tram_acc[MAX_TRAM_COUNT];
Packit 427e91
Packit 427e91
	unsigned int max_itram_hwacc;
Packit 427e91
	ld10k1_tram_hwacc_t itram_hwacc[0xC0];
Packit 427e91
	unsigned int max_etram_hwacc;
Packit 427e91
	ld10k1_tram_hwacc_t etram_hwacc[0x40];
Packit 427e91
Packit 427e91
	unsigned int patch_count;
Packit 427e91
	ld10k1_patch_t *patch_ptr[EMU10K1_PATCH_MAX];
Packit 427e91
	unsigned int patch_order[EMU10K1_PATCH_MAX];
Packit 427e91
Packit 427e91
	unsigned short patch_id_gens[EMU10K1_PATCH_MAX];
Packit 427e91
Packit 427e91
	ld10k1_ctl_list_item_t *add_ctl_list;
Packit 427e91
	int add_list_count;
Packit 427e91
Packit 427e91
	ld10k1_ctl_list_item_t *del_ctl_list;
Packit 427e91
	int del_list_count;
Packit 427e91
Packit 427e91
	ld10k1_ctl_list_item_t *ctl_list;
Packit 427e91
	int ctl_list_count;
Packit 427e91
	
Packit 427e91
	ld10k1_reserved_ctl_list_item_t *reserved_ctl_list;
Packit 427e91
Packit 427e91
	ld10k1_conn_point_t *point_list;
Packit 427e91
} ld10k1_dsp_mgr_t;
Packit 427e91
Packit 427e91
void error(const char *fmt,...);
Packit 427e91
#endif /* __LD10K1_H */