X-Git-Url: https://jxself.org/git/?p=zilutils.git;a=blobdiff_plain;f=zilasm%2Fmain.cpp;fp=zilasm%2Fmain.cpp;h=e7bd734b755f1906d51f1f1c05b49c13417903db;hp=68846b03da7fb491cf82c6861d67baf59a8bdc8b;hb=b1f151e1500e1fdadafaab6b13df6e0a8f32136e;hpb=c0f515aab1285fdedb65d4582b42cc59db0c8e26 diff --git a/zilasm/main.cpp b/zilasm/main.cpp index 68846b0..e7bd734 100644 --- a/zilasm/main.cpp +++ b/zilasm/main.cpp @@ -19,41 +19,45 @@ * * SPDX-License-Identifier: AGPL-3.0-or-later */ - -#include -#include -#include -#include -#include -#include -#include -using namespace std; - - -extern "C" -{ -#include -} -#include -#include -#include -#include "config.h" -#include "header.h" -extern "C" -{ -#include "opcodes.h" -} -#include "parser.h" - - +// +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//using namespace std; +// +// +//extern "C" +//{ +//#include +//} +//#include +//#include +//#include +//#include "config.h" +//#include "header.h" +//extern "C" +//{ +//#include "opcodes.h" +//} +//#include "directives.h" +//#include "parser.h" +//#include "compiler.h" + + +#include "include_all.h" const int DEFAULT_ZVERSION = 6; enum { ZVERSION = 11, ZORKID, ZSERIAL }; -enum -{ FAIL = -1, OK = 0, NEED_RESTART = 1 }; + static struct option const long_options[] = { {"help", no_argument, NULL, 'h'}, @@ -66,152 +70,24 @@ static struct option const long_options[] = { }; -typedef struct -{ - int todo; -} Opcode_dict; -struct -{ - int zversion; /* 0 - 8 */ - int zorkid; /* 0 - 65535 */ - char zserial[7]; /* YYMMDD */ - Opcode_dict *opcode_dict; -} Config; -struct String_Table_Elem -{ - string value; // value in ASCII format - int index; -}; -class CMain -{ -public: - CMain (); - int assembly (); - void fill_config (void); - void get_arguments (int argc, char *argv[], char *envp[]); - - char *get_output_file_name (); -private: - char *m_output_file; - list < String_Table_Elem > m_string_table; - int m_code_size; - - - char *build_output_filename (const char basename[], const char *suffix); - void fill_zserial (void); - void new_file_suffix (char *result, size_t maxlen, const char *src, - const char *newsuffix); - - void output_code_section (); - - void parse_intarg (int *dest, const char name[], int min, int max, - int defval); - void parse_zserial (void); - void print_usage (int failed); - void print_version (); - void wrong_arg (const char *err, ...); - -}; - - -CMain::CMain ():m_output_file (NULL) -{ -} - -int -CMain::assembly () -{ - FILE *file = fopen (m_output_file, "wb"); - if (file) - { - program_header_reset (6); - int size = sizeof (Program_header); - Program_header.mode = 0; - Program_header.release = 1; // game version - int code_start_offset = 64; - Program_header.startPC = code_start_offset >> 2; - - m_code_size = 0; - ZMemblock *zmem_code = zmem_init (65536); - - /// write zero number of local variables - zmem_putbyte (zmem_code, 0); // number of local variables - ++m_code_size; - - // write instructions' codes - for (int i = 0; i < g_number_of_instructions; ++i) - { - for (int j = 0; j < g_codes[i]->used_size; ++j) - { - zmem_putbyte (zmem_code, g_codes[i]->contents[j]); - ++m_code_size; - } - } - - if (m_code_size & 7) - m_code_size += 8 - (m_code_size & 7); - - Program_header.dynamic_size = 8; - - //Program_header.h_file_size = 33; //sizeof(Program_header) + zmb->used_size; - - //m_code_size = 8; - - Word stringTableOffset = m_code_size; - Program_header.H_STRINGS_OFFSET = (64 + stringTableOffset) >> 3; - - int stringTableSize = 64; - Program_header.h_file_size = - (code_start_offset + m_code_size + stringTableSize) >> 3; - ZMemblock *zmb = zmem_init (Program_header.h_file_size * 8); - - for (int i = 0; i < m_code_size; ++i) - zmem_putbyte (zmb, zmem_code->contents[i]); - - zmem_destroy (zmem_code); - - //zmem_putbyte(zmb, 0); // number of local variables - //zmem_putbyte(zmb, 141); // print addr command - - //Word offset = 0; - //zmem_putbyte(zmb, (offset >> 8) & 255); - //zmem_putbyte(zmb, offset & 255); - - //zmem_putbyte(zmb, 186); // quit command - - // output zeros until string table begins - while (zmb->used_size < stringTableOffset) - zmem_putbyte (zmb, 0); - // - //// fill string table with one string - //add_string_to_string_table("Hello, World!", zmb); - - outputToFile (&Program_header, file); - fwrite (zmb->contents, zmb->allocated_size, 1, file); - fclose (file); - } - - return OK; -} - - -char * -CMain::get_output_file_name () +struct { - return m_output_file; -} - + int zversion; /* 0 - 8 */ + int zorkid; /* 0 - 65535 */ + char zserial[7]; /* YYMMDD */ + Opcode_dict *opcode_dict; +} Config; void -CMain::get_arguments (int argc, char *argv[], char *envp[]) +CCompiler::get_arguments (int argc, char *argv[], char *envp[]) { int opt = 0; while ((opt = getopt_long (argc, argv, "hVo:", long_options, NULL)) != -1) @@ -265,7 +141,7 @@ CMain::get_arguments (int argc, char *argv[], char *envp[]) void -CMain::wrong_arg (const char *err, ...) +CCompiler::wrong_arg (const char *err, ...) { if (err) { @@ -280,7 +156,7 @@ CMain::wrong_arg (const char *err, ...) void -CMain::print_version () +CCompiler::print_version () { printf (PACKAGE_STRING "\n" "License AGPLv3+: GNU AGPL version 3 or later\n" @@ -292,7 +168,7 @@ CMain::print_version () void -CMain::print_usage (int failed) +CCompiler::print_usage (int failed) { printf ("Usage: " PACKAGE_NAME " [OPTION...] [FILES...]\n" "\n" @@ -308,7 +184,7 @@ CMain::print_usage (int failed) } void -CMain::fill_zserial (void) +CCompiler::fill_zserial (void) { time_t t; struct tm *timeinfo; @@ -319,7 +195,7 @@ CMain::fill_zserial (void) void -CMain::fill_config (void) +CCompiler::fill_config (void) { bzero (&Config, sizeof (Config)); Config.zversion = DEFAULT_ZVERSION; @@ -328,7 +204,7 @@ CMain::fill_config (void) void -CMain::parse_intarg (int *dest, const char name[], int min, int max, +CCompiler::parse_intarg (int *dest, const char name[], int min, int max, int defval) { if (!optarg) @@ -348,7 +224,7 @@ CMain::parse_intarg (int *dest, const char name[], int min, int max, void -CMain::parse_zserial (void) +CCompiler::parse_zserial (void) { if (!optarg) { @@ -372,7 +248,7 @@ CMain::parse_zserial (void) void -CMain::new_file_suffix (char *result, size_t maxlen, const char *src, +CCompiler::new_file_suffix (char *result, size_t maxlen, const char *src, const char *newsuffix) { strncpy (result, src, maxlen); @@ -392,7 +268,7 @@ CMain::new_file_suffix (char *result, size_t maxlen, const char *src, char * -CMain::build_output_filename (const char basename[], const char *suffix) +CCompiler::build_output_filename (const char basename[], const char *suffix) { int n = strlen (basename) + strlen (suffix); char *ofile = (char *) malloc (n + 1); /* todo!!! check for NULL. free. */ @@ -410,24 +286,22 @@ init_assembly (void) void -CMain::output_code_section () +CCompiler::output_code_section () { } - int main (int argc, char *argv[], char *envp[]) { - CMain main; + CCompiler compiler; - main.fill_config (); - main.get_arguments (argc, argv, envp); + compiler.fill_config (); + compiler.get_arguments (argc, argv, envp); init_opcodes (Config.zversion, 0); - init_parser (); - + //for (int i = optind; i < argc; i++) // parse_file(argv[i]); @@ -452,12 +326,12 @@ main (int argc, char *argv[], char *envp[]) } g_parsing_contexts.push(pc); - parse_file();// argv[optind]); - if ( !g_haveErrors ) - main.assembly (); + compiler.parser.parse_file();// argv[optind]); + if ( !compiler.parser.have_errors()) + compiler.assembly (); /* TODO! List global symbols */ /* TODO! Find abbreviations */ - relase_parser (); + //relase_parser (); return 0; }