1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-11-26 13:49:21 +00:00
C02/src/label.c

134 lines
3.5 KiB
C
Raw Normal View History

/******************************************************
* C02 Label Parsing, Generation, and Lookup Routines *
******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
#include "common.h"
#include "asm.h"
#include "parse.h"
#include "label.h"
const char lblflg[] = {LFNONE, LFNONE, LFBGN, LFEND, LFBGN, LFEND, LFEND, LFNONE, LFNONE}; //Label Type Flags
2017-06-27 00:16:23 +00:00
/* Find Last Label of Specified Types *
* Args: lbtyp1: First label type *
* lbtyp2: Second label type *
* Sets: tmplbl - Label name *
* Returns: Index into label table *
* (-1 if not found) */
2018-03-04 03:32:39 +00:00
int lstlbl(int lbflag) {
2017-05-01 01:17:50 +00:00
int i;
DEBUG("Searching for label flag %d\n", lbflag);
2017-06-27 00:16:23 +00:00
for (i = lblcnt - 1; i>-1; i--) {
//DEBUG("Comparing against flag %d", lblflg[lbltyp[i]]);
if (lblflg[lbltyp[i]] == lbflag) break;
2017-06-27 00:16:23 +00:00
}
2017-05-01 01:17:50 +00:00
DEBUG("Search produced label index %d\n", i);
if (i>=0)
strcpy(tmplbl, lblnam[i]);
return i;
}
/* Set Block Flag for Last Label */
2018-03-04 03:32:39 +00:00
void setblk(int blkflg) {
2017-05-01 01:17:50 +00:00
lblblk[lblcnt-1] = blkflg;
}
/* Set label for next line of *
* Assembly Language Code *
* to word */
2018-03-04 03:32:39 +00:00
void setlbl(char *lblset) {
DEBUG("Setting Label '%s'\n", lblset);
2017-06-27 00:16:23 +00:00
if (strlen(lblasm) > 0) {
DEBUG("Emitting Label '%s'\n'", lblasm);
asmlin("",""); //Emit Block End Label on it's own line
2017-06-27 00:16:23 +00:00
}
2017-05-01 01:17:50 +00:00
if (strlen(lblset) > LABLEN)
ERROR("Label '%s' exceeds maximum size\n", word, EXIT_FAILURE)
strcpy(lblasm, lblset);
}
/* parse label in code */
2018-03-04 03:32:39 +00:00
void prslbl(void) {
DEBUG("Parsing Label '%s''\n", word);
2017-06-27 00:16:23 +00:00
CCMNT(nxtchr);
skpchr(); //skip ':'
setlbl(word);
}
/* generate new label */
2018-03-04 03:32:39 +00:00
void newlbl(char* lbname) {
sprintf(lbname, LABFMT, lblnxt++);
DEBUG("Generated new label '%s'\n", lbname);
}
2018-02-13 22:25:57 +00:00
/* Check Label Contents *
* If lbname is blank, generate new *
* label and copy into lbname */
2018-03-04 03:32:39 +00:00
void chklbl(char* lbname) {
if (lbname[0]) return;
newlbl(lbname);
}
2018-02-13 22:25:57 +00:00
/* Require Label *
2017-06-27 00:16:23 +00:00
* if label is already set, returns that label *
* else generates new label and sets it */
2018-03-04 03:32:39 +00:00
void reqlbl(char* lbname) {
2017-06-27 00:16:23 +00:00
if (lblasm[0])
strcpy(lbname, lblasm);
else {
newlbl(lbname);
setlbl(lbname);
}
2017-06-27 00:16:23 +00:00
}
2017-05-01 01:17:50 +00:00
/* Pop Label from Stack and Emit on Next Line */
2018-03-04 03:32:39 +00:00
int poplbl(void) {
int lbtype = lbltyp[--lblcnt];
2017-05-01 01:17:50 +00:00
DEBUG("Popped label type %d\n", lbtype);
if (lbtype == LTLOOP)
asmlin("JMP", lblnam[lblcnt--]); //Jump to Beginning of Loop
if (lbtype == LTFUNC) {
if (!lsrtrn) asmlin("RTS", ""); //Return From Subroutine
}
else if (lbtype == LTDO)
2017-05-01 01:17:50 +00:00
strcpy(loplbl, lblnam[lblcnt]);
2017-06-27 00:16:23 +00:00
else if (lbtype == LTDWHL)
strcpy(endlbl, lblnam[lblcnt]);
//strcpy(cndlbl, lblnam[lblcnt]);
else if (lbtype == LTCASE)
strcpy(cndlbl, lblnam[lblcnt]);
else
setlbl(lblnam[lblcnt]);
if (lbtype != LTCASE)
inblck = lblblk[lblcnt-1];
2017-05-01 01:17:50 +00:00
return lbtype;
}
/* Get Top Label and Return Type */
2018-03-04 03:32:39 +00:00
int toplbl(char *rtlbl) {
if (lblcnt) {
strcpy(rtlbl, lblnam[lblcnt-1]);
DEBUG("Found top label %s\n", rtlbl);
return lbltyp[lblcnt-1];
}
rtlbl[0] = 0; //Clear Label
return LTNONE;
}
2017-05-01 01:17:50 +00:00
/* Push Label onto Stack *
* Args: lbltyp - Label type *
* Uses: curlbl - Label to push */
2018-03-04 03:32:39 +00:00
void pshlbl(int lbtype, char* lbname) {
DEBUG("Pushing label type %d\n", lbtype);
strcpy(lblnam[lblcnt], lbname);
2017-05-01 01:17:50 +00:00
lbltyp[lblcnt] = lbtype;
lblblk[lblcnt++] = FALSE;
DEBUG("Pushed label '%s' onto stack\n", lbname);
2017-05-01 01:17:50 +00:00
}