|
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 */
|