mirror of https://github.com/marketideas/qasm.git
now able to push all test scripts to a directory that can be shared with gsplus, and files directly loaded into Merlin. Also support 'CHK' p-op to compare assemblies between the two
This commit is contained in:
parent
6571f2de07
commit
e687507a3b
4
Makefile
4
Makefile
|
@ -35,14 +35,14 @@ cider:
|
||||||
-mkdir -p ./build
|
-mkdir -p ./build
|
||||||
-cd ./build && cmake -DCIDER=1 -DCMAKE_BUILD_TYPE=DEBUG .. && $(MAKE) $S
|
-cd ./build && cmake -DCIDER=1 -DCMAKE_BUILD_TYPE=DEBUG .. && $(MAKE) $S
|
||||||
|
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
-rm -rf ./qasmout
|
-rm -rf ./qasmout
|
||||||
-rm -rf ./m32out
|
-rm -rf ./m32out
|
||||||
-rm -rf ./libhfs/build ./nufxlib/build ./diskimg/build ./libpal/build
|
-rm -rf ./libhfs/build ./nufxlib/build ./diskimg/build ./libpal/build
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-rm -rf ./build *.2mg test.bin
|
-rm -rf ./build *.2mg test.bin *_Output.txt _FileInforma*.txt testdata/*.bin testdata/Finder.Data
|
||||||
|
-rm -rf ./log_qasm ./testdata1 test
|
||||||
|
|
||||||
depend:
|
depend:
|
||||||
-cd ./build && $(MAKE) depend
|
-cd ./build && $(MAKE) depend
|
||||||
|
|
114
asm.cpp
114
asm.cpp
|
@ -150,15 +150,21 @@ void CLASS::print(uint32_t lineno)
|
||||||
pcol += printf(" ");
|
pcol += printf(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string addrmode=options->addrModeEnglish(addressmode).c_str();
|
string addrmode=options->addrModeEnglish(addressmode).c_str();
|
||||||
pcol+=printf("%s ",addrmode.c_str());
|
pcol+=printf("%s ",addrmode.c_str());
|
||||||
|
pcol+=printf("/%04X ",flags);
|
||||||
|
|
||||||
while(pcol<50)
|
while(pcol<50)
|
||||||
{
|
{
|
||||||
pcol+=printf(" ");
|
pcol+=printf(" ");
|
||||||
}
|
}
|
||||||
pcol+=printf("|");
|
char sc=shiftchar;
|
||||||
|
if (sc==0)
|
||||||
|
{
|
||||||
|
sc=' ';
|
||||||
|
}
|
||||||
|
pcol+=printf("%c |",sc);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1624,57 +1630,75 @@ int CLASS::callOpCode(std::string op, MerlinLine &line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line.addressmode == syn_imm)
|
if (line.addressmode == syn_imm) //page 83 merlin16 manual
|
||||||
{
|
{
|
||||||
//printf("immediate mode\n");
|
//printf("immediate mode\n");
|
||||||
switch (line.expr_shift)
|
switch (line.shiftchar)
|
||||||
{
|
{
|
||||||
case '<':
|
case '<':
|
||||||
//line.expr_value &= 0xFF;
|
//line.expr_value &= 0xFF;
|
||||||
break;
|
break;
|
||||||
case '>':
|
case '>':
|
||||||
line.expr_value >>= 8;
|
//line.expr_value >>= 8;
|
||||||
//line.expr_value &= 0xFFFF;
|
//line.expr_value &= 0xFFFF;
|
||||||
break;
|
break;
|
||||||
case '^':
|
case '^':
|
||||||
line.expr_value = (line.expr_value >> 16);
|
//line.expr_value = (line.expr_value >> 16);
|
||||||
//line.expr_value = (line.expr_value >> 16) & 0xFFFF;
|
//line.expr_value = (line.expr_value >> 16) & 0xFFFF;
|
||||||
break;
|
break;
|
||||||
case '|':
|
case '|': // should never get here, handled in getAddrMode
|
||||||
//if (syntax == SYNTAX_MERLIN)
|
//if (syntax == SYNTAX_MERLIN)
|
||||||
if (options.isMerlin())
|
if (options.isMerlin())
|
||||||
{
|
{
|
||||||
line.setError(errBadLabel);
|
line.setError(errBadOperand);
|
||||||
line.expr_value = 0;
|
line.expr_value = 0;
|
||||||
}
|
}
|
||||||
|
//line.shiftchar=0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (line.expr_shift)
|
switch (line.shiftchar) // page 84 Merlin16 manual
|
||||||
{
|
{
|
||||||
case '<':
|
case '<':
|
||||||
line.flags |= FLAG_DP;
|
if (options.isMerlin32())
|
||||||
|
{
|
||||||
|
line.flags |= FLAG_DP;
|
||||||
|
line.expr_value &= 0xFF;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '>':
|
case '>':
|
||||||
#if 0
|
|
||||||
if (options.isMerlin32())
|
if (options.isMerlin32())
|
||||||
{
|
{
|
||||||
// bug in M32 or not, do what it does
|
// bug in M32 or not, do what it does
|
||||||
line.flags |= FLAG_FORCEABS;
|
//line.flags |= FLAG_FORCEABS;
|
||||||
|
line.flags |= FLAG_FORCELONG;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
line.flags |= FLAG_FORCELONG;
|
// Merlin16+ uses this to force long addressing
|
||||||
|
// need to check Merlin16
|
||||||
|
if (!options.isMerlin()) // not merlin8
|
||||||
|
{
|
||||||
|
line.flags |= FLAG_FORCELONG;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '|':
|
case '|':
|
||||||
line.flags |= FLAG_FORCEABS;
|
if ((!options.isMerlin32()) && (options.isMerlinCompat()))
|
||||||
|
{
|
||||||
|
line.flags |= FLAG_FORCEABS;
|
||||||
|
//line.shiftchar=0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '^':
|
case '^':
|
||||||
//line.flags |= FLAG_FORCELONG;
|
if (options.isMerlin32())
|
||||||
|
{
|
||||||
|
line.flags |= FLAG_DP;
|
||||||
|
line.expr_value >>= 16;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1737,7 +1761,7 @@ const std::string valExpression = "^([^\\[,();]+)$";
|
||||||
|
|
||||||
// this one looks for ]variables
|
// this one looks for ]variables
|
||||||
const std::string varExpression = "([]]{1}[:0-9A-Z_a-z]{1}[0-9A-Z_a-z]*)";
|
const std::string varExpression = "([]]{1}[:0-9A-Z_a-z]{1}[0-9A-Z_a-z]*)";
|
||||||
const std::string varMACExpression = "([]]{1}[:0-9]{1}[0-9]*)";
|
const std::string macExpression = "([]]{1}[:0-9]{1}[0-9]*)";
|
||||||
|
|
||||||
// opcode check. emitted opcodes are compared against this
|
// opcode check. emitted opcodes are compared against this
|
||||||
// table, and if the XC status doesn't meet the requirements
|
// table, and if the XC status doesn't meet the requirements
|
||||||
|
@ -1798,7 +1822,7 @@ void CLASS::initpass(void)
|
||||||
{
|
{
|
||||||
trackrep = false; // can't turn this ON in M16
|
trackrep = false; // can't turn this ON in M16
|
||||||
}
|
}
|
||||||
else if (options.isQASM())
|
else if (options.isNative())
|
||||||
{
|
{
|
||||||
// we will allow this to be settable default off
|
// we will allow this to be settable default off
|
||||||
trackrep = false;
|
trackrep = false;
|
||||||
|
@ -1920,30 +1944,6 @@ void CLASS::complete(void)
|
||||||
|
|
||||||
if (f.is_open())
|
if (f.is_open())
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
uint32_t lineno = 0;
|
|
||||||
uint32_t l = (uint32_t)lines.size();
|
|
||||||
while (lineno < l)
|
|
||||||
{
|
|
||||||
MerlinLine &line = lines.at(lineno++);
|
|
||||||
if ((line.outbytect > 0) && ((line.flags & FLAG_INDUM) == 0))
|
|
||||||
{
|
|
||||||
for (uint32_t i = 0; i < line.outbytect; i++)
|
|
||||||
{
|
|
||||||
f.put(line.outbytes[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((line.datafillct > 0) && ((line.flags & FLAG_INDUM) == 0))
|
|
||||||
{
|
|
||||||
for (uint32_t i = 0; i < line.datafillct; i++)
|
|
||||||
{
|
|
||||||
f.put(line.datafillbyte & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<outputbytes.size(); i++)
|
for (unsigned int i=0; i<outputbytes.size(); i++)
|
||||||
{
|
{
|
||||||
f.put(outputbytes[i]);
|
f.put(outputbytes[i]);
|
||||||
|
@ -1956,8 +1956,6 @@ void CLASS::complete(void)
|
||||||
writeerr=true;
|
writeerr=true;
|
||||||
}
|
}
|
||||||
f.close();
|
f.close();
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1980,7 +1978,7 @@ void CLASS::complete(void)
|
||||||
|
|
||||||
TFileProcessor::complete();
|
TFileProcessor::complete();
|
||||||
|
|
||||||
if (listing)
|
if ((errorct==0) && (listing) && (!options.isQuiet()))
|
||||||
{
|
{
|
||||||
showSymbolTable(true);
|
showSymbolTable(true);
|
||||||
showSymbolTable(false);
|
showSymbolTable(false);
|
||||||
|
@ -2117,10 +2115,7 @@ int CLASS::getAddrMode(MerlinLine & line)
|
||||||
{
|
{
|
||||||
modified=true;
|
modified=true;
|
||||||
}
|
}
|
||||||
if (supportbar && shiftchar=='|')
|
|
||||||
{
|
|
||||||
line.flags|=FLAG_FORCELONG;
|
|
||||||
}
|
|
||||||
if (modified)
|
if (modified)
|
||||||
{
|
{
|
||||||
line.shiftchar=shiftchar;
|
line.shiftchar=shiftchar;
|
||||||
|
@ -2142,6 +2137,17 @@ int CLASS::getAddrMode(MerlinLine & line)
|
||||||
line.strippedoperand=oper;
|
line.strippedoperand=oper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (supportbar && shiftchar=='|')
|
||||||
|
{
|
||||||
|
//if ((options.isMerlin32()) || (options.isNative()))
|
||||||
|
if (options.isMerlin32())
|
||||||
|
{
|
||||||
|
// regular Merlin16/16+ seems to accept this character, but does NOT force long (bank) addressing
|
||||||
|
line.flags|=FLAG_FORCELONG;
|
||||||
|
}
|
||||||
|
//shiftchar=0; // don't process this as a shift because we only needed to set a flag to force long addressing
|
||||||
|
}
|
||||||
|
|
||||||
idx = 0;
|
idx = 0;
|
||||||
RegularExpression valEx(valExpression, 0, true);
|
RegularExpression valEx(valExpression, 0, true);
|
||||||
|
|
||||||
|
@ -2150,7 +2156,7 @@ int CLASS::getAddrMode(MerlinLine & line)
|
||||||
s = addrRegEx[idx].regEx;
|
s = addrRegEx[idx].regEx;
|
||||||
if (s == "")
|
if (s == "")
|
||||||
{
|
{
|
||||||
mode = syn_err;
|
mode = syn_err; // no more RegX left (nothing matched)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2179,7 +2185,7 @@ int CLASS::getAddrMode(MerlinLine & line)
|
||||||
|
|
||||||
if (s != "")
|
if (s != "")
|
||||||
{
|
{
|
||||||
if ((s != "^") && (s != "<") && (s != ">") && (s != "|"))
|
//if ((s != "^") && (s != "<") && (s != ">") && (s != "|"))
|
||||||
{
|
{
|
||||||
bool v = true;
|
bool v = true;
|
||||||
if (mode == syn_abs)
|
if (mode == syn_abs)
|
||||||
|
@ -2234,7 +2240,7 @@ int CLASS::getAddrMode(MerlinLine & line)
|
||||||
ct++;
|
ct++;
|
||||||
//printf("line expression=|%s|\n", s.c_str());
|
//printf("line expression=|%s|\n", s.c_str());
|
||||||
}
|
}
|
||||||
else
|
//else
|
||||||
{
|
{
|
||||||
// SGQ need to set a flag for a shift and process it after eval
|
// SGQ need to set a flag for a shift and process it after eval
|
||||||
}
|
}
|
||||||
|
@ -2334,7 +2340,7 @@ restart:
|
||||||
sym = findVariable(s, expand_macro.variables);
|
sym = findVariable(s, expand_macro.variables);
|
||||||
if (sym!=NULL)
|
if (sym!=NULL)
|
||||||
{
|
{
|
||||||
RegularExpression varEx1(varMACExpression, 0, true);
|
RegularExpression varEx1(macExpression, 0, true);
|
||||||
Poco::RegularExpression::MatchVec mVec1;
|
Poco::RegularExpression::MatchVec mVec1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -2596,7 +2602,7 @@ void CLASS::process(void)
|
||||||
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;
|
||||||
|
|
3
asm.h
3
asm.h
|
@ -388,9 +388,10 @@ class TPsuedoOp;
|
||||||
class T65816Asm : public TFileProcessor
|
class T65816Asm : public TFileProcessor
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
std::vector<uint8_t> outputbytes;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
std::vector<uint8_t> outputbytes;
|
||||||
|
|
||||||
// options
|
// options
|
||||||
bool casesen;
|
bool casesen;
|
||||||
bool showmx;
|
bool showmx;
|
||||||
|
|
65
opcodes.cpp
65
opcodes.cpp
|
@ -654,7 +654,7 @@ int CLASS::doBase6502(MerlinLine & line, TSymbol & sym)
|
||||||
}
|
}
|
||||||
if ((m == syn_absx) || (m == syn_abs) || (m == syn_absy))
|
if ((m == syn_absx) || (m == syn_abs) || (m == syn_absy))
|
||||||
{
|
{
|
||||||
if ((line.flags & FLAG_FORCEABS) || (line.expr_value >= 0x100))
|
if ((line.flags & FLAG_FORCEABS) || (line.expr_value >= 0x100) )
|
||||||
{
|
{
|
||||||
bytelen++;
|
bytelen++;
|
||||||
amode += 2;
|
amode += 2;
|
||||||
|
@ -725,6 +725,7 @@ int CLASS::doBase6502(MerlinLine & line, TSymbol & sym)
|
||||||
{
|
{
|
||||||
if ((((line.flags & FLAG_DP) == 0) && ((line.flags & FLAG_FORCEDP) == 0))
|
if ((((line.flags & FLAG_DP) == 0) && ((line.flags & FLAG_FORCEDP) == 0))
|
||||||
|| (line.flags & FLAG_FORCEABS)
|
|| (line.flags & FLAG_FORCEABS)
|
||||||
|
|| (m==syn_absy)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
bytelen++;
|
bytelen++;
|
||||||
|
@ -806,26 +807,58 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
res += bytelen;
|
res += bytelen;
|
||||||
//if (options.isMerlin32())
|
|
||||||
{
|
|
||||||
if ((op==0xB9) || (op==0x79) || (op==0xF9) || (op==0x99))
|
|
||||||
{
|
|
||||||
// there are 4 instructions that don't have (dp),y addressing so convert to (abs),
|
|
||||||
if (bytelen<2)
|
|
||||||
{
|
|
||||||
res++;
|
|
||||||
bytelen++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((pass > 0) && (res > 0))
|
if ((pass > 0) && (res > 0))
|
||||||
{
|
{
|
||||||
|
int pidx=0;
|
||||||
|
uint8_t *ptr=(uint8_t *)&line.expr_value;
|
||||||
|
|
||||||
setOpcode(line, op);
|
setOpcode(line, op);
|
||||||
|
if (line.shiftchar!=0)
|
||||||
|
{
|
||||||
|
if (m==syn_imm)
|
||||||
|
{
|
||||||
|
switch(line.shiftchar)
|
||||||
|
{
|
||||||
|
case '>':
|
||||||
|
pidx+=1;
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
pidx+=2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch(line.shiftchar)
|
||||||
|
{
|
||||||
|
case '>':
|
||||||
|
{
|
||||||
|
if ((line.flags&FLAG_FORCELONG)!=FLAG_FORCELONG)
|
||||||
|
{
|
||||||
|
pidx+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
for (i = 0; i < (res - 1); i++)
|
for (i = 0; i < (res - 1); i++)
|
||||||
{
|
{
|
||||||
line.outbytes.push_back(line.expr_value >> (8 * i));
|
if (pidx>3) // don't over index into 32 bit int
|
||||||
|
{
|
||||||
|
line.outbytes.push_back(0x00);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
line.outbytes.push_back(ptr[pidx]);
|
||||||
|
pidx++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
line.outbytect = res;
|
line.outbytect = res;
|
||||||
}
|
}
|
||||||
|
@ -941,6 +974,7 @@ void CLASS::insertOpcodes(void)
|
||||||
pushopcode("PAG", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("PAG", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("TTL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("TTL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("SKP", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("SKP", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
|
pushopcode("PAU", P_PAU, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("TR", P_TR, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("TR", P_TR, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("ASC", P_ASC, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("ASC", P_ASC, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("DCI", P_ASC, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("DCI", P_ASC, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
|
@ -961,12 +995,11 @@ void CLASS::insertOpcodes(void)
|
||||||
pushopcode("ELSE", P_DO, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("ELSE", P_DO, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("IF", P_DO, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("IF", P_DO, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("FIN", P_DO, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("FIN", P_DO, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("CHK", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("CHK", P_CHK, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("ERR", P_ERR, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("ERR", P_ERR, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("KBD", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("KBD", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("LUP", P_LUP, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("LUP", P_LUP, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("--^", P_LUP, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("--^", P_LUP, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("PAU", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
|
||||||
pushopcode("SW", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("SW", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("USR", P_USR, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("USR", P_USR, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
pushopcode("MAC", P_MAC, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
pushopcode("MAC", P_MAC, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||||
|
|
21
parms.json
21
parms.json
|
@ -10,16 +10,29 @@
|
||||||
"1": "${QASM_BASE}"
|
"1": "${QASM_BASE}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"2": "0/object"
|
"2": "0/source"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"3": "1/macros"
|
"3": "0/object"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"4": "1/toolmacs"
|
"4": "1/macros"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"5": "../backup"
|
"5": "1/lib"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"6": "1/commands"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"7": "1/help"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"8": "object",
|
||||||
|
"volume": "0/merlin.2mg",
|
||||||
|
"size": "800K",
|
||||||
|
"format": "prodos",
|
||||||
|
"fileformat": "2mg"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
32
psuedo.cpp
32
psuedo.cpp
|
@ -777,6 +777,32 @@ out:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CLASS::doPAU(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||||
|
{
|
||||||
|
UNUSED(opinfo);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CLASS::doCHK(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||||
|
{
|
||||||
|
int res=1;
|
||||||
|
|
||||||
|
UNUSED(opinfo);
|
||||||
|
if (a.pass>0)
|
||||||
|
{
|
||||||
|
uint8_t val=0;
|
||||||
|
for (uint64_t i=0;i<a.outputbytes.size();i++)
|
||||||
|
{
|
||||||
|
val^=a.outputbytes[i];
|
||||||
|
//printf("%02X ",val);
|
||||||
|
}
|
||||||
|
line.outbytes.push_back(val);
|
||||||
|
}
|
||||||
|
line.outbytect=res;
|
||||||
|
return (res);
|
||||||
|
}
|
||||||
|
|
||||||
// the handler for STR,STRL,REV,FLS,INV,DCI,ASC
|
// the handler for STR,STRL,REV,FLS,INV,DCI,ASC
|
||||||
int CLASS::doASC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
int CLASS::doASC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||||
{
|
{
|
||||||
|
@ -1122,6 +1148,12 @@ int CLASS::ProcessOpcode(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||||
case P_USR:
|
case P_USR:
|
||||||
res = doUSR(a, line, opinfo);
|
res = doUSR(a, line, opinfo);
|
||||||
break;
|
break;
|
||||||
|
case P_PAU:
|
||||||
|
res = doPAU(a, line, opinfo);
|
||||||
|
break;
|
||||||
|
case P_CHK:
|
||||||
|
res = doCHK(a, line, opinfo);
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
return (res);
|
return (res);
|
||||||
|
|
5
psuedo.h
5
psuedo.h
|
@ -23,6 +23,8 @@ enum
|
||||||
P_MAC,
|
P_MAC,
|
||||||
P_CAS,
|
P_CAS,
|
||||||
P_USR,
|
P_USR,
|
||||||
|
P_PAU,
|
||||||
|
P_CHK,
|
||||||
|
|
||||||
P_MAX
|
P_MAX
|
||||||
};
|
};
|
||||||
|
@ -46,6 +48,9 @@ public:
|
||||||
int doASC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
int doASC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||||
int doMAC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
int doMAC(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||||
int doUSR(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
int doUSR(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||||
|
int doPAU(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||||
|
int doCHK(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -367,7 +367,7 @@ public:
|
||||||
}
|
}
|
||||||
return(res);
|
return(res);
|
||||||
}
|
}
|
||||||
bool isQASM(void)
|
bool isNative(void) // use this as we are running in 'native/qasm' mode so we can add special options
|
||||||
{
|
{
|
||||||
bool res=false;
|
bool res=false;
|
||||||
if (language=="QASM")
|
if (language=="QASM")
|
||||||
|
|
|
@ -5,6 +5,8 @@ TMPFILE=/tmp/qasm_out.txt
|
||||||
|
|
||||||
rm -f $TMPFILE
|
rm -f $TMPFILE
|
||||||
rm -rf $OUTDIR
|
rm -rf $OUTDIR
|
||||||
|
rm -rf ./testdata/*.bin
|
||||||
|
|
||||||
mkdir -p $OUTDIR
|
mkdir -p $OUTDIR
|
||||||
|
|
||||||
SRC=`ls ./testdata | grep -E '^([0-9]+)(.*)\.[Ss]'`
|
SRC=`ls ./testdata | grep -E '^([0-9]+)(.*)\.[Ss]'`
|
||||||
|
@ -17,6 +19,7 @@ SRC=`ls ./testdata | grep -E '^([0-9]+)(.*)\.[Ss]'`
|
||||||
TOTAL=0
|
TOTAL=0
|
||||||
FAILCT=0
|
FAILCT=0
|
||||||
|
|
||||||
|
|
||||||
for S in $SRC ; do
|
for S in $SRC ; do
|
||||||
|
|
||||||
rm -f $TMPFILE
|
rm -f $TMPFILE
|
||||||
|
|
|
@ -8,9 +8,10 @@ fi
|
||||||
cp testdata/$FNAME.S /tmp
|
cp testdata/$FNAME.S /tmp
|
||||||
|
|
||||||
cd /tmp
|
cd /tmp
|
||||||
OUTNAME=compare.txt
|
OUTNAME=/tmp/compare.txt
|
||||||
merlin32 -V ${FNAME}.S >/dev/null
|
merlin32 -V ${FNAME}.S >/dev/null
|
||||||
cat ${FNAME}_Output.txt >OUTNAME
|
cat ${FNAME}_Output.txt >OUTNAME
|
||||||
|
cat ${FNAME}_Output.txt
|
||||||
|
|
||||||
qasm ${FNAME}.S -t merlin32 -i M65816 -o 0/${FNAME}.S.bin
|
qasm ${FNAME}.S -t merlin32 -i M65816 -o 0/${FNAME}.S.bin
|
||||||
qasm ${FNAME}.S -t qasm -i M65816 -o 0/${FNAME}.S_q.bin
|
qasm ${FNAME}.S -t qasm -i M65816 -o 0/${FNAME}.S_q.bin
|
||||||
|
|
68
test.s
68
test.s
|
@ -10,14 +10,9 @@
|
||||||
xc off
|
xc off
|
||||||
xc
|
xc
|
||||||
xc
|
xc
|
||||||
lst
|
|
||||||
;lst OFF
|
|
||||||
ZP equ $00
|
ZP equ $00
|
||||||
org $2000
|
org $2000
|
||||||
lda $04,y
|
|
||||||
adc $04,y
|
|
||||||
sbc $04,y
|
|
||||||
sta $04,y
|
|
||||||
|
|
||||||
lda <$fff0 ;zp
|
lda <$fff0 ;zp
|
||||||
lda >$fff0 ;ABS (lo word)
|
lda >$fff0 ;ABS (lo word)
|
||||||
|
@ -29,31 +24,35 @@ ZP equ $00
|
||||||
lda >$fff0+24 ;ABS (lo word)
|
lda >$fff0+24 ;ABS (lo word)
|
||||||
lda ^$fff0+24 ;ABS (hi word)
|
lda ^$fff0+24 ;ABS (hi word)
|
||||||
lda |$fff0+24 ;ABS (long in 65816 mode)
|
lda |$fff0+24 ;ABS (long in 65816 mode)
|
||||||
|
ldal $fff0+24 ;ABS (long in 65816 mode)
|
||||||
|
lda: $fff0+24 ;ABS (long in 65816 mode)
|
||||||
|
lda: $00
|
||||||
|
|
||||||
|
mx %11
|
||||||
lda #<$fff0 ;zp
|
lda #<$fff0 ;zp
|
||||||
lda #>$fff0 ;ABS (lo word)
|
lda #>$fff0 ;ABS (lo word)
|
||||||
lda #^$fff0 ;ABS (hi word)
|
lda #^$fff0 ;ABS (hi word)
|
||||||
lda #<$FFF0+$FFFF
|
lda #<$FFF0+$FFFF
|
||||||
lda #>$FFF0+$FFFF
|
lda #>$FFF0+$FFFF
|
||||||
|
lda #^$FFF0+$FFFF
|
||||||
|
|
||||||
|
mx %00
|
||||||
|
lda #<$fff0 ;zp
|
||||||
|
lda #>$fff0 ;ABS (lo word)
|
||||||
|
lda #^$fff0 ;ABS (hi word)
|
||||||
|
lda #<$FFF0+$FFFF
|
||||||
|
lda #>$FFF0+$FFFF
|
||||||
|
lda #^$FFF0+$FFFF
|
||||||
|
|
||||||
|
|
||||||
lst off
|
|
||||||
;end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ora ($00)
|
ora ($00)
|
||||||
lda ($00)
|
lda ($00)
|
||||||
bit: $FFFE,X
|
bit: $FFFE,X
|
||||||
ror: $FFFE,X
|
ror: $FFFE,X
|
||||||
ora #ZP
|
ora #ZP
|
||||||
begin
|
begin
|
||||||
;]m equ *
|
;]m equ *
|
||||||
; lda begin
|
lda begin
|
||||||
; lda ]m
|
;lda ]m
|
||||||
;lst on
|
|
||||||
;end
|
|
||||||
|
|
||||||
_mymac mac
|
_mymac mac
|
||||||
]mac1 lda ]mac1
|
]mac1 lda ]mac1
|
||||||
|
@ -64,7 +63,6 @@ _mymac mac
|
||||||
_ascmac mac
|
_ascmac mac
|
||||||
asc ]1,]2,8D
|
asc ]1,]2,8D
|
||||||
eom
|
eom
|
||||||
;lst off
|
|
||||||
;var 'one';'two';'three'
|
;var 'one';'two';'three'
|
||||||
justlable ;line with just a lable
|
justlable ;line with just a lable
|
||||||
start
|
start
|
||||||
|
@ -73,23 +71,31 @@ another lda #$00 ;line with everything
|
||||||
nop ;line with just opcode
|
nop ;line with just opcode
|
||||||
_mymac *;1
|
_mymac *;1
|
||||||
_mymac *;2
|
_mymac *;2
|
||||||
_ascmac 'hello';'there'
|
;_ascmac 'hello';'there'
|
||||||
|
|
||||||
lup 2
|
|
||||||
]m equ *
|
|
||||||
nop
|
|
||||||
lda ]m
|
|
||||||
bra ]m
|
|
||||||
--^
|
|
||||||
sav 2/test.bin
|
|
||||||
end
|
|
||||||
|
|
||||||
|
;lup 2
|
||||||
|
;]m equ *
|
||||||
|
;nop
|
||||||
|
;lda ]m
|
||||||
|
;bra ]m
|
||||||
|
;--^
|
||||||
|
|
||||||
]1 nop
|
]1 nop
|
||||||
nop
|
nop
|
||||||
;lst
|
;bra ]1
|
||||||
bra ]1
|
|
||||||
|
|
||||||
;typ $06
|
;typ $06
|
||||||
db 255
|
db 255
|
||||||
;lst off
|
]DPNOP equ $80
|
||||||
|
lda ]DPNOP
|
||||||
|
jsr DPCODE
|
||||||
|
rts
|
||||||
|
org $0080
|
||||||
|
DPCODE nop
|
||||||
|
lda DPCODE
|
||||||
|
lda |DPCODE
|
||||||
|
lda >DPCODE
|
||||||
|
|
||||||
|
lst
|
||||||
|
chk
|
||||||
|
lst off
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
../test.s
|
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
rm -rf ./testdata1/*
|
||||||
|
cp -r ./testdata/*.S testdata1/
|
||||||
|
cd ./testdata1
|
||||||
|
X=`ls *.S`
|
||||||
|
|
||||||
|
for F in $X ; do
|
||||||
|
UFNAME=`echo $F | tr '[:lower:]' '[:upper:]'`
|
||||||
|
qasm -x format-merlin $F >${UFNAME}
|
||||||
|
rm -rf $F
|
||||||
|
done
|
||||||
|
ls
|
Loading…
Reference in New Issue