qasm/qasm.cpp

200 lines
3.7 KiB
C++
Raw Normal View History

2019-11-11 23:56:03 +00:00
#include "app.h"
#include "asm.h"
2019-11-17 02:27:19 +00:00
#ifdef CIDERPRESS
2019-11-17 01:36:22 +00:00
#include "DiskImg.h"
2019-11-17 02:27:19 +00:00
#endif
2019-11-11 23:56:03 +00:00
#define CLASS PAL_APPCLASS
// return a pointer to the actual Application class
PAL_BASEAPP *PAL::appFactory(void)
{
return (new CLASS());
}
// you MUST supply this array 'appOptions'. NULL line and end.
programOption PAL::appOptions[] =
{
2019-11-15 12:23:55 +00:00
#ifdef DEBUG
2019-11-11 23:56:03 +00:00
{ "debug", "d", "enable debug info (repeat for more verbosity)", "", false, true},
2019-11-15 12:23:55 +00:00
#endif
2019-11-19 17:59:03 +00:00
//{ "config", "f", "load configuration data from a <file>", "<file>", false, false},
{ "exec", "x", "execute a command [asm, link, reformat] default=asm", "<command>", false, false},
{ "objfile", "o", "write output to file", "<file>", false, false},
{ "syntax", "s", "enforce syntax of other assembler [merlin16, merlin32]", "<syntax>", false, false},
2019-11-17 22:15:45 +00:00
2019-11-11 23:56:03 +00:00
{ "", "", "", "", false, false}
};
2019-11-15 10:48:58 +00:00
void CLASS::displayVersion()
{
2019-11-15 10:56:43 +00:00
std::string s = "";
#ifdef DEBUG
s = "-debug";
#endif
cerr << "quickASM 16++ v" << (std::string)STRINGIFY(APPVERSION) << s << endl;
2019-11-17 02:27:19 +00:00
#ifdef CIDERPRESS
DiskImgLib::Global::AppInit();
DiskImgLib::DiskImg prodos;
DiskImgLib::Global::AppCleanup();
#endif
2019-11-15 10:48:58 +00:00
}
2019-11-11 23:56:03 +00:00
int CLASS::runServerApp(PAL_EVENTMANAGER *em)
{
int res = -1;
if (em != NULL)
{
PAL_BASEAPP::runServerApp(em);
2019-11-12 18:13:15 +00:00
#if 0
2019-11-11 23:56:03 +00:00
PAL_HTTPSERVERTASK *server = new PAL_HTTPSERVERTASK("httptask");
if (server != NULL)
{
em->startTask(server);
server->initServer(getConfig("http.listen", "0.0.0.0:9080"), false, 64);
res = 0;
}
2019-11-12 18:13:15 +00:00
#endif
2019-11-11 23:56:03 +00:00
}
return (res);
}
2019-11-14 17:43:27 +00:00
void CLASS::showerror(int ecode, std::string fname)
{
std::string s;
switch (ecode)
{
case -2:
s = "Permission Denied";
break;
case -3:
s = "File not found";
break;
default:
s = "Unknown Error";
break;
}
2019-11-14 18:47:50 +00:00
if (ecode < -1)
{
std::string a = Poco::Util::Application::instance().config().getString("application.name", "");
fprintf(stderr, "%s: %s: %s\n", a.c_str(), fname.c_str(), s.c_str());
}
2019-11-14 17:43:27 +00:00
}
2019-11-11 23:56:03 +00:00
int CLASS::runCommandLineApp(void)
{
TFileProcessor *t = NULL;
std::string line;
2019-11-14 05:56:50 +00:00
std::string startdirectory;
2019-11-14 18:47:50 +00:00
std::string fname;
2019-11-11 23:56:03 +00:00
int res = -1;
2019-11-14 05:56:50 +00:00
startdirectory = Poco::Path::current();
2019-11-15 10:48:58 +00:00
2019-11-14 05:56:50 +00:00
if (commandargs.size() == 0)
{
2019-11-15 10:56:43 +00:00
displayHelp();
2019-11-14 05:56:50 +00:00
return (res);
}
2019-11-11 23:56:03 +00:00
for (ArgVec::const_iterator it = commandargs.begin(); it != commandargs.end(); ++it)
{
Poco::File fn(*it);
2019-11-14 17:32:11 +00:00
int x;
2019-11-11 23:56:03 +00:00
std::string p = fn.path();
Poco::Path path(p);
2019-11-14 06:03:34 +00:00
//logger().information(path.toString());
2019-11-11 23:56:03 +00:00
std::string e = toUpper(path.getExtension());
std::string cmd = Poco::toUpper(getConfig("option.exec", "asm"));
2019-11-11 23:56:03 +00:00
if (cmd.length() > 0)
2019-11-11 23:56:03 +00:00
{
if (cmd == "REFORMAT")
{
res = 0;
t = new TMerlinConverter();
if (t != NULL)
{
2019-11-14 05:56:50 +00:00
try
{
t->init();
std::string f = path.toString();
2019-11-14 17:43:27 +00:00
t->filename = f;
2019-11-15 10:48:58 +00:00
x = t->processfile(f, fname);
2019-11-14 17:32:11 +00:00
if (x == 0)
2019-11-14 15:28:42 +00:00
{
t->process();
t->complete();
}
2019-11-14 17:32:11 +00:00
else
{
2019-11-14 18:47:50 +00:00
showerror(x, fname);
2019-11-14 17:43:27 +00:00
t->errorct = 1;
2019-11-14 17:32:11 +00:00
}
2019-11-14 05:56:50 +00:00
res = (t->errorct > 0) ? -1 : 0;
}
catch (...)
{
delete t;
t = NULL;
}
}
}
else if (cmd == "ASM")
{
2019-11-14 17:32:11 +00:00
int x;
2019-11-14 15:28:42 +00:00
t = new T65816Asm();
if (t != NULL)
{
2019-11-14 05:56:50 +00:00
try
{
t->init();
std::string f = path.toString();
2019-11-14 17:43:27 +00:00
t->filename = f;
2019-11-15 10:48:58 +00:00
x = t->processfile(f, fname);
2019-11-14 17:43:27 +00:00
f = t->filename;
2019-11-14 17:32:11 +00:00
if (x == 0)
2019-11-14 15:28:42 +00:00
{
t->process();
t->complete();
}
2019-11-14 17:32:11 +00:00
else
{
2019-11-14 18:47:50 +00:00
showerror(x, fname);
2019-11-14 17:43:27 +00:00
t->errorct = 1;
2019-11-14 17:32:11 +00:00
}
2019-11-14 05:56:50 +00:00
res = (t->errorct > 0) ? -1 : 0;
}
catch (...)
{
delete t;
t = NULL;
}
2019-11-15 11:40:35 +00:00
if (chdir(startdirectory.c_str())) {}; // return us back to where we were
}
else
{
printf("not supported type\n");
}
}
else
{
2019-11-14 05:56:50 +00:00
fprintf(stderr, "Invalid command: <%s>\n\n", cmd.c_str());
}
2019-11-11 23:56:03 +00:00
}
}
return (res);
}