2004-08-06 12:46:59 +04:00
|
|
|
/* AMX Assembler
|
|
|
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
|
|
|
*
|
|
|
|
* This software is provided 'as-is', without any express or implied
|
|
|
|
* warranty. In no event will the authors be held liable for any damages
|
|
|
|
* arising from the use of this software.
|
|
|
|
*
|
|
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
|
|
* including commercial applications, and to alter it and redistribute it
|
|
|
|
* freely, subject to the following restrictions:
|
|
|
|
*
|
|
|
|
* 1. The origin of this software must not be misrepresented; you must not
|
|
|
|
* claim that you wrote the original software. If you use this software
|
|
|
|
* in a product, an acknowledgment in the product documentation would be
|
|
|
|
* appreciated but is not required.
|
|
|
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
* misrepresented as being the original software.
|
|
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
|
|
*
|
|
|
|
* Version: $Id$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _INCLUDE_AMXASM_H
|
|
|
|
#define _INCLUDE_AMXASM_H
|
|
|
|
|
|
|
|
//C includes
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <assert.h>
|
|
|
|
//C++ includes
|
|
|
|
#include <iostream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
#include <stack>
|
|
|
|
#include <list>
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
class Asm
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
int op;
|
|
|
|
std::vector<int> params;
|
|
|
|
int cip;
|
2004-08-11 12:14:54 +04:00
|
|
|
int line;
|
2004-08-06 12:46:59 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#include "amx.h"
|
|
|
|
#include "amx_error.h"
|
|
|
|
#include "cexpr.h"
|
|
|
|
#include "amx_parser.h"
|
|
|
|
#include "amx_symbol.h"
|
|
|
|
#include "amx_macro.h"
|
|
|
|
#include "amx_define.h"
|
|
|
|
#include "amx_data.h"
|
|
|
|
#include "amx_proc.h"
|
|
|
|
#include "amx_label.h"
|
|
|
|
#include "amx_natives.h"
|
2004-08-08 14:15:08 +04:00
|
|
|
#include "amx_nametable.h"
|
2004-08-06 12:46:59 +04:00
|
|
|
#include "amx_compiler.h" //This should be last!
|
|
|
|
|
|
|
|
#define SMALL_CELL_SIZE 32
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
Asm_Invalid = -1,
|
|
|
|
Asm_None,
|
|
|
|
Asm_Data,
|
|
|
|
Asm_Code,
|
|
|
|
Asm_Public,
|
|
|
|
Asm_Native,
|
|
|
|
} AsmSection;
|
|
|
|
|
|
|
|
/* From amx.c */
|
|
|
|
typedef enum {
|
|
|
|
OP_NONE, /* invalid opcode */
|
|
|
|
OP_LOAD_PRI,
|
|
|
|
OP_LOAD_ALT,
|
|
|
|
OP_LOAD_S_PRI,
|
|
|
|
OP_LOAD_S_ALT,
|
|
|
|
OP_LREF_PRI,
|
|
|
|
OP_LREF_ALT,
|
|
|
|
OP_LREF_S_PRI,
|
|
|
|
OP_LREF_S_ALT,
|
|
|
|
OP_LOAD_I,
|
|
|
|
OP_LODB_I,
|
|
|
|
OP_CONST_PRI,
|
|
|
|
OP_CONST_ALT,
|
|
|
|
OP_ADDR_PRI,
|
|
|
|
OP_ADDR_ALT,
|
|
|
|
OP_STOR_PRI,
|
|
|
|
OP_STOR_ALT,
|
|
|
|
OP_STOR_S_PRI,
|
|
|
|
OP_STOR_S_ALT,
|
|
|
|
OP_SREF_PRI,
|
|
|
|
OP_SREF_ALT,
|
|
|
|
OP_SREF_S_PRI,
|
|
|
|
OP_SREF_S_ALT,
|
|
|
|
OP_STOR_I,
|
|
|
|
OP_STRB_I,
|
|
|
|
OP_LIDX,
|
|
|
|
OP_LIDX_B,
|
|
|
|
OP_IDXADDR,
|
|
|
|
OP_IDXADDR_B,
|
|
|
|
OP_ALIGN_PRI,
|
|
|
|
OP_ALIGN_ALT,
|
|
|
|
OP_LCTRL,
|
|
|
|
OP_SCTRL,
|
|
|
|
OP_MOVE_PRI,
|
|
|
|
OP_MOVE_ALT,
|
|
|
|
OP_XCHG,
|
|
|
|
OP_PUSH_PRI,
|
|
|
|
OP_PUSH_ALT,
|
|
|
|
OP_PUSH_R,
|
|
|
|
OP_PUSH_C,
|
|
|
|
OP_PUSH,
|
|
|
|
OP_PUSH_S,
|
|
|
|
OP_POP_PRI,
|
|
|
|
OP_POP_ALT,
|
|
|
|
OP_STACK,
|
|
|
|
OP_HEAP,
|
|
|
|
OP_PROC,
|
|
|
|
OP_RET,
|
|
|
|
OP_RETN,
|
|
|
|
OP_CALL,
|
|
|
|
OP_CALL_PRI,
|
|
|
|
OP_JUMP,
|
|
|
|
OP_JREL,
|
|
|
|
OP_JZER,
|
|
|
|
OP_JNZ,
|
|
|
|
OP_JEQ,
|
|
|
|
OP_JNEQ,
|
|
|
|
OP_JLESS,
|
|
|
|
OP_JLEQ,
|
|
|
|
OP_JGRTR,
|
|
|
|
OP_JGEQ,
|
|
|
|
OP_JSLESS,
|
|
|
|
OP_JSLEQ,
|
|
|
|
OP_JSGRTR,
|
|
|
|
OP_JSGEQ,
|
|
|
|
OP_SHL,
|
|
|
|
OP_SHR,
|
|
|
|
OP_SSHR,
|
|
|
|
OP_SHL_C_PRI,
|
|
|
|
OP_SHL_C_ALT,
|
|
|
|
OP_SHR_C_PRI,
|
|
|
|
OP_SHR_C_ALT,
|
|
|
|
OP_SMUL,
|
|
|
|
OP_SDIV,
|
|
|
|
OP_SDIV_ALT,
|
|
|
|
OP_UMUL,
|
|
|
|
OP_UDIV,
|
|
|
|
OP_UDIV_ALT,
|
|
|
|
OP_ADD,
|
|
|
|
OP_SUB,
|
|
|
|
OP_SUB_ALT,
|
|
|
|
OP_AND,
|
|
|
|
OP_OR,
|
|
|
|
OP_XOR,
|
|
|
|
OP_NOT,
|
|
|
|
OP_NEG,
|
|
|
|
OP_INVERT,
|
|
|
|
OP_ADD_C,
|
|
|
|
OP_SMUL_C,
|
|
|
|
OP_ZERO_PRI,
|
|
|
|
OP_ZERO_ALT,
|
|
|
|
OP_ZERO,
|
|
|
|
OP_ZERO_S,
|
|
|
|
OP_SIGN_PRI,
|
|
|
|
OP_SIGN_ALT,
|
|
|
|
OP_EQ,
|
|
|
|
OP_NEQ,
|
|
|
|
OP_LESS,
|
|
|
|
OP_LEQ,
|
|
|
|
OP_GRTR,
|
|
|
|
OP_GEQ,
|
|
|
|
OP_SLESS,
|
|
|
|
OP_SLEQ,
|
|
|
|
OP_SGRTR,
|
|
|
|
OP_SGEQ,
|
|
|
|
OP_EQ_C_PRI,
|
|
|
|
OP_EQ_C_ALT,
|
|
|
|
OP_INC_PRI,
|
|
|
|
OP_INC_ALT,
|
|
|
|
OP_INC,
|
|
|
|
OP_INC_S,
|
|
|
|
OP_INC_I,
|
|
|
|
OP_DEC_PRI,
|
|
|
|
OP_DEC_ALT,
|
|
|
|
OP_DEC,
|
|
|
|
OP_DEC_S,
|
|
|
|
OP_DEC_I,
|
|
|
|
OP_MOVS,
|
|
|
|
OP_CMPS,
|
|
|
|
OP_FILL,
|
|
|
|
OP_HALT,
|
|
|
|
OP_BOUNDS,
|
|
|
|
OP_SYSREQ_PRI,
|
|
|
|
OP_SYSREQ_C,
|
|
|
|
OP_FILE,
|
|
|
|
OP_LINE,
|
|
|
|
OP_SYMBOL,
|
|
|
|
OP_SRANGE,
|
|
|
|
OP_JUMP_PRI,
|
|
|
|
OP_SWITCH,
|
|
|
|
OP_CASETBL,
|
|
|
|
OP_SWAP_PRI,
|
|
|
|
OP_SWAP_ALT,
|
|
|
|
OP_PUSHADDR,
|
|
|
|
OP_NOP,
|
|
|
|
OP_SYSREQ_D,
|
|
|
|
OP_SYMTAG,
|
|
|
|
/* ----- */
|
|
|
|
OP_NUM_OPCODES
|
|
|
|
} OPCODE;
|
|
|
|
|
2004-08-09 09:23:32 +04:00
|
|
|
void get_options(int argc, char **argv, Compiler &Prog);
|
2004-08-06 12:46:59 +04:00
|
|
|
void InitOpcodes();
|
2004-08-07 21:07:50 +04:00
|
|
|
void DestroyArgList(std::vector<std::string *> &List);
|
2004-08-09 09:23:32 +04:00
|
|
|
void print_version();
|
2004-08-11 13:32:24 +04:00
|
|
|
void print_options();
|
2004-08-06 12:46:59 +04:00
|
|
|
|
|
|
|
#endif //_INCLUDE_AMXASM_H
|