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