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