mirror of
https://github.com/uffejakobsen/acme.git
synced 2025-02-10 11:31:49 +00:00
writing to output buffer now only happens in final pass
git-svn-id: https://svn.code.sf.net/p/acme-crossass/code-0/trunk@401 4df02467-bbd4-4a76-a152-e7ce94205b78
This commit is contained in:
parent
df7f1bf06b
commit
d0b1ad84b7
@ -333,6 +333,7 @@ static void save_output_file(void)
|
|||||||
#define PF_COMPLAIN_ABOUT_UNDEFINEDS (1u << 0) // throw "Symbol not defined" errors
|
#define PF_COMPLAIN_ABOUT_UNDEFINEDS (1u << 0) // throw "Symbol not defined" errors
|
||||||
#define PF_THROW_SEGMENT_MESSAGES (1u << 1) // throw segment warnings/errors
|
#define PF_THROW_SEGMENT_MESSAGES (1u << 1) // throw segment warnings/errors
|
||||||
#define PF_GENERATE_OUTPUT (1u << 2) // generate output and/or report file
|
#define PF_GENERATE_OUTPUT (1u << 2) // generate output and/or report file
|
||||||
|
|
||||||
// perform a single pass
|
// perform a single pass
|
||||||
static void perform_pass(bits passflags)
|
static void perform_pass(bits passflags)
|
||||||
{
|
{
|
||||||
@ -399,8 +400,8 @@ static void perform_pass(bits passflags)
|
|||||||
++pass.number;
|
++pass.number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct report global_report;
|
static struct report global_report;
|
||||||
|
|
||||||
// do passes until done (or errors occurred).
|
// do passes until done (or errors occurred).
|
||||||
static void do_actual_work(void)
|
static void do_actual_work(void)
|
||||||
{
|
{
|
||||||
@ -413,6 +414,9 @@ static void do_actual_work(void)
|
|||||||
sanity.source_recursions_left = config.sanity_limit;
|
sanity.source_recursions_left = config.sanity_limit;
|
||||||
sanity.passes_left = config.sanity_limit;
|
sanity.passes_left = config.sanity_limit;
|
||||||
|
|
||||||
|
// init output system
|
||||||
|
output_init();
|
||||||
|
|
||||||
// first pass:
|
// first pass:
|
||||||
perform_pass(PF_THROW_SEGMENT_MESSAGES); // FIXME - check segments in all passes, but only throw errors/warnings in final pass!
|
perform_pass(PF_THROW_SEGMENT_MESSAGES); // FIXME - check segments in all passes, but only throw errors/warnings in final pass!
|
||||||
// pretend there has been a previous pass, with one more undefined result
|
// pretend there has been a previous pass, with one more undefined result
|
||||||
@ -813,8 +817,6 @@ int main(int argc, const char *argv[])
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// init output buffer
|
|
||||||
output_createbuffer();
|
|
||||||
// do the actual work
|
// do the actual work
|
||||||
do_actual_work();
|
do_actual_work();
|
||||||
return ACME_finalize(EXIT_SUCCESS); // dump labels, if wanted
|
return ACME_finalize(EXIT_SUCCESS); // dump labels, if wanted
|
||||||
|
36
src/output.c
36
src/output.c
@ -124,10 +124,14 @@ static void real_output(intval_t byte)
|
|||||||
// new maximum address?
|
// new maximum address?
|
||||||
if (out->write_idx > out->highest_written)
|
if (out->write_idx > out->highest_written)
|
||||||
out->highest_written = out->write_idx;
|
out->highest_written = out->write_idx;
|
||||||
// write byte and advance ptrs
|
// tell report listing about byte
|
||||||
if (report->fd)
|
if (report->fd)
|
||||||
report_binary(byte & 0xff); // file for reporting
|
report_binary(byte & 0xff); // file for reporting
|
||||||
out->buffer[out->write_idx++] = (byte & 0xff) ^ out->xor;
|
// write byte to output buffer
|
||||||
|
if (out->buffer)
|
||||||
|
out->buffer[out->write_idx] = (byte & 0xff) ^ out->xor;
|
||||||
|
// advance pointer
|
||||||
|
out->write_idx++;
|
||||||
++statement_size; // count this byte
|
++statement_size; // count this byte
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,17 +208,6 @@ void outbuf_set_outfile_limit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// init output struct
|
|
||||||
// FIXME - remove this, create the buffer at start of final pass instead!
|
|
||||||
void output_createbuffer(void)
|
|
||||||
{
|
|
||||||
out->buffer = safe_malloc(config.outbuf_size);
|
|
||||||
// init ring list of segments
|
|
||||||
out->segm.list_head.next = &out->segm.list_head;
|
|
||||||
out->segm.list_head.prev = &out->segm.list_head;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// link segment data into segment ring
|
// link segment data into segment ring
|
||||||
static void link_segment(intval_t start, intval_t length)
|
static void link_segment(intval_t start, intval_t length)
|
||||||
{
|
{
|
||||||
@ -264,6 +257,16 @@ static void check_segment(intval_t new_pc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// init structs
|
||||||
|
void output_init(void)
|
||||||
|
{
|
||||||
|
out->buffer = NULL;
|
||||||
|
// init ring list of segments (FIXME - move to passinit)
|
||||||
|
out->segm.list_head.next = &out->segm.list_head;
|
||||||
|
out->segm.list_head.prev = &out->segm.list_head;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// clear segment list and disable output
|
// clear segment list and disable output
|
||||||
void output_passinit(void)
|
void output_passinit(void)
|
||||||
{
|
{
|
||||||
@ -271,7 +274,9 @@ void output_passinit(void)
|
|||||||
|
|
||||||
// are we supposed to actually generate correct output?
|
// are we supposed to actually generate correct output?
|
||||||
if (pass.flags.generate_output) {
|
if (pass.flags.generate_output) {
|
||||||
// FIXME - allocate output buffer using size info gathered in previous pass!
|
// allocate output buffer
|
||||||
|
// FIXME - use size info gathered in previous pass!
|
||||||
|
out->buffer = safe_malloc(config.outbuf_size);
|
||||||
// fill output buffer with initial byte value
|
// fill output buffer with initial byte value
|
||||||
if (config.mem_init_value == NO_VALUE_GIVEN) {
|
if (config.mem_init_value == NO_VALUE_GIVEN) {
|
||||||
memset(out->buffer, 0, config.outbuf_size); // default value
|
memset(out->buffer, 0, config.outbuf_size); // default value
|
||||||
@ -491,6 +496,9 @@ void output_get_result(const char **ptr, intval_t *size, intval_t *loadaddr)
|
|||||||
limit, // end+1
|
limit, // end+1
|
||||||
amount;
|
amount;
|
||||||
|
|
||||||
|
if (out->buffer == NULL)
|
||||||
|
BUG("noOutBuf", 0);
|
||||||
|
|
||||||
start = out->lowest_written;
|
start = out->lowest_written;
|
||||||
limit = out->highest_written + 1;
|
limit = out->highest_written + 1;
|
||||||
// if pseudo opcodes were used, they override the actual values:
|
// if pseudo opcodes were used, they override the actual values:
|
||||||
|
@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
// prototypes
|
// prototypes
|
||||||
|
|
||||||
// alloc and init mem buffer (called once on startup)
|
// init structs (called once on startup)
|
||||||
extern void output_createbuffer(void);
|
extern void output_init(void);
|
||||||
|
|
||||||
// clear segment list and disable output (called on each pass)
|
// clear segment list and disable output (called on each pass)
|
||||||
extern void output_passinit(void);
|
extern void output_passinit(void);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#define RELEASE "0.97" // update before release FIXME
|
#define RELEASE "0.97" // update before release FIXME
|
||||||
#define CODENAME "Zem" // update before release
|
#define CODENAME "Zem" // update before release
|
||||||
#define CHANGE_DATE "3 Aug" // update before release FIXME
|
#define CHANGE_DATE "4 Aug" // update before release FIXME
|
||||||
#define CHANGE_YEAR "2024" // update before release
|
#define CHANGE_YEAR "2024" // update before release
|
||||||
//#define HOME_PAGE "http://home.pages.de/~mac_bacon/smorbrod/acme/"
|
//#define HOME_PAGE "http://home.pages.de/~mac_bacon/smorbrod/acme/"
|
||||||
#define HOME_PAGE "http://sourceforge.net/p/acme-crossass/" // FIXME
|
#define HOME_PAGE "http://sourceforge.net/p/acme-crossass/" // FIXME
|
||||||
|
Loading…
x
Reference in New Issue
Block a user