home *** CD-ROM | disk | FTP | other *** search
- /******************************************************/
- /* 6502/6510 Cross Assembler */
- /* */
- /* ©1995 by Skoe of Expression */
- /* */
- /* Version 0.72ß (23 Dez 1995) */
- /* */
- /* for Easy C Compiler on Acorn machines */
- /* */
- /******************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <roslib.h>
- #include <swis.h>
-
- #define TASK 0x4b534154
-
- int bar_icon_handle,
- task_handle,
- window_info,
- window_work,
- menu_x,
- center_x,
- center_y,
- poll_block[64],
- menu_block[32],
- temp[256],
- indirect[128],
- last_inc_file,
- //last_error_file,
- *line_list;
- char file_list[50][256];
- os_regset r;
-
- #include "XAss.c"
-
- int mode_var(int m_var)
- {
- r.r[0] = -1;
- r.r[1] = m_var;
- os_swi(OS_ReadModeVariable, &r);
- return r.r[2];
- }
-
- void get_center(void)
- {
- int x_eig_factor,
- y_eig_factor,
- x_lim,
- y_lim;
-
- x_eig_factor = mode_var(4);
- y_eig_factor = mode_var(5);
- x_lim = mode_var(11);
- y_lim = mode_var(12);
-
- center_x = (x_lim << x_eig_factor) >> 1;
- center_y = (y_lim << y_eig_factor) >> 1;
- }
-
- void load_templates(void)
- {
- r.r[1] = "<6502-XAss$Dir>.Templates";
- os_swi(Wimp_OpenTemplate, &r);
-
- r.r[1] = &temp[0];
- r.r[2] = &indirect[0];
- r.r[3] = &indirect[0] + 128 * 4;
- r.r[4] = -1;
- r.r[5] = "info";
- r.r[6] = 0;
- os_swi(Wimp_LoadTemplate, &r);
-
- r.r[1] = &temp[0];
- os_swi(Wimp_CreateWindow, &r);
- window_info = r.r[0];
-
- r.r[1] = &temp[0];
- r.r[3] = &indirect[0] + 64 * 4;
- r.r[4] = -1;
- r.r[5] = "work";
- r.r[6] = 0;
- os_swi(Wimp_LoadTemplate, &r);
-
- temp[0] = center_x - 220;
- temp[1] = center_y - 300;
- temp[2] = center_x + 220;
- temp[3] = center_y + 300;
- r.r[1] = &temp[0];
- os_swi(Wimp_CreateWindow, &r);
- window_work = r.r[0];
-
- os_swi(Wimp_CloseTemplate, &r);
- }
-
- void define_menu(void)
- {
- // header
- memcpy( &menu_block[0], "6502-XAss", 10 );
- menu_block[3] = 0x00070207;
- menu_block[4] = 120;
- menu_block[5] = 44;
- menu_block[6] = 0;
- // item 1
- menu_block[7] = 0;
- menu_block[8] = window_info;
- menu_block[9] = 0x07008001;
- memcpy( &menu_block[10], "Info", 5);
- // item 2
- menu_block[13] = 0x80;
- menu_block[14] = -1;
- menu_block[15] = 0x07008001;
- memcpy( &menu_block[16], "Quit", 5);
- }
-
- void status(char *stat)
- {
- int buffer;
-
- temp[0] = window_work;
- temp[1] = 7;
- r.r[1] = &temp[0];
- os_swi(Wimp_GetIconState, &r);
- memcpy( (char *)temp[7], stat, 63);
-
- temp[0] = window_work;
- temp[1] = 8;
- r.r[1] = &temp[0];
- os_swi(Wimp_GetIconState, &r);
- buffer = temp[7];
-
- r.r[0] = error_counter;
- r.r[1] = &temp[0];
- r.r[2] = 128;
- os_swi(OS_ConvertInteger4, &r);
- memcpy( (char *)buffer, (char *)r.r[0], 10);
-
- r.r[0] = window_work;
- r.r[1] = 28;
- r.r[2] = -496;
- r.r[3] = 410;
- r.r[4] = -442;
- os_swi(Wimp_ForceRedraw, &r);
- r.r[0] = window_work;
- r.r[1] = 276;
- r.r[2] = -572;
- r.r[3] = 410;
- r.r[4] = -514;
- os_swi(Wimp_ForceRedraw, &r);
-
- r.r[0] = 0; // poll mask
- r.r[1] = poll_block;
- os_swi(Wimp_Poll, &r); // control to WIMP
- }
-
- int precompile(char *source_filename)
- {
- FILE *inc_file, *source_file;
- char new_filename[256], line[256], *report;
- int pos, pos_2,
- error_occured = 0,
- main_line_nr = 0,
- inc_line_nr;
-
- status("Precompiling...");
- source_file = fopen(source_filename, "r");
- if (source_file == NULL)
- {
- status("Source error");
- error_occured = 1;
- }
- else
- {
- last_inc_file = 0;
- memcpy(file_list[0], source_filename, 255);
-
- line_nr = 1;
- while ( (report = fgets(line, 256, source_file)) != NULL)
- {
- main_line_nr++;
- if (line[0] == '#')
- {
- if (line[1] == 'i' && line[2] == 'n' &&
- line[3] == 'c' && line[4] == 'l' &&
- line[5] == 'u' && line[6] == 'd' && line[7] == 'e')
- {
- // include a new file
- pos = 8;
- while ( line[pos] != '\"' && pos < strlen(line) )
- pos++;
- if (line[pos] == '\"')
- {
- pos_2 = 0;
- new_filename[0] = 0;
- do
- new_filename[pos_2++] = line[++pos];
- while (line[pos] != '\"');
- new_filename[pos_2 -1] = 0;
- }
- inc_line_nr = 0;
- memcpy(file_list[++last_inc_file], new_filename, 255);
- inc_file = fopen(new_filename, "r");
- if (inc_file != NULL)
- while ( (report = fgets(line, 256, inc_file)) != NULL)
- {
- fputs(line, out_file);
- *(line_list + (line_nr << 1)) = inc_line_nr;
- *(1 + line_list + (line_nr << 1)) = last_inc_file;
- inc_line_nr++;
- line_nr++;
- }
- else
- {
- status("Including error");
- error_occured = 1;
- }
- fclose(inc_file);
- }
- else
- {
- error_occured = 1;
- status("?Precompiler command");
- }
- }
- else
- {
- *(line_list + (line_nr << 1)) = main_line_nr;
- *(1 + line_list + (line_nr << 1)) = 0;
- fputs(line, out_file);
- line_nr++;
- }
- }
- }
- fclose(source_file);
- return error_occured;
- }
-
- void start_assembling(void)
- {
- char *in_filename;
- int count, error_occured = 1;
-
- os_swi(Hourglass_On, &r);
- line_list = (int *) malloc(80000);
- if (line_list == NULL)
- os_vdu(7);
-
- temp[0] = window_work;
- temp[1] = 2; // "Assemble" icon
- r.r[1] = &temp[0];
- os_swi(Wimp_GetIconState, &r);
- in_filename = (char *)temp[7];
-
- temp[0] = window_work;
- temp[1] = 3;
- r.r[1] = &temp[0];
- os_swi(Wimp_GetIconState, &r); // do we have to transfer?
- transfer_enabled = (temp[6] & (1 << 21) ) >> 21;
-
- // precompiling
- out_file = fopen("<6502-XAss$Dir>.Scrap.Source", "w");
- if (out_file != NULL)
- os_cli("SetType <6502-XAss$Dir>.Scrap.Source Text");
- error_occured = precompile(in_filename);
- fclose(out_file);
-
- in_file = fopen("<6502-XAss$Dir>.Scrap.Source", "r");
- out_file = fopen("<6502-XAss$Dir>.Scrap.Object", "w");
- error_file = fopen("<6502-XAss$Dir>.Scrap.Report", "w");
-
- if (in_file == NULL)
- status("Source file error");
- else
- {
- if (out_file == NULL)
- status("Object file error");
- else
- {
- if (error_file == NULL)
- status("Report file error");
- else
- if (!error_occured)
- {
- os_cli("SetType <6502-XAss$Dir>.Scrap.Report Text");
- os_cli("SetType <6502-XAss$Dir>.Scrap.Object Data");
- assemble(in_file, in_filename);
- }
- }
- }
- fclose(in_file);
- fclose(out_file);
- fclose(error_file);
-
- error_file = fopen("<6502-XAss$Dir>.Scrap.Symbols", "w");
- if (error_file == NULL)
- status("Symbol file error");
- else
- {
- fprintf(error_file, "Source file: %s\n\n", in_filename);
-
- for (count = 0; count < nr_of_symbols; count++)
- {
- fprintf(error_file, "%20s = $%04x (%03d)",
- symbol[count].name, symbol[count].address,
- symbol[count].number_of_reads);
- if (symbol[count].number_of_reads == 0)
- fprintf(error_file, " <= not used!\n");
- else
- fprintf(error_file, "\n");
- }
- fprintf(error_file, "\n%d symbol(s) defined\n", nr_of_symbols);
- fclose(error_file);
- }
-
- if (transfer_enabled && !error_occured)
- {
- if (error_counter == 0 && in_file != NULL
- && out_file != NULL && error_file != NULL )
- {
- status("Transfering...");
- transfer_file();
- }
- else
- status("Transfer skipped");
- }
-
- if (error_counter == 0 && error_occured == 0
- && error_file != NULL && in_file != NULL && out_file != NULL)
- status("Done.");
-
- free(line_list);
- }
-
- void mouse_clicked(void)
- {
- if (poll_block[3] == -2 && poll_block[4] == bar_icon_handle)
- { // my icon on iconbar clicked
- if (poll_block[2] & 2) // menu clicked
- {
- r.r[1] = menu_block;
- r.r[2] = menu_x = poll_block[0] - 64;
- r.r[3] = 96+2*44;
- os_swi(Wimp_CreateMenu, &r);
- }
- else
- {
- if (poll_block[2] & 4)
- {
- temp[0] = window_work;
- r.r[1] = &temp[0];
- os_swi(Wimp_GetWindowState, &r);
- temp[7] = -1;
- os_swi(Wimp_OpenWindow, &r);
- }
- else if (poll_block[2] & 1)
- start_assembling();
- }
- }
- else if (poll_block[3] == window_work)
- { // work window clicked
- if (poll_block[4] == 4)
- start_assembling();
- else if (poll_block[4] == 5)
- os_cli("Filer_Run <6502-XAss$Dir>.Scrap.Report");
- else if (poll_block[4] == 6)
- os_cli("Filer_Run <6502-XAss$Dir>.Scrap.Symbols");
- }
- os_swi(Hourglass_Off, &r);
- }
-
- int menu_selection(void)
- {
- int ret = 0;
-
- r.r[1] = &temp[0];
- os_swi(Wimp_GetPointerInfo, &r);
- if (temp[2] & 1)
- {
- r.r[1] = menu_block; // adjust => window remains
- r.r[2] = menu_x; // on screen
- r.r[3] = 96+2*44;
- os_swi(Wimp_CreateMenu, &r);
- }
-
- if (poll_block[0] == 1 && poll_block[1] == -1)
- ret = 1;
-
- return ret; // 1 means quit
- }
-
- void message(void)
- {
- if (poll_block[4] == 3)
- { // drag
- if ( poll_block[5] == window_work ||
- (poll_block[5] == -2 && poll_block[6] == bar_icon_handle) )
- {
- temp[0] = window_work;
- temp[1] = 2;
- r.r[1] = &temp[0];
- os_swi(Wimp_GetIconState, &r); // get file name
-
- memcpy( (char *)temp[7], &poll_block[11], 127);
-
- temp[0] = window_work;
- r.r[1] = &temp[0];
- os_swi(Wimp_GetWindowState, &r);
- temp[7] = -1;
- os_swi(Wimp_OpenWindow, &r);
-
- r.r[0] = window_work;
- r.r[1] = 116;
- r.r[2] = -76;
- r.r[3] = 396;
- r.r[4] = -44;
- os_swi(Wimp_ForceRedraw, &r);
- }
- }
- }
-
- void poll(void)
- {
- int stop = 0;
-
- do
- {
- r.r[0] = 0x18b1; // poll mask
- r.r[1] = poll_block;
- os_swi(Wimp_Poll, &r); // control to WIMP
-
- switch (r.r[0])
- {
- case 2:
- r.r[1] = &poll_block[0];
- os_swi(Wimp_OpenWindow, &r);
- break;
- case 3:
- r.r[1] = &poll_block[0];
- os_swi(Wimp_CloseWindow, &r);
- break;
- case 6:
- mouse_clicked();
- break;
- case 8:
- if (poll_block[0] == window_work)
- {
- r.r[0] = poll_block[6];
- os_swi(Wimp_ProcessKey, &r);
- }
- break;
- case 9:
- stop = menu_selection();
- break;
- case 17:
- if (poll_block[4] == 0) stop = 1; // quit-request
- else message();
- break;
- case 18:
- if (poll_block[4] == 0) stop = 1; // quit-request
- else message();
- break;
- }
- }
- while (!stop);
- }
-
- void main(void)
- {
- r.r[0] = 200;
- r.r[1] = TASK;
- r.r[2] = "6502-XAss";
- r.r[3] = NULL;
- os_swi(Wimp_Initialise, &r);
- task_handle = r.r[1]; // init task
-
- poll_block[0] = -1;
- poll_block[1] = 0;
- poll_block[2] = 0;
- poll_block[3] = 76;
- poll_block[4] = 76;
- poll_block[5] = 0x3002;
- memcpy( &poll_block[6], "!6502-XAss", 10);
- r.r[1] = poll_block;
- os_swi(Wimp_CreateIcon, &r); // put icon onto iconbar
- bar_icon_handle = r.r[0];
-
- get_center();
- load_templates();
- define_menu();
- poll(); // do something
-
- r.r[0] = task_handle;
- r.r[1] = TASK;
- os_swi(Wimp_CloseDown, &r); // stop task
- r.r[0] = 0;
- r.r[1] = 0;
- os_swi(OS_Exit, &r); // bye!
- }
-