#include "CodeWriter.h" #include #include #include #include using namespace std; CodeWriter::CodeWriter(string name) { string temp; temp=(name.substr(0,name.length()-2))+"asm"; name1=name.substr(0,name.length()-3); tname.open(temp.c_str()); } void CodeWriter::writeArithmetic(string command,int a) { int i=0; string asmCom="",num; if(a==0) num="0"; while(a!=0) { num+=a%10+'0'; a/=10; i++; } reverse(num.begin(),num.end()); if(command.substr(0,3)=="add") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D+M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=D\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,3)=="sub") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D-M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=D\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,3)=="neg") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="M=-M\n"; } if(command.substr(0,2)=="eq") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D-M\n"; asmCom+="@EQ"; asmCom+=num; asmCom+="\n"; asmCom+="D;JEQ\n"; asmCom+="(NEQ"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=0\n"; asmCom+="@END"; asmCom+=num; asmCom+="\n"; asmCom+="0;JMP\n"; asmCom+="(EQ"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=-1\n"; asmCom+="(END"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,2)=="gt") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D-M\n"; asmCom+="@GR"; asmCom+=num; asmCom+="\n"; asmCom+="D;JGT\n"; asmCom+="(NG"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=0\n"; asmCom+="@END"; asmCom+=num; asmCom+="\n"; asmCom+="0;JMP\n"; asmCom+="(GR"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=-1\n"; asmCom+="(END"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,2)=="lt") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D-M\n"; asmCom+="@LS"; asmCom+=num; asmCom+="\n"; asmCom+="D;JLT\n"; asmCom+="(NL"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=0\n"; asmCom+="@END"; asmCom+=num; asmCom+="\n"; asmCom+="0;JMP\n"; asmCom+="(LS"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=-1\n"; asmCom+="(END"; asmCom+=num; asmCom+=")\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,3)=="and") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D&M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=D\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,2)=="or") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D|M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=D\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; } if(command.substr(0,3)=="not") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="M=!M\n"; } if(command.substr(0,4)=="nand") { asmCom="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="D=M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="D=D&M\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="A=A-1\n"; asmCom+="M=D\n"; asmCom+="@SP\n"; asmCom+="M=M-1\n"; asmCom+="@SP\n"; asmCom+="A=M-1\n"; asmCom+="M=!M\n"; } tname<