mirror of
https://github.com/marketideas/qasm.git
synced 2025-01-13 20:32:14 +00:00
merge of HEX
This commit is contained in:
parent
f3eb63888d
commit
e34a58d6d6
34
asm.cpp
34
asm.cpp
@ -366,7 +366,9 @@ void CLASS::complete(void)
|
||||
uint64_t n = GetTickCount();
|
||||
if (isDebug())
|
||||
{
|
||||
printf("Processing Time: %lu ms\n", n - starttime);
|
||||
//cout << "Processing Time: " << n - starttime << "ms" << endl;
|
||||
printf("Processing Time: %" PRIu64 " ms\n",n-starttime);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -507,8 +509,7 @@ int CLASS::processfile(std::string p, std::string &newfilename)
|
||||
{
|
||||
// is this the first file in the compilation, or a PUT/USE?
|
||||
// if first, change CWD to location of file
|
||||
//LOG_DEBUG << "Changing directory to: " << dir << endl;
|
||||
|
||||
LOG_DEBUG << "Changing directory to: " << dir << endl;
|
||||
chdir(dir.c_str()); // change directory to where the file is
|
||||
}
|
||||
|
||||
@ -563,7 +564,6 @@ int CLASS::processfile(std::string p, std::string &newfilename)
|
||||
//fprintf(stderr, "Unable to access file: %s\n", p1.c_str());
|
||||
|
||||
errorct = 1;
|
||||
chdir(currentdir.c_str()); // change directory to where the file is
|
||||
return (ecode);
|
||||
}
|
||||
|
||||
@ -579,8 +579,6 @@ int CLASS::processfile(std::string p, std::string &newfilename)
|
||||
{
|
||||
if (*itr == p1)
|
||||
{
|
||||
chdir(currentdir.c_str()); // change directory to where the file is
|
||||
|
||||
return (-9);
|
||||
}
|
||||
}
|
||||
@ -649,9 +647,8 @@ int CLASS::processfile(std::string p, std::string &newfilename)
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
||||
}
|
||||
chdir(currentdir.c_str());
|
||||
//printf("\n\nfile read result: %d\n", res);
|
||||
return (res);
|
||||
}
|
||||
|
||||
@ -938,7 +935,7 @@ void CLASS::showSymbolTable(bool alpha)
|
||||
std::map<std::string, uint32_t> alphamap;
|
||||
std::map<uint32_t, std::string> nummap;
|
||||
|
||||
int columns = 4;
|
||||
int columns = 2;
|
||||
int column = columns;
|
||||
|
||||
for (auto itr = symbols.begin(); itr != symbols.end(); itr++)
|
||||
@ -954,7 +951,7 @@ void CLASS::showSymbolTable(bool alpha)
|
||||
|
||||
for (auto itr = alphamap.begin(); itr != alphamap.end(); ++itr)
|
||||
{
|
||||
printf("%-16s 0x%08X ", itr->first.c_str(), itr->second);
|
||||
printf("%-16s 0x%08X ", itr->first.c_str(), itr->second);
|
||||
if ( !--column )
|
||||
{
|
||||
printf("\n");
|
||||
@ -967,7 +964,7 @@ void CLASS::showSymbolTable(bool alpha)
|
||||
printf("\n\nSymbol table sorted numerically:\n\n");
|
||||
for (auto itr = nummap.begin(); itr != nummap.end(); ++itr)
|
||||
{
|
||||
printf("0x%08X %-16s ", itr->first, itr->second.c_str());
|
||||
printf("0x%08X %-16s ", itr->first, itr->second.c_str());
|
||||
if ( !--column )
|
||||
{
|
||||
printf("\n");
|
||||
@ -1201,6 +1198,11 @@ void CLASS::complete(void)
|
||||
{
|
||||
if (errorct == 0)
|
||||
{
|
||||
std::string currentdir = Poco::Path::current();
|
||||
|
||||
savepath = processFilename(savepath, currentdir, 0);
|
||||
printf("saving to file: %s\n", savepath.c_str());
|
||||
|
||||
std::ofstream f(savepath);
|
||||
|
||||
uint32_t lineno = 0;
|
||||
@ -1249,7 +1251,9 @@ int CLASS::evaluate(MerlinLine &line, std::string expr, int64_t &value)
|
||||
if (isDebug() > 2)
|
||||
{
|
||||
int c = SetColor(CL_RED);
|
||||
printf("eval Error=%d %08lX |%s|\n", res, result, eval.badsymbol.c_str());
|
||||
cout << "eval Error=" << res << "0x" << std::hex << result << std::dec << eval.badsymbol << endl;
|
||||
|
||||
//printf("eval Error=%d %08lX |%s|\n", res, result, eval.badsymbol.c_str());
|
||||
SetColor(c);
|
||||
}
|
||||
}
|
||||
@ -1259,7 +1263,8 @@ int CLASS::evaluate(MerlinLine &line, std::string expr, int64_t &value)
|
||||
value = result;
|
||||
if ((listing) && (pass > 0) && (isDebug() > 2))
|
||||
{
|
||||
printf("EV1=%08lX '%c'\n", v1, line.expr_shift);
|
||||
cout << "EV1=0x" << std::hex << v1 << " '" << std::dec << line.expr_shift << ";" << endl;
|
||||
//printf("EV1=%08lX '%c'\n", v1, line.expr_shift);
|
||||
}
|
||||
if (v1 >= 0x10000)
|
||||
{
|
||||
@ -1278,7 +1283,8 @@ int CLASS::evaluate(MerlinLine &line, std::string expr, int64_t &value)
|
||||
}
|
||||
if (isDebug() >= 3)
|
||||
{
|
||||
printf("Eval Result: %08lX (status=%d)\n", value, res);
|
||||
cout << "Eval Result: 0x" << std::hex << value << std::dec << "(status=" << res << ")" << endl;
|
||||
//printf("Eval Result: %08lX (status=%d)\n", value, res);
|
||||
}
|
||||
return (res);
|
||||
}
|
||||
|
@ -700,7 +700,7 @@ void CLASS::insertOpcodes(void)
|
||||
pushopcode("EXT", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("ENT", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("ORG", P_ORG, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("DSK", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("DSK", P_SAV, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("SAV", P_SAV, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("DS", P_DS, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("REL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
@ -736,7 +736,7 @@ void CLASS::insertOpcodes(void)
|
||||
pushopcode("DB", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("ADR", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("ADRL", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("HEX", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("HEX", P_HEX, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("DS", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("DO", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
pushopcode("ELSE", 0x00, OP_PSUEDO, OPHANDLER(&CLASS::doPSEUDO));
|
||||
|
89
psuedo.cpp
89
psuedo.cpp
@ -17,7 +17,7 @@ int CLASS::doDS(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||
{
|
||||
int res = 0;
|
||||
int32_t v = line.expr_value;
|
||||
if (line.eval_result!=0)
|
||||
if (line.eval_result != 0)
|
||||
{
|
||||
line.setError(errForwardRef);
|
||||
}
|
||||
@ -29,13 +29,13 @@ int CLASS::doDS(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||
{
|
||||
res = v;
|
||||
|
||||
if (a.pass>0)
|
||||
if (a.pass > 0)
|
||||
{
|
||||
for (int i=0;i<v;i++)
|
||||
for (int i = 0; i < v; i++)
|
||||
{
|
||||
line.outbytes.push_back(0x00);
|
||||
}
|
||||
line.outbytect=v;
|
||||
line.outbytect = v;
|
||||
}
|
||||
|
||||
}
|
||||
@ -87,6 +87,74 @@ int CLASS::doLST(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||
return (0);
|
||||
}
|
||||
|
||||
int CLASS::doHEX(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||
{
|
||||
int res = 0;
|
||||
std::vector<std::string> values;
|
||||
values.clear();
|
||||
|
||||
std::string os = Poco::toUpper(Poco::trim(line.operand));
|
||||
std::string vs = "0123456789ABCDEF";
|
||||
std::string hex = "";
|
||||
|
||||
for ( uint32_t i = 0; i < os.length(); ++i )
|
||||
{
|
||||
char c = os[i];
|
||||
|
||||
// Check for a comma if needed, and continue to next char if found
|
||||
if ( hex.length() == 0 && c == ',' )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( vs.find(c) == std::string::npos )
|
||||
{
|
||||
line.setError(errBadOperand);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Got a good char, append to hex string and see if we've got a byte
|
||||
hex.append(1, c);
|
||||
if ( hex.length() == 2 )
|
||||
{
|
||||
// Got 2 chars (1 byte), so store in values array
|
||||
values.push_back(hex);
|
||||
hex.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// We can't have an odd character dangling around!
|
||||
if ( hex.size() != 0 )
|
||||
{
|
||||
line.setError(errOverflow);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int byteCnt = (int)values.size();
|
||||
a.PC.currentpc += byteCnt;
|
||||
|
||||
if (a.pass > 0)
|
||||
{
|
||||
for ( uint32_t i = 0; i < values.size(); ++i )
|
||||
{
|
||||
std::string s = "$";
|
||||
s.append(values[i]);
|
||||
int64_t v;
|
||||
if ( 0 == a.evaluate(line, s, v) )
|
||||
{
|
||||
line.outbytes.push_back((uint8_t)v);
|
||||
}
|
||||
}
|
||||
line.outbytect = byteCnt;
|
||||
}
|
||||
else
|
||||
{
|
||||
line.pass0bytect = byteCnt;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int CLASS::ProcessOpcode(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||
{
|
||||
int res = 0;
|
||||
@ -110,24 +178,27 @@ int CLASS::ProcessOpcode(T65816Asm &a, MerlinLine &line, TSymbol &opinfo)
|
||||
res = doDUM(a, line, opinfo);
|
||||
break;
|
||||
case P_ORG:
|
||||
if (line.operand.length()>0)
|
||||
if (line.operand.length() > 0)
|
||||
{
|
||||
a.PC.orgsave=a.PC.currentpc;
|
||||
a.PC.orgsave = a.PC.currentpc;
|
||||
a.PC.currentpc = line.expr_value;
|
||||
line.startpc=line.expr_value;
|
||||
line.startpc = line.expr_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
a.PC.currentpc = a.PC.orgsave;
|
||||
line.startpc=a.PC.orgsave;
|
||||
line.startpc = a.PC.orgsave;
|
||||
}
|
||||
break;
|
||||
case P_SAV:
|
||||
a.savepath = line.operand;
|
||||
a.savepath = a.processFilename(line.operand, Poco::Path::current(), 0);
|
||||
break;
|
||||
case P_LST:
|
||||
res = doLST(a, line, opinfo);
|
||||
break;
|
||||
case P_HEX:
|
||||
res = doHEX(a, line, opinfo);
|
||||
break;
|
||||
}
|
||||
return (res);
|
||||
}
|
||||
|
5
psuedo.h
5
psuedo.h
@ -13,6 +13,7 @@ enum
|
||||
P_DS,
|
||||
P_PUT,
|
||||
P_USE,
|
||||
P_HEX,
|
||||
|
||||
P_MAX
|
||||
};
|
||||
@ -26,9 +27,7 @@ public:
|
||||
int doLST(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||
int doDUM(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||
int doDS(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||
|
||||
|
||||
|
||||
int doHEX(T65816Asm &a, MerlinLine &line, TSymbol &opinfo);
|
||||
};
|
||||
|
||||
#undef CLASS
|
1
qasm.h
1
qasm.h
@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include "inttypes.h"
|
||||
#include "palPoco.h"
|
||||
#include "pallogger.h"
|
||||
#include "eventtask.h"
|
||||
|
@ -311,9 +311,6 @@ myQuit
|
||||
|
||||
asll $1234
|
||||
|
||||
|
||||
lst off
|
||||
|
||||
lda <$fff0+24 ;zp
|
||||
lda >$fff0+24 ;ABS (lo word)
|
||||
lda ^$fff0+24 ;ABS (hi word)
|
||||
@ -363,6 +360,12 @@ L00BC bit L00BC
|
||||
ldx L00BC,y
|
||||
stx L00BC,y
|
||||
|
||||
* Data Storage Tests
|
||||
|
||||
hex 11,22,33,44,55,66,77,88,99
|
||||
hex 112233445566778899
|
||||
hex aabb,cc,ddee,ff
|
||||
|
||||
//]XCODEEND ; Keep this at the end and put your code above this
|
||||
;lst off
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user