home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / _ / 6502xass / !6502-XAss / c / RunImage < prev    next >
Text File  |  1995-12-31  |  12KB  |  502 lines

  1. /******************************************************/
  2. /*             6502/6510 Cross Assembler              */
  3. /*                                                    */
  4. /*            ©1995 by Skoe of Expression             */
  5. /*                                                    */
  6. /*            Version 0.72ß (23 Dez 1995)             */
  7. /*                                                    */
  8. /*        for Easy C Compiler on Acorn machines       */
  9. /*                                                    */
  10. /******************************************************/
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <ctype.h>
  16. #include <roslib.h>
  17. #include <swis.h>
  18.  
  19. #define TASK 0x4b534154
  20.  
  21. int bar_icon_handle,
  22.     task_handle,
  23.     window_info,
  24.     window_work,
  25.     menu_x,
  26.     center_x,
  27.     center_y,
  28.     poll_block[64],
  29.     menu_block[32],
  30.     temp[256],
  31.     indirect[128],
  32.     last_inc_file,
  33.     //last_error_file,
  34.     *line_list;
  35. char file_list[50][256];
  36. os_regset r;
  37.  
  38. #include "XAss.c"
  39.  
  40. int mode_var(int m_var)
  41. {
  42.   r.r[0] = -1;
  43.   r.r[1] = m_var;
  44.   os_swi(OS_ReadModeVariable, &r);
  45.   return r.r[2];
  46. }
  47.  
  48. void get_center(void)
  49. {
  50.   int x_eig_factor,
  51.       y_eig_factor,
  52.       x_lim,
  53.       y_lim;
  54.  
  55.   x_eig_factor = mode_var(4);
  56.   y_eig_factor = mode_var(5);
  57.   x_lim = mode_var(11);
  58.   y_lim = mode_var(12);
  59.  
  60.   center_x = (x_lim << x_eig_factor) >> 1;
  61.   center_y = (y_lim << y_eig_factor) >> 1;
  62. }
  63.  
  64. void load_templates(void)
  65. {
  66.   r.r[1] = "<6502-XAss$Dir>.Templates";
  67.   os_swi(Wimp_OpenTemplate, &r);
  68.  
  69.   r.r[1] = &temp[0];
  70.   r.r[2] = &indirect[0];
  71.   r.r[3] = &indirect[0] + 128 * 4;
  72.   r.r[4] = -1;
  73.   r.r[5] = "info";
  74.   r.r[6] = 0;
  75.   os_swi(Wimp_LoadTemplate, &r);
  76.  
  77.   r.r[1] = &temp[0];
  78.   os_swi(Wimp_CreateWindow, &r);
  79.   window_info = r.r[0];
  80.  
  81.   r.r[1] = &temp[0];
  82.   r.r[3] = &indirect[0] + 64 * 4;
  83.   r.r[4] = -1;
  84.   r.r[5] = "work";
  85.   r.r[6] = 0;
  86.   os_swi(Wimp_LoadTemplate, &r);
  87.  
  88.   temp[0] = center_x - 220;
  89.   temp[1] = center_y - 300;
  90.   temp[2] = center_x + 220;
  91.   temp[3] = center_y + 300;
  92.   r.r[1] = &temp[0];
  93.   os_swi(Wimp_CreateWindow, &r);
  94.   window_work = r.r[0];
  95.  
  96.   os_swi(Wimp_CloseTemplate, &r);
  97. }
  98.  
  99. void define_menu(void)
  100. {
  101.   // header
  102.   memcpy( &menu_block[0], "6502-XAss", 10 );
  103.   menu_block[3] = 0x00070207;
  104.   menu_block[4] = 120;
  105.   menu_block[5] = 44;
  106.   menu_block[6] = 0;
  107.   // item 1
  108.   menu_block[7] = 0;
  109.   menu_block[8] = window_info;
  110.   menu_block[9] = 0x07008001;
  111.   memcpy( &menu_block[10], "Info", 5);
  112.   // item 2
  113.   menu_block[13] = 0x80;
  114.   menu_block[14] = -1;
  115.   menu_block[15] = 0x07008001;
  116.   memcpy( &menu_block[16], "Quit", 5);
  117. }
  118.  
  119. void status(char *stat)
  120. {
  121.   int buffer;
  122.  
  123.   temp[0] = window_work;
  124.   temp[1] = 7;
  125.   r.r[1] = &temp[0];
  126.   os_swi(Wimp_GetIconState, &r);
  127.   memcpy( (char *)temp[7], stat, 63);
  128.  
  129.   temp[0] = window_work;
  130.   temp[1] = 8;
  131.   r.r[1] = &temp[0];
  132.   os_swi(Wimp_GetIconState, &r);
  133.   buffer = temp[7];
  134.  
  135.   r.r[0] = error_counter;
  136.   r.r[1] = &temp[0];
  137.   r.r[2] = 128;
  138.   os_swi(OS_ConvertInteger4, &r);
  139.   memcpy( (char *)buffer, (char *)r.r[0], 10);
  140.  
  141.   r.r[0] = window_work;
  142.   r.r[1] = 28;
  143.   r.r[2] = -496;
  144.   r.r[3] = 410;
  145.   r.r[4] = -442;
  146.   os_swi(Wimp_ForceRedraw, &r);
  147.   r.r[0] = window_work;
  148.   r.r[1] = 276;
  149.   r.r[2] = -572;
  150.   r.r[3] = 410;
  151.   r.r[4] = -514;
  152.   os_swi(Wimp_ForceRedraw, &r);
  153.  
  154.   r.r[0] = 0;                             // poll mask
  155.   r.r[1] = poll_block;
  156.   os_swi(Wimp_Poll, &r);                  // control to WIMP
  157. }
  158.  
  159. int precompile(char *source_filename)
  160. {
  161.   FILE *inc_file, *source_file;
  162.   char new_filename[256], line[256], *report;
  163.   int pos, pos_2,
  164.       error_occured = 0,
  165.       main_line_nr = 0,
  166.       inc_line_nr;
  167.  
  168.   status("Precompiling...");
  169.   source_file = fopen(source_filename, "r");
  170.   if (source_file == NULL)
  171.   {
  172.     status("Source error");
  173.     error_occured = 1;
  174.   }
  175.   else
  176.   {
  177.     last_inc_file = 0;
  178.     memcpy(file_list[0], source_filename, 255);
  179.  
  180.     line_nr = 1;
  181.     while ( (report = fgets(line, 256, source_file)) != NULL)
  182.     {
  183.       main_line_nr++;
  184.       if (line[0] == '#')
  185.       {
  186.         if (line[1] == 'i' && line[2] == 'n' &&
  187.             line[3] == 'c' && line[4] == 'l' &&
  188.             line[5] == 'u' && line[6] == 'd' && line[7] == 'e')
  189.         {
  190.           // include a new file
  191.           pos = 8;
  192.           while ( line[pos] != '\"' && pos < strlen(line) )
  193.             pos++;
  194.           if (line[pos] == '\"')
  195.           {
  196.             pos_2 = 0;
  197.             new_filename[0] = 0;
  198.             do
  199.               new_filename[pos_2++] = line[++pos];
  200.             while (line[pos] != '\"');
  201.             new_filename[pos_2 -1] = 0;
  202.           }
  203.           inc_line_nr = 0;
  204.           memcpy(file_list[++last_inc_file], new_filename, 255);
  205.           inc_file = fopen(new_filename, "r");
  206.           if (inc_file != NULL)
  207.             while ( (report = fgets(line, 256, inc_file)) != NULL)
  208.             {
  209.               fputs(line, out_file);
  210.               *(line_list + (line_nr << 1)) = inc_line_nr;
  211.               *(1 + line_list + (line_nr << 1)) = last_inc_file;
  212.               inc_line_nr++;
  213.               line_nr++;
  214.             }
  215.           else
  216.           {
  217.             status("Including error");
  218.             error_occured = 1;
  219.           }
  220.           fclose(inc_file);
  221.         }
  222.         else
  223.         {
  224.           error_occured = 1;
  225.           status("?Precompiler command");
  226.         }
  227.       }
  228.       else
  229.       {
  230.         *(line_list + (line_nr << 1)) = main_line_nr;
  231.         *(1 + line_list + (line_nr << 1)) = 0;
  232.         fputs(line, out_file);
  233.         line_nr++;
  234.       }
  235.     }
  236.   }
  237.   fclose(source_file);
  238.   return error_occured;
  239. }
  240.  
  241. void start_assembling(void)
  242. {
  243.   char *in_filename;
  244.   int  count, error_occured = 1;
  245.  
  246.   os_swi(Hourglass_On, &r);
  247.   line_list = (int *) malloc(80000);
  248.   if (line_list == NULL)
  249.     os_vdu(7);
  250.  
  251.   temp[0] = window_work;
  252.   temp[1] = 2;                              // "Assemble" icon
  253.   r.r[1] = &temp[0];
  254.   os_swi(Wimp_GetIconState, &r);
  255.   in_filename = (char *)temp[7];
  256.  
  257.   temp[0] = window_work;
  258.   temp[1] = 3;
  259.   r.r[1] = &temp[0];
  260.   os_swi(Wimp_GetIconState, &r);            // do we have to transfer?
  261.   transfer_enabled = (temp[6] & (1 << 21) ) >> 21;
  262.  
  263.   // precompiling
  264.   out_file = fopen("<6502-XAss$Dir>.Scrap.Source", "w");
  265.   if (out_file != NULL)
  266.     os_cli("SetType <6502-XAss$Dir>.Scrap.Source Text");
  267.     error_occured = precompile(in_filename);
  268.   fclose(out_file);
  269.  
  270.   in_file = fopen("<6502-XAss$Dir>.Scrap.Source", "r");
  271.   out_file = fopen("<6502-XAss$Dir>.Scrap.Object", "w");
  272.   error_file = fopen("<6502-XAss$Dir>.Scrap.Report", "w");
  273.  
  274.   if (in_file == NULL)
  275.     status("Source file error");
  276.   else
  277.   {
  278.     if (out_file == NULL)
  279.       status("Object file error");
  280.     else
  281.     {
  282.       if (error_file == NULL)
  283.         status("Report file error");
  284.       else
  285.         if (!error_occured)
  286.         {
  287.           os_cli("SetType <6502-XAss$Dir>.Scrap.Report Text");
  288.           os_cli("SetType <6502-XAss$Dir>.Scrap.Object Data");
  289.           assemble(in_file, in_filename);
  290.         }
  291.     }
  292.   }
  293.   fclose(in_file);
  294.   fclose(out_file);
  295.   fclose(error_file);
  296.  
  297.   error_file = fopen("<6502-XAss$Dir>.Scrap.Symbols", "w");
  298.   if (error_file == NULL)
  299.     status("Symbol file error");
  300.   else
  301.   {
  302.     fprintf(error_file, "Source file: %s\n\n", in_filename);
  303.  
  304.     for (count = 0; count < nr_of_symbols; count++)
  305.     {
  306.       fprintf(error_file, "%20s = $%04x (%03d)",
  307.               symbol[count].name, symbol[count].address,
  308.               symbol[count].number_of_reads);
  309.       if (symbol[count].number_of_reads == 0)
  310.         fprintf(error_file, " <= not used!\n");
  311.       else
  312.         fprintf(error_file, "\n");
  313.     }
  314.     fprintf(error_file, "\n%d symbol(s) defined\n", nr_of_symbols);
  315.     fclose(error_file);
  316.   }
  317.  
  318.   if (transfer_enabled && !error_occured)
  319.   {
  320.     if (error_counter == 0 && in_file != NULL
  321.         && out_file != NULL && error_file != NULL )
  322.     {
  323.       status("Transfering...");
  324.       transfer_file();
  325.     }
  326.     else
  327.       status("Transfer skipped");
  328.   }
  329.  
  330.   if (error_counter == 0 && error_occured == 0
  331.       && error_file != NULL && in_file != NULL && out_file != NULL)
  332.     status("Done.");
  333.  
  334.   free(line_list);
  335. }
  336.  
  337. void mouse_clicked(void)
  338. {
  339.   if (poll_block[3] == -2 && poll_block[4] == bar_icon_handle)
  340.   {                                         // my icon on iconbar cl