forked from dolphin-emu/dolphin
		
	add *.aps to ignore list for DolphinWX dir add eol-style native to 120 or so files git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3689 8ced0084-cf51-0410-be5f-012b33b47a6e
		
			
				
	
	
		
			140 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*====================================================================
 | |
| 
 | |
|    project:      GameCube DSP Tool (gcdsp)
 | |
|    created:      2005.03.04
 | |
|    mail:		  duddie@walla.com
 | |
| 
 | |
|    Copyright (c) 2005 Duddie
 | |
| 
 | |
|    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 _DSP_ASSEMBLE_H
 | |
| #define _DSP_ASSEMBLE_H
 | |
| 
 | |
| #include <string>
 | |
| #include <map>
 | |
| 
 | |
| #include "Common.h"
 | |
| #include "disassemble.h"
 | |
| #include "DSPTables.h"
 | |
| #include "LabelMap.h"
 | |
| 
 | |
| enum err_t
 | |
| {
 | |
| 	ERR_OK = 0,
 | |
| 	ERR_UNKNOWN,
 | |
| 	ERR_UNKNOWN_OPCODE,
 | |
| 	ERR_NOT_ENOUGH_PARAMETERS,
 | |
| 	ERR_TOO_MANY_PARAMETERS,
 | |
| 	ERR_WRONG_PARAMETER,
 | |
| 	ERR_EXPECTED_PARAM_STR,
 | |
| 	ERR_EXPECTED_PARAM_VAL,
 | |
| 	ERR_EXPECTED_PARAM_REG,
 | |
| 	ERR_EXPECTED_PARAM_MEM,
 | |
| 	ERR_EXPECTED_PARAM_IMM,
 | |
| 	ERR_INCORRECT_BIN,
 | |
| 	ERR_INCORRECT_HEX,
 | |
| 	ERR_INCORRECT_DEC,
 | |
| 	ERR_LABEL_EXISTS,
 | |
| 	ERR_UNKNOWN_LABEL,
 | |
| 	ERR_NO_MATCHING_BRACKETS,
 | |
| 	ERR_EXT_CANT_EXTEND_OPCODE,
 | |
| 	ERR_EXT_PAR_NOT_EXT,
 | |
| 	ERR_WRONG_PARAMETER_ACC,
 | |
| 	ERR_WRONG_PARAMETER_MID_ACC,
 | |
| 	ERR_INVALID_REGISTER,
 | |
| 	ERR_OUT_RANGE_NUMBER
 | |
| };
 | |
| 
 | |
| 
 | |
| // Unless you want labels to carry over between files, you probably
 | |
| // want to create a new DSPAssembler for every file you assemble.
 | |
| class DSPAssembler
 | |
| {
 | |
| public:
 | |
| 	DSPAssembler(const AssemblerSettings &settings);
 | |
| 	~DSPAssembler();
 | |
| 
 | |
| 	// line_numbers is optional (and not yet implemented). It'll receieve a list of ints,
 | |
| 	// one for each word of code, indicating the source assembler code line number it came from.
 | |
| 
 | |
| 	// If returns false, call GetErrorString to get some text to present to the user.
 | |
| 	bool Assemble(const char *text, std::vector<u16> &code, std::vector<int> *line_numbers = NULL);
 | |
| 
 | |
| 	std::string GetErrorString() const { return last_error_str; }
 | |
| 	err_t GetError() const { return last_error; }
 | |
| 
 | |
| private:
 | |
| 	struct param_t
 | |
| 	{
 | |
| 		u32			val;
 | |
| 		partype_t	type;
 | |
| 		char		*str;
 | |
| 	};
 | |
| 
 | |
| 	enum segment_t
 | |
| 	{
 | |
| 		SEGMENT_CODE = 0,
 | |
| 		SEGMENT_DATA,
 | |
| 		SEGMENT_OVERLAY,
 | |
| 		SEGMENT_MAX
 | |
| 	};
 | |
| 
 | |
| 	// Utility functions
 | |
| 	s32 ParseValue(const char *str);
 | |
| 	u32 ParseExpression(const char *ptr);
 | |
| 
 | |
| 	u32 GetParams(char *parstr, param_t *par);
 | |
| 
 | |
| 	void InitPass(int pass);
 | |
| 	bool AssembleFile(const char *fname, int pass);
 | |
| 
 | |
| 	void ShowError(err_t err_code, const char *extra_info = NULL);
 | |
| 	// void ShowWarning(err_t err_code, const char *extra_info = NULL);
 | |
| 
 | |
| 	char *FindBrackets(char *src, char *dst);
 | |
| 	const opc_t *FindOpcode(const char *opcode, u32 par_count, const opc_t * const opcod, int opcod_size);
 | |
| 	bool VerifyParams(const opc_t *opc, param_t *par, int count, bool ext = false);
 | |
| 	void BuildCode(const opc_t *opc, param_t *par, u32 par_count, u16 *outbuf);
 | |
| 
 | |
| 	char *gdg_buffer;
 | |
| 
 | |
| 	std::string include_dir;
 | |
| 	std::string cur_line;
 | |
| 
 | |
| 	u32 m_cur_addr;
 | |
| 	int m_totalSize;
 | |
| 	u8  m_cur_pass;
 | |
| 	
 | |
| 	LabelMap labels;
 | |
| 
 | |
| 	u32	code_line;
 | |
| 	bool failed;
 | |
| 	std::string last_error_str;
 | |
| 	err_t last_error;
 | |
| 
 | |
| 	typedef std::map<std::string, std::string> AliasMap;
 | |
| 	AliasMap aliases;
 | |
| 
 | |
| 	segment_t cur_segment;
 | |
| 	u32 segment_addr[SEGMENT_MAX];
 | |
| 	int m_current_param;
 | |
| 	const AssemblerSettings settings_;
 | |
| };
 | |
| 
 | |
| #endif  // _DSP_ASSEMBLE_H
 |