#include <stdio.h>
#include <string.h>

void insert (FILE *dest, char opcode)
{
  fwrite (&opcode, 1, 1, dest);
}

int main (int argc, char *argv[])
{
  FILE *src, *dest;
  char character, mnemonic[32] = {0};
  int i;
  if (argc > 2)
  {
    src = fopen (argv[1], "r");
    dest = fopen (argv[2], "wb");
    if (src && dest)
    {
      while (!feof (src))
      {
        character = fgetc (src);
        if (character == '#')
          while (character != '\n' && !feof (src))
            character = fgetc (src);
        else if (character == '_')
        {
          for (i = 0; i < 32; i++)
            mnemonic[i] = 0;
          i = 0;
          do
          {
            character = fgetc (src);
            if (character >= 'a' && character <= 'z')
              mnemonic[i++] = character;
          }
          while (character >= 'a' && character <= 'z' && i < 31 && !feof (src));
          if (!strcmp (mnemonic, "nopo"))
            insert (dest, 0);
          else if (!strcmp (mnemonic, "ld"))
            insert (dest, 1);
          else if (!strcmp (mnemonic, "ldc"))
            insert (dest, 2);
          else if (!strcmp (mnemonic, "and"))
            insert (dest, 3);
          else if (!strcmp (mnemonic, "andc"))
            insert (dest, 4);
          else if (!strcmp (mnemonic, "or"))
            insert (dest, 5);
          else if (!strcmp (mnemonic, "orc"))
            insert (dest, 6);
          else if (!strcmp (mnemonic, "xnor"))
            insert (dest, 7);
          else if (!strcmp (mnemonic, "sto"))
            insert (dest, 8);
          else if (!strcmp (mnemonic, "stoc"))
            insert (dest, 9);
          else if (!strcmp (mnemonic, "ien"))
            insert (dest, 10);
          else if (!strcmp (mnemonic, "oen"))
            insert (dest, 11);
          else if (!strcmp (mnemonic, "jmp"))
            insert (dest, 12);
          else if (!strcmp (mnemonic, "rtn"))
            insert (dest, 13);
          else if (!strcmp (mnemonic, "skz"))
            insert (dest, 14);
          else if (!strcmp (mnemonic, "nopf"))
            insert (dest, 0);
          else
            printf ("Unknown mnemonic: %s, ignored.\a\n", mnemonic);
        }
      }
      fclose (src);
      fclose (dest);
      puts ("Assembly completed!");
      return 0;
    }
    puts ("File system error!\a");
  }
  puts ("Assembler for MC14500B written by Jan 'Manna5' Mleczko.\n\tASSEMBLE <src> <dest>");
  return 1;
}
