📄 pass1.cpp
字号:
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
offset = (S4)t.val;
bret = (*ptr).match(&t,TOK_NO_MORE);
if(bret!=TRUE)
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
PASS1_DEBUG0("processPDirective(): adding .PA to symbol table\n");
hptr = (*hashTbl).queryHashTbl(name);
if(hptr!=NULL)
{
ERROR2("processPDirective(): line %d, %s re-defined\n",line,name);
return;
}
struct StackFrame sf;
sf.text = (*strTbl).iStr;
sf.fpOffset = offset;
sf.line = line;
(*strTbl).addStrTbl(name);
(*symTbl).addProcArgHL(&sf);
(*hashTbl).addHashTblEntry(name,
sf.text,
PROC_ARG,
((*symTbl).iProc-1),
(((*symTbl).proc[(*symTbl).iProc-1]).iArg-1),
line);
}/*end .PA*/
else if(strcmp((*tptr).text,".PV")==0) /*.PV identifier -n*/
{
char name[ID_SIZE];
S4 offset;
U4 line;
struct HashTbl *hptr;
line = (*tptr).line;
bret = (*ptr).match(&t,TOK_IDENTIFIER);
if(bret!=TRUE)
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
strcpy(name,t.text);
bret = (*ptr).match(&t,TOK_INT_CONST);
if(bret!=TRUE)
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
offset = (S4)t.val;
bret = (*ptr).match(&t,TOK_NO_MORE);
if(bret!=TRUE)
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
PASS1_DEBUG0("processPDirective(): adding .PV to symbol table\n");
hptr = (*hashTbl).queryHashTbl(name);
if(hptr!=NULL)
{
ERROR2("processPDirective(): line %d, %s re-defined\n",line,name);
return;
}
struct StackFrame sf;
sf.text = (*strTbl).iStr;
sf.fpOffset = (S4)offset;
sf.line = line;
(*strTbl).addStrTbl(name);
(*symTbl).addProcLocHL(&sf);
(*hashTbl).addHashTblEntry(name,
sf.text,
PROC_LOC,
((*symTbl).iProc-1),
(((*symTbl).proc[(*symTbl).iProc-1]).iLocal-1),
line);
}/*end .PV*/
else if(strcmp((*tptr).text,".PL")==0) /*.PL identifier*/
{
char name[ID_SIZE];
U8 address;
U4 line;
struct HashTbl *hptr;
line = (*tptr).line;
bret = (*ptr).match(&t,TOK_IDENTIFIER);
if(bret!=TRUE)
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
strcpy(name,t.text);
address = bytePosPass1;
bret = (*ptr).match(&t,TOK_NO_MORE);
if(bret!=TRUE)
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
PASS1_DEBUG0("processPDirective(): adding .PL to symbol table\n");
hptr = (*hashTbl).queryHashTbl(name);
if(hptr!=NULL)
{
ERROR2("processPDirective(): line %d, %s re-defined\n",line,name);
return;
}
struct Label lb;
lb.text = (*strTbl).iStr;
lb.address = address;
lb.line = line;
(*strTbl).addStrTbl(name);
(*symTbl).addProcLblHL(&lb);
(*hashTbl).addHashTblEntry(name,
lb.text,
PROC_LBL,
((*symTbl).iProc-1),
(((*symTbl).proc[(*symTbl).iProc-1]).iLabel-1),
line);
}/*end .PL*/
else if(strcmp((*tptr).text,".PE")==0)/*.PE*/
{
bret = (*ptr).match(&t,TOK_NO_MORE);
if(bret==TRUE)
{
/*
cannot define code outside of a procedure
*/
currentProcPass1 = OUTSIDE_PROC_PASS1;
}
else
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
return;
}
}/*end .PE*/
else
{
ERROR1("Pass1::processPDirective(): line %lu, bad directive\n",(*tptr).line);
}
return;
}/*end processPDirective*/
/*-----------------------------------------------------------------*/
/*
Do not generate bytecode in first pass, but we need to know
-offset of label directives
-offset of procedures
Thus, we need to do minimal instruction processing to keep
track of bytesize via ->bytePos<- variable
use switch to help cut down on calls to strcmp()
can probably recycle basic skeleton and extend on this code for Pass2
*/
void Pass1::processInstruction(struct Token *tptr)
{
if((*tptr).type!=TOK_IDENTIFIER)
{
ERROR3("Pass1::processInstruction(): %s on line %lu type %s not a valid opcode\n",(*tptr).text,(*tptr).line,TokStr[(*tptr).type]);
return;
}
switch((*tptr).text[0])
{
case 'A':
{
if(strcmp((*tptr).text,"ADD")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"AND")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'B':
{
if(strcmp((*tptr).text,"BS")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"BT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'C':
{
if(strcmp((*tptr).text,"CAST_IF")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"CAST_ID")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"CAST_FI")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"CAST_FD")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"CAST_DI")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"CAST_DF")==0){ bytePosPass1 = bytePosPass1 + 3;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'D':
{
if(strcmp((*tptr).text,"DIV")==0){ bytePosPass1 = bytePosPass1 + 5;}
else if(strcmp((*tptr).text,"DI")==0){ bytePosPass1 = bytePosPass1 + 1;}
else if(strcmp((*tptr).text,"DADD")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"DSUB")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"DMULT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"DDIV")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"DSLT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'E':
{
if(strcmp((*tptr).text,"EI")==0){ bytePosPass1 = bytePosPass1 + 1;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'F':
{
if(strcmp((*tptr).text,"FADD")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"FSUB")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"FMULT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"FDIV")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"FSLT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'H':
{
if(strcmp((*tptr).text,"HALT")==0){ bytePosPass1 = bytePosPass1 + 1;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'I':
{
if(strcmp((*tptr).text,"INT")==0){ bytePosPass1 = bytePosPass1 + 2;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'J':
{
if(strcmp((*tptr).text,"JMP")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"JE")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"JNE")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'L':
{
if(strcmp((*tptr).text,"LBI")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LWI")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"LDI")==0){ bytePosPass1 = bytePosPass1 + 6;}
else if(strcmp((*tptr).text,"LQI")==0){ bytePosPass1 = bytePosPass1 + 10;}
else if(strcmp((*tptr).text,"LF1I")==0){ bytePosPass1 = bytePosPass1 + 6;}
else if(strcmp((*tptr).text,"LF2I")==0){ bytePosPass1 = bytePosPass1 + 10;}
else if(strcmp((*tptr).text,"LB")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LW")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LD")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LQ")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LF1")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LF2")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"LAD")==0){ bytePosPass1 = bytePosPass1 + 10;}
else if(strcmp((*tptr).text,"LAI")==0){ bytePosPass1 = bytePosPass1 + 11;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'M':
{
if(strcmp((*tptr).text,"MOV")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"MOVF")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"MOVD")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"MULT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'N':
{
if(strcmp((*tptr).text,"NOT")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"NOP")==0){ bytePosPass1 = bytePosPass1 + 1;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'O':
{
if(strcmp((*tptr).text,"OR")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'P':
{
if(strcmp((*tptr).text,"PUSHB")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"PUSHW")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"PUSHD")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"PUSHQ")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"PUSHF1")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"PUSHF2")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"POPB")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"POPW")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"POPD")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"POPQ")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"POPF1")==0){ bytePosPass1 = bytePosPass1 + 2;}
else if(strcmp((*tptr).text,"POPF2")==0){ bytePosPass1 = bytePosPass1 + 2;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'S':
{
if(strcmp((*tptr).text,"SB")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"SW")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"SD")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"SQ")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"SF1")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"SF2")==0){ bytePosPass1 = bytePosPass1 + 3;}
else if(strcmp((*tptr).text,"SRA")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"SRL")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"SL")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"SUB")==0){ bytePosPass1 = bytePosPass1 + 4;}
else if(strcmp((*tptr).text,"SLT")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
case 'X':
{
if(strcmp((*tptr).text,"XOR")==0){ bytePosPass1 = bytePosPass1 + 4;}
else
{
ERROR2("Pass1::processInstruction(): line %d, invalid opcode (%s)\n",(*tptr).line,(*tptr).text);
return;
}
}break;
default:
{
ERROR3("Pass1::processInstruction(): %s on line %lu type %s not a valid opcode\n",(*tptr).text,(*tptr).line,TokStr[(*tptr).type]);
return;
}
}/*end switch*/
return;
}/*end processInstruction*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -