//Stephen Bassoli //CSE 258 //6502 Relocatable Assembler #include #include #include "Token.h" class lengthAnalyzer { public: lengthAnalyzer(); int getLength(CString line); int getMode(CString address); int ADC(int mode); int AND(int mode); int ASL(int mode); int BIT(int mode); int BRK(); int CMP(int mode); int CPX(int mode); int CPY(int mode); int DEC(int mode); int EOR(int mode); int INC(int mode); int JMP(int mode); int JSR(); int LDA(int mode); int LDX(int mode); int LDY(int mode); int LSR(int mode); int NOP(); int ORA(int mode); int ROL(int mode); int ROR(int mode); int RTI(); int RTS(); int SBC(int mode); int STA(int mode); int STX(int mode); int STY(int mode); int Branch(); int Flag(); int Register(); int Stack(); }; //CONSTRUCTOR lengthAnalyzer::lengthAnalyzer() {} //INPUTS: One line of 6502 code //OUTPUTS: Integer indicating the instruction length int lengthAnalyzer::getLength(CString line) { CToken tok(line); tok.SetToken(" "); CString command; CString addr; addr = "$44"; if (line.GetLength() < 5) command = line; else { command = tok.GetNextToken(); addr = tok.GetNextToken(); } if (command == "ADC") return ADC(getMode(addr)); if (command == "AND") return AND(getMode(addr)); if (command == "ASL") return ASL(getMode(addr)); if (command == "BCC") return Branch(); if (command == "BCS") return Branch(); if (command == "BEQ") return Branch(); if (command == "BIT") return BIT(getMode(addr)); if (command == "BMI") return Branch(); if (command == "BNE") return Branch(); if (command == "BPL") return Branch(); if (command == "BRK") return BRK(); if (command == "BVC") return Branch(); if (command == "BVS") return Branch(); if (command == "CLC") return Flag(); if (command == "CLD") return Flag(); if (command == "CLI") return Flag(); if (command == "CLV") return Flag(); if (command == "CMP") return CMP(getMode(addr)); if (command == "CPX") return CPX(getMode(addr)); if (command == "CPY") return CPY(getMode(addr)); if (command == "DEC") return DEC(getMode(addr)); if (command == "DEX") return Register(); if (command == "DEY") return Register(); if (command == "EOR") return EOR(getMode(addr)); if (command == "INC") return INC(getMode(addr)); if (command == "INX") return Register(); if (command == "INY") return Register(); if (command == "JMP") return JMP(getMode(addr)); if (command == "JSR") return JSR(); if (command == "LDA") return LDA(getMode(addr)); if (command == "LDX") return LDX(getMode(addr)); if (command == "LDY") return LDY(getMode(addr)); if (command == "LSR") return LSR(getMode(addr)); if (command == "NOP") return NOP(); if (command == "ORA") return ORA(getMode(addr)); if (command == "PHA") return Stack(); if (command == "PHP") return Stack(); if (command == "PLA") return Stack(); if (command == "PLP") return Stack(); if (command == "ROL") return ROL(getMode(addr)); if (command == "ROR") return ROR(getMode(addr)); if (command == "RTI") return RTI(); if (command == "RTS") return RTS(); if (command == "SBC") return SBC(getMode(addr)); if (command == "SEC") return Flag(); if (command == "SED") return Flag(); if (command == "SEI") return Flag(); if (command == "STA") return STA(getMode(addr)); if (command == "STX") return STX(getMode(addr)); if (command == "STY") return STY(getMode(addr)); if (command == "TAX") return Register(); if (command == "TAY") return Register(); if (command == "TSX") return Stack(); if (command == "TXA") return Register(); if (command == "TXS") return Stack(); if (command == "TYA") return Register(); return 0; } //INPUTS: Second portion of 6502 line of code, the part that indicates mode of instruction //OUTPUTS: An Integer representing the mode of the instruction /*MODES: 0 - IMMEDIATE/ACCUMULATOR 1 - ZERO PAGE 3 - ABSOLUTE 6 - INDIRECT */ int lengthAnalyzer::getMode(CString address) { /* Some error/format checking */ if (!((address.GetAt(0) == '#')||(address.GetAt(0) == '$')||(address.GetAt(0) == 'A')||(address.GetAt(0) == '('))) { cout << address.GetAt(0); return 404; } if (address.GetLength() == 1) { if (address.GetAt(0) != 'A') return 404; } if (address.GetAt(0) == '#') { if (address.GetLength() != 4) return 404; } /* fairly certain the input is correct (still need to add more error checking)*/ if (address.GetAt(0) == '(') return 6; else if ((address.GetAt(0) == '#')||(address.GetAt(0) == 'A')) return 0; else if (address.GetLength() < 4) return 1; else if (address.GetAt(3) == ',') return 1; else return 3; } /*BEGIN MINDLESS FUNCTIONS*/ int lengthAnalyzer::ADC(int mode) { switch (mode) { case 0: return 2; break; case 1: return 2; break; case 3: return 3; break; case 6: return 2; break; default: return 0; break; } } int lengthAnalyzer::AND(int mode) { return ADC(mode); } int lengthAnalyzer::ASL(int mode) { switch (mode) { case 0: return 1; break; case 1: return 2; break; case 3: return 3; break; default: return 0; break; } } int lengthAnalyzer::BIT(int mode) { switch (mode) { case 1: return 2; break; case 3: return 3; break; default: return 0; break; } } int lengthAnalyzer::BRK() { return 1; } int lengthAnalyzer::CMP(int mode) { return ADC(mode); } int lengthAnalyzer::CPX(int mode) { switch (mode) { case 0: return 2; break; case 1: return 2; break; case 3: return 3; break; default: return 0; break; } } int lengthAnalyzer::CPY(int mode) { return CPX(mode); } int lengthAnalyzer::DEC(int mode) { switch (mode) { case 1: return 2; break; case 3: return 3; break; default: return 0; break; } } int lengthAnalyzer::EOR(int mode) { return ADC(mode); } int lengthAnalyzer::INC(int mode) { return DEC(mode); } int lengthAnalyzer::JMP(int mode) { switch (mode) { case 3: return 3; break; case 6: return 3; break; default: return 0; break; } } int lengthAnalyzer::JSR() { return 3; } int lengthAnalyzer::LDA(int mode) { return ADC(mode); } int lengthAnalyzer::LDX(int mode) { switch (mode) { case 0: return 2; break; case 1: return 2; break; case 3: return 3; break; default: return 0; break; } } int lengthAnalyzer::LDY(int mode) { return LDX(mode); } int lengthAnalyzer::LSR(int mode) { return ASL(mode); } int lengthAnalyzer::NOP() { return 1; } int lengthAnalyzer::ORA(int mode) { return ADC(mode); } int lengthAnalyzer::ROL(int mode) { return ASL(mode); } int lengthAnalyzer::ROR(int mode) { return ASL(mode); } int lengthAnalyzer::RTI() { return 1; } int lengthAnalyzer::RTS() { return 1; } int lengthAnalyzer::SBC(int mode) { return ADC(mode); } int lengthAnalyzer::STA(int mode) { switch (mode) { case 1: return 2; break; case 3: return 3; break; case 6: return 2; break; default: return 0; break; } } int lengthAnalyzer::STX(int mode) { switch (mode) { case 1: return 2; break; case 3: return 3; break; default: return 0; break; } } int lengthAnalyzer::STY(int mode) { return STX(mode); } int lengthAnalyzer::Branch() { return 2; } int lengthAnalyzer::Flag() { return 1; } int lengthAnalyzer::Register() { return 1; } int lengthAnalyzer::Stack() { return 1; }