blob: 2969607558f225b26e5cb98c5d4cbd7c72197741 [file] [log] [blame]
/* %%%%%%%%%%%%%%%%%%%% (c) William Landi 1991 %%%%%%%%%%%%%%%%%%%%%%%%%%%% */
/* Permission to use this code is granted as long as the copyright */
/* notice remains in place. */
/* =============================== pass1.c ================================= */
/* Process Header, define, and end records of oen object file. */
#include <string.h>
#include <stdio.h>
#include "boolean.h"
#include "constants.h"
#include "sym_tab.h"
#include "stringI.h"
#include "memory.h"
#include "convert.h"
#include "load.h"
/* ------------------------------- PASS1 ----------------------------------- */
/* Process Header, define, and end records of oen object file. */
void PASS1(SYMBOL_TABLE *SYM_TAB,int *LOCATION,int *ERROR,FILE *INPUT)
{
char MODULE_NAME[LABEL_SIZE_1+1]; /* Name of (program) module currently */
/* assembling. */
char *RECORD; /* One record from the input stream */
int UNREL_TO_REL_SHIFT = 0; /* signed number of bytes to shift the */
/* object code due to relocation */
MODULE_NAME[LABEL_SIZE_1] = '\0';
while (!feof(INPUT) && ((*LOCATION) <= MEM_SIZE_1)) {
BOOLEAN LOCAL_ERROR;
LOCAL_ERROR = FALSE_1;
GET_LINE(&RECORD,INPUT);
switch (RECORD[0]) {
case 'H':
/* ---------------------- HEADER RECORD ------------------------------------ */
if (strlen(RECORD) != (13 + LABEL_SIZE_1))
LOCAL_ERROR = TRUE_1;
else {
int TEMP_LOC;
(void) strncpy(MODULE_NAME,&(RECORD[1]),LABEL_SIZE_1);
if (!INSERT_IN_SYM_TAB(GLOBAL_1,MODULE_NAME,*LOCATION,MODULE,
SYM_TAB)) {
int I;
for (I=LABEL_SIZE_1-1; ( (I<1) || (MODULE_NAME[I] == ' ')); I--);
MODULE_NAME[I+1] = '\0';
(void) printf(
"ERROR: Multiply defined global %s. Program not loaded.\n",
MODULE_NAME);
(*ERROR) = TRUE_1;
} else {
STR_TO_NUM(&(RECORD[9]),6,16,&TEMP_LOC,&LOCAL_ERROR);
UNREL_TO_REL_SHIFT = (*LOCATION) - TEMP_LOC;
STR_TO_NUM(&(RECORD[15]),6,16,&TEMP_LOC,&LOCAL_ERROR);
(*LOCATION) += TEMP_LOC;
(*LOOK_UP_SYMBOL(GLOBAL_1,MODULE_NAME,SYM_TAB)).LENGTH =
TEMP_LOC;
}
}
if (LOCAL_ERROR)
(void) printf("ERROR: Illegal header record = %s\n",RECORD);
break;
case 'D':
/* ------------------------ DEFINE RECORD ---------------------------------- */
if (strlen(RECORD) > 71) LOCAL_ERROR = TRUE_1;
else {
int NEXT = 1;
char TEMP_NAME[LABEL_SIZE_1+1];
int TEMP_LOC;
TEMP_NAME[LABEL_SIZE_1] = '\0';
while (NEXT + 14 <= strlen(RECORD)) {
(void) strncpy(TEMP_NAME,&(RECORD[NEXT]),LABEL_SIZE_1);
STR_TO_NUM(&(RECORD[NEXT+LABEL_SIZE_1]),6,16,&TEMP_LOC,
&LOCAL_ERROR);
if (!INSERT_IN_SYM_TAB(GLOBAL_1,TEMP_NAME
,TEMP_LOC + UNREL_TO_REL_SHIFT,GLOBAL,
SYM_TAB)) {
int I;
for (I=LABEL_SIZE_1-1; ( (I<1) || (TEMP_NAME[I] == ' ')); I--);
TEMP_NAME[I+1] = '\0';
(void) printf(
"ERROR: Multiply defined global %s. Program not loaded.\n",
TEMP_NAME);
(*ERROR) = TRUE_1;
}
NEXT += 14;
}
if (NEXT != strlen(RECORD)) LOCAL_ERROR = TRUE_1;
}
if (LOCAL_ERROR)
(void) printf("ERROR: Illegal define record = %s\n",RECORD);
break;
/* ------------------------- END RECORD ------------------------------------ */
case 'E':
if (strlen(RECORD) != 1)
if (strlen(RECORD) != 7)
LOCAL_ERROR = TRUE_1;
else {
if (START_ADDRESS != -1)
(void) printf("%s%s\n",
"WARNING: Found multiple start addresses.",
" Expected only one. Using the first.");
else {
STR_TO_NUM(&(RECORD[1]),6,16,&START_ADDRESS, &LOCAL_ERROR);
START_ADDRESS += UNREL_TO_REL_SHIFT;
(void) strcpy(MAIN_ROUTINE,MODULE_NAME);
}
}
if (LOCAL_ERROR)
(void) printf("ERROR: Illegal end record = %s\n",RECORD);
break;
case 'M':
case 'R':
case 'T':
case '\0':
break;
default:
(void) printf("ERROR: Illegal RECORD = %s\n",RECORD);
LOCAL_ERROR = TRUE_1;
}
(*ERROR) = (*ERROR) || LOCAL_ERROR;
}
}