#include #include #include #include #include #include #include #include #include #include #include #include #include "memory.h" #include "cpu.h" #include "audio.h" #include "editor.h" #include "loader.h" #include "assembler.h" #include "expression.h" #ifndef STAND_ALONE #include "cpu.h" #include "editor.h" #endif #define BRANCH_ADJUSTMENT 2 #define MAX_DASM_LINES 30 namespace Assembler { enum ParseType {PreProcessPass=0, MnemonicPass, CodePass, NumParseTypes}; enum EvaluateResult {Failed=-1, NotFound, Reserved, Duplicate, Skipped, Success}; enum AddressMode {D_AC=0b00000000, X_AC=0b00000100, YD_AC=0b00001000, YX_AC=0b00001100, D_X=0b00010000, D_Y=0b00010100, D_OUT=0b00011000, YXpp_OUT=0b00011100}; enum BusMode {D=0b00000000, RAM=0b00000001, AC=0b00000010, IN=0b00000011}; enum ReservedWords {CallTable=0, StartAddress, SingleStepWatch, DisableUpload, CpuUsageAddressA, CpuUsageAddressB, INCLUDE, MACRO, ENDM, GPRINTF, NumReservedWords}; struct Label { uint16_t _address; std::string _name; }; struct Equate { bool _isCustomAddress; uint16_t _operand; std::string _name; }; struct Instruction { bool _isRomAddress; bool _isCustomAddress; ByteSize _byteSize; uint8_t _opcode; uint8_t _operand0; uint8_t _operand1; uint16_t _address; OpcodeType _opcodeType; }; struct CallTableEntry { uint8_t _operand; uint16_t _address; }; struct Macro { bool _complete = false; bool _fromInclude = false; int _fileStartLine; std::string _name; std::string _filename; std::vector _params; std::vector _lines; }; int _lineNumber; uint8_t _vSpMin = 0x00; uint16_t _byteCount = 0; uint16_t _callTablePtr = 0x0000; uint16_t _startAddress = DEFAULT_EXEC_ADDRESS; uint16_t _currentAddress = _startAddress; uint16_t _currDasmByteCount = 1, _prevDasmByteCount = 1; uint16_t _currDasmPageByteCount = 0, _prevDasmPageByteCount = 0; std::string _includePath = "."; std::vector