mirror of
https://github.com/marketideas/qasm.git
synced 2025-01-13 20:32:14 +00:00
more fixes on operand handling, tests back to passing (not all, but many)
This commit is contained in:
parent
4380f4e8ca
commit
20f78d128b
74
asm.cpp
74
asm.cpp
@ -149,6 +149,17 @@ void CLASS::print(uint32_t lineno)
|
|||||||
{
|
{
|
||||||
pcol += printf(" ");
|
pcol += printf(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string addrmode=options->addrModeEnglish(addressmode).c_str();
|
||||||
|
pcol+=printf("%s ",addrmode.c_str());
|
||||||
|
|
||||||
|
while(pcol<50)
|
||||||
|
{
|
||||||
|
pcol+=printf(" ");
|
||||||
|
}
|
||||||
|
pcol+=printf("|");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDebug() > 1)
|
if (isDebug() > 1)
|
||||||
@ -1810,7 +1821,7 @@ void CLASS::initpass(void)
|
|||||||
s=PAL::getString("option.instruction","");
|
s=PAL::getString("option.instruction","");
|
||||||
if (s!="")
|
if (s!="")
|
||||||
{
|
{
|
||||||
printf("CPU command line %s\n",s.c_str());
|
//printf("CPU command line %s\n",s.c_str());
|
||||||
cpumode = MODE_65816;
|
cpumode = MODE_65816;
|
||||||
mx = 0x03;
|
mx = 0x03;
|
||||||
|
|
||||||
@ -1904,7 +1915,8 @@ void CLASS::complete(void)
|
|||||||
printf("saving to file: %s\n", savepath.c_str());
|
printf("saving to file: %s\n", savepath.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ofstream f(savepath, std::ios::out|std::ios::trunc);
|
//std::ofstream f(savepath, std::ios::out|std::ios::trunc);
|
||||||
|
std::ofstream f(savepath, std::ios::out);
|
||||||
|
|
||||||
if (f.is_open())
|
if (f.is_open())
|
||||||
{
|
{
|
||||||
@ -2050,9 +2062,17 @@ int CLASS::getAddrMode(MerlinLine & line)
|
|||||||
|
|
||||||
oper = line.operand;
|
oper = line.operand;
|
||||||
int l=oper.length();
|
int l=oper.length();
|
||||||
if ((line.opcode.length() == 0) || (l <= 0))
|
int ol=line.opcode.length();
|
||||||
|
if ((ol == 0) || (l <= 0))
|
||||||
{
|
{
|
||||||
return (syn_none);
|
if (ol>0)
|
||||||
|
{
|
||||||
|
return (syn_implied);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(syn_none);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool supportbar=false;
|
bool supportbar=false;
|
||||||
@ -2093,13 +2113,13 @@ int CLASS::getAddrMode(MerlinLine & line)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((shiftchar=='^') || (shiftchar=='<') || (shiftchar=='>') || (supportbar && shiftchar=='|'))
|
if ((shiftchar=='^') || (shiftchar=='<') || (shiftchar=='>') || (supportbar && (shiftchar=='|')))
|
||||||
{
|
{
|
||||||
modified=true;
|
modified=true;
|
||||||
}
|
}
|
||||||
if (supportbar)
|
if (supportbar && shiftchar=='|')
|
||||||
{
|
{
|
||||||
|
line.flags|=FLAG_FORCELONG;
|
||||||
}
|
}
|
||||||
if (modified)
|
if (modified)
|
||||||
{
|
{
|
||||||
@ -2115,7 +2135,10 @@ int CLASS::getAddrMode(MerlinLine & line)
|
|||||||
oper=oper.substr(1);
|
oper=oper.substr(1);
|
||||||
l=oper.length();
|
l=oper.length();
|
||||||
}
|
}
|
||||||
printf("old: |%s| new: |%s|\n",line.operand.c_str(),oper.c_str());
|
if (isDebug()>1)
|
||||||
|
{
|
||||||
|
printf("old: |%s| new: |%s|\n",line.operand.c_str(),oper.c_str());
|
||||||
|
}
|
||||||
line.strippedoperand=oper;
|
line.strippedoperand=oper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2246,34 +2269,13 @@ int CLASS::parseOperand(MerlinLine & line)
|
|||||||
{
|
{
|
||||||
//errorOut(errBadAddressMode);
|
//errorOut(errBadAddressMode);
|
||||||
}
|
}
|
||||||
printf("addressmode=%d %s\n",res,addrModeEnglish(res).c_str());
|
if (isDebug()>1)
|
||||||
|
{
|
||||||
|
printf("addressmode=%d %s\n",res,options.addrModeEnglish(res).c_str());
|
||||||
|
}
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
string CLASS::addrModeEnglish(int mode)
|
|
||||||
{
|
|
||||||
string res="<none>";
|
|
||||||
switch(mode)
|
|
||||||
{
|
|
||||||
case syn_err: res="addrmode_error";break;
|
|
||||||
case syn_none: res="addrmode_none";break;
|
|
||||||
case syn_implied: res="implied";break;
|
|
||||||
case syn_s: res="dp,s";break;
|
|
||||||
case syn_sy: res="(dp,s),y";break;
|
|
||||||
case syn_imm: res="#immediate";break;
|
|
||||||
case syn_diix: res="(dp,x)";break;
|
|
||||||
case syn_diiy: res="(dp),y";break;
|
|
||||||
case syn_di: res="(dp)";break;
|
|
||||||
case syn_iyl: res="[expr],y";break;
|
|
||||||
case syn_dil: res="[expr]";break;
|
|
||||||
case syn_absx: res="abs,x";break;
|
|
||||||
case syn_absy: res="abs,y";break;
|
|
||||||
case syn_bm: res="block move";break;
|
|
||||||
case syn_abs: res="absolute";break;
|
|
||||||
default: res="addr_mode bad";break;
|
|
||||||
}
|
|
||||||
return(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
int CLASS::substituteVariables(MerlinLine & line, std::string &outop)
|
int CLASS::substituteVariables(MerlinLine & line, std::string &outop)
|
||||||
{
|
{
|
||||||
@ -2592,10 +2594,10 @@ void CLASS::process(void)
|
|||||||
line.operand = outop;
|
line.operand = outop;
|
||||||
}
|
}
|
||||||
x = parseOperand(line);
|
x = parseOperand(line);
|
||||||
if (x >= 0)
|
//if (x >= 0)
|
||||||
{
|
//{
|
||||||
line.addressmode = x;
|
line.addressmode = x;
|
||||||
}
|
//}
|
||||||
|
|
||||||
int64_t value = -1;
|
int64_t value = -1;
|
||||||
x = evaluate(line, line.operand_expr, value);
|
x = evaluate(line, line.operand_expr, value);
|
||||||
|
21
asm.h
21
asm.h
@ -110,26 +110,6 @@ extern uint8_t opCodeCompatibility[256];
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
syn_err = -1, // error - not recognized
|
|
||||||
syn_none = 0, // should never be returned 0
|
|
||||||
syn_implied, // no operand 1
|
|
||||||
syn_s, // expr,s 2
|
|
||||||
syn_sy, // (expr,s),y 3
|
|
||||||
syn_imm, // #expr 4
|
|
||||||
syn_diix, // (expr,x) 5
|
|
||||||
syn_diiy, // (expr),y 6
|
|
||||||
syn_di, // (expr) 7
|
|
||||||
syn_iyl, // [expr],y 8
|
|
||||||
syn_dil, // [expr] 9
|
|
||||||
syn_absx, // expr,x 10
|
|
||||||
syn_absy, // expr,y 11
|
|
||||||
syn_bm, // block move 12
|
|
||||||
syn_abs, // expr 13
|
|
||||||
|
|
||||||
syn_MAX
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class TOriginSection
|
class TOriginSection
|
||||||
@ -493,7 +473,6 @@ public:
|
|||||||
|
|
||||||
int parseOperand(MerlinLine &line);
|
int parseOperand(MerlinLine &line);
|
||||||
int getAddrMode(MerlinLine &line);
|
int getAddrMode(MerlinLine &line);
|
||||||
string addrModeEnglish(int mode);
|
|
||||||
void setOpcode(MerlinLine &line, uint8_t op);
|
void setOpcode(MerlinLine &line, uint8_t op);
|
||||||
|
|
||||||
|
|
||||||
|
@ -599,6 +599,9 @@ int CLASS::doBase6502(MerlinLine & line, TSymbol & sym)
|
|||||||
case syn_absy:
|
case syn_absy:
|
||||||
amode = 6;
|
amode = 6;
|
||||||
break;
|
break;
|
||||||
|
//case syn_none:
|
||||||
|
// printf("syn_none on ROR OP_A\n");
|
||||||
|
// break;
|
||||||
default:
|
default:
|
||||||
err = true;
|
err = true;
|
||||||
break;
|
break;
|
||||||
|
@ -967,7 +967,7 @@ int CLASS::doASC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("bug\n");
|
//printf("bug\n"); // SGQ BUG - still not working right
|
||||||
// invert last byte of last string (old merlin way (pre-merlin16+))
|
// invert last byte of last string (old merlin way (pre-merlin16+))
|
||||||
if (dci && (i == lastdelimidx))
|
if (dci && (i == lastdelimidx))
|
||||||
{
|
{
|
||||||
|
5
qasm.cpp
5
qasm.cpp
@ -72,6 +72,11 @@ void CLASS::showerror(int ecode, std::string fname)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CLASS::displayHelp()
|
||||||
|
{
|
||||||
|
PAL_BASEAPP::displayHelp();
|
||||||
|
printf("\n\t\t...remembering Glen Bredon\n\n");
|
||||||
|
}
|
||||||
// int main(int argc, char *argv[])
|
// int main(int argc, char *argv[])
|
||||||
// this is where libpal calls to run a command line program
|
// this is where libpal calls to run a command line program
|
||||||
int CLASS::runCommandLineApp(void)
|
int CLASS::runCommandLineApp(void)
|
||||||
|
1
qasm.h
1
qasm.h
@ -26,6 +26,7 @@ protected:
|
|||||||
virtual int runServerApp(PAL_EVENTMANAGER *em);
|
virtual int runServerApp(PAL_EVENTMANAGER *em);
|
||||||
#endif
|
#endif
|
||||||
virtual void displayVersion();
|
virtual void displayVersion();
|
||||||
|
virtual void displayHelp();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
80
qoptions.h
80
qoptions.h
@ -31,6 +31,27 @@ using namespace Poco;
|
|||||||
#define OPTION_M32_VARS 0x4000
|
#define OPTION_M32_VARS 0x4000
|
||||||
#define OPTION_M16_PLUS 0x8000
|
#define OPTION_M16_PLUS 0x8000
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
syn_err = -1, // error - not recognized
|
||||||
|
syn_none = 0, // should never be returned 0
|
||||||
|
syn_implied, // no operand 1
|
||||||
|
syn_s, // expr,s 2
|
||||||
|
syn_sy, // (expr,s),y 3
|
||||||
|
syn_imm, // #expr 4
|
||||||
|
syn_diix, // (expr,x) 5
|
||||||
|
syn_diiy, // (expr),y 6
|
||||||
|
syn_di, // (expr) 7
|
||||||
|
syn_iyl, // [expr],y 8
|
||||||
|
syn_dil, // [expr] 9
|
||||||
|
syn_absx, // expr,x 10
|
||||||
|
syn_absy, // expr,y 11
|
||||||
|
syn_bm, // block move 12
|
||||||
|
syn_abs, // expr 13
|
||||||
|
|
||||||
|
syn_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class myLayeredConfiguration : public Poco::Util::LayeredConfiguration
|
class myLayeredConfiguration : public Poco::Util::LayeredConfiguration
|
||||||
{
|
{
|
||||||
@ -522,7 +543,7 @@ public:
|
|||||||
string pn=Poco::toUpper(lang);
|
string pn=Poco::toUpper(lang);
|
||||||
if ((old!=pn) || (force))
|
if ((old!=pn) || (force))
|
||||||
{
|
{
|
||||||
printf("setting language options to %s\n",pn.c_str());
|
//printf("setting language options to %s\n",pn.c_str());
|
||||||
language=pn;
|
language=pn;
|
||||||
setCurrent();
|
setCurrent();
|
||||||
if (pn=="QASM")
|
if (pn=="QASM")
|
||||||
@ -657,6 +678,63 @@ public:
|
|||||||
return(res);
|
return(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string addrModeEnglish(int mode)
|
||||||
|
{
|
||||||
|
string res="<none>";
|
||||||
|
switch(mode)
|
||||||
|
{
|
||||||
|
case syn_err:
|
||||||
|
res="error";
|
||||||
|
break;
|
||||||
|
case syn_none:
|
||||||
|
res="<none>";
|
||||||
|
break;
|
||||||
|
case syn_implied:
|
||||||
|
res="impl";
|
||||||
|
break;
|
||||||
|
case syn_s:
|
||||||
|
res="dp,s";
|
||||||
|
break;
|
||||||
|
case syn_sy:
|
||||||
|
res="(dp,s),y";
|
||||||
|
break;
|
||||||
|
case syn_imm:
|
||||||
|
res="#imme";
|
||||||
|
break;
|
||||||
|
case syn_diix:
|
||||||
|
res="(dp,x)";
|
||||||
|
break;
|
||||||
|
case syn_diiy:
|
||||||
|
res="(dp),y";
|
||||||
|
break;
|
||||||
|
case syn_di:
|
||||||
|
res="(dp)";
|
||||||
|
break;
|
||||||
|
case syn_iyl:
|
||||||
|
res="[expr],y";
|
||||||
|
break;
|
||||||
|
case syn_dil:
|
||||||
|
res="[expr]";
|
||||||
|
break;
|
||||||
|
case syn_absx:
|
||||||
|
res="abs,x";
|
||||||
|
break;
|
||||||
|
case syn_absy:
|
||||||
|
res="abs,y";
|
||||||
|
break;
|
||||||
|
case syn_bm:
|
||||||
|
res="blkmv";
|
||||||
|
break;
|
||||||
|
case syn_abs:
|
||||||
|
res="abs";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
res="unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
10
runtests.sh
10
runtests.sh
@ -29,9 +29,9 @@ for S in $SRC ; do
|
|||||||
BASE=${BASE/.s/}
|
BASE=${BASE/.s/}
|
||||||
#./qasm -o 0/$OUTDIR/$S1 ./testdata/$S
|
#./qasm -o 0/$OUTDIR/$S1 ./testdata/$S
|
||||||
|
|
||||||
./qasm -l -t merlin32 -i M65816 -o 0/$OUTDIR/$S1 ./testdata/$S >> $TMPFILE
|
X="./qasm -q -c -t merlin32 -i M65816 -o 0/$OUTDIR/$S1 ./testdata/$S"
|
||||||
|
|
||||||
X="./qasm -l -t merlin32 -i M65816 -o 0/$OUTDIR/$S1 ./testdata/$S"
|
$X >$TMPFILE
|
||||||
#echo $X
|
#echo $X
|
||||||
|
|
||||||
R=?$
|
R=?$
|
||||||
@ -71,9 +71,9 @@ for S in $SRC ; do
|
|||||||
echo " $S"
|
echo " $S"
|
||||||
|
|
||||||
FAILCT=$(($FAILCT+1))
|
FAILCT=$(($FAILCT+1))
|
||||||
cat $TMPFILE
|
#cat $TMPFILE
|
||||||
echo $X
|
#echo $X
|
||||||
exit 255
|
#exit 255
|
||||||
else
|
else
|
||||||
printf "PASS: "
|
printf "PASS: "
|
||||||
fi
|
fi
|
||||||
|
Loading…
x
Reference in New Issue
Block a user