void JSGlobalObject::copyGlobalsTo(RegisterFile& registerFile) { JSGlobalObject* lastGlobalObject = registerFile.globalObject(); if (lastGlobalObject && lastGlobalObject != this) lastGlobalObject->copyGlobalsFrom(registerFile); registerFile.setGlobalObject(this); registerFile.setNumGlobals(symbolTable().size()); if (d()->registerArray) { memcpy(registerFile.start() - d()->registerArraySize, d()->registerArray.get(), d()->registerArraySize * sizeof(Register)); setRegisters(registerFile.start(), 0, 0); } }
void JSGlobalObject::copyGlobalsFrom(RegisterFile& registerFile) { ASSERT(!d()->registerArray); ASSERT(!d()->registerArraySize); int numGlobals = registerFile.numGlobals(); if (!numGlobals) { d()->registers = 0; return; } Register* registerArray = copyRegisterArray(registerFile.lastGlobal(), numGlobals); setRegisters(registerArray + numGlobals, registerArray, numGlobals); }
void JSGlobalObject::copyGlobalsTo(RegisterFile& registerFile) { JSGlobalObject* lastGlobalObject = registerFile.globalObject(); if (lastGlobalObject && lastGlobalObject != this) lastGlobalObject->copyGlobalsFrom(registerFile); registerFile.setGlobalObject(this); registerFile.setNumGlobals(symbolTable().size()); if (m_registerArray) { // The register file is always a gc root so no barrier is needed here memcpy(registerFile.start() - m_registerArraySize, m_registerArray.get(), m_registerArraySize * sizeof(WriteBarrier<Unknown>)); setRegisters(reinterpret_cast<WriteBarrier<Unknown>*>(registerFile.start()), nullptr, 0); } }
std::string makeRegisterName(const RegisterFile& file, unsigned int id) { std::stringstream stream; stream << file.name() << id; return stream.str(); }
void Operation(string inst , Databus & DB, RegisterFile & RG , FlagRegister & FL) { if (inst[LIO]=='1')//Check if LIO == 1 for a new instruction only { string sn=""; sn = sn + DB.DATA[4] + DB.DATA[5] + DB.DATA[6] + DB.DATA[7]; RG.Snoop(sn); // Last 4 bits for Register ID sn = ""; sn = sn + DB.DATA[5] + DB.DATA[6] + DB.DATA[7]; // Last 3 bits of Flag FL.Snoop(sn); return ; } }
void JSGlobalObject::copyGlobalsFrom(RegisterFile& registerFile) { ASSERT(!m_registerArray); ASSERT(!m_registerArraySize); int numGlobals = registerFile.numGlobals(); if (!numGlobals) { m_registers = 0; return; } OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData(), reinterpret_cast<WriteBarrier<Unknown>*>(registerFile.lastGlobal()), numGlobals, numGlobals); WriteBarrier<Unknown>* registers = registerArray.get() + numGlobals; setRegisters(registers, registerArray.release(), numGlobals); }
bool EXECUTE(int ret_inst) { cout << "\n\t At any time during the exection of the program, the following keywords can be used\n"; cout << "\t'rc' : To change the current register contents\n"; cout << "\t'rd' : To display the current register contents\n"; cout << "\t'md' : To display the current memory and register contents\n"; cout << "\t'mc' : To change the current execution mode\n"; cout << "\t'rc' : To change the current break point state \n"; cout << "\t'fp' : To print all the current flag contents\n"; string tmp = "" , mode = ""; char input[100];input[0]=0; cout << "\n Set the Execution Mode by pressing one of the following :\n"; cout << "\t'm' : execute Microinstruction by Microinstruction\n"; cout << "\t'i' : execute Instruction by Instruction\n"; cout << "\t'p' : execute entire program (default mode)\n"; strcpy(input,"p"); while (true) { cout << "\tExecution Mode : "; getchar(); scanf("%[^\n]",input); mode = input ; if (mode != "p" && mode !="m" && mode!="i") { cout << "Invalid Entry . Press (m/i/p) .\n"; continue ; } break; } cout << "\tPress 'bp' to set additional break-points besides (brk) in the program : "; getchar(); scanf("%[^\n]",input); tmp = input ; bool be = false ; if (tmp == "bp") { if (SetBreakPoints() == false ) return false ; } cout << "\tPress be/bd to enable/disable all break-points (default disable)\n"; string Microinstruction=""; int count_inst = -1; // Counter to count the number of instructions executed cout << "\n\tProgram Execution Begins .......\n\n"; while ( TRUE ) { /* This is the main loop. All modules are executed in this order. NOTICE */ ret_inst = MS.Sequencer(ret_inst , DC , FL); if (ret_inst == 0) count_inst++; Microinstruction = MPM.Fetch(ret_inst); PC.Operation(Microinstruction , DB); //Program Counter Module MR.Operation(Microinstruction,DB); //Memory Address Module Mem.Operation(Microinstruction,DB,MR); //Memory Address Module DC.Operation(Microinstruction,DB); //Decoder Module MS.Operation(Microinstruction,DC); //MicroSequencer Module IOR.Operation(Microinstruction,DB,RG,FL); //Instr. Oper. Register Module RG.Operation(Microinstruction,DB,PC,SP,AC,OP,ALU1); //Register File Module OP.Operation(Microinstruction,DB); //Operand Module AC.S_Operation(Microinstruction,DB); // Special Accumulator Operation (only to EAR) ALU1.Operation(Microinstruction,DB,OP,FL); //ALU Module AC.Operation(Microinstruction,DB,ALU1); //Accumulator Module SP.Operation(Microinstruction,DB); //Stack Module MR.Operation(Microinstruction,DB); //Memory Address Module Mem.Operation(Microinstruction,DB,MR); //Memory Address Module RG.Operation(Microinstruction,DB,PC,SP,AC,OP,ALU1); //Register File Module OP.Operation(Microinstruction,DB); //Operand Module PC.S_Operation(Microinstruction, DB); // Special PC Operation // FL.Operation(Microinstruction); //Flag Register Module (only to LPC) if (Microinstruction == "000000000000000000001000000000000000000000") break; clocks++; if (Print(mode,count_inst,ret_inst,Microinstruction , be) == false) return false; } return true; }
void Video::write2Port(u32 value,Memory& memory,RegisterFile& registerFile) { (void)value; // this->memory=memory; that is a bug; // this->registerFile=registerFile; that is a bug; qDebug("Video:function %xh",registerFile.getGPR8BitsHigh(RAX)); VideoMemoryStart=memory.getVideoTextMemoryAddress(); MemoryStart=memory.getMemoryAddress(); switch(registerFile.getGPR8BitsHigh(RAX)) { case 0:DispModeChanged();break; case 1:SetCursorType();break; case 2:SetCursorPositon();break; case 3:ReadCurrentCursorPosition();break; case 4:ReadLightPenPosition();break; case 5:SelectNewVideoPage();break; case 6:ScrollCurrentPageUp();break; case 7:ScrollCurrentPageDown();break; case 8:ReadCharacter_AttributefromScreen();break; case 9:WriteCharacter_AttributetoScreen();break; case 0xA:WriteCharacterOnlytoScreen();break; case 0xB:SetColorPalette();break; case 0xC:WritePixel();break; case 0xD:ReadPixel();break; case 0xE:WriteTeletypetoActivePage();break; case 0xF:ReturnVideoStatus();break; case 0x10: registerFile.setGPR8BitsLow(RAX,0); break; case 0x11: // switch(eCPU.al) switch(registerFile.getGPR8BitsLow(RAX)) { case 0x30: // switch(eCPU.bh) switch(registerFile.getGPR8BitsHigh(RBX)) { case 0x00: // eCPU.es=*(unsigned short *)(MemoryStart+0x1f*4+2); registerFile.setSR(ES,0xf000); registerFile.setSSR(ES,0xf0000); // eCPU.bp=*(unsigned short *)(MemoryStart+0x1f*4); registerFile.setGPR16Bits(RBP,0xf000); break; default: assert(0); } // eCPU.cx=0x10; //从Bochs跟出来的,不知具体意思 registerFile.setGPR16Bits(RCX,0x10); // eCPU.dl=TextSolutionY-1; registerFile.setGPR8BitsLow(RDX,ROW_SIZE-1); break; default: assert(0); } break; case 0x12: // switch(eCPU.bl) switch(registerFile.getGPR8BitsLow(RBX)) { case 0x10: // eCPU.bh=0; // eCPU.bl=3; // eCPU.cl=7; registerFile.setGPR8BitsHigh(RBX,0); registerFile.setGPR8BitsLow(RBX,3); registerFile.setGPR8BitsLow(RCX,7); break; default: assert(0); } break; case 0x13:WriteString();break; case 0x1a: // switch(eCPU.al) switch(registerFile.getGPR8BitsLow(RAX)) { case 00: // eCPU.al=0x1a; // eCPU.bl=DispCombinCode; // eCPU.bh=0; registerFile.setGPR8BitsLow(RAX,0x1a); registerFile.setGPR8BitsLow(RBX,0x8); registerFile.setGPR8BitsHigh(RBX,0); break; case 01: break; default: assert(0); } break; case 0x1b: registerFile.setGPR8BitsLow(RAX,0); break; case 0xef: /* *Return: DL = video adapter type 00h original Hercules 01h Hercules Plus (port 03BAh reads x001xxxxx) 02h Hercules InColor (port 03BAh reads x101xxxxx) FFh not a Hercules-compatible card (port 03BAh bit 7 not pulsing) DH = memory mode byte 00h "half" mode 01h "full" mode FFh not a Hercules-compatible card */ registerFile.setGPR8BitsLow(RDX,0xff); registerFile.setGPR8BitsHigh(RDX,0x00); break; case 0xfa: /*Return: AX = 00FAh if installed ES = segment of resident code Program: FASTBUFF.COM is a keyboard speedup/screen blanking utility by David Steiner */ registerFile.setGPR16Bits(RAX,0x0); break; default: cerr<<"Int 10h function called,no such function code."<<hex<<(int)registerFile.getGPR8BitsHigh(RAX)<<"h"<<endl; exit(-1); break; } }