You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kpicosim/src/cassembler.h

148 lines
2.7 KiB

#include <iostream>
#include <string>
#include <list>
#include <vector>
#include <tdelistview.h>
#include <algorithm>
#include <cctype>
#include "types.h"
class CCode ;
using namespace std ;
enum instrNumber {
ADD, ADDCY, AND, CALL, COMPARE, DISABLE, ENABLE, FETCH, INPUT,
JUMP, LOAD, OR, OUTPUT, RETURN, RETURNI, ROTATE, RL, RR, SL0,
SL1, SLA, SLX, SR0, SR1, SRA, SRX, STORE, SUB, SUBCY, TEST,
XOR
} ;
class CNamereg {
public:
CNamereg() {} ;
~CNamereg() {} ;
string reg ;
string name ;
} ;
class CConstant {
public:
CConstant() {}
~CConstant() {}
string value ;
string name ;
} ;
class CLabel {
public:
CLabel() {}
~CLabel() ;
string value ;
string name ;
} ;
class CSourceLine {
public:
enum SymbolType {
stNone,
stLabel,
stNamereg,
stConstant,
stAddress
} ;
CSourceLine( unsigned int lineNr ) : m_lineNr( lineNr )
{
m_type = stNone ;
}
~CSourceLine() {} ;
void addColumn( string word )
{
/* int i ; // Case sensitive
for ( i = 0 ; i < word.length(); i++ )
word[ i ] = toupper( word[ i ] ) ;
*/ m_line.push_back( word ) ;
}
bool isColumn( unsigned int index )
{
return m_line.size() > index ;
}
string getColumn( int index )
{
if ( !isColumn( index ) )
return "" ;
else
return m_line[index] ;
}
unsigned int m_lineNr;
vector<string> m_line ;
unsigned int m_address ;
SymbolType m_type ;
} ;
class CAssembler {
public:
CAssembler() ;
~CAssembler() ;
void setCode( CCode *code )
{
m_code = code ;
}
void setFilename( string filename )
{
m_filename = filename ;
}
bool assemble() ;
void clear() {
m_source.clear() ;
m_registerTable.clear() ;
m_labelTable.clear() ;
m_constantTable.clear() ;
}
void setMessageList( TDEListView *messageList )
{
m_messageList = messageList ;
}
bool exportVHDL( string templateFile, string outputDir, string entityName ) ;
bool exportHEX( string filename, bool mem ) ;
protected:
list<CSourceLine*> m_source ;
list<CNamereg*> m_registerTable ;
list<CConstant*> m_constantTable ;
list<CLabel*> m_labelTable ;
string m_filename ;
bool buildSymbolTable() ;
bool loadFile() ;
void error( unsigned int line, const char *description ) ;
int getRegister( string name ) ;
char * getWord( char *s, char *word ) ;
CSourceLine * formatLine( int lineNr, char *s ) ;
int getInstruction( string name ) ;
bool createOpcodes() ;
string translateLabel( string name ) ;
string translateConstant( string name ) ;
string translateRegister( string name ) ;
bool addInstruction( instrNumber instr, CSourceLine sourceLine, int offset ) ;
CCode * m_code ;
TDEListView *m_messageList ;
} ;