94 lines
2.9 KiB
C++
94 lines
2.9 KiB
C++
#ifndef _AS68HC11_SCAN_HPP_
|
|
#define _AS68HC11_SCAN_HPP_
|
|
#ifndef _COMMON_BLOCK_HPP_
|
|
#include <common/block.hpp>
|
|
#endif
|
|
#ifndef _AS68HC11_EMIT_HPP_
|
|
#include <as68hc11/emit.hpp>
|
|
#endif
|
|
|
|
class Table;
|
|
|
|
class Scan : public Emit
|
|
{
|
|
public:
|
|
enum ScanSymbols{unknown1,name1,asterisk1,apostrophe1,equ1,origin1,rmb1,comma1,label1,literal1,leftbracket1,rightbracket1,numeral1,
|
|
char1,divide1,plus1,minus1,leftparen1,rightparen1,newline1,endtext1,
|
|
ix1,iy1,aba1,abx1,aby1,adca1,adcb1,adda1,addb1,addd1,anda1,andb1,asl1,asla1,aslb1,
|
|
asld1,asr1,asra1,asrb1,bcc1,bclr1,bcs1,beq1,bge1,bgt1,bhi1,bhs1,bita1,bitb1,ble1,blo1,
|
|
bls1,blt1,bmi1,bne1,bpl1,bra1,brclr1,brn1,brset1,bset1,bsr1,bvc1,bvs1,cba1,clc1,cli1,clr1,
|
|
clra1,clrb1,clv1,cmpa1,cmpb1,com1,coma1,comb1,cpd1,cpx1,cpy1,daa1,dec1,deca1,decb1,des1,
|
|
dex1,dey1,eora1,eorb1,fdiv1,idiv1,inc1,inca1,incb1,ins1,inx1,iny1,jmp1,jsr1,ldaa1,ldab1,
|
|
ldd1,lds1,ldx1,ldy1,lsl1,lsla1,lslb1,lsld1,lsr1,lsra1,lsrb1,lsrd1,mul1,neg1,nega1,negb1,
|
|
nop1,oraa1,orab1,psha1,pshb1,pshx1,pshy1,pula1,pulb1,pulx1,puly1,rol1,rola1,rolb1,ror1,
|
|
rora1,rorb1,rti1,rts1,sba1,sbca1,sbcb1,sec1,sei1,sev1,staa1,stab1,std1,stop1,sts1,stx1,
|
|
sty1,suba1,subb1,subd1,swi1,tab1,tap1,tba1,test1,tpa1,tst1,tsta1,tstb1,tsx1,tsy1,txs1,
|
|
tys1,wai1,xgdx1,xgdy1,end1};
|
|
Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,Block<String> &includePath=Block<String>());
|
|
Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,CodePointer &codePointer,Block<String> &includePath=Block<String>());
|
|
virtual ~Scan();
|
|
bool analyze(void);
|
|
const String &lastMessage(void)const;
|
|
private:
|
|
enum {SpaceChar=32,TabChar=9};
|
|
void readch(void);
|
|
void skipSeparators(void);
|
|
bool scanNumeral(void);
|
|
void scanNewLine(void);
|
|
bool scanWord(void);
|
|
void scanComment(void);
|
|
void scanCharacter(void);
|
|
void scanUnknown(void);
|
|
void hex(char chBuffer[],int chIndex);
|
|
void binary(char chBuffer[],int chIndex);
|
|
void decimal(char chBuffer[],int chIndex);
|
|
bool scanInclude(void);
|
|
bool isKeySymbol(void)const;
|
|
bool isInHex(int chr)const;
|
|
bool getIncludeFile(const String &fileName,String &pathFileName);
|
|
|
|
|
|
Block<String> mIncludePath;
|
|
WORD mUserSymbols;
|
|
Table &mSymbolTable;
|
|
String mWordString;
|
|
String mLastMessage;
|
|
bool mIsInError;
|
|
bool mEmitEndText;
|
|
int mChar;
|
|
};
|
|
|
|
inline
|
|
void Scan::readch(void)
|
|
{
|
|
mChar=read();
|
|
}
|
|
|
|
inline
|
|
bool Scan::isKeySymbol(void)const
|
|
{
|
|
return (' '==mChar||','==mChar||'['==mChar||']'==mChar||':'==mChar||'*'==mChar||'/'==mChar||'+'==mChar||'-'==mChar||'('==mChar||')'==mChar);
|
|
}
|
|
|
|
inline
|
|
bool Scan::isInHex(int chr)const
|
|
{
|
|
if('A'==chr||'B'==chr||'C'==chr||'D'==chr||'E'==chr||'F'==chr||
|
|
'a'==chr||'b'==chr||'c'==chr||'d'==chr||'e'==chr||'f'==chr)return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
inline
|
|
void Scan::scanUnknown(void)
|
|
{
|
|
readch();
|
|
emit(unknown1);
|
|
}
|
|
|
|
inline
|
|
const String &Scan::lastMessage(void)const
|
|
{
|
|
return mLastMessage;
|
|
}
|
|
#endif
|