OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_42/] [or1ksim/] [cpu/] [common/] [parse.c] - Diff between revs 3 and 6

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 3 Rev 6
Line 25... Line 25...
#include "parse.h"
#include "parse.h"
#include "abstract.h"
#include "abstract.h"
 
 
#define MAXLINE_LEN     18000
#define MAXLINE_LEN     18000
 
 
 
/* Struct labelref that is used in linked list for fixing label refs
 
   after program is loaded to memory. */
 
 
 
struct st_labelref {
 
        struct st_labelref *next;
 
        unsigned long addr;
 
        char label[100];
 
} *labelref = NULL;
 
 
/* Unused mem memory marker. It is used when allocating program and data memory
/* Unused mem memory marker. It is used when allocating program and data memory
   during parsing */
   during parsing */
unsigned int freemem;
unsigned int freemem;
 
 
int nonempty(char *line)
int nonempty(char *line)
Line 95... Line 104...
                        }
                        }
                else
                else
                        mem[freemem].data = *str;
                        mem[freemem].data = *str;
}
}
 
 
 
int is_str(char *str)
 
{
 
        char *c;
 
 
 
        for (c = str; *c != '\0'; c++)
 
                if (isalpha(*c))
 
                        return 1;
 
 
 
        return 0;
 
}
 
 
 
void handle_labelref(struct st_labelref *root)
 
{
 
        unsigned long label;
 
        struct st_labelref *tmp;
 
 
 
        while (root) {
 
                label = eval_label(root->label);
 
                mem[root->addr].data = (char) (label >> 24);
 
                mem[root->addr + 1].data = (char) (label >> 16);
 
                mem[root->addr + 2].data = (char) (label >> 8);
 
                mem[root->addr + 3].data = (char) (label);
 
 
 
                tmp = root->next;
 
                free(root);
 
                root = tmp;
 
        }
 
}
 
 
void adddataword(char *num)
void adddataword(char *num)
{
{
 
 
 
        if (is_str(num)) {
 
                struct st_labelref *new = malloc(sizeof(struct st_labelref));
 
                strcpy(new->label, num);
 
                new->addr = freemem;
 
                new->next = labelref;
 
                labelref = new;
 
        } else {
        mem[freemem].data = (char) (atol(num) >> 24);
        mem[freemem].data = (char) (atol(num) >> 24);
        mem[freemem + 1].data = (char) (atol(num) >> 16);
        mem[freemem + 1].data = (char) (atol(num) >> 16);
        mem[freemem + 2].data = (char) (atol(num) >> 8);
        mem[freemem + 2].data = (char) (atol(num) >> 8);
        mem[freemem + 3].data = (char) (atol(num));
        mem[freemem + 3].data = (char) (atol(num));
 
        }
 
 
        freemem += 4;
        freemem += 4;
}
}
 
 
void adddatahalf(char *num)
void adddatahalf(char *num)
Line 293... Line 340...
void loadcode(char *filename)
void loadcode(char *filename)
{
{
        freemem = 0;
        freemem = 0;
        memset(mem, 0, sizeof(mem));
        memset(mem, 0, sizeof(mem));
        readfile(filename);
        readfile(filename);
 
        handle_labelref(labelref);
        return;
        return;
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.