173 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef ASSEMBLER_H
 | 
						|
#define ASSEMBLER_H
 | 
						|
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
#include <string>
 | 
						|
#include <map>
 | 
						|
 | 
						|
 | 
						|
#define OPCODE_N_LD  0x00
 | 
						|
#define OPCODE_N_AND 0x20
 | 
						|
#define OPCODE_N_OR  0x40
 | 
						|
#define OPCODE_N_XOR 0x60
 | 
						|
#define OPCODE_N_ADD 0x80
 | 
						|
#define OPCODE_N_SUB 0xA0
 | 
						|
#define OPCODE_N_ST  0xC0
 | 
						|
#define OPCODE_N_J   0xE0
 | 
						|
 | 
						|
#define EA_0D_AC    0x00
 | 
						|
#define EA_0X_AC    0x04
 | 
						|
#define EA_YD_AC    0x08
 | 
						|
#define EA_YX_AC    0x0C
 | 
						|
#define EA_0D_X     0x10
 | 
						|
#define EA_0D_Y     0x14
 | 
						|
#define EA_0D_OUT   0x18
 | 
						|
#define EA_YX_OUTIX 0x1C
 | 
						|
 | 
						|
#define BUS_D   0x00
 | 
						|
#define BUS_RAM 0x01
 | 
						|
#define BUS_AC  0x02
 | 
						|
#define BUS_IN  0x03
 | 
						|
 | 
						|
#define BRA_CC_FAR    0x00
 | 
						|
#define BRA_CC_GT     0x04
 | 
						|
#define BRA_CC_LT     0x08
 | 
						|
#define BRA_CC_NE     0x0C
 | 
						|
#define BRA_CC_EQ     0x10
 | 
						|
#define BRA_CC_GE     0x14
 | 
						|
#define BRA_CC_LE     0x18
 | 
						|
#define BRA_CC_ALWAYS 0x1C
 | 
						|
 | 
						|
#define DEFAULT_EXEC_ADDRESS 0x0200
 | 
						|
#define DEFAULT_CALL_TABLE   0x0000
 | 
						|
 | 
						|
#define USER_ROMv1_ADDRESS 0x0B00 // pictures in ROM v1
 | 
						|
 | 
						|
#define OPCODE_V_BRA   0x90
 | 
						|
#define OPCODE_V_BCC   0x35
 | 
						|
#define OPCODE_V_CALL  0xCF
 | 
						|
#define OPCODE_V_HALT  0xB4
 | 
						|
#define OPERAND_V_HALT 0x80
 | 
						|
 | 
						|
#define GIGA_V_AC 0x18
 | 
						|
 | 
						|
 | 
						|
namespace Assembler
 | 
						|
{
 | 
						|
    enum ByteSize {BadSize=-1, OneByte=1, TwoBytes=2, ThreeBytes=3};
 | 
						|
    enum OpcodeType {ReservedDB=0, ReservedDW, ReservedDBR, ReservedDWR, vCpu, Native};
 | 
						|
 | 
						|
    struct ByteCode
 | 
						|
    {
 | 
						|
        bool _isRomAddress;
 | 
						|
        bool _isCustomAddress;
 | 
						|
        uint8_t _data;
 | 
						|
        uint16_t _address;
 | 
						|
    };
 | 
						|
 | 
						|
    struct DasmCode
 | 
						|
    {
 | 
						|
        uint8_t _instruction;
 | 
						|
        uint8_t _byteSize;
 | 
						|
        uint8_t _data0;
 | 
						|
        uint8_t _data1;
 | 
						|
        uint16_t _address;
 | 
						|
        std::string _text;
 | 
						|
    };
 | 
						|
 | 
						|
    struct InstructionType
 | 
						|
    {
 | 
						|
        uint8_t _opcode0;
 | 
						|
        uint8_t _opcode1;
 | 
						|
        ByteSize _byteSize;
 | 
						|
        OpcodeType _opcodeType;
 | 
						|
    };
 | 
						|
 | 
						|
    struct InstructionDasm
 | 
						|
    {
 | 
						|
        uint8_t _opcode;
 | 
						|
        uint8_t _branch;
 | 
						|
        ByteSize _byteSize;
 | 
						|
        OpcodeType _opcodeType;
 | 
						|
        std::string _mnemonic;
 | 
						|
    };
 | 
						|
 | 
						|
    struct LineToken
 | 
						|
    {
 | 
						|
        bool _fromInclude = false;
 | 
						|
        int _includeLineNumber;
 | 
						|
        std::string _text;
 | 
						|
        std::string _includeName;
 | 
						|
    };
 | 
						|
 | 
						|
    struct Gprintf
 | 
						|
    {
 | 
						|
        enum Format {Chr, Int, Bin, Oct, Hex, Str};
 | 
						|
        struct Var
 | 
						|
        {
 | 
						|
            int _indirection = 0;
 | 
						|
            Format _format;
 | 
						|
            int _width;
 | 
						|
            uint16_t _data;
 | 
						|
            std::string _text;
 | 
						|
        };
 | 
						|
 | 
						|
        uint16_t _address;
 | 
						|
        int _lineNumber;
 | 
						|
        std::string _lineToken;
 | 
						|
        std::string _format;
 | 
						|
        std::vector<Var> _vars;
 | 
						|
        std::vector<std::string> _subs;
 | 
						|
    };
 | 
						|
 | 
						|
    struct Define
 | 
						|
    {
 | 
						|
        bool _enabled = false;
 | 
						|
        bool _toggle = false;
 | 
						|
        int16_t _value = 0;
 | 
						|
        std::string _name;
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    uint8_t getvSpMin(void);
 | 
						|
    uint16_t getStartAddress(void);
 | 
						|
    int getCurrDasmByteCount(void);
 | 
						|
    int getPrevDasmByteCount(void);
 | 
						|
    int getPrevDasmPageByteCount(void);
 | 
						|
    int getCurrDasmPageByteCount(void);
 | 
						|
    int getDisassembledCodeSize(void);
 | 
						|
    DasmCode* getDisassembledCode(int index);
 | 
						|
    const std::string& getIncludePath(void);
 | 
						|
 | 
						|
    void setvSpMin(uint8_t vSpMin);
 | 
						|
    void setIncludePath(const std::string& includePath);
 | 
						|
 | 
						|
    int getAsmOpcodeSize(const std::string& opcodeStr);
 | 
						|
    int getAsmOpcodeSizeText(const std::string& textStr);
 | 
						|
    int getAsmOpcodeSizeFile(const std::string& filename);
 | 
						|
 | 
						|
    void clearDefines(void);
 | 
						|
    bool createDefine(const std::string& filename, const std::vector<std::string>& tokens, int adjustedLineIndex);
 | 
						|
    bool handleIfDefine(const std::string& filename, const std::vector<std::string>& tokens, int adjustedLineIndex);
 | 
						|
    bool handleEndIfDefine(const std::string& filename, const std::vector<std::string>& tokens, int adjustedLineIndex);
 | 
						|
    bool handleElseDefine(const std::string& filename, const std::vector<std::string>& tokens, int adjustedLineIndex);
 | 
						|
    bool isCurrentDefineDisabled(void);
 | 
						|
    int16_t getRuntimeVersion(void);
 | 
						|
 | 
						|
    void initialise(void);
 | 
						|
    void clearAssembler(bool dontClearGprintfs=false);
 | 
						|
    bool getNextAssembledByte(ByteCode& byteCode, bool debug=false);
 | 
						|
 | 
						|
    bool assemble(const std::string& filename, uint16_t startAddress=DEFAULT_EXEC_ADDRESS, bool dontClearGprintfs=false);
 | 
						|
    int disassemble(uint16_t address);
 | 
						|
 | 
						|
#ifndef STAND_ALONE
 | 
						|
    bool addGprintf(const Gprintf& gprintf, uint16_t address);
 | 
						|
    bool parseGprintfFormat(const std::string& fmtstr, const std::vector<std::string>& variables, std::vector<Gprintf::Var>& vars, std::vector<std::string>& subs);
 | 
						|
    bool getGprintfString(const Gprintf& gprintf, std::string& gstring);
 | 
						|
    void handleGprintfs(void);
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
#endif |