#include <cpu_prog_model.h>


#define INPUT     "\004"
#define CALL      "\014"
#define HOME      "\027"
#define GOTO      "\053"
#define IF        "\055"
#define STOP      "\063"
#define PRINT     "\072"
#define EQUAL     "\120"
#define THEN      "\104"

#define COLON     "\272"
#define SEMI      "\273"
#define SITT      "\242"

make_line( base_pointer, address, line_number, basic_line)
short          * base_pointer;
unsigned short * address;
short            line_number;
char           * basic_line;
{
   unsigned short temp_address;

   base_pointer [(*address)++] = 0;  /* Delimiter Must be zero */

   temp_address = (*address) + strlen( basic_line) + 5;
   base_pointer [(*address)++] = temp_address & 0xFF;
   base_pointer [(*address)++] = temp_address >> 8;

   base_pointer [(*address)++] = line_number & 0xFF;
   base_pointer [(*address)++] = line_number >> 8;

   while (*basic_line)
      base_pointer [(*address)++] = *(basic_line++) ^ 0x80;
}

one_prog( code, address, file_name)
PM             * code;
unsigned short   address;
char           * file_name;
{
   unsigned short   basic_address;
   char             buffer [256];

   basic_address = 0x0800;

   make_line( code->Me, &basic_address,
              10, INPUT SITT "Auto start (J/N) : " SITT ";A$" );

   strcpy( buffer, IF "A$" EQUAL SITT "J" SITT THEN CALL);
   sprintf( buffer + strlen( buffer), "%d", address);
   make_line( code->Me, &basic_address, 20, buffer);

   make_line( code->Me, &basic_address,
              30, PRINT COLON PRINT SITT "End." SITT);

   code->Me [basic_address++] = 0x00;
   code->Me [basic_address++] = 0x00;
   code->Me [basic_address++] = 0x00;

}

auto_list( code, buffer, number_of_progs)
PM   * code;
char * buffer;
short  number_of_progs;
{
   char           * temp_pointer;
   unsigned short   call_address,
                    basic_address;

   if (number_of_progs == 1)
   {
      call_address = buffer [0] | buffer [1] << 8;

      one_prog( code, call_address, buffer + 2);
   }

   else
   {
      short number_of_files,
            loop;

      char  temp_buffer [256];

      temp_pointer    = buffer;
      basic_address   = 0x0800;
      number_of_files = 0;

      make_line( code->Me, &basic_address, 5, HOME);
      make_line( code->Me, &basic_address, 8,
PRINT COLON PRINT SITT "                       0)  BREAK" SITT);

      while (temp_pointer [2])
      {
         call_address = temp_pointer [0] | temp_pointer [1] << 8;
         temp_pointer += 2;

         sprintf( temp_buffer,
PRINT COLON PRINT SITT "                       %d)  %s" SITT,
                                               number_of_files + 1,
                                               temp_pointer         );

         make_line( code->Me, &basic_address, number_of_files * 10 + 10,
                                                        temp_buffer );

         sprintf( temp_buffer, "A%d" EQUAL "%d", number_of_files,
                                                        call_address );
         make_line( code->Me, &basic_address, number_of_files * 10 + 12,
                                                        temp_buffer  );

/*         printf("bugg list_buffer %d '%s'\n", call_address, temp_pointer);*/
         temp_pointer += (strlen( temp_pointer) + 1);

         number_of_files ++;
      }

      make_line( code->Me, &basic_address, 150, PRINT);
      make_line( code->Me, &basic_address, 160,
INPUT SITT "                       Make your choise : " SITT SEMI "V");
      make_line( code->Me, &basic_address, 165, IF "V" EQUAL "0" THEN STOP);

      for (loop = 0;loop < number_of_files;loop ++)
      {
         sprintf( temp_buffer, IF "V" EQUAL "%d" THEN CALL "A%d", loop + 1,
                                                                  loop);
         make_line( code->Me, &basic_address, 170 + loop * 10, temp_buffer);
      }

      make_line( code->Me, &basic_address, 170 + loop * 10, GOTO "5");

      code->Me [basic_address++] = 0x00;
      code->Me [basic_address++] = 0x00;
      code->Me [basic_address++] = 0x00;

   }

}


